_ZN8facebook6hermes8debugger8DebuggerC2EPNS0_13HermesRuntimeEPN6hermes2vm8DebuggerE:
   72|     99|    : runtime_(runtime), impl_(impl), state_(this) {
   73|     99|  using EvalResultMetadata = ::hermes::vm::Debugger::EvalResultMetadata;
   74|     99|  impl->setDidPauseCallback(
   75|     99|      [this](
   76|     99|          InterpreterState state,
   77|     99|          PauseReason reason,
   78|     99|          HermesValue evalResult,
   79|     99|          const EvalResultMetadata &evalResultMd,
   80|     99|          BreakpointID breakpoint) -> DebugCommand {
   81|     99|        if (!eventObserver_)
   82|     99|          return DebugCommand::makeContinue();
   83|     99|        state_.pauseReason_ = reason;
   84|     99|        state_.stackTrace_ = impl_->getStackTrace(state);
   85|     99|        state_.evalResult_.value = jsiValueFromHermesValue(evalResult);
   86|     99|        state_.evalResult_.isException = evalResultMd.isException;
   87|     99|        state_.evalResult_.exceptionDetails = evalResultMd.exceptionDetails;
   88|     99|        state_.breakpoint_ = breakpoint;
   89|     99|        Command command = eventObserver_->didPause(*this);
   90|     99|        return std::move(*command.debugCommand_);
   91|     99|      });
   92|     99|  impl->setBreakpointResolvedCallback([this](BreakpointID breakpoint) -> void {
   93|     99|    if (!eventObserver_) {
   94|     99|      return;
   95|     99|    }
   96|     99|    eventObserver_->breakpointResolved(*this, breakpoint);
   97|     99|  });
   98|     99|}

_ZN8facebook6hermes8debugger12ProgramStateC2EPNS1_8DebuggerE:
  147|     99|  ProgramState(Debugger *dbg) : dbg_(dbg) {}
_ZN8facebook6hermes8debugger10EvalResultC2Ev:
   60|     99|  EvalResult() = default;

_ZN8facebook6hermes13HermesRuntime16isHermesBytecodeEPKhm:
 1040|    198|bool HermesRuntime::isHermesBytecode(const uint8_t *data, size_t len) {
 1041|    198|  return hbc::BCProviderFromBuffer::isBytecodeStream(
 1042|    198|      llvh::ArrayRef<uint8_t>(data, len));
 1043|    198|}
_ZN8facebook6hermes13HermesRuntime14watchTimeLimitEj:
 1335|     99|void HermesRuntime::watchTimeLimit(uint32_t timeoutInMs) {
 1336|     99|  HermesRuntimeImpl &concrete = *impl(this);
 1337|     99|  vm::Runtime &runtime = concrete.runtime_;
 1338|     99|  auto &runtimeTimeLimitMonitor = runtime.timeLimitMonitor;
 1339|     99|  if (!runtimeTimeLimitMonitor) {
  ------------------
  |  Branch (1339:7): [True: 99, False: 0]
  ------------------
 1340|     99|    concrete.compileFlags_.emitAsyncBreakCheck = true;
 1341|     99|    runtimeTimeLimitMonitor = ::hermes::vm::TimeLimitMonitor::getOrCreate();
 1342|     99|  }
 1343|     99|  runtimeTimeLimitMonitor->watchRuntime(
 1344|     99|      runtime, std::chrono::milliseconds(timeoutInMs));
 1345|     99|}
_ZN8facebook6hermes13HermesRuntime31evaluateJavaScriptWithSourceMapERKNSt3__110shared_ptrIKNS_3jsi6BufferEEES9_RKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1357|     99|    const std::string &sourceURL) {
 1358|     99|  return impl(this)->evaluatePreparedJavaScript(
 1359|     99|      impl(this)->prepareJavaScriptWithSourceMap(
 1360|     99|          buffer, sourceMapBuf, sourceURL));
 1361|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl30prepareJavaScriptWithSourceMapERKNSt3__110shared_ptrIKNS_3jsi6BufferEEES9_NS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1403|     99|    std::string sourceURL) {
 1404|     99|  std::pair<std::unique_ptr<hbc::BCProvider>, std::string> bcErr{};
 1405|     99|  auto buffer = std::make_unique<BufferAdapter>(jsiBuffer);
 1406|     99|  vm::RuntimeModuleFlags runtimeFlags{};
 1407|     99|  runtimeFlags.persistent = true;
 1408|       |
 1409|     99|  bool isBytecode = isHermesBytecode(buffer->data(), buffer->size());
 1410|       |#ifdef HERMESVM_PLATFORM_LOGGING
 1411|       |  hermesLog(
 1412|       |      "HermesVM", "Prepare JS on %s.", isBytecode ? "bytecode" : "source");
 1413|       |#endif
 1414|       |  // Save the first few bytes of the buffer so that we can later append them
 1415|       |  // to any error message.
 1416|     99|  uint8_t bufPrefix[16];
 1417|     99|  const size_t bufSize = buffer->size();
 1418|     99|  memcpy(bufPrefix, buffer->data(), std::min(sizeof(bufPrefix), bufSize));
 1419|       |
 1420|       |  // Construct the BC provider either from buffer or source.
 1421|     99|  if (isBytecode) {
  ------------------
  |  Branch (1421:7): [True: 0, False: 99]
  ------------------
 1422|      0|    if (sourceMapBuf) {
  ------------------
  |  Branch (1422:9): [True: 0, False: 0]
  ------------------
 1423|      0|      throw std::logic_error("Source map cannot be specified with bytecode");
 1424|      0|    }
 1425|      0|    bcErr = hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
 1426|      0|        std::move(buffer));
 1427|     99|  } else {
 1428|       |#if defined(HERMESVM_LEAN)
 1429|       |    bcErr.second = "prepareJavaScript source compilation not supported";
 1430|       |#else
 1431|     99|    std::unique_ptr<::hermes::SourceMap> sourceMap{};
 1432|     99|    if (sourceMapBuf) {
  ------------------
  |  Branch (1432:9): [True: 0, False: 99]
  ------------------
 1433|       |      // Convert the buffer into a form the parser needs.
 1434|      0|      llvh::MemoryBufferRef mbref(
 1435|      0|          llvh::StringRef(
 1436|      0|              (const char *)sourceMapBuf->data(), sourceMapBuf->size()),
 1437|      0|          "");
 1438|      0|      ::hermes::SimpleDiagHandler diag;
 1439|      0|      ::hermes::SourceErrorManager sm;
 1440|      0|      diag.installInto(sm);
 1441|      0|      sourceMap = ::hermes::SourceMapParser::parse(mbref, sm);
 1442|      0|      if (!sourceMap) {
  ------------------
  |  Branch (1442:11): [True: 0, False: 0]
  ------------------
 1443|      0|        auto errorStr = diag.getErrorString();
 1444|      0|        LOG_EXCEPTION_CAUSE("Error parsing source map: %s", errorStr.c_str());
  ------------------
  |  |   73|      0|  do {                           \
  |  |   74|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (74:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1445|      0|        throw std::runtime_error("Error parsing source map:" + errorStr);
 1446|      0|      }
 1447|      0|    }
 1448|     99|    bcErr = hbc::BCProviderFromSrc::createBCProviderFromSrc(
 1449|     99|        std::move(buffer), sourceURL, std::move(sourceMap), compileFlags_);
 1450|     99|#endif
 1451|     99|  }
 1452|     99|  if (!bcErr.first) {
  ------------------
  |  Branch (1452:7): [True: 43, False: 56]
  ------------------
 1453|     43|    std::string storage;
 1454|     43|    llvh::raw_string_ostream os(storage);
 1455|     43|    os << " Buffer size " << bufSize << " starts with: ";
 1456|    731|    for (size_t i = 0; i < sizeof(bufPrefix) && i < bufSize; ++i)
  ------------------
  |  Branch (1456:24): [True: 688, False: 43]
  |  Branch (1456:49): [True: 688, False: 0]
  ------------------
 1457|    688|      os << llvh::format_hex_no_prefix(bufPrefix[i], 2);
 1458|     43|    std::string bufferModes = "";
 1459|     43|    for (const auto &mode : ::hermes::oscompat::get_vm_protect_modes(
  ------------------
  |  Branch (1459:27): [True: 43, False: 43]
  ------------------
 1460|     43|             jsiBuffer->data(), jsiBuffer->size())) {
 1461|       |      // We only expect one match, but if there are multiple, we want to know.
 1462|     43|      bufferModes += mode;
 1463|     43|    }
 1464|     43|    if (!bufferModes.empty()) {
  ------------------
  |  Branch (1464:9): [True: 43, False: 0]
  ------------------
 1465|     43|      os << " and has protection mode(s): " << bufferModes;
 1466|     43|    }
 1467|     43|    LOG_EXCEPTION_CAUSE(
  ------------------
  |  |   73|     43|  do {                           \
  |  |   74|     43|  } while (0)
  |  |  ------------------
  |  |  |  Branch (74:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1468|     43|        "Compiling JS failed: %s, %s", bcErr.second.c_str(), os.str().c_str());
 1469|     43|    throw jsi::JSINativeException(
 1470|     43|        "Compiling JS failed: " + std::move(bcErr.second) + os.str());
 1471|     43|  }
 1472|     56|  return std::make_shared<const HermesPreparedJavaScript>(
 1473|     56|      std::move(bcErr.first), runtimeFlags, std::move(sourceURL));
 1474|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl26evaluatePreparedJavaScriptERKNSt3__110shared_ptrIKNS_3jsi18PreparedJavaScriptEEE:
 1484|     56|    const std::shared_ptr<const jsi::PreparedJavaScript> &js) {
 1485|     56|  assert(
 1486|     56|      dynamic_cast<const HermesPreparedJavaScript *>(js.get()) &&
 1487|     56|      "js must be an instance of HermesPreparedJavaScript");
 1488|      0|  const auto *hermesPrep =
 1489|     56|      static_cast<const HermesPreparedJavaScript *>(js.get());
 1490|     56|  vm::GCScope gcScope(runtime_);
 1491|     56|  auto res = runtime_.runBytecode(
 1492|     56|      hermesPrep->bytecodeProvider(),
 1493|     56|      hermesPrep->runtimeFlags(),
 1494|     56|      hermesPrep->sourceURL(),
 1495|     56|      vm::Runtime::makeNullHandle<vm::Environment>());
 1496|     56|  checkStatus(res.getStatus());
 1497|     56|  return valueFromHermesValue(*res);
 1498|     56|}
_ZN8facebook6hermes17HermesRuntimeImpl18evaluateJavaScriptERKNSt3__110shared_ptrIKNS_3jsi6BufferEEERKNS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1502|     99|    const std::string &sourceURL) {
 1503|     99|  return evaluateJavaScriptWithSourceMap(buffer, nullptr, sourceURL);
 1504|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl6globalEv:
 1516|     99|jsi::Object HermesRuntimeImpl::global() {
 1517|     99|  return add<jsi::Object>(runtime_.getGlobal().getHermesValue());
 1518|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl11cloneStringEPKNS_3jsi7Runtime12PointerValueE:
 1552|     48|    const Runtime::PointerValue *pv) {
 1553|     48|  return clone(pv);
 1554|     48|}
_ZN8facebook6hermes17HermesRuntimeImpl11cloneObjectEPKNS_3jsi7Runtime12PointerValueE:
 1557|    123|    const Runtime::PointerValue *pv) {
 1558|    123|  return clone(pv);
 1559|    123|}
_ZN8facebook6hermes17HermesRuntimeImpl21createStringFromAsciiEPKcm:
 1706|    147|    size_t length) {
 1707|    147|#ifndef NDEBUG
 1708|    534|  for (size_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (1708:22): [True: 387, False: 147]
  ------------------
 1709|    387|    assert(
 1710|    387|        static_cast<unsigned char>(str[i]) < 128 &&
 1711|    387|        "non-ASCII character in string");
 1712|    387|  }
 1713|    147|#endif
 1714|    147|  vm::GCScope gcScope(runtime_);
 1715|    147|  return add<jsi::String>(stringHVFromAscii(str, length));
 1716|    147|}
_ZN8facebook6hermes17HermesRuntimeImpl4utf8ERKNS_3jsi6StringE:
 1725|     48|std::string HermesRuntimeImpl::utf8(const jsi::String &str) {
 1726|     48|  vm::GCScope gcScope(runtime_);
 1727|     48|  vm::Handle<vm::StringPrimitive> handle(
 1728|     48|      runtime_, stringHandle(str)->getString());
 1729|     48|  return toStdString(runtime_, handle);
 1730|     48|}
_ZN8facebook6hermes17HermesRuntimeImpl12createObjectENSt3__110shared_ptrINS_3jsi10HostObjectEEE:
 1749|     99|    std::shared_ptr<jsi::HostObject> ho) {
 1750|     99|  vm::GCScope gcScope(runtime_);
 1751|       |
 1752|     99|  auto objRes = vm::HostObject::createWithoutPrototype(
 1753|     99|      runtime_, std::make_unique<JsiProxy>(*this, ho));
 1754|     99|  checkStatus(objRes.getStatus());
 1755|     99|  return add<jsi::Object>(*objRes);
 1756|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl11getPropertyERKNS_3jsi6ObjectERKNS2_6StringE:
 1838|     48|    const jsi::String &name) {
 1839|     48|  vm::GCScope gcScope(runtime_);
 1840|     48|  auto h = handle(obj);
 1841|     48|  auto res = h->getComputed_RJS(h, runtime_, stringHandle(name));
 1842|     48|  checkStatus(res.getStatus());
 1843|     48|  return valueFromHermesValue(res->get());
 1844|     48|}
_ZN8facebook6hermes17HermesRuntimeImpl16setPropertyValueERKNS_3jsi6ObjectERKNS2_6StringERKNS2_5ValueE:
 1881|     99|    const jsi::Value &value) {
 1882|     99|  vm::GCScope gcScope(runtime_);
 1883|     99|  auto h = handle(obj);
 1884|     99|  checkStatus(h->putComputed_RJS(
 1885|     99|                   h,
 1886|     99|                   runtime_,
 1887|     99|                   stringHandle(name),
 1888|     99|                   vmHandleFromValue(value),
 1889|     99|                   vm::PropOpFlags().plusThrowOnError())
 1890|     99|                  .getStatus());
 1891|     99|}
_ZN8facebook6hermes17HermesRuntimeImpl11checkStatusEN6hermes2vm15ExecutionStatusE:
 2230|    449|void HermesRuntimeImpl::checkStatus(vm::ExecutionStatus status) {
 2231|    449|  if (LLVM_LIKELY(status != vm::ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  188|    449|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 425, False: 24]
  |  |  ------------------
  ------------------
 2232|    425|    return;
 2233|    425|  }
 2234|       |
 2235|     24|  jsi::Value exception = valueFromHermesValue(runtime_.getThrownValue());
 2236|     24|  runtime_.clearThrownValue();
 2237|       |  // Here, we increment the depth to detect recursion in error handling.
 2238|     24|  vm::ScopedNativeDepthTracker depthTracker{runtime_};
 2239|     24|  if (LLVM_LIKELY(!depthTracker.overflowed())) {
  ------------------
  |  |  188|     24|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24, False: 0]
  |  |  ------------------
  ------------------
 2240|     24|    auto ex = jsi::JSError(*this, std::move(exception));
 2241|     24|    LOG_EXCEPTION_CAUSE("JSI rethrowing JS exception: %s", ex.what());
  ------------------
  |  |   73|     24|  do {                           \
  |  |   74|     24|  } while (0)
  |  |  ------------------
  |  |  |  Branch (74:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2242|     24|    throw ex;
 2243|     24|  }
 2244|       |
 2245|      0|  (void)runtime_.raiseStackOverflow(
 2246|      0|      vm::Runtime::StackOverflowKind::NativeStack);
 2247|      0|  exception = valueFromHermesValue(runtime_.getThrownValue());
 2248|      0|  runtime_.clearThrownValue();
 2249|       |  // Here, we give us a little more room so we can call into JS to
 2250|       |  // populate the JSError members.
 2251|      0|  vm::ScopedNativeDepthReducer reducer(runtime_);
 2252|      0|  throw jsi::JSError(*this, std::move(exception));
 2253|     24|}
_ZN8facebook6hermes17HermesRuntimeImpl17stringHVFromAsciiEPKcm:
 2257|    147|    size_t length) {
 2258|    147|  auto strRes = vm::StringPrimitive::createEfficient(
 2259|    147|      runtime_, llvh::makeArrayRef(str, length));
 2260|    147|  checkStatus(strRes.getStatus());
 2261|    147|  return *strRes;
 2262|    147|}
_ZN8facebook6hermes17makeHermesRuntimeERKN6hermes2vm13RuntimeConfigE:
 2327|     99|    const vm::RuntimeConfig &runtimeConfig) {
 2328|       |  // This is insurance against someone adding data members to
 2329|       |  // HermesRuntime.  If on some weird platform it fails, it can be
 2330|       |  // updated or removed.
 2331|     99|  static_assert(
 2332|     99|      sizeof(HermesRuntime) == sizeof(void *),
 2333|     99|      "HermesRuntime should only include a vtable ptr");
 2334|       |
 2335|       |#if defined(HERMESVM_PLATFORM_LOGGING)
 2336|       |  auto ret = std::make_unique<HermesRuntimeImpl>(
 2337|       |      runtimeConfig.rebuild()
 2338|       |          .withGCConfig(runtimeConfig.getGCConfig()
 2339|       |                            .rebuild()
 2340|       |                            .withShouldRecordStats(true)
 2341|       |                            .build())
 2342|       |          .build());
 2343|       |#else
 2344|     99|  auto ret = std::make_unique<HermesRuntimeImpl>(runtimeConfig);
 2345|     99|#endif
 2346|       |
 2347|     99|#ifdef HERMES_ENABLE_DEBUGGER
 2348|       |  // Only HermesRuntime can create a debugger instance.  This requires
 2349|       |  // the setter and not using make_unique, so the call to new is here
 2350|       |  // in this function, which is a friend of debugger::Debugger.
 2351|     99|  ret->setDebugger(std::unique_ptr<debugger::Debugger>(
 2352|     99|      new debugger::Debugger(ret.get(), &(ret->runtime_.getDebugger()))));
 2353|       |#else
 2354|       |  ret->setDebugger(std::make_unique<debugger::Debugger>());
 2355|       |#endif
 2356|       |
 2357|     99|  return ret;
 2358|     99|}
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_14implEPNS0_13HermesRuntimeE:
 1023|    297|inline HermesRuntimeImpl *impl(HermesRuntime *rt) {
 1024|       |  // This is guaranteed safe because HermesRuntime is abstract so
 1025|       |  // cannot be constructed, and the only instances created are
 1026|       |  // HermesRuntimeImpl's created by the factory function.  It's kind
 1027|       |  // of like pimpl, but different.
 1028|       |
 1029|    297|  return static_cast<HermesRuntimeImpl *>(rt);
 1030|    297|}
_ZN8facebook6hermes17HermesRuntimeImpl17vmHandleFromValueERKNS_3jsi5ValueE:
  526|     99|  vm::Handle<> vmHandleFromValue(const jsi::Value &value) {
  527|     99|    if (value.isUndefined()) {
  ------------------
  |  Branch (527:9): [True: 0, False: 99]
  ------------------
  528|      0|      return vm::Runtime::getUndefinedValue();
  529|     99|    } else if (value.isNull()) {
  ------------------
  |  Branch (529:16): [True: 0, False: 99]
  ------------------
  530|      0|      return vm::Runtime::getNullValue();
  531|     99|    } else if (value.isBool()) {
  ------------------
  |  Branch (531:16): [True: 0, False: 99]
  ------------------
  532|      0|      return vm::Runtime::getBoolValue(value.getBool());
  533|     99|    } else if (value.isNumber()) {
  ------------------
  |  Branch (533:16): [True: 0, False: 99]
  ------------------
  534|      0|      return runtime_.makeHandle(
  535|      0|          vm::HermesValue::encodeUntrustedDoubleValue(value.getNumber()));
  536|     99|    } else if (
  537|     99|        value.isSymbol() || value.isBigInt() || value.isString() ||
  ------------------
  |  Branch (537:9): [True: 0, False: 99]
  |  Branch (537:29): [True: 0, False: 99]
  |  Branch (537:49): [True: 0, False: 99]
  ------------------
  538|     99|        value.isObject()) {
  ------------------
  |  Branch (538:9): [True: 99, False: 0]
  ------------------
  539|     99|      return vm::Handle<vm::HermesValue>(&phv(value));
  540|     99|    } else {
  541|      0|      llvm_unreachable("unknown value kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  542|      0|    }
  543|     99|  }
_ZN8facebook6hermes17HermesRuntimeImpl3phvERKNS_3jsi5ValueE:
  468|     99|  static const ::hermes::vm::PinnedHermesValue &phv(const jsi::Value &value) {
  469|     99|    assert(
  470|     99|        dynamic_cast<const HermesPointerValue *>(getPointerValue(value)) &&
  471|     99|        "Pointer does not contain a HermesPointerValue");
  472|      0|    return static_cast<const HermesPointerValue *>(getPointerValue(value))
  473|     99|        ->value();
  474|     99|  }
_ZNK8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE5valueEv:
  891|    441|    const T &value() const {
  892|    441|      assert(!isFree() && "Value not present");
  893|      0|      return value_;
  894|    441|    }
_ZNK8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE6isFreeEv:
  858|  43.8k|    bool isFree() const {
  859|  43.8k|      return refCount_.load(std::memory_order_relaxed) == 0;
  860|  43.8k|    }
_ZN8facebook6hermes17HermesRuntimeImpl3phvERKNS_3jsi7PointerE:
  460|    342|      const jsi::Pointer &pointer) {
  461|    342|    assert(
  462|    342|        dynamic_cast<const HermesPointerValue *>(getPointerValue(pointer)) &&
  463|    342|        "Pointer does not contain a HermesPointerValue");
  464|      0|    return static_cast<const HermesPointerValue *>(getPointerValue(pointer))
  465|    342|        ->value();
  466|    342|  }
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript16bytecodeProviderEv:
 1384|     56|  std::shared_ptr<hbc::BCProvider> bytecodeProvider() const {
 1385|     56|    return bcProvider_;
 1386|     56|  }
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript12runtimeFlagsEv:
 1388|     56|  vm::RuntimeModuleFlags runtimeFlags() const {
 1389|     56|    return runtimeFlags_;
 1390|     56|  }
hermes.cpp:_ZNK8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScript9sourceURLEv:
 1392|     56|  const std::string &sourceURL() const {
 1393|     56|    return sourceURL_;
 1394|     56|  }
_ZN8facebook6hermes17HermesRuntimeImpl20valueFromHermesValueEN6hermes2vm11HermesValueE:
  545|    104|  jsi::Value valueFromHermesValue(vm::HermesValue hv) {
  546|    104|    if (hv.isUndefined() || hv.isEmpty()) {
  ------------------
  |  Branch (546:9): [True: 6, False: 98]
  |  Branch (546:29): [True: 0, False: 98]
  ------------------
  547|      6|      return jsi::Value::undefined();
  548|     98|    } else if (hv.isNull()) {
  ------------------
  |  Branch (548:16): [True: 0, False: 98]
  ------------------
  549|      0|      return nullptr;
  550|     98|    } else if (hv.isBool()) {
  ------------------
  |  Branch (550:16): [True: 0, False: 98]
  ------------------
  551|      0|      return hv.getBool();
  552|     98|    } else if (hv.isDouble()) {
  ------------------
  |  Branch (552:16): [True: 3, False: 95]
  ------------------
  553|      3|      return hv.getDouble();
  554|     95|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (554:16): [True: 0, False: 95]
  ------------------
  555|      0|      return add<jsi::Symbol>(hv);
  556|     95|    } else if (hv.isBigInt()) {
  ------------------
  |  Branch (556:16): [True: 0, False: 95]
  ------------------
  557|      0|      return add<jsi::BigInt>(hv);
  558|     95|    } else if (hv.isString()) {
  ------------------
  |  Branch (558:16): [True: 54, False: 41]
  ------------------
  559|     54|      return add<jsi::String>(hv);
  560|     54|    } else if (hv.isObject()) {
  ------------------
  |  Branch (560:16): [True: 41, False: 0]
  ------------------
  561|     41|      return add<jsi::Object>(hv);
  562|     41|    } else {
  563|      0|      llvm_unreachable("unknown HermesValue type");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  564|      0|    }
  565|    104|  }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEEC2Ev:
  855|  1.58k|    ManagedValue() : refCount_(0) {}
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE10invalidateEv:
  896|    611|    void invalidate() override {
  897|    611|#ifdef ASSERT_ON_DANGLING_VM_REFS
  898|    611|      assert(
  899|    611|          ((1 << 31) & refCount_) == 0 &&
  900|    611|          "This PointerValue was left dangling after the Runtime was destroyed.");
  901|      0|#endif
  902|      0|      dec();
  903|    611|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE3decEv:
  916|    611|    void dec() {
  917|       |      // It is safe to use relaxed operations here because decrementing the
  918|       |      // reference count is the only access that may be performed without proper
  919|       |      // synchronisation. As a result, the only ordering we need to enforce when
  920|       |      // decrementing is that the vtable pointer used to call \c invalidate is
  921|       |      // loaded from before the decrement, in case the decrement ends up causing
  922|       |      // this value to be freed. We get this ordering from the fact that the
  923|       |      // vtable read and the reference count update form a load-store control
  924|       |      // dependency, which preserves their ordering on any reasonable hardware.
  925|    611|      auto oldCount = refCount_.fetch_sub(1, std::memory_order_relaxed);
  926|    611|      assert(oldCount > 0 && "Ref count underflow");
  927|      0|      (void)oldCount;
  928|    611|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE11setNextFreeEPS6_:
  881|  3.16k|    void setNextFree(ManagedValue<T> *nextFree) {
  882|  3.16k|      assert(isFree() && "Free pointer unusuable while occupied");
  883|      0|      nextFree_ = nextFree;
  884|  3.16k|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE11getNextFreeEv:
  874|  8.80k|    ManagedValue<T> *getNextFree() {
  875|  8.80k|      assert(isFree() && "Free pointer unusuable while occupied");
  876|      0|      return nextFree_;
  877|  8.80k|    }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE7emplaceIJRNS4_11HermesValueEEEEvDpOT_:
  866|    440|    void emplace(Args &&...args) {
  867|    440|      assert(isFree() && "Emplacing already occupied value");
  868|      0|      refCount_.store(1, std::memory_order_relaxed);
  869|    440|      new (&value_) T(std::forward<Args>(args)...);
  870|    440|    }
_ZN8facebook6hermes17HermesRuntimeImpl5cloneEPKNS_3jsi7Runtime12PointerValueE:
  986|    171|  HermesPointerValue *clone(const Runtime::PointerValue *pv) {
  987|    171|    if (!pv) {
  ------------------
  |  Branch (987:9): [True: 0, False: 171]
  ------------------
  988|      0|      return nullptr;
  989|      0|    }
  990|       |    // These are only ever allocated by us, so we can remove their constness
  991|    171|    auto result = static_cast<HermesPointerValue *>(
  992|    171|        const_cast<Runtime::PointerValue *>(pv));
  993|    171|    result->inc();
  994|    171|    return result;
  995|    171|  }
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE3incEv:
  905|    171|    void inc() {
  906|       |      // It is always safe to use relaxed operations for incrementing the
  907|       |      // reference count, because the only operation that may occur concurrently
  908|       |      // with it is decrementing the reference count, and we do not need to
  909|       |      // enforce any ordering between the two.
  910|    171|      auto oldCount = refCount_.fetch_add(1, std::memory_order_relaxed);
  911|    171|      assert(oldCount && "Cannot resurrect a pointer");
  912|      0|      assert(oldCount + 1 != 0 && "Ref count overflow");
  913|      0|      (void)oldCount;
  914|    171|    }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_111toStdStringERN6hermes2vm7RuntimeENS3_6HandleINS3_15StringPrimitiveEEE:
 1632|     48|    vm::Handle<vm::StringPrimitive> handle) {
 1633|     48|  auto view = vm::StringPrimitive::createStringView(runtime, handle);
 1634|     48|  vm::SmallU16String<32> allocator;
 1635|     48|  std::string ret;
 1636|     48|  ::hermes::convertUTF16ToUTF8WithReplacements(
 1637|     48|      ret, view.getUTF16Ref(allocator));
 1638|     48|  return ret;
 1639|     48|}
_ZN8facebook6hermes17HermesRuntimeImpl12stringHandleERKNS_3jsi6StringE:
  477|    195|      const jsi::String &str) {
  478|    195|    return ::hermes::vm::Handle<::hermes::vm::HermesValue>::vmcast(&phv(str));
  479|    195|  }
_ZN8facebook6hermes17HermesRuntimeImpl6handleERKNS_3jsi6ObjectE:
  482|    147|      const jsi::Object &obj) {
  483|    147|    return ::hermes::vm::Handle<::hermes::vm::JSObject>::vmcast(&phv(obj));
  484|    147|  }
_ZN8facebook6hermes17HermesRuntimeImpl11setDebuggerENSt3__110unique_ptrINS0_8debugger8DebuggerENS2_14default_deleteIS5_EEEE:
  248|     99|  void setDebugger(std::unique_ptr<debugger::Debugger> d) {
  249|     99|    debugger_ = std::move(d);
  250|     99|  }
_ZN8facebook6hermes17HermesRuntimeImplD2Ev:
  239|     99|  ~HermesRuntimeImpl() override {
  240|     99|#ifdef HERMES_ENABLE_DEBUGGER
  241|       |    // Deallocate the debugger so it frees any HermesPointerValues it may hold.
  242|       |    // This must be done before we check hermesValues_ below.
  243|     99|    debugger_.reset();
  244|     99|#endif
  245|     99|  }
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm8WeakRootINS4_8JSObjectEEEED2Ev:
  967|     99|    ~ManagedValues() {
  968|     99|      ::hermes::ManagedChunkedList<ManagedValue<T>>::collect();
  969|     99|      bool empty = true;
  970|     99|      ::hermes::ManagedChunkedList<ManagedValue<T>>::forEach(
  971|     99|          [&empty](ManagedValue<T> &element) {
  972|     99|            element.markDangling();
  973|     99|            empty = false;
  974|     99|          });
  975|     99|      if (!empty) {
  ------------------
  |  Branch (975:11): [True: 0, False: 99]
  ------------------
  976|       |        // This is the deliberate memory leak described above.
  977|      0|        new ::hermes::ManagedChunkedList(std::move(*this));
  978|      0|      }
  979|     99|    }
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm17PinnedHermesValueEED2Ev:
  967|     99|    ~ManagedValues() {
  968|     99|      ::hermes::ManagedChunkedList<ManagedValue<T>>::collect();
  969|     99|      bool empty = true;
  970|     99|      ::hermes::ManagedChunkedList<ManagedValue<T>>::forEach(
  971|     99|          [&empty](ManagedValue<T> &element) {
  972|     99|            element.markDangling();
  973|     99|            empty = false;
  974|     99|          });
  975|     99|      if (!empty) {
  ------------------
  |  Branch (975:11): [True: 0, False: 99]
  ------------------
  976|       |        // This is the deliberate memory leak described above.
  977|      0|        new ::hermes::ManagedChunkedList(std::move(*this));
  978|      0|      }
  979|     99|    }
_ZN8facebook6hermes17HermesRuntimeImpl3addINS_3jsi6StringEEET_N6hermes2vm11HermesValueE:
  253|    201|  T add(::hermes::vm::HermesValue hv) {
  254|    201|    static_assert(
  255|    201|        std::is_base_of<jsi::Pointer, T>::value, "this type cannot be added");
  256|    201|    return make<T>(&hermesValues_.add(hv));
  257|    201|  }
_ZN8facebook6hermes17HermesRuntimeImpl3addINS_3jsi6ObjectEEET_N6hermes2vm11HermesValueE:
  253|    239|  T add(::hermes::vm::HermesValue hv) {
  254|    239|    static_assert(
  255|    239|        std::is_base_of<jsi::Pointer, T>::value, "this type cannot be added");
  256|    239|    return make<T>(&hermesValues_.add(hv));
  257|    239|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_113BufferAdapterC2ENSt3__110shared_ptrIKNS_3jsi6BufferEEE:
 1170|     99|  BufferAdapter(std::shared_ptr<const jsi::Buffer> buf) : buf_(std::move(buf)) {
 1171|     99|    data_ = buf_->data();
 1172|     99|    size_ = buf_->size();
 1173|     99|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_124HermesPreparedJavaScriptC2ENSt3__110unique_ptrIN6hermes3hbc14BCProviderBaseENS3_14default_deleteIS7_EEEENS5_2vm18RuntimeModuleFlagsENS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
 1382|     56|        sourceURL_(std::move(sourceURL)) {}
_ZN8facebook6hermes17HermesRuntimeImpl8JsiProxyC2ERS1_NSt3__110shared_ptrINS_3jsi10HostObjectEEE:
  700|     99|        : rt_(rt), ho_(ho) {}
_ZN8facebook6hermes17HermesRuntimeImplC2ERKN6hermes2vm13RuntimeConfigE:
  166|     99|        vmExperimentFlags_(runtimeConfig.getVMExperimentFlags()) {
  167|     99|#ifdef HERMES_ENABLE_DEBUGGER
  168|     99|    compileFlags_.debug = true;
  169|     99|#endif
  170|       |
  171|     99|    switch (runtimeConfig.getCompilationMode()) {
  ------------------
  |  Branch (171:13): [True: 0, False: 99]
  ------------------
  172|     99|      case vm::SmartCompilation:
  ------------------
  |  Branch (172:7): [True: 99, False: 0]
  ------------------
  173|     99|        compileFlags_.lazy = true;
  174|       |        // (Leaves thresholds at default values)
  175|     99|        break;
  176|      0|      case vm::ForceEagerCompilation:
  ------------------
  |  Branch (176:7): [True: 0, False: 99]
  ------------------
  177|      0|        compileFlags_.lazy = false;
  178|      0|        break;
  179|      0|      case vm::ForceLazyCompilation:
  ------------------
  |  Branch (179:7): [True: 0, False: 99]
  ------------------
  180|      0|        compileFlags_.lazy = true;
  181|      0|        compileFlags_.preemptiveFileCompilationThreshold = 0;
  182|      0|        compileFlags_.preemptiveFunctionCompilationThreshold = 0;
  183|      0|        break;
  184|     99|    }
  185|       |
  186|     99|    compileFlags_.enableGenerator = runtimeConfig.getEnableGenerator();
  187|     99|    compileFlags_.emitAsyncBreakCheck = defaultEmitAsyncBreakCheck_ =
  188|     99|        runtimeConfig.getAsyncBreakCheckInEval();
  189|     99|    runtime_.addCustomRootsFunction(
  190|     99|        [this](vm::GC *, vm::RootAcceptor &acceptor) {
  191|     99|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  192|     99|            acceptor.accept(element.value());
  193|     99|          });
  194|     99|        });
  195|     99|    runtime_.addCustomWeakRootsFunction(
  196|     99|        [this](vm::GC *, vm::WeakRootAcceptor &acceptor) {
  197|     99|          weakHermesValues_.forEach([&acceptor](WeakRefPointerValue &element) {
  198|     99|            acceptor.acceptWeak(element.value());
  199|     99|          });
  200|     99|        });
  201|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
  202|     99|    runtime_.addCustomSnapshotFunction(
  203|     99|        [this](vm::HeapSnapshot &snap) {
  204|     99|          snap.beginNode();
  205|     99|          snap.endNode(
  206|     99|              vm::HeapSnapshot::NodeType::Native,
  207|     99|              "ManagedValues",
  208|     99|              vm::GCBase::IDTracker::reserved(
  209|     99|                  vm::GCBase::IDTracker::ReservedObjectID::JSIHermesValueList),
  210|     99|              hermesValues_.capacity() * sizeof(HermesPointerValue),
  211|     99|              0);
  212|     99|          snap.beginNode();
  213|     99|          snap.endNode(
  214|     99|              vm::HeapSnapshot::NodeType::Native,
  215|     99|              "ManagedValues",
  216|     99|              vm::GCBase::IDTracker::reserved(
  217|     99|                  vm::GCBase::IDTracker::ReservedObjectID::
  218|     99|                      JSIWeakHermesValueList),
  219|     99|              weakHermesValues_.capacity() * sizeof(WeakRefPointerValue),
  220|     99|              0);
  221|     99|        },
  222|     99|        [](vm::HeapSnapshot &snap) {
  223|     99|          snap.addNamedEdge(
  224|     99|              vm::HeapSnapshot::EdgeType::Internal,
  225|     99|              "hermesValues",
  226|     99|              vm::GCBase::IDTracker::reserved(
  227|     99|                  vm::GCBase::IDTracker::ReservedObjectID::JSIHermesValueList));
  228|     99|          snap.addNamedEdge(
  229|     99|              vm::HeapSnapshot::EdgeType::Internal,
  230|     99|              "weakHermesValues",
  231|     99|              vm::GCBase::IDTracker::reserved(
  232|     99|                  vm::GCBase::IDTracker::ReservedObjectID::
  233|     99|                      JSIWeakHermesValueList));
  234|     99|        });
  235|     99|#endif // HERMES_MEMORY_INSTRUMENTATION
  236|     99|  }
hermes.cpp:_ZN8facebook6hermes12_GLOBAL__N_130InstallHermesFatalErrorHandlerC2Ev:
  135|     99|  InstallHermesFatalErrorHandler() {
  136|       |    // The LLVM fatal error handler can only be installed once. Use a Meyer's
  137|       |    // singleton to guarantee it - the static "dummy" is guaranteed by the
  138|       |    // compiler to be initialized no more than once.
  139|     99|    static int dummy = ([]() {
  140|     99|      llvh::install_fatal_error_handler(detail::hermesFatalErrorHandler);
  141|     99|      return 0;
  142|     99|    })();
  143|     99|    (void)dummy;
  144|     99|  }
hermes.cpp:_ZZN8facebook6hermes12_GLOBAL__N_130InstallHermesFatalErrorHandlerC1EvENKUlvE_clEv:
  139|      1|    static int dummy = ([]() {
  140|      1|      llvh::install_fatal_error_handler(detail::hermesFatalErrorHandler);
  141|      1|      return 0;
  142|      1|    })();
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm17PinnedHermesValueEEC2Ed:
  957|     99|              kSizingWeight_) {}
_ZN8facebook6hermes17HermesRuntimeImpl13ManagedValuesIN6hermes2vm8WeakRootINS4_8JSObjectEEEEC2Ed:
  957|     99|              kSizingWeight_) {}
_ZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_12RootAcceptorEE_clES8_SA_:
  190|  1.18k|        [this](vm::GC *, vm::RootAcceptor &acceptor) {
  191|  1.18k|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  192|  1.18k|            acceptor.accept(element.value());
  193|  1.18k|          });
  194|  1.18k|        });
_ZZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_12RootAcceptorEE_clES8_SA_ENKUlRNS1_12ManagedValueINS3_17PinnedHermesValueEEEE_clESF_:
  191|     12|          hermesValues_.forEach([&acceptor](HermesPointerValue &element) {
  192|     12|            acceptor.accept(element.value());
  193|     12|          });
_ZN8facebook6hermes17HermesRuntimeImpl12ManagedValueIN6hermes2vm17PinnedHermesValueEE5valueEv:
  886|     12|    T &value() {
  887|     12|      assert(!isFree() && "Value not present");
  888|      0|      return value_;
  889|     12|    }
_ZZN8facebook6hermes17HermesRuntimeImplC1ERKN6hermes2vm13RuntimeConfigEENKUlPNS3_7HadesGCERNS3_16WeakRootAcceptorEE_clES8_SA_:
  196|  1.18k|        [this](vm::GC *, vm::WeakRootAcceptor &acceptor) {
  197|  1.18k|          weakHermesValues_.forEach([&acceptor](WeakRefPointerValue &element) {
  198|  1.18k|            acceptor.acceptWeak(element.value());
  199|  1.18k|          });
  200|  1.18k|        });

_ZN8facebook6hermes13HermesRuntimeC2Ev:
  214|     99|  HermesRuntime() = default;

_ZN8facebook3jsi15InstrumentationD2Ev:
   28|     99|  virtual ~Instrumentation() = default;

_ZNK8facebook3jsi6Object11setPropertyIS1_EEvRNS0_7RuntimeEPKcOT_:
  114|     99|void Object::setProperty(Runtime& runtime, const char* name, T&& value) const {
  115|     99|  setProperty(
  116|     99|      runtime, String::createFromAscii(runtime, name), std::forward<T>(value));
  117|     99|}
_ZNK8facebook3jsi6Object11setPropertyIS1_EEvRNS0_7RuntimeERKNS0_6StringEOT_:
  121|     99|    const {
  122|     99|  setPropertyValue(
  123|     99|      runtime, name, detail::toValue(runtime, std::forward<T>(value)));
  124|     99|}
_ZN8facebook3jsi6detail7toValueINS0_6ObjectEEENS0_5ValueERNS0_7RuntimeERKT_:
   36|     99|inline Value toValue(Runtime& runtime, const T& other) {
   37|     99|  static_assert(
   38|     99|      std::is_base_of<Pointer, T>::value,
   39|     99|      "This type cannot be converted to Value");
   40|     99|  return Value(runtime, other);
   41|     99|}
_ZN8facebook3jsi7Runtime15getPointerValueERKNS0_7PointerE:
   78|    684|    const jsi::Pointer& pointer) {
   79|    684|  return pointer.ptr_;
   80|    684|}
_ZN8facebook3jsi7Runtime15getPointerValueERKNS0_5ValueE:
   83|    198|    const jsi::Value& value) {
   84|    198|  return value.data_.pointer.ptr_;
   85|    198|}
_ZNK8facebook3jsi6Object11getPropertyERNS0_7RuntimeEPKc:
   87|     48|inline Value Object::getProperty(Runtime& runtime, const char* name) const {
   88|     48|  return getProperty(runtime, String::createFromAscii(runtime, name));
   89|     48|}
_ZNK8facebook3jsi6Object11getPropertyERNS0_7RuntimeERKNS0_6StringE:
   91|     48|inline Value Object::getProperty(Runtime& runtime, const String& name) const {
   92|     48|  return runtime.getProperty(*this, name);
   93|     48|}
_ZN8facebook3jsi7Runtime4makeINS0_6StringEEET_PNS1_12PointerValueE:
   69|    201|inline T Runtime::make(Runtime::PointerValue* pv) {
   70|    201|  return T(pv);
   71|    201|}
_ZN8facebook3jsi7Runtime4makeINS0_6ObjectEEET_PNS1_12PointerValueE:
   69|    239|inline T Runtime::make(Runtime::PointerValue* pv) {
   70|    239|  return T(pv);
   71|    239|}

_ZN8facebook3jsi6BufferD2Ev:
   67|     99|Buffer::~Buffer() = default;
_ZN8facebook3jsi18PreparedJavaScriptD2Ev:
   71|     56|PreparedJavaScript::~PreparedJavaScript() = default;
_ZN8facebook3jsi10HostObjectD2Ev:
   84|     99|HostObject::~HostObject() {}
_ZN8facebook3jsi7RuntimeD2Ev:
   88|     99|Runtime::~Runtime() {}
_ZN8facebook3jsi5ValueC2EOS1_:
  221|     24|Value::Value(Value&& other) : Value(other.kind_) {
  222|     24|  if (kind_ == BooleanKind) {
  ------------------
  |  Branch (222:7): [True: 0, False: 24]
  ------------------
  223|      0|    data_.boolean = other.data_.boolean;
  224|     24|  } else if (kind_ == NumberKind) {
  ------------------
  |  Branch (224:14): [True: 0, False: 24]
  ------------------
  225|      0|    data_.number = other.data_.number;
  226|     24|  } else if (kind_ >= PointerKind) {
  ------------------
  |  Branch (226:14): [True: 24, False: 0]
  ------------------
  227|     24|    new (&data_.pointer) Pointer(std::move(other.data_.pointer));
  228|     24|  }
  229|       |  // when the other's dtor runs, nothing will happen.
  230|     24|  other.kind_ = UndefinedKind;
  231|     24|}
_ZN8facebook3jsi5ValueD2Ev:
  252|    326|Value::~Value() {
  253|    326|  if (kind_ >= PointerKind) {
  ------------------
  |  Branch (253:7): [True: 194, False: 132]
  ------------------
  254|    194|    data_.pointer.~Pointer();
  255|    194|  }
  256|    326|}
_ZN8facebook3jsi7JSErrorC2ERNS0_7RuntimeEONS0_5ValueE:
  421|     24|JSError::JSError(Runtime& rt, Value&& value) {
  422|     24|  setValue(rt, std::move(value));
  423|     24|}
_ZN8facebook3jsi7JSError8setValueERNS0_7RuntimeEONS0_5ValueE:
  453|     24|void JSError::setValue(Runtime& rt, Value&& value) {
  454|     24|  value_ = std::make_shared<Value>(std::move(value));
  455|       |
  456|     24|  if ((message_.empty() || stack_.empty()) && value_->isObject()) {
  ------------------
  |  Branch (456:8): [True: 24, False: 0]
  |  Branch (456:28): [True: 0, False: 0]
  |  Branch (456:47): [True: 24, False: 0]
  ------------------
  457|     24|    auto obj = value_->getObject(rt);
  458|       |
  459|     24|    if (message_.empty()) {
  ------------------
  |  Branch (459:9): [True: 24, False: 0]
  ------------------
  460|     24|      try {
  461|     24|        Value message = obj.getProperty(rt, "message");
  462|     24|        if (!message.isUndefined() && !message.isString()) {
  ------------------
  |  Branch (462:13): [True: 24, False: 0]
  |  Branch (462:39): [True: 0, False: 24]
  ------------------
  463|      0|          message = callGlobalFunction(rt, "String", message);
  464|      0|        }
  465|     24|        if (message.isString()) {
  ------------------
  |  Branch (465:13): [True: 24, False: 0]
  ------------------
  466|     24|          message_ = message.getString(rt).utf8(rt);
  467|     24|        } else if (!message.isUndefined()) {
  ------------------
  |  Branch (467:20): [True: 0, False: 0]
  ------------------
  468|      0|          message_ = "String(e.message) is a " + kindToString(message, &rt);
  469|      0|        }
  470|     24|      } catch (const JSIException& ex) {
  471|      0|        message_ = std::string("[Exception while creating message string: ") +
  472|      0|            ex.what() + "]";
  473|      0|      }
  474|     24|    }
  475|       |
  476|     24|    if (stack_.empty()) {
  ------------------
  |  Branch (476:9): [True: 24, False: 0]
  ------------------
  477|     24|      try {
  478|     24|        Value stack = obj.getProperty(rt, "stack");
  479|     24|        if (!stack.isUndefined() && !stack.isString()) {
  ------------------
  |  Branch (479:13): [True: 24, False: 0]
  |  Branch (479:37): [True: 0, False: 24]
  ------------------
  480|      0|          stack = callGlobalFunction(rt, "String", stack);
  481|      0|        }
  482|     24|        if (stack.isString()) {
  ------------------
  |  Branch (482:13): [True: 24, False: 0]
  ------------------
  483|     24|          stack_ = stack.getString(rt).utf8(rt);
  484|     24|        } else if (!stack.isUndefined()) {
  ------------------
  |  Branch (484:20): [True: 0, False: 0]
  ------------------
  485|      0|          stack_ = "String(e.stack) is a " + kindToString(stack, &rt);
  486|      0|        }
  487|     24|      } catch (const JSIException& ex) {
  488|      0|        message_ = std::string("[Exception while creating stack string: ") +
  489|      0|            ex.what() + "]";
  490|      0|      }
  491|     24|    }
  492|     24|  }
  493|       |
  494|     24|  if (message_.empty()) {
  ------------------
  |  Branch (494:7): [True: 0, False: 24]
  ------------------
  495|      0|    try {
  496|      0|      if (value_->isString()) {
  ------------------
  |  Branch (496:11): [True: 0, False: 0]
  ------------------
  497|      0|        message_ = value_->getString(rt).utf8(rt);
  498|      0|      } else {
  499|      0|        Value message = callGlobalFunction(rt, "String", *value_);
  500|      0|        if (message.isString()) {
  ------------------
  |  Branch (500:13): [True: 0, False: 0]
  ------------------
  501|      0|          message_ = message.getString(rt).utf8(rt);
  502|      0|        } else {
  503|      0|          message_ = "String(e) is a " + kindToString(message, &rt);
  504|      0|        }
  505|      0|      }
  506|      0|    } catch (const JSIException& ex) {
  507|      0|      message_ = std::string("[Exception while creating message string: ") +
  508|      0|          ex.what() + "]";
  509|      0|    }
  510|      0|  }
  511|       |
  512|     24|  if (stack_.empty()) {
  ------------------
  |  Branch (512:7): [True: 0, False: 24]
  ------------------
  513|      0|    stack_ = "no stack";
  514|      0|  }
  515|       |
  516|     24|  if (what_.empty()) {
  ------------------
  |  Branch (516:7): [True: 24, False: 0]
  ------------------
  517|     24|    what_ = message_ + "\n\n" + stack_;
  518|     24|  }
  519|     24|}
_ZN8facebook3jsi12JSIExceptionD2Ev:
  521|     91|JSIException::~JSIException() {}
_ZN8facebook3jsi7JSErrorD2Ev:
  525|     48|JSError::~JSError() {}

_ZN8facebook3jsi6Object20createFromHostObjectERNS0_7RuntimeENSt3__110shared_ptrINS0_10HostObjectEEE:
  662|     99|      std::shared_ptr<HostObject> ho) {
  663|     99|    return runtime.createObject(ho);
  664|     99|  }
_ZN8facebook3jsi7PointerD2Ev:
  410|    706|  ~Pointer() {
  411|    706|    if (ptr_) {
  ------------------
  |  Branch (411:9): [True: 611, False: 95]
  ------------------
  412|    611|      ptr_->invalidate();
  413|    611|    }
  414|    706|  }
_ZN8facebook3jsi6String15createFromAsciiERNS0_7RuntimeEPKc:
  606|    147|  static String createFromAscii(Runtime& runtime, const char* str) {
  607|    147|    return createFromAscii(runtime, str, strlen(str));
  608|    147|  }
_ZN8facebook3jsi6String15createFromAsciiERNS0_7RuntimeEPKcm:
  600|    147|  createFromAscii(Runtime& runtime, const char* str, size_t length) {
  601|    147|    return runtime.createStringFromAscii(str, length);
  602|    147|  }
_ZN8facebook3jsi5ValueC2INS0_6StringEEEOT_:
 1102|     54|  /* implicit */ Value(T&& other) : Value(kindOf(other)) {
 1103|     54|    static_assert(
 1104|     54|        std::is_base_of<Symbol, T>::value ||
 1105|     54|            std::is_base_of<BigInt, T>::value ||
 1106|     54|            std::is_base_of<String, T>::value ||
 1107|     54|            std::is_base_of<Object, T>::value,
 1108|     54|        "Value cannot be implicitly move-constructed from this type");
 1109|     54|    new (&data_.pointer) T(std::move(other));
 1110|     54|  }
_ZN8facebook3jsi5Value6kindOfERKNS0_6StringE:
 1356|     54|  constexpr static ValueKind kindOf(const String&) {
 1357|     54|    return StringKind;
 1358|     54|  }
_ZN8facebook3jsi5ValueC2ENS1_9ValueKindE:
 1348|    326|  Value(ValueKind kind) : kind_(kind) {}
_ZN8facebook3jsi5Value4DataC2Ev:
 1334|    326|    Data() {
 1335|    326|      static_assert(
 1336|    326|          sizeof(Data) == sizeof(uint64_t),
 1337|    326|          "Value data should fit in a 64-bit register");
 1338|    326|    }
_ZN8facebook3jsi6StringC2EOS1_:
  594|     54|  String(String&& other) = default;
_ZN8facebook3jsi7PointerC2EOS1_:
  406|    119|  explicit Pointer(Pointer&& other) : ptr_(other.ptr_) {
  407|    119|    other.ptr_ = nullptr;
  408|    119|  }
_ZNK8facebook3jsi6Object16setPropertyValueERNS0_7RuntimeERKNS0_6StringERKNS0_5ValueE:
  841|     99|      const Value& value) const {
  842|     99|    return runtime.setPropertyValue(*this, name, value);
  843|     99|  }
_ZN8facebook3jsi5ValueC2ERNS0_7RuntimeERKNS0_6ObjectE:
 1139|     99|  Value(Runtime& runtime, const Object& obj) : Value(ObjectKind) {
 1140|     99|    new (&data_.pointer) Object(runtime.cloneObject(obj.ptr_));
 1141|     99|  }
_ZN8facebook3jsi7PointerC2EPNS0_7Runtime12PointerValueE:
  421|    611|  explicit Pointer(Runtime::PointerValue* ptr) : ptr_(ptr) {}
_ZN8facebook3jsi12StringBufferC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
   47|     99|  StringBuffer(std::string s) : s_(std::move(s)) {}
_ZNK8facebook3jsi12StringBuffer4sizeEv:
   48|    142|  size_t size() const override {
   49|    142|    return s_.size();
   50|    142|  }
_ZNK8facebook3jsi12StringBuffer4dataEv:
   51|    142|  const uint8_t* data() const override {
   52|    142|    return reinterpret_cast<const uint8_t*>(s_.data());
   53|    142|  }
_ZNK8facebook3jsi6String4utf8ERNS0_7RuntimeE:
  638|     48|  std::string utf8(Runtime& runtime) const {
  639|     48|    return runtime.utf8(*this);
  640|     48|  }
_ZN8facebook3jsi5ValueC2Ev:
 1080|    105|  Value() : Value(UndefinedKind) {}
_ZN8facebook3jsi5ValueC2Ed:
 1091|      3|  /* implicit */ Value(double d) : Value(NumberKind) {
 1092|      3|    data_.number = d;
 1093|      3|  }
_ZN8facebook3jsi5Value9undefinedEv:
 1157|      6|  static Value undefined() {
 1158|      6|    return Value();
 1159|      6|  }
_ZNK8facebook3jsi5Value11isUndefinedEv:
 1182|    147|  bool isUndefined() const {
 1183|    147|    return kind_ == UndefinedKind;
 1184|    147|  }
_ZNK8facebook3jsi5Value6isNullEv:
 1186|     99|  bool isNull() const {
 1187|     99|    return kind_ == NullKind;
 1188|     99|  }
_ZNK8facebook3jsi5Value6isBoolEv:
 1190|     99|  bool isBool() const {
 1191|     99|    return kind_ == BooleanKind;
 1192|     99|  }
_ZNK8facebook3jsi5Value8isNumberEv:
 1194|     99|  bool isNumber() const {
 1195|     99|    return kind_ == NumberKind;
 1196|     99|  }
_ZNK8facebook3jsi5Value8isStringEv:
 1198|    243|  bool isString() const {
 1199|    243|    return kind_ == StringKind;
 1200|    243|  }
_ZNK8facebook3jsi5Value8isBigIntEv:
 1202|     99|  bool isBigInt() const {
 1203|     99|    return kind_ == BigIntKind;
 1204|     99|  }
_ZNK8facebook3jsi5Value8isSymbolEv:
 1206|     99|  bool isSymbol() const {
 1207|     99|    return kind_ == SymbolKind;
 1208|     99|  }
_ZNK8facebook3jsi5Value8isObjectEv:
 1210|    147|  bool isObject() const {
 1211|    147|    return kind_ == ObjectKind;
 1212|    147|  }
_ZNKR8facebook3jsi5Value9getStringERNS0_7RuntimeE:
 1275|     48|  String getString(Runtime& runtime) const& {
 1276|     48|    assert(isString());
 1277|      0|    return String(runtime.cloneString(data_.pointer.ptr_));
 1278|     48|  }
_ZNKR8facebook3jsi5Value9getObjectERNS0_7RuntimeE:
 1295|     24|  Object getObject(Runtime& runtime) const& {
 1296|     24|    assert(isObject());
 1297|      0|    return Object(runtime.cloneObject(data_.pointer.ptr_));
 1298|     24|  }
_ZN8facebook3jsi5Value4DataD2Ev:
 1339|    326|    ~Data() {}
_ZN8facebook3jsi5Value6kindOfERKNS0_6ObjectE:
 1359|     41|  constexpr static ValueKind kindOf(const Object&) {
 1360|     41|    return ObjectKind;
 1361|     41|  }
_ZN8facebook3jsi12JSIExceptionC2Ev:
 1414|     24|  JSIException(){};
_ZN8facebook3jsi12JSIExceptionC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1415|     43|  JSIException(std::string what) : what_(std::move(what)){};
_ZN8facebook3jsi18JSINativeExceptionC2ENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1434|     43|  JSINativeException(std::string what) : JSIException(std::move(what)) {}
_ZN8facebook3jsi7Runtime12PointerValueD2Ev:
  287|  1.58k|    virtual ~PointerValue() = default;
_ZN8facebook3jsi7JSErrorC2ERKS1_:
 1467|     24|  JSError(const JSError&) = default;
_ZN8facebook3jsi12JSIExceptionC2ERKS1_:
 1418|     24|  JSIException(const JSIException&) = default;
_ZN8facebook3jsi5ValueC2INS0_6ObjectEEEOT_:
 1102|     41|  /* implicit */ Value(T&& other) : Value(kindOf(other)) {
 1103|     41|    static_assert(
 1104|     41|        std::is_base_of<Symbol, T>::value ||
 1105|     41|            std::is_base_of<BigInt, T>::value ||
 1106|     41|            std::is_base_of<String, T>::value ||
 1107|     41|            std::is_base_of<Object, T>::value,
 1108|     41|        "Value cannot be implicitly move-constructed from this type");
 1109|     41|    new (&data_.pointer) T(std::move(other));
 1110|     41|  }
_ZN8facebook3jsi6ObjectC2EOS1_:
  654|     41|  Object(Object&& other) = default;
_ZN8facebook3jsi18PreparedJavaScriptC2Ev:
   77|     56|  PreparedJavaScript() = default;

dtoa_alloc_init:
  579|  4.04k|dtoa_alloc *dtoa_alloc_init(void *mem, int bytelen) {
  580|  4.04k|	dtoa_alloc *dalloc = (dtoa_alloc *)mem;
  581|  4.04k|	int pmem_len = (bytelen - sizeof(dtoa_alloc)) / sizeof(double) + 1;
  582|  4.04k|	assert(pmem_len > 0 && "dtoa_alloc_init bytelen is too small");
  583|  4.04k|	dalloc_init(dalloc, pmem_len);
  584|  4.04k|	return dalloc;
  585|  4.04k|}
dtoa_alloc_done:
  587|  4.04k|void dtoa_alloc_done(dtoa_alloc *dalloc) {
  588|  4.04k|	dalloc_done(dalloc);
  589|  4.04k|}
hermes_g_strtod:
 3610|  12.3k|{
 3611|  12.3k|	DECL_DALLOC(dalloc, PRIVATE_mem);
  ------------------
  |  |  543|  12.3k|	struct { \
  |  |  544|  12.3k|		dtoa_alloc h; \
  |  |  545|  12.3k|		double mem[(len)-1]; \
  |  |  546|  12.3k|	} name
  ------------------
 3612|  12.3k|	dalloc_init(&dalloc.h, PRIVATE_mem);
  ------------------
  |  |  219|  12.3k|#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
  |  |  ------------------
  |  |  |  |  217|  12.3k|#define PRIVATE_MEM 2304
  |  |  ------------------
  ------------------
 3613|  12.3k|	double res = _hermes_g_strtod(&dalloc.h, s00, se);
 3614|  12.3k|	dalloc_done(&dalloc.h);
 3615|  12.3k|	return res;
 3616|  12.3k|}
g_freedtoa:
 3673|  4.04k|{
 3674|  4.04k|	Bigint *b = (Bigint *)((int *)s - 1);
 3675|  4.04k|	b->maxwds = 1 << (b->k = *(int*)b);
 3676|  4.04k|	Bfree(dalloc, b);
 3677|       |#ifndef MULTIPLE_THREADS
 3678|       |	if (s == dtoa_result)
 3679|       |		dtoa_result = 0;
 3680|       |#endif
 3681|  4.04k|	}
dtoa.c:dalloc_init:
  548|  16.3k|static void dalloc_init(dtoa_alloc *dalloc, int pmem_len) {
  549|  16.3k|	memset(dalloc, 0, sizeof(dtoa_alloc));
  550|  16.3k|	dalloc->pmem_len = pmem_len;
  551|  16.3k|	dalloc->pmem_next = dalloc->private_mem;
  552|  16.3k|}
dtoa.c:dalloc_done:
  554|  16.3k|static void dalloc_done(dtoa_alloc *dalloc) {
  555|  16.3k|	char *pmem, *pmem_end;
  556|       |
  557|  16.3k|	if (!dalloc->used_heap)
  ------------------
  |  Branch (557:6): [True: 16.3k, False: 0]
  ------------------
  558|  16.3k|		return;
  559|       |
  560|      0|	pmem = (char *)dalloc->private_mem;
  561|      0|	pmem_end = (char *)(dalloc->private_mem + dalloc->pmem_len);
  562|       |
  563|      0|	for(int i = 0; i < Kmax+1; ++i) {
  ------------------
  |  |  516|      0|#define Kmax 7
  ------------------
  |  Branch (563:17): [True: 0, False: 0]
  ------------------
  564|      0|		Bigint *p = dalloc->freelist[i];
  565|      0|		while (p) {
  ------------------
  |  Branch (565:10): [True: 0, False: 0]
  ------------------
  566|      0|			char *tf = (char *)p;
  567|      0|			p = p->next;
  568|      0|			if (tf >= pmem && tf < pmem_end)
  ------------------
  |  Branch (568:8): [True: 0, False: 0]
  |  Branch (568:22): [True: 0, False: 0]
  ------------------
  569|      0|				continue;
  570|       |#ifdef FREE
  571|       |			FREE((void*)tf);
  572|       |#else
  573|      0|			free((void*)tf);
  574|      0|#endif
  575|      0|		}
  576|      0|	}
  577|      0|}
dtoa.c:_hermes_g_strtod:
 2537|  12.3k|{
 2538|  12.3k|	int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
 2539|  12.3k|	int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;
 2540|  12.3k|	CONST char *s, *s0, *s1;
  ------------------
  |  |  287|  12.3k|#define CONST const
  ------------------
 2541|  12.3k|	double aadj, aadj1;
 2542|  12.3k|	Long L;
 2543|  12.3k|	ULong UL;
 2544|  12.3k|	U aadj2, adj, rv, rv0;
 2545|  12.3k|	ULong y, z;
 2546|  12.3k|	BCinfo bc;
 2547|  12.3k|	Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
 2548|  12.3k|#ifdef Avoid_Underflow
 2549|  12.3k|	ULong Lsb, Lsb1;
 2550|  12.3k|#endif
 2551|       |#ifdef SET_INEXACT
 2552|       |	int oldinexact;
 2553|       |#endif
 2554|  12.3k|#ifndef NO_STRTOD_BIGCOMP
 2555|  12.3k|	int req_bigcomp = 0;
 2556|  12.3k|#endif
 2557|       |#ifdef Honor_FLT_ROUNDS /*{*/
 2558|       |#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
 2559|       |	bc.rounding = Flt_Rounds;
 2560|       |#else /*}{*/
 2561|       |	bc.rounding = 1;
 2562|       |	switch(fegetround()) {
 2563|       |	  case FE_TOWARDZERO:	bc.rounding = 0; break;
 2564|       |	  case FE_UPWARD:	bc.rounding = 2; break;
 2565|       |	  case FE_DOWNWARD:	bc.rounding = 3;
 2566|       |	  }
 2567|       |#endif /*}}*/
 2568|       |#endif /*}*/
 2569|       |#ifdef USE_LOCALE
 2570|       |	CONST char *s2;
 2571|       |#endif
 2572|       |
 2573|  12.3k|	sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
 2574|  12.3k|	dval(&rv) = 0.;
  ------------------
  |  |  304|  12.3k|#define dval(x) (x)->d
  ------------------
 2575|  12.3k|	for(s = s00;;s++) switch(*s) {
 2576|      0|		case '-':
  ------------------
  |  Branch (2576:3): [True: 0, False: 12.3k]
  ------------------
 2577|      0|			sign = 1;
 2578|       |			/* no break */
 2579|      0|		case '+':
  ------------------
  |  Branch (2579:3): [True: 0, False: 12.3k]
  ------------------
 2580|      0|			if (*++s)
  ------------------
  |  Branch (2580:8): [True: 0, False: 0]
  ------------------
 2581|      0|				goto break2;
 2582|       |			/* no break */
 2583|      0|		case 0:
  ------------------
  |  Branch (2583:3): [True: 0, False: 12.3k]
  ------------------
 2584|      0|			goto ret0;
 2585|      0|		case '\t':
  ------------------
  |  Branch (2585:3): [True: 0, False: 12.3k]
  ------------------
 2586|      0|		case '\n':
  ------------------
  |  Branch (2586:3): [True: 0, False: 12.3k]
  ------------------
 2587|      0|		case '\v':
  ------------------
  |  Branch (2587:3): [True: 0, False: 12.3k]
  ------------------
 2588|      0|		case '\f':
  ------------------
  |  Branch (2588:3): [True: 0, False: 12.3k]
  ------------------
 2589|      0|		case '\r':
  ------------------
  |  Branch (2589:3): [True: 0, False: 12.3k]
  ------------------
 2590|      0|		case ' ':
  ------------------
  |  Branch (2590:3): [True: 0, False: 12.3k]
  ------------------
 2591|      0|			continue;
 2592|  12.3k|		default:
  ------------------
  |  Branch (2592:3): [True: 12.3k, False: 0]
  ------------------
 2593|  12.3k|			goto break2;
 2594|  12.3k|		}
 2595|  12.3k| break2:
 2596|  12.3k|	if (*s == '0') {
  ------------------
  |  Branch (2596:6): [True: 310, False: 12.0k]
  ------------------
 2597|       |#ifndef NO_HEX_FP /*{*/
 2598|       |		switch(s[1]) {
 2599|       |		  case 'x':
 2600|       |		  case 'X':
 2601|       |#ifdef Honor_FLT_ROUNDS
 2602|       |			gethex(&s, &rv, bc.rounding, sign);
 2603|       |#else
 2604|       |			gethex(&s, &rv, 1, sign);
 2605|       |#endif
 2606|       |			goto ret;
 2607|       |		  }
 2608|       |#endif /*}*/
 2609|    310|		nz0 = 1;
 2610|    310|		while(*++s == '0') ;
  ------------------
  |  Branch (2610:9): [True: 0, False: 310]
  ------------------
 2611|    310|		if (!*s)
  ------------------
  |  Branch (2611:7): [True: 0, False: 310]
  ------------------
 2612|      0|			goto ret;
 2613|    310|		}
 2614|  12.3k|	s0 = s;
 2615|  12.3k|	y = z = 0;
 2616|   195k|	for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
  ------------------
  |  Branch (2616:19): [True: 184k, False: 10.7k]
  |  Branch (2616:38): [True: 182k, False: 1.52k]
  ------------------
 2617|   182k|		if (nd < 9)
  ------------------
  |  Branch (2617:7): [True: 94.5k, False: 88.1k]
  ------------------
 2618|  94.5k|			y = 10*y + c - '0';
 2619|  88.1k|		else if (nd < DBL_DIG + 2)
  ------------------
  |  Branch (2619:12): [True: 77.3k, False: 10.8k]
  ------------------
 2620|  77.3k|			z = 10*z + c - '0';
 2621|  12.3k|	nd0 = nd;
 2622|  12.3k|	bc.dp0 = bc.dp1 = s - s0;
 2623|  12.4k|	for(s1 = s; s1 > s0 && *--s1 == '0'; )
  ------------------
  |  Branch (2623:14): [True: 12.1k, False: 310]
  |  Branch (2623:25): [True: 109, False: 12.0k]
  ------------------
 2624|    109|		++nz1;
 2625|       |#ifdef USE_LOCALE
 2626|       |	s1 = localeconv()->decimal_point;
 2627|       |	if (c == *s1) {
 2628|       |		c = '.';
 2629|       |		if (*++s1) {
 2630|       |			s2 = s;
 2631|       |			for(;;) {
 2632|       |				if (*++s2 != *s1) {
 2633|       |					c = 0;
 2634|       |					break;
 2635|       |					}
 2636|       |				if (!*++s1) {
 2637|       |					s = s2;
 2638|       |					break;
 2639|       |					}
 2640|       |				}
 2641|       |			}
 2642|       |		}
 2643|       |#endif
 2644|  12.3k|	if (c == '.') {
  ------------------
  |  Branch (2644:6): [True: 1.21k, False: 11.1k]
  ------------------
 2645|  1.21k|		c = *++s;
 2646|  1.21k|		bc.dp1 = s - s0;
 2647|  1.21k|		bc.dplen = bc.dp1 - bc.dp0;
 2648|  1.21k|		if (!nd) {
  ------------------
  |  Branch (2648:7): [True: 118, False: 1.09k]
  ------------------
 2649|  1.96M|			for(; c == '0'; c = *++s)
  ------------------
  |  Branch (2649:10): [True: 1.96M, False: 118]
  ------------------
 2650|  1.96M|				nz++;
 2651|    118|			if (c > '0' && c <= '9') {
  ------------------
  |  Branch (2651:8): [True: 8, False: 110]
  |  Branch (2651:19): [True: 8, False: 0]
  ------------------
 2652|      8|				bc.dp0 = s0 - s;
 2653|      8|				bc.dp1 = bc.dp0 + bc.dplen;
 2654|      8|				s0 = s;
 2655|      8|				nf += nz;
 2656|      8|				nz = 0;
 2657|      8|				goto have_dig;
 2658|      8|				}
 2659|    110|			goto dig_done;
 2660|    118|			}
 2661|  9.81k|		for(; c >= '0' && c <= '9'; c = *++s) {
  ------------------
  |  Branch (2661:9): [True: 8.71k, False: 1.09k]
  |  Branch (2661:21): [True: 8.70k, False: 8]
  ------------------
 2662|  8.71k| have_dig:
 2663|  8.71k|			nz++;
 2664|  8.71k|			if (c -= '0') {
  ------------------
  |  Branch (2664:8): [True: 7.74k, False: 970]
  ------------------
 2665|  7.74k|				nf += nz;
 2666|  8.63k|				for(i = 1; i < nz; i++)
  ------------------
  |  Branch (2666:16): [True: 891, False: 7.74k]
  ------------------
 2667|    891|					if (nd++ < 9)
  ------------------
  |  Branch (2667:10): [True: 83, False: 808]
  ------------------
 2668|     83|						y *= 10;
 2669|    808|					else if (nd <= DBL_DIG + 2)
  ------------------
  |  Branch (2669:15): [True: 409, False: 399]
  ------------------
 2670|    409|						z *= 10;
 2671|  7.74k|				if (nd++ < 9)
  ------------------
  |  Branch (2671:9): [True: 2.01k, False: 5.73k]
  ------------------
 2672|  2.01k|					y = 10*y + c;
 2673|  5.73k|				else if (nd <= DBL_DIG + 2)
  ------------------
  |  Branch (2673:14): [True: 3.34k, False: 2.38k]
  ------------------
 2674|  3.34k|					z = 10*z + c;
 2675|  7.74k|				nz = nz1 = 0;
 2676|  7.74k|				}
 2677|  8.71k|			}
 2678|  1.09k|		}
 2679|  12.3k| dig_done:
 2680|  12.3k|	e = 0;
 2681|  12.3k|	if (c == 'e' || c == 'E') {
  ------------------
  |  Branch (2681:6): [True: 1.52k, False: 10.7k]
  |  Branch (2681:18): [True: 0, False: 10.7k]
  ------------------
 2682|  1.52k|		if (!nd && !nz && !nz0) {
  ------------------
  |  Branch (2682:7): [True: 192, False: 1.33k]
  |  Branch (2682:14): [True: 192, False: 0]
  |  Branch (2682:21): [True: 0, False: 192]
  ------------------
 2683|      0|			goto ret0;
 2684|      0|			}
 2685|  1.52k|		s00 = s;
 2686|  1.52k|		esign = 0;
 2687|  1.52k|		switch(c = *++s) {
  ------------------
  |  Branch (2687:10): [True: 1.52k, False: 8]
  ------------------
 2688|      4|			case '-':
  ------------------
  |  Branch (2688:4): [True: 4, False: 1.52k]
  ------------------
 2689|      4|				esign = 1;
 2690|      8|			case '+':
  ------------------
  |  Branch (2690:4): [True: 4, False: 1.52k]
  ------------------
 2691|      8|				c = *++s;
 2692|  1.52k|			}
 2693|  1.52k|		if (c >= '0' && c <= '9') {
  ------------------
  |  Branch (2693:7): [True: 1.52k, False: 0]
  |  Branch (2693:19): [True: 1.52k, False: 0]
  ------------------
 2694|  1.53k|			while(c == '0')
  ------------------
  |  Branch (2694:10): [True: 3, False: 1.52k]
  ------------------
 2695|      3|				c = *++s;
 2696|  1.52k|			if (c > '0' && c <= '9') {
  ------------------
  |  Branch (2696:8): [True: 1.52k, False: 3]
  |  Branch (2696:19): [True: 1.52k, False: 0]
  ------------------
 2697|  1.52k|				UL = c - '0';
 2698|  1.52k|				s1 = s;
 2699|  4.14k|				while((c = *++s) >= '0' && c <= '9')
  ------------------
  |  Branch (2699:11): [True: 2.61k, False: 1.52k]
  |  Branch (2699:32): [True: 2.61k, False: 0]
  ------------------
 2700|  2.61k|					UL = 10*UL + c - '0';
 2701|  1.52k|				if (s - s1 > 8 || UL > 19999)
  ------------------
  |  Branch (2701:9): [True: 4, False: 1.52k]
  |  Branch (2701:23): [True: 2, False: 1.51k]
  ------------------
 2702|       |					/* Avoid confusion from exponents
 2703|       |					 * so large that e might overflow.
 2704|       |					 */
 2705|      6|					e = 19999; /* safe for 16 bit ints */
 2706|  1.51k|				else
 2707|  1.51k|					e = (int)UL;
 2708|  1.52k|				if (esign)
  ------------------
  |  Branch (2708:9): [True: 4, False: 1.52k]
  ------------------
 2709|      4|					e = -e;
 2710|  1.52k|				}
 2711|      3|			else
 2712|      3|				e = 0;
 2713|  1.52k|			}
 2714|      0|		else
 2715|      0|			s = s00;
 2716|  1.52k|		}
 2717|  12.3k|	if (!nd) {
  ------------------
  |  Branch (2717:6): [True: 302, False: 12.0k]
  ------------------
 2718|    302|		if (!nz && !nz0) {
  ------------------
  |  Branch (2718:7): [True: 192, False: 110]
  |  Branch (2718:14): [True: 0, False: 192]
  ------------------
 2719|       |#ifdef INFNAN_CHECK
 2720|       |			/* Check for Nan and Infinity */
 2721|       |			if (!bc.dplen)
 2722|       |			 switch(c) {
 2723|       |			  case 'i':
 2724|       |			  case 'I':
 2725|       |				if (match(&s,"nf")) {
 2726|       |					--s;
 2727|       |					if (!match(&s,"inity"))
 2728|       |						++s;
 2729|       |					word0(&rv) = 0x7ff00000;
 2730|       |					word1(&rv) = 0;
 2731|       |					goto ret;
 2732|       |					}
 2733|       |				break;
 2734|       |			  case 'n':
 2735|       |			  case 'N':
 2736|       |				if (match(&s, "an")) {
 2737|       |					word0(&rv) = NAN_WORD0;
 2738|       |					word1(&rv) = NAN_WORD1;
 2739|       |#ifndef No_Hex_NaN
 2740|       |					if (*s == '(') /*)*/
 2741|       |						hexnan(&rv, &s);
 2742|       |#endif
 2743|       |					goto ret;
 2744|       |					}
 2745|       |			  }
 2746|       |#endif /* INFNAN_CHECK */
 2747|      0| ret0:
 2748|      0|			s = s00;
 2749|      0|			sign = 0;
 2750|      0|			}
 2751|    302|		goto ret;
 2752|    302|		}
 2753|  12.0k|	bc.e0 = e1 = e -= nf;
 2754|       |
 2755|       |	/* Now we have nd0 digits, starting at s0, followed by a
 2756|       |	 * decimal point, followed by nd-nd0 digits.  The number we're
 2757|       |	 * after is the integer represented by those digits times
 2758|       |	 * 10**e */
 2759|       |
 2760|  12.0k|	if (!nd0)
  ------------------
  |  Branch (2760:6): [True: 8, False: 12.0k]
  ------------------
 2761|      8|		nd0 = nd;
 2762|  12.0k|	k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
  ------------------
  |  Branch (2762:6): [True: 2.25k, False: 9.75k]
  ------------------
 2763|  12.0k|	dval(&rv) = y;
  ------------------
  |  |  304|  12.0k|#define dval(x) (x)->d
  ------------------
 2764|  12.0k|	if (k > 9) {
  ------------------
  |  Branch (2764:6): [True: 10.4k, False: 1.52k]
  ------------------
 2765|       |#ifdef SET_INEXACT
 2766|       |		if (k > DBL_DIG)
 2767|       |			oldinexact = get_inexact();
 2768|       |#endif
 2769|  10.4k|		dval(&rv) = tens[k - 9] * dval(&rv) + z;
  ------------------
  |  |  304|  10.4k|#define dval(x) (x)->d
  ------------------
              		dval(&rv) = tens[k - 9] * dval(&rv) + z;
  ------------------
  |  |  304|  10.4k|#define dval(x) (x)->d
  ------------------
 2770|  10.4k|		}
 2771|  12.0k|	bd0 = 0;
 2772|  12.0k|	if (nd <= DBL_DIG
  ------------------
  |  Branch (2772:6): [True: 2.25k, False: 9.75k]
  ------------------
 2773|  12.0k|#ifndef RND_PRODQUOT
 2774|  12.0k|#ifndef Honor_FLT_ROUNDS
 2775|  12.0k|		&& Flt_Rounds == 1
  ------------------
  |  |  370|  2.25k|#define Flt_Rounds FLT_ROUNDS
  ------------------
  |  Branch (2775:6): [True: 2.25k, False: 0]
  ------------------
 2776|  12.0k|#endif
 2777|  12.0k|#endif
 2778|  12.0k|			) {
 2779|  2.25k|		if (!e)
  ------------------
  |  Branch (2779:7): [True: 235, False: 2.02k]
  ------------------
 2780|    235|			goto ret;
 2781|  2.02k|#ifndef ROUND_BIASED_without_Round_Up
 2782|  2.02k|		if (e > 0) {
  ------------------
  |  Branch (2782:7): [True: 1.32k, False: 694]
  ------------------
 2783|  1.32k|			if (e <= Ten_pmax) {
  ------------------
  |  |  350|  1.32k|#define Ten_pmax 22
  ------------------
  |  Branch (2783:8): [True: 40, False: 1.28k]
  ------------------
 2784|       |#ifdef VAX
 2785|       |				goto vax_ovfl_check;
 2786|       |#else
 2787|       |#ifdef Honor_FLT_ROUNDS
 2788|       |				/* round correctly FLT_ROUNDS = 2 or 3 */
 2789|       |				if (sign) {
 2790|       |					rv.d = -rv.d;
 2791|       |					sign = 0;
 2792|       |					}
 2793|       |#endif
 2794|     40|				/* rv = */ rounded_product(dval(&rv), tens[e]);
  ------------------
  |  |  468|     40|#define rounded_product(a,b) a *= b
  ------------------
 2795|     40|				goto ret;
 2796|     40|#endif
 2797|     40|				}
 2798|  1.28k|			i = DBL_DIG - nd;
 2799|  1.28k|			if (e <= Ten_pmax + i) {
  ------------------
  |  |  350|  1.28k|#define Ten_pmax 22
  ------------------
  |  Branch (2799:8): [True: 3, False: 1.28k]
  ------------------
 2800|       |				/* A fancier test would sometimes let us do
 2801|       |				 * this for larger i values.
 2802|       |				 */
 2803|       |#ifdef Honor_FLT_ROUNDS
 2804|       |				/* round correctly FLT_ROUNDS = 2 or 3 */
 2805|       |				if (sign) {
 2806|       |					rv.d = -rv.d;
 2807|       |					sign = 0;
 2808|       |					}
 2809|       |#endif
 2810|      3|				e -= i;
 2811|      3|				dval(&rv) *= tens[i];
  ------------------
  |  |  304|      3|#define dval(x) (x)->d
  ------------------
 2812|       |#ifdef VAX
 2813|       |				/* VAX exponent range is so narrow we must
 2814|       |				 * worry about overflow here...
 2815|       |				 */
 2816|       | vax_ovfl_check:
 2817|       |				word0(&rv) -= P*Exp_msk1;
 2818|       |				/* rv = */ rounded_product(dval(&rv), tens[e]);
 2819|       |				if ((word0(&rv) & Exp_mask)
 2820|       |				 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
 2821|       |					goto ovfl;
 2822|       |				word0(&rv) += P*Exp_msk1;
 2823|       |#else
 2824|      3|				/* rv = */ rounded_product(dval(&rv), tens[e]);
  ------------------
  |  |  468|      3|#define rounded_product(a,b) a *= b
  ------------------
 2825|      3|#endif
 2826|      3|				goto ret;
 2827|      3|				}
 2828|  1.28k|			}
 2829|    694|#ifndef Inaccurate_Divide
 2830|    694|		else if (e >= -Ten_pmax) {
  ------------------
  |  |  350|    694|#define Ten_pmax 22
  ------------------
  |  Branch (2830:12): [True: 690, False: 4]
  ------------------
 2831|       |#ifdef Honor_FLT_ROUNDS
 2832|       |			/* round correctly FLT_ROUNDS = 2 or 3 */
 2833|       |			if (sign) {
 2834|       |				rv.d = -rv.d;
 2835|       |				sign = 0;
 2836|       |				}
 2837|       |#endif
 2838|    690|			/* rv = */ rounded_quotient(dval(&rv), tens[-e]);
  ------------------
  |  |  469|    690|#define rounded_quotient(a,b) a /= b
  ------------------
 2839|    690|			goto ret;
 2840|    690|			}
 2841|  2.02k|#endif
 2842|  2.02k|#endif /* ROUND_BIASED_without_Round_Up */
 2843|  2.02k|		}
 2844|  11.0k|	e1 += nd - k;
 2845|       |
 2846|  11.0k|#ifdef IEEE_Arith
 2847|       |#ifdef SET_INEXACT
 2848|       |	bc.inexact = 1;
 2849|       |	if (k <= DBL_DIG)
 2850|       |		oldinexact = get_inexact();
 2851|       |#endif
 2852|  11.0k|#ifdef Avoid_Underflow
 2853|  11.0k|	bc.scale = 0;
 2854|  11.0k|#endif
 2855|       |#ifdef Honor_FLT_ROUNDS
 2856|       |	if (bc.rounding >= 2) {
 2857|       |		if (sign)
 2858|       |			bc.rounding = bc.rounding == 2 ? 0 : 2;
 2859|       |		else
 2860|       |			if (bc.rounding != 2)
 2861|       |				bc.rounding = 0;
 2862|       |		}
 2863|       |#endif
 2864|  11.0k|#endif /*IEEE_Arith*/
 2865|       |
 2866|       |	/* Get starting approximation = rv * 10**e1 */
 2867|       |
 2868|  11.0k|	if (e1 > 0) {
  ------------------
  |  Branch (2868:6): [True: 10.6k, False: 439]
  ------------------
 2869|  10.6k|		if ((i = e1 & 15))
  ------------------
  |  Branch (2869:7): [True: 10.6k, False: 0]
  ------------------
 2870|  10.6k|			dval(&rv) *= tens[i];
  ------------------
  |  |  304|  10.6k|#define dval(x) (x)->d
  ------------------
 2871|  10.6k|		if (e1 &= ~15) {
  ------------------
  |  Branch (2871:7): [True: 1.31k, False: 9.29k]
  ------------------
 2872|  1.31k|			if (e1 > DBL_MAX_10_EXP) {
  ------------------
  |  Branch (2872:8): [True: 24, False: 1.29k]
  ------------------
 2873|  1.28k| ovfl:
 2874|       |				/* Can't trust HUGE_VAL */
 2875|  1.28k|#ifdef IEEE_Arith
 2876|       |#ifdef Honor_FLT_ROUNDS
 2877|       |				switch(bc.rounding) {
 2878|       |				  case 0: /* toward 0 */
 2879|       |				  case 3: /* toward -infinity */
 2880|       |					word0(&rv) = Big0;
 2881|       |					word1(&rv) = Big1;
 2882|       |					break;
 2883|       |				  default:
 2884|       |					word0(&rv) = Exp_mask;
 2885|       |					word1(&rv) = 0;
 2886|       |				  }
 2887|       |#else /*Honor_FLT_ROUNDS*/
 2888|  1.28k|				word0(&rv) = Exp_mask;
  ------------------
  |  |  298|  1.28k|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Exp_mask;
  ------------------
  |  |  339|  1.28k|#define Exp_mask  0x7ff00000
  ------------------
 2889|  1.28k|				word1(&rv) = 0;
  ------------------
  |  |  299|  1.28k|#define word1(x) (x)->L[0]
  ------------------
 2890|  1.28k|#endif /*Honor_FLT_ROUNDS*/
 2891|       |#ifdef SET_INEXACT
 2892|       |				/* set overflow bit */
 2893|       |				dval(&rv0) = 1e300;
 2894|       |				dval(&rv0) *= dval(&rv0);
 2895|       |#endif
 2896|       |#else /*IEEE_Arith*/
 2897|       |				word0(&rv) = Big0;
 2898|       |				word1(&rv) = Big1;
 2899|       |#endif /*IEEE_Arith*/
 2900|  1.28k| range_err:
 2901|  1.28k|				if (bd0) {
  ------------------
  |  Branch (2901:9): [True: 0, False: 1.28k]
  ------------------
 2902|      0|					Bfree(dalloc, bb);
 2903|      0|					Bfree(dalloc, bd);
 2904|      0|					Bfree(dalloc, bs);
 2905|      0|					Bfree(dalloc, bd0);
 2906|      0|					Bfree(dalloc, delta);
 2907|      0|					}
 2908|  1.28k|#ifndef NO_ERRNO
 2909|  1.28k|				errno = ERANGE;
 2910|  1.28k|#endif
 2911|  1.28k|				goto ret;
 2912|  1.28k|				}
 2913|  1.29k|			e1 >>= 4;
 2914|  6.33k|			for(j = 0; e1 > 1; j++, e1 >>= 1)
  ------------------
  |  Branch (2914:15): [True: 5.04k, False: 1.29k]
  ------------------
 2915|  5.04k|				if (e1 & 1)
  ------------------
  |  Branch (2915:9): [True: 2.52k, False: 2.52k]
  ------------------
 2916|  2.52k|					dval(&rv) *= bigtens[j];
  ------------------
  |  |  304|  2.52k|#define dval(x) (x)->d
  ------------------
 2917|       |		/* The last multiplication could overflow. */
 2918|  1.29k|			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  298|  1.29k|#define word0(x) (x)->L[1]
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  340|  1.29k|#define P 53
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  337|  1.29k|#define Exp_msk1    0x100000
  ------------------
 2919|  1.29k|			dval(&rv) *= bigtens[j];
  ------------------
  |  |  304|  1.29k|#define dval(x) (x)->d
  ------------------
 2920|  1.29k|			if ((z = word0(&rv) & Exp_mask)
  ------------------
  |  |  298|  1.29k|#define word0(x) (x)->L[1]
  ------------------
              			if ((z = word0(&rv) & Exp_mask)
  ------------------
  |  |  339|  1.29k|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (2920:8): [True: 1.25k, False: 34]
  ------------------
 2921|  1.29k|			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  337|  1.29k|#define Exp_msk1    0x100000
  ------------------
              			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  342|  1.29k|#define Bias 1023
  ------------------
              			 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
  ------------------
  |  |  340|  1.29k|#define P 53
  ------------------
 2922|  1.25k|				goto ovfl;
 2923|     34|			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  337|     34|#define Exp_msk1    0x100000
  ------------------
              			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  342|     34|#define Bias 1023
  ------------------
              			if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
  ------------------
  |  |  340|     34|#define P 53
  ------------------
  |  Branch (2923:8): [True: 0, False: 34]
  ------------------
 2924|       |				/* set to largest number */
 2925|       |				/* (Can't trust DBL_MAX) */
 2926|      0|				word0(&rv) = Big0;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Big0;
  ------------------
  |  |  472|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  349|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  337|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  342|      0|#define Bias 1023
  |  |  ------------------
  ------------------
 2927|      0|				word1(&rv) = Big1;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
              				word1(&rv) = Big1;
  ------------------
  |  |  473|      0|#define Big1 0xffffffff
  ------------------
 2928|      0|				}
 2929|     34|			else
 2930|     34|				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  298|     34|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  340|     34|#define P 53
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  337|     34|#define Exp_msk1    0x100000
  ------------------
 2931|     34|			}
 2932|  10.6k|		}
 2933|    439|	else if (e1 < 0) {
  ------------------
  |  Branch (2933:11): [True: 409, False: 30]
  ------------------
 2934|    409|		e1 = -e1;
 2935|    409|		if ((i = e1 & 15))
  ------------------
  |  Branch (2935:7): [True: 406, False: 3]
  ------------------
 2936|    406|			dval(&rv) /= tens[i];
  ------------------
  |  |  304|    406|#define dval(x) (x)->d
  ------------------
 2937|    409|		if (e1 >>= 4) {
  ------------------
  |  Branch (2937:7): [True: 7, False: 402]
  ------------------
 2938|      7|			if (e1 >= 1 << n_bigtens)
  ------------------
  |  | 1514|      7|#define n_bigtens 5
  ------------------
  |  Branch (2938:8): [True: 4, False: 3]
  ------------------
 2939|      4|				goto undfl;
 2940|      3|#ifdef Avoid_Underflow
 2941|      3|			if (e1 & Scale_Bit)
  ------------------
  |  | 1513|      3|#define Scale_Bit 0x10
  ------------------
  |  Branch (2941:8): [True: 0, False: 3]
  ------------------
 2942|      0|				bc.scale = 2*P;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
 2943|      6|			for(j = 0; e1 > 0; j++, e1 >>= 1)
  ------------------
  |  Branch (2943:15): [True: 3, False: 3]
  ------------------
 2944|      3|				if (e1 & 1)
  ------------------
  |  Branch (2944:9): [True: 3, False: 0]
  ------------------
 2945|      3|					dval(&rv) *= tinytens[j];
  ------------------
  |  |  304|      3|#define dval(x) (x)->d
  ------------------
 2946|      3|			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (2946:8): [True: 0, False: 3]
  |  Branch (2946:20): [True: 0, False: 0]
  ------------------
 2947|      0|						>> Exp_shift)) > 0) {
  ------------------
  |  |  335|      0|#define Exp_shift  20
  ------------------
 2948|       |				/* scaled rv is denormal; clear j low bits */
 2949|      0|				if (j >= 32) {
  ------------------
  |  Branch (2949:9): [True: 0, False: 0]
  ------------------
 2950|      0|					if (j > 54)
  ------------------
  |  Branch (2950:10): [True: 0, False: 0]
  ------------------
 2951|      0|						goto undfl;
 2952|      0|					word1(&rv) = 0;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 2953|      0|					if (j >= 53)
  ------------------
  |  Branch (2953:10): [True: 0, False: 0]
  ------------------
 2954|      0|					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              					 word0(&rv) = (P+2)*Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 2955|      0|					else
 2956|      0|					 word0(&rv) &= 0xffffffff << (j-32);
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
 2957|      0|					}
 2958|      0|				else
 2959|      0|					word1(&rv) &= 0xffffffff << j;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 2960|      0|				}
 2961|       |#else
 2962|       |			for(j = 0; e1 > 1; j++, e1 >>= 1)
 2963|       |				if (e1 & 1)
 2964|       |					dval(&rv) *= tinytens[j];
 2965|       |			/* The last multiplication could underflow. */
 2966|       |			dval(&rv0) = dval(&rv);
 2967|       |			dval(&rv) *= tinytens[j];
 2968|       |			if (!dval(&rv)) {
 2969|       |				dval(&rv) = 2.*dval(&rv0);
 2970|       |				dval(&rv) *= tinytens[j];
 2971|       |#endif
 2972|      3|				if (!dval(&rv)) {
  ------------------
  |  |  304|      3|#define dval(x) (x)->d
  ------------------
  |  Branch (2972:9): [True: 0, False: 3]
  ------------------
 2973|      4| undfl:
 2974|      4|					dval(&rv) = 0.;
  ------------------
  |  |  304|      4|#define dval(x) (x)->d
  ------------------
 2975|      4|					goto range_err;
 2976|      0|					}
 2977|       |#ifndef Avoid_Underflow
 2978|       |				word0(&rv) = Tiny0;
 2979|       |				word1(&rv) = Tiny1;
 2980|       |				/* The refinement below will clean
 2981|       |				 * this approximation up.
 2982|       |				 */
 2983|       |				}
 2984|       |#endif
 2985|      3|			}
 2986|    409|		}
 2987|       |
 2988|       |	/* Now the hard part -- adjusting rv to the correct value.*/
 2989|       |
 2990|       |	/* Put digits into bd: true value = bd * 10^e */
 2991|       |
 2992|  9.75k|	bc.nd = nd - nz1;
 2993|  9.75k|#ifndef NO_STRTOD_BIGCOMP
 2994|  9.75k|	bc.nd0 = nd0;	/* Only needed if nd > strtod_diglim, but done here */
 2995|       |			/* to silence an erroneous warning about bc.nd0 */
 2996|       |			/* possibly not being initialized. */
 2997|  9.75k|	if (nd > strtod_diglim) {
  ------------------
  |  |  313|  9.75k|#define strtod_diglim STRTOD_DIGLIM
  |  |  ------------------
  |  |  |  |  307|  9.75k|#define STRTOD_DIGLIM 40
  |  |  ------------------
  ------------------
  |  Branch (2997:6): [True: 0, False: 9.75k]
  ------------------
 2998|       |		/* ASSERT(strtod_diglim >= 18); 18 == one more than the */
 2999|       |		/* minimum number of decimal digits to distinguish double values */
 3000|       |		/* in IEEE arithmetic. */
 3001|      0|		i = j = 18;
 3002|      0|		if (i > nd0)
  ------------------
  |  Branch (3002:7): [True: 0, False: 0]
  ------------------
 3003|      0|			j += bc.dplen;
 3004|      0|		for(;;) {
 3005|      0|			if (--j < bc.dp1 && j >= bc.dp0)
  ------------------
  |  Branch (3005:8): [True: 0, False: 0]
  |  Branch (3005:24): [True: 0, False: 0]
  ------------------
 3006|      0|				j = bc.dp0 - 1;
 3007|      0|			if (s0[j] != '0')
  ------------------
  |  Branch (3007:8): [True: 0, False: 0]
  ------------------
 3008|      0|				break;
 3009|      0|			--i;
 3010|      0|			}
 3011|      0|		e += nd - i;
 3012|      0|		nd = i;
 3013|      0|		if (nd0 > nd)
  ------------------
  |  Branch (3013:7): [True: 0, False: 0]
  ------------------
 3014|      0|			nd0 = nd;
 3015|      0|		if (nd < 9) { /* must recompute y */
  ------------------
  |  Branch (3015:7): [True: 0, False: 0]
  ------------------
 3016|      0|			y = 0;
 3017|      0|			for(i = 0; i < nd0; ++i)
  ------------------
  |  Branch (3017:15): [True: 0, False: 0]
  ------------------
 3018|      0|				y = 10*y + s0[i] - '0';
 3019|      0|			for(j = bc.dp1; i < nd; ++i)
  ------------------
  |  Branch (3019:20): [True: 0, False: 0]
  ------------------
 3020|      0|				y = 10*y + s0[j++] - '0';
 3021|      0|			}
 3022|      0|		}
 3023|  9.75k|#endif
 3024|  9.75k|	bd0 = s2b(dalloc, s0, nd0, nd, y, bc.dplen);
 3025|       |
 3026|  9.75k|	for(;;) {
 3027|  9.75k|		bd = Balloc(dalloc, bd0->k);
 3028|  9.75k|		Bcopy(bd, bd0);
  ------------------
  |  |  646|  9.75k|#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
  |  |  647|  9.75k|y->wds*sizeof(Long) + 2*sizeof(int))
  ------------------
 3029|  9.75k|		bb = d2b(dalloc, &rv, &bbe, &bbbits);	/* rv = bb * 2^bbe */
 3030|  9.75k|		bs = i2b(dalloc, 1);
 3031|       |
 3032|  9.75k|		if (e >= 0) {
  ------------------
  |  Branch (3032:7): [True: 9.35k, False: 406]
  ------------------
 3033|  9.35k|			bb2 = bb5 = 0;
 3034|  9.35k|			bd2 = bd5 = e;
 3035|  9.35k|			}
 3036|    406|		else {
 3037|    406|			bb2 = bb5 = -e;
 3038|    406|			bd2 = bd5 = 0;
 3039|    406|			}
 3040|  9.75k|		if (bbe >= 0)
  ------------------
  |  Branch (3040:7): [True: 9.35k, False: 405]
  ------------------
 3041|  9.35k|			bb2 += bbe;
 3042|    405|		else
 3043|    405|			bd2 -= bbe;
 3044|  9.75k|		bs2 = bb2;
 3045|       |#ifdef Honor_FLT_ROUNDS
 3046|       |		if (bc.rounding != 1)
 3047|       |			bs2++;
 3048|       |#endif
 3049|  9.75k|#ifdef Avoid_Underflow
 3050|  9.75k|		Lsb = LSB;
  ------------------
  |  |  354|  9.75k|#define LSB 1
  ------------------
 3051|  9.75k|		Lsb1 = 0;
 3052|  9.75k|		j = bbe - bc.scale;
 3053|  9.75k|		i = j + bbbits - 1;	/* logb(rv) */
 3054|  9.75k|		j = P + 1 - bbbits;
  ------------------
  |  |  340|  9.75k|#define P 53
  ------------------
 3055|  9.75k|		if (i < Emin) {	/* denormal */
  ------------------
  |  |  344|  9.75k|#define Emin (-1022)
  ------------------
  |  Branch (3055:7): [True: 0, False: 9.75k]
  ------------------
 3056|      0|			i = Emin - i;
  ------------------
  |  |  344|      0|#define Emin (-1022)
  ------------------
 3057|      0|			j -= i;
 3058|      0|			if (i < 32)
  ------------------
  |  Branch (3058:8): [True: 0, False: 0]
  ------------------
 3059|      0|				Lsb <<= i;
 3060|      0|			else if (i < 52)
  ------------------
  |  Branch (3060:13): [True: 0, False: 0]
  ------------------
 3061|      0|				Lsb1 = Lsb << (i-32);
 3062|      0|			else
 3063|      0|				Lsb1 = Exp_mask;
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
 3064|      0|			}
 3065|       |#else /*Avoid_Underflow*/
 3066|       |#ifdef Sudden_Underflow
 3067|       |#ifdef IBM
 3068|       |		j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
 3069|       |#else
 3070|       |		j = P + 1 - bbbits;
 3071|       |#endif
 3072|       |#else /*Sudden_Underflow*/
 3073|       |		j = bbe;
 3074|       |		i = j + bbbits - 1;	/* logb(rv) */
 3075|       |		if (i < Emin)	/* denormal */
 3076|       |			j += P - Emin;
 3077|       |		else
 3078|       |			j = P + 1 - bbbits;
 3079|       |#endif /*Sudden_Underflow*/
 3080|       |#endif /*Avoid_Underflow*/
 3081|  9.75k|		bb2 += j;
 3082|  9.75k|		bd2 += j;
 3083|  9.75k|#ifdef Avoid_Underflow
 3084|  9.75k|		bd2 += bc.scale;
 3085|  9.75k|#endif
 3086|  9.75k|		i = bb2 < bd2 ? bb2 : bd2;
  ------------------
  |  Branch (3086:7): [True: 405, False: 9.35k]
  ------------------
 3087|  9.75k|		if (i > bs2)
  ------------------
  |  Branch (3087:7): [True: 405, False: 9.35k]
  ------------------
 3088|    405|			i = bs2;
 3089|  9.75k|		if (i > 0) {
  ------------------
  |  Branch (3089:7): [True: 9.75k, False: 0]
  ------------------
 3090|  9.75k|			bb2 -= i;
 3091|  9.75k|			bd2 -= i;
 3092|  9.75k|			bs2 -= i;
 3093|  9.75k|			}
 3094|  9.75k|		if (bb5 > 0) {
  ------------------
  |  Branch (3094:7): [True: 406, False: 9.35k]
  ------------------
 3095|    406|			bs = pow5mult(dalloc, bs, bb5);
 3096|    406|			bb1 = mult(dalloc, bs, bb);
 3097|    406|			Bfree(dalloc, bb);
 3098|    406|			bb = bb1;
 3099|    406|			}
 3100|  9.75k|		if (bb2 > 0)
  ------------------
  |  Branch (3100:7): [True: 9.75k, False: 0]
  ------------------
 3101|  9.75k|			bb = lshift(dalloc, bb, bb2);
 3102|  9.75k|		if (bd5 > 0)
  ------------------
  |  Branch (3102:7): [True: 4, False: 9.75k]
  ------------------
 3103|      4|			bd = pow5mult(dalloc, bd, bd5);
 3104|  9.75k|		if (bd2 > 0)
  ------------------
  |  Branch (3104:7): [True: 405, False: 9.35k]
  ------------------
 3105|    405|			bd = lshift(dalloc, bd, bd2);
 3106|  9.75k|		if (bs2 > 0)
  ------------------
  |  Branch (3106:7): [True: 9.35k, False: 405]
  ------------------
 3107|  9.35k|			bs = lshift(dalloc, bs, bs2);
 3108|  9.75k|		delta = diff(dalloc, bb, bd);
 3109|  9.75k|		bc.dsign = delta->sign;
 3110|  9.75k|		delta->sign = 0;
 3111|  9.75k|		i = cmp(delta, bs);
 3112|  9.75k|#ifndef NO_STRTOD_BIGCOMP /*{*/
 3113|  9.75k|		if (bc.nd > nd && i <= 0) {
  ------------------
  |  Branch (3113:7): [True: 0, False: 9.75k]
  |  Branch (3113:21): [True: 0, False: 0]
  ------------------
 3114|      0|			if (bc.dsign) {
  ------------------
  |  Branch (3114:8): [True: 0, False: 0]
  ------------------
 3115|       |				/* Must use bigcomp(). */
 3116|      0|				req_bigcomp = 1;
 3117|      0|				break;
 3118|      0|				}
 3119|       |#ifdef Honor_FLT_ROUNDS
 3120|       |			if (bc.rounding != 1) {
 3121|       |				if (i < 0) {
 3122|       |					req_bigcomp = 1;
 3123|       |					break;
 3124|       |					}
 3125|       |				}
 3126|       |			else
 3127|       |#endif
 3128|      0|				i = -1;	/* Discarded digits make delta smaller. */
 3129|      0|			}
 3130|  9.75k|#endif /*}*/
 3131|       |#ifdef Honor_FLT_ROUNDS /*{*/
 3132|       |		if (bc.rounding != 1) {
 3133|       |			if (i < 0) {
 3134|       |				/* Error is less than an ulp */
 3135|       |				if (!delta->x[0] && delta->wds <= 1) {
 3136|       |					/* exact */
 3137|       |#ifdef SET_INEXACT
 3138|       |					bc.inexact = 0;
 3139|       |#endif
 3140|       |					break;
 3141|       |					}
 3142|       |				if (bc.rounding) {
 3143|       |					if (bc.dsign) {
 3144|       |						adj.d = 1.;
 3145|       |						goto apply_adj;
 3146|       |						}
 3147|       |					}
 3148|       |				else if (!bc.dsign) {
 3149|       |					adj.d = -1.;
 3150|       |					if (!word1(&rv)
 3151|       |					 && !(word0(&rv) & Frac_mask)) {
 3152|       |						y = word0(&rv) & Exp_mask;
 3153|       |#ifdef Avoid_Underflow
 3154|       |						if (!bc.scale || y > 2*P*Exp_msk1)
 3155|       |#else
 3156|       |						if (y)
 3157|       |#endif
 3158|       |						  {
 3159|       |						  delta = lshift(delta,Log2P);
 3160|       |						  if (cmp(delta, bs) <= 0)
 3161|       |							adj.d = -0.5;
 3162|       |						  }
 3163|       |						}
 3164|       | apply_adj:
 3165|       |#ifdef Avoid_Underflow /*{*/
 3166|       |					if (bc.scale && (y = word0(&rv) & Exp_mask)
 3167|       |						<= 2*P*Exp_msk1)
 3168|       |					  word0(&adj) += (2*P+1)*Exp_msk1 - y;
 3169|       |#else
 3170|       |#ifdef Sudden_Underflow
 3171|       |					if ((word0(&rv) & Exp_mask) <=
 3172|       |							P*Exp_msk1) {
 3173|       |						word0(&rv) += P*Exp_msk1;
 3174|       |						dval(&rv) += adj.d*ulp(dval(&rv));
 3175|       |						word0(&rv) -= P*Exp_msk1;
 3176|       |						}
 3177|       |					else
 3178|       |#endif /*Sudden_Underflow*/
 3179|       |#endif /*Avoid_Underflow}*/
 3180|       |					dval(&rv) += adj.d*ulp(&rv);
 3181|       |					}
 3182|       |				break;
 3183|       |				}
 3184|       |			adj.d = ratio(delta, bs);
 3185|       |			if (adj.d < 1.)
 3186|       |				adj.d = 1.;
 3187|       |			if (adj.d <= 0x7ffffffe) {
 3188|       |				/* adj = rounding ? ceil(adj) : floor(adj); */
 3189|       |				y = adj.d;
 3190|       |				if (y != adj.d) {
 3191|       |					if (!((bc.rounding>>1) ^ bc.dsign))
 3192|       |						y++;
 3193|       |					adj.d = y;
 3194|       |					}
 3195|       |				}
 3196|       |#ifdef Avoid_Underflow /*{*/
 3197|       |			if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
 3198|       |				word0(&adj) += (2*P+1)*Exp_msk1 - y;
 3199|       |#else
 3200|       |#ifdef Sudden_Underflow
 3201|       |			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
 3202|       |				word0(&rv) += P*Exp_msk1;
 3203|       |				adj.d *= ulp(dval(&rv));
 3204|       |				if (bc.dsign)
 3205|       |					dval(&rv) += adj.d;
 3206|       |				else
 3207|       |					dval(&rv) -= adj.d;
 3208|       |				word0(&rv) -= P*Exp_msk1;
 3209|       |				goto cont;
 3210|       |				}
 3211|       |#endif /*Sudden_Underflow*/
 3212|       |#endif /*Avoid_Underflow}*/
 3213|       |			adj.d *= ulp(&rv);
 3214|       |			if (bc.dsign) {
 3215|       |				if (word0(&rv) == Big0 && word1(&rv) == Big1)
 3216|       |					goto ovfl;
 3217|       |				dval(&rv) += adj.d;
 3218|       |				}
 3219|       |			else
 3220|       |				dval(&rv) -= adj.d;
 3221|       |			goto cont;
 3222|       |			}
 3223|       |#endif /*}Honor_FLT_ROUNDS*/
 3224|       |
 3225|  9.75k|		if (i < 0) {
  ------------------
  |  Branch (3225:7): [True: 651, False: 9.10k]
  ------------------
 3226|       |			/* Error is less than half an ulp -- check for
 3227|       |			 * special case of mantissa a power of two.
 3228|       |			 */
 3229|    651|			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  299|    748|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (299:18): [True: 50, False: 47]
  |  |  ------------------
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  298|     47|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
  ------------------
  |  |  352|    698|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3229:8): [True: 554, False: 97]
  |  Branch (3229:34): [True: 24, False: 23]
  ------------------
 3230|    651|#ifdef IEEE_Arith /*{*/
 3231|    651|#ifdef Avoid_Underflow
 3232|    651|			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  298|     23|#define word0(x) (x)->L[1]
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  339|     23|#define Exp_mask  0x7ff00000
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  340|     23|#define P 53
  ------------------
              			 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
  ------------------
  |  |  337|     23|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3232:8): [True: 0, False: 23]
  ------------------
 3233|       |#else
 3234|       |			 || (word0(&rv) & Exp_mask) <= Exp_msk1
 3235|       |#endif
 3236|    651|#endif /*}*/
 3237|    651|				) {
 3238|       |#ifdef SET_INEXACT
 3239|       |				if (!delta->x[0] && delta->wds <= 1)
 3240|       |					bc.inexact = 0;
 3241|       |#endif
 3242|    628|				break;
 3243|    628|				}
 3244|     23|			if (!delta->x[0] && delta->wds <= 1) {
  ------------------
  |  Branch (3244:8): [True: 22, False: 1]
  |  Branch (3244:24): [True: 22, False: 0]
  ------------------
 3245|       |				/* exact result */
 3246|       |#ifdef SET_INEXACT
 3247|       |				bc.inexact = 0;
 3248|       |#endif
 3249|     22|				break;
 3250|     22|				}
 3251|      1|			delta = lshift(dalloc,delta,Log2P);
  ------------------
  |  |  356|      1|#define Log2P 1
  ------------------
 3252|      1|			if (cmp(delta, bs) > 0)
  ------------------
  |  Branch (3252:8): [True: 0, False: 1]
  ------------------
 3253|      0|				goto drop_down;
 3254|      1|			break;
 3255|      1|			}
 3256|  9.10k|		if (i == 0) {
  ------------------
  |  Branch (3256:7): [True: 9.08k, False: 19]
  ------------------
 3257|       |			/* exactly half-way between */
 3258|  9.08k|			if (bc.dsign) {
  ------------------
  |  Branch (3258:8): [True: 0, False: 9.08k]
  ------------------
 3259|      0|				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  353|      0|#define Bndry_mask1 0xfffff
  ------------------
              				if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
  ------------------
  |  |  353|      0|#define Bndry_mask1 0xfffff
  ------------------
  |  Branch (3259:9): [True: 0, False: 0]
  ------------------
 3260|      0|				 &&  word1(&rv) == (
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3260:10): [True: 0, False: 0]
  ------------------
 3261|      0|#ifdef Avoid_Underflow
 3262|      0|			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              			(bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3262:5): [True: 0, False: 0]
  |  Branch (3262:17): [True: 0, False: 0]
  ------------------
 3263|      0|		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              		? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
  ------------------
  |  |  335|      0|#define Exp_shift  20
  ------------------
 3264|      0|#endif
 3265|      0|						   0xffffffff)) {
 3266|       |					/*boundary case -- increment exponent*/
 3267|      0|					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  472|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  349|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  337|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  342|      0|#define Bias 1023
  |  |  ------------------
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
              					if (word0(&rv) == Big0 && word1(&rv) == Big1)
  ------------------
  |  |  473|      0|#define Big1 0xffffffff
  ------------------
  |  Branch (3267:10): [True: 0, False: 0]
  |  Branch (3267:32): [True: 0, False: 0]
  ------------------
 3268|      0|						goto ovfl;
 3269|      0|					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              					word0(&rv) = (word0(&rv) & Exp_mask)
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
 3270|      0|						+ Exp_msk1
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3271|       |#ifdef IBM
 3272|       |						| Exp_msk1 >> 4
 3273|       |#endif
 3274|      0|						;
 3275|      0|					word1(&rv) = 0;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 3276|      0|#ifdef Avoid_Underflow
 3277|      0|					bc.dsign = 0;
 3278|      0|#endif
 3279|      0|					break;
 3280|      0|					}
 3281|      0|				}
 3282|  9.08k|			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  298|  9.08k|#define word0(x) (x)->L[1]
  ------------------
              			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  352|  9.08k|#define Bndry_mask  0xfffff
  ------------------
              			else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3282:13): [True: 0, False: 9.08k]
  |  Branch (3282:43): [True: 0, False: 0]
  ------------------
 3283|      0| drop_down:
 3284|       |				/* boundary case -- decrement exponent */
 3285|       |#ifdef Sudden_Underflow /*{{*/
 3286|       |				L = word0(&rv) & Exp_mask;
 3287|       |#ifdef IBM
 3288|       |				if (L <  Exp_msk1)
 3289|       |#else
 3290|       |#ifdef Avoid_Underflow
 3291|       |				if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
 3292|       |#else
 3293|       |				if (L <= Exp_msk1)
 3294|       |#endif /*Avoid_Underflow*/
 3295|       |#endif /*IBM*/
 3296|       |					{
 3297|       |					if (bc.nd >nd) {
 3298|       |						bc.uflchk = 1;
 3299|       |						break;
 3300|       |						}
 3301|       |					goto undfl;
 3302|       |					}
 3303|       |				L -= Exp_msk1;
 3304|       |#else /*Sudden_Underflow}{*/
 3305|      0|#ifdef Avoid_Underflow
 3306|      0|				if (bc.scale) {
  ------------------
  |  Branch (3306:9): [True: 0, False: 0]
  ------------------
 3307|      0|					L = word0(&rv) & Exp_mask;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              					L = word0(&rv) & Exp_mask;
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
 3308|      0|					if (L <= (2*P+1)*Exp_msk1) {
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              					if (L <= (2*P+1)*Exp_msk1) {
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3308:10): [True: 0, False: 0]
  ------------------
 3309|      0|						if (L > (P+2)*Exp_msk1)
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              						if (L > (P+2)*Exp_msk1)
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3309:11): [True: 0, False: 0]
  ------------------
 3310|       |							/* round even ==> */
 3311|       |							/* accept rv */
 3312|      0|							break;
 3313|       |						/* rv = smallest denormal */
 3314|      0|						if (bc.nd >nd) {
  ------------------
  |  Branch (3314:11): [True: 0, False: 0]
  ------------------
 3315|      0|							bc.uflchk = 1;
 3316|      0|							break;
 3317|      0|							}
 3318|      0|						goto undfl;
 3319|      0|						}
 3320|      0|					}
 3321|      0|#endif /*Avoid_Underflow*/
 3322|      0|				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
              				L = (word0(&rv) & Exp_mask) - Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3323|      0|#endif /*Sudden_Underflow}}*/
 3324|      0|				word0(&rv) = L | Bndry_mask1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = L | Bndry_mask1;
  ------------------
  |  |  353|      0|#define Bndry_mask1 0xfffff
  ------------------
 3325|      0|				word1(&rv) = 0xffffffff;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 3326|       |#ifdef IBM
 3327|       |				goto cont;
 3328|       |#else
 3329|      0|#ifndef NO_STRTOD_BIGCOMP
 3330|      0|				if (bc.nd > nd)
  ------------------
  |  Branch (3330:9): [True: 0, False: 0]
  ------------------
 3331|      0|					goto cont;
 3332|      0|#endif
 3333|      0|				break;
 3334|      0|#endif
 3335|      0|				}
 3336|  9.08k|#ifndef ROUND_BIASED
 3337|  9.08k|#ifdef Avoid_Underflow
 3338|  9.08k|			if (Lsb1) {
  ------------------
  |  Branch (3338:8): [True: 0, False: 9.08k]
  ------------------
 3339|      0|				if (!(word0(&rv) & Lsb1))
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (3339:9): [True: 0, False: 0]
  ------------------
 3340|      0|					break;
 3341|      0|				}
 3342|  9.08k|			else if (!(word1(&rv) & Lsb))
  ------------------
  |  |  299|  9.08k|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (3342:13): [True: 0, False: 9.08k]
  ------------------
 3343|      0|				break;
 3344|       |#else
 3345|       |			if (!(word1(&rv) & LSB))
 3346|       |				break;
 3347|       |#endif
 3348|  9.08k|#endif
 3349|  9.08k|			if (bc.dsign)
  ------------------
  |  Branch (3349:8): [True: 0, False: 9.08k]
  ------------------
 3350|      0|#ifdef Avoid_Underflow
 3351|      0|				dval(&rv) += sulp(&rv, &bc);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3352|       |#else
 3353|       |				dval(&rv) += ulp(&rv);
 3354|       |#endif
 3355|  9.08k|#ifndef ROUND_BIASED
 3356|  9.08k|			else {
 3357|  9.08k|#ifdef Avoid_Underflow
 3358|  9.08k|				dval(&rv) -= sulp(&rv, &bc);
  ------------------
  |  |  304|  9.08k|#define dval(x) (x)->d
  ------------------
 3359|       |#else
 3360|       |				dval(&rv) -= ulp(&rv);
 3361|       |#endif
 3362|  9.08k|#ifndef Sudden_Underflow
 3363|  9.08k|				if (!dval(&rv)) {
  ------------------
  |  |  304|  9.08k|#define dval(x) (x)->d
  ------------------
  |  Branch (3363:9): [True: 0, False: 9.08k]
  ------------------
 3364|      0|					if (bc.nd >nd) {
  ------------------
  |  Branch (3364:10): [True: 0, False: 0]
  ------------------
 3365|      0|						bc.uflchk = 1;
 3366|      0|						break;
 3367|      0|						}
 3368|      0|					goto undfl;
 3369|      0|					}
 3370|  9.08k|#endif
 3371|  9.08k|				}
 3372|  9.08k|#ifdef Avoid_Underflow
 3373|  9.08k|			bc.dsign = 1 - bc.dsign;
 3374|  9.08k|#endif
 3375|  9.08k|#endif
 3376|  9.08k|			break;
 3377|  9.08k|			}
 3378|     19|		if ((aadj = ratio(delta, bs)) <= 2.) {
  ------------------
  |  Branch (3378:7): [True: 19, False: 0]
  ------------------
 3379|     19|			if (bc.dsign)
  ------------------
  |  Branch (3379:8): [True: 2, False: 17]
  ------------------
 3380|      2|				aadj = aadj1 = 1.;
 3381|     17|			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  299|     34|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (299:18): [True: 17, False: 0]
  |  |  ------------------
  ------------------
              			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			else if (word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  352|      0|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3381:27): [True: 0, False: 0]
  ------------------
 3382|     17|#ifndef Sudden_Underflow
 3383|     17|				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  299|     17|#define word1(x) (x)->L[0]
  ------------------
              				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  358|     34|#define Tiny1 1
  ------------------
              				if (word1(&rv) == Tiny1 && !word0(&rv)) {
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (3383:9): [True: 0, False: 17]
  |  Branch (3383:32): [True: 0, False: 0]
  ------------------
 3384|      0|					if (bc.nd >nd) {
  ------------------
  |  Branch (3384:10): [True: 0, False: 0]
  ------------------
 3385|      0|						bc.uflchk = 1;
 3386|      0|						break;
 3387|      0|						}
 3388|      0|					goto undfl;
 3389|      0|					}
 3390|     17|#endif
 3391|     17|				aadj = 1.;
 3392|     17|				aadj1 = -1.;
 3393|     17|				}
 3394|      0|			else {
 3395|       |				/* special case -- power of FLT_RADIX to be */
 3396|       |				/* rounded down... */
 3397|       |
 3398|      0|				if (aadj < 2./FLT_RADIX)
  ------------------
  |  Branch (3398:9): [True: 0, False: 0]
  ------------------
 3399|      0|					aadj = 1./FLT_RADIX;
 3400|      0|				else
 3401|      0|					aadj *= 0.5;
 3402|      0|				aadj1 = -aadj;
 3403|      0|				}
 3404|     19|			}
 3405|      0|		else {
 3406|      0|			aadj *= 0.5;
 3407|      0|			aadj1 = bc.dsign ? aadj : -aadj;
  ------------------
  |  Branch (3407:12): [True: 0, False: 0]
  ------------------
 3408|       |#ifdef Check_FLT_ROUNDS
 3409|       |			switch(bc.rounding) {
 3410|       |				case 2: /* towards +infinity */
 3411|       |					aadj1 -= 0.5;
 3412|       |					break;
 3413|       |				case 0: /* towards 0 */
 3414|       |				case 3: /* towards -infinity */
 3415|       |					aadj1 += 0.5;
 3416|       |				}
 3417|       |#else
 3418|      0|			if (Flt_Rounds == 0)
  ------------------
  |  |  370|      0|#define Flt_Rounds FLT_ROUNDS
  ------------------
  |  Branch (3418:8): [True: 0, False: 0]
  ------------------
 3419|      0|				aadj1 += 0.5;
 3420|      0|#endif /*Check_FLT_ROUNDS*/
 3421|      0|			}
 3422|     19|		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  298|     19|#define word0(x) (x)->L[1]
  ------------------
              		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  339|     19|#define Exp_mask  0x7ff00000
  ------------------
 3423|       |
 3424|       |		/* Check for overflow */
 3425|       |
 3426|     19|		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
  ------------------
  |  |  337|     19|#define Exp_msk1    0x100000
  ------------------
              		if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
  ------------------
  |  |  342|     19|#define Bias 1023
  ------------------
  |  Branch (3426:7): [True: 0, False: 19]
  ------------------
 3427|      0|			dval(&rv0) = dval(&rv);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              			dval(&rv0) = dval(&rv);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3428|      0|			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              			word0(&rv) -= P*Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3429|      0|			adj.d = aadj1 * ulp(&rv);
 3430|      0|			dval(&rv) += adj.d;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3431|      0|			if ((word0(&rv) & Exp_mask) >=
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			if ((word0(&rv) & Exp_mask) >=
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3431:8): [True: 0, False: 0]
  ------------------
 3432|      0|					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
              					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              					Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
  ------------------
  |  |  340|      0|#define P 53
  ------------------
 3433|      0|				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  472|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  349|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  337|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  342|      0|#define Bias 1023
  |  |  ------------------
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
              				if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
  ------------------
  |  |  473|      0|#define Big1 0xffffffff
  ------------------
  |  Branch (3433:9): [True: 0, False: 0]
  |  Branch (3433:32): [True: 0, False: 0]
  ------------------
 3434|      0|					goto ovfl;
 3435|      0|				word0(&rv) = Big0;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) = Big0;
  ------------------
  |  |  472|      0|#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  349|      0|#define Frac_mask1 0xfffff
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  337|      0|#define Exp_msk1    0x100000
  |  |  ------------------
  |  |               #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
  |  |  ------------------
  |  |  |  |  342|      0|#define Bias 1023
  |  |  ------------------
  ------------------
 3436|      0|				word1(&rv) = Big1;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
              				word1(&rv) = Big1;
  ------------------
  |  |  473|      0|#define Big1 0xffffffff
  ------------------
 3437|      0|				goto cont;
 3438|      0|				}
 3439|      0|			else
 3440|      0|				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              				word0(&rv) += P*Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3441|      0|			}
 3442|     19|		else {
 3443|     19|#ifdef Avoid_Underflow
 3444|     19|			if (bc.scale && y <= 2*P*Exp_msk1) {
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              			if (bc.scale && y <= 2*P*Exp_msk1) {
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  |  Branch (3444:8): [True: 0, False: 19]
  |  Branch (3444:20): [True: 0, False: 0]
  ------------------
 3445|      0|				if (aadj <= 0x7fffffff) {
  ------------------
  |  Branch (3445:9): [True: 0, False: 0]
  ------------------
 3446|      0|					if ((z = aadj) <= 0)
  ------------------
  |  Branch (3446:10): [True: 0, False: 0]
  ------------------
 3447|      0|						z = 1;
 3448|      0|					aadj = z;
 3449|      0|					aadj1 = bc.dsign ? aadj : -aadj;
  ------------------
  |  Branch (3449:14): [True: 0, False: 0]
  ------------------
 3450|      0|					}
 3451|      0|				dval(&aadj2) = aadj1;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3452|      0|				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              				word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3453|      0|				aadj1 = dval(&aadj2);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3454|      0|				adj.d = aadj1 * ulp(&rv);
 3455|      0|				dval(&rv) += adj.d;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3456|      0|				if (rv.d == 0.)
  ------------------
  |  Branch (3456:9): [True: 0, False: 0]
  ------------------
 3457|       |#ifdef NO_STRTOD_BIGCOMP
 3458|       |					goto undfl;
 3459|       |#else
 3460|      0|					{
 3461|      0|					req_bigcomp = 1;
 3462|      0|					break;
 3463|      0|					}
 3464|      0|#endif
 3465|      0|				}
 3466|     19|			else {
 3467|     19|				adj.d = aadj1 * ulp(&rv);
 3468|     19|				dval(&rv) += adj.d;
  ------------------
  |  |  304|     19|#define dval(x) (x)->d
  ------------------
 3469|     19|				}
 3470|       |#else
 3471|       |#ifdef Sudden_Underflow
 3472|       |			if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
 3473|       |				dval(&rv0) = dval(&rv);
 3474|       |				word0(&rv) += P*Exp_msk1;
 3475|       |				adj.d = aadj1 * ulp(&rv);
 3476|       |				dval(&rv) += adj.d;
 3477|       |#ifdef IBM
 3478|       |				if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
 3479|       |#else
 3480|       |				if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
 3481|       |#endif
 3482|       |					{
 3483|       |					if (word0(&rv0) == Tiny0
 3484|       |					 && word1(&rv0) == Tiny1) {
 3485|       |						if (bc.nd >nd) {
 3486|       |							bc.uflchk = 1;
 3487|       |							break;
 3488|       |							}
 3489|       |						goto undfl;
 3490|       |						}
 3491|       |					word0(&rv) = Tiny0;
 3492|       |					word1(&rv) = Tiny1;
 3493|       |					goto cont;
 3494|       |					}
 3495|       |				else
 3496|       |					word0(&rv) -= P*Exp_msk1;
 3497|       |				}
 3498|       |			else {
 3499|       |				adj.d = aadj1 * ulp(&rv);
 3500|       |				dval(&rv) += adj.d;
 3501|       |				}
 3502|       |#else /*Sudden_Underflow*/
 3503|       |			/* Compute adj so that the IEEE rounding rules will
 3504|       |			 * correctly round rv + adj in some half-way cases.
 3505|       |			 * If rv * ulp(rv) is denormalized (i.e.,
 3506|       |			 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
 3507|       |			 * trouble from bits lost to denormalization;
 3508|       |			 * example: 1.2e-307 .
 3509|       |			 */
 3510|       |			if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
 3511|       |				aadj1 = (double)(int)(aadj + 0.5);
 3512|       |				if (!bc.dsign)
 3513|       |					aadj1 = -aadj1;
 3514|       |				}
 3515|       |			adj.d = aadj1 * ulp(&rv);
 3516|       |			dval(&rv) += adj.d;
 3517|       |#endif /*Sudden_Underflow*/
 3518|       |#endif /*Avoid_Underflow*/
 3519|     19|			}
 3520|     19|		z = word0(&rv) & Exp_mask;
  ------------------
  |  |  298|     19|#define word0(x) (x)->L[1]
  ------------------
              		z = word0(&rv) & Exp_mask;
  ------------------
  |  |  339|     19|#define Exp_mask  0x7ff00000
  ------------------
 3521|     19|#ifndef SET_INEXACT
 3522|     19|		if (bc.nd == nd) {
  ------------------
  |  Branch (3522:7): [True: 19, False: 0]
  ------------------
 3523|     19|#ifdef Avoid_Underflow
 3524|     19|		if (!bc.scale)
  ------------------
  |  Branch (3524:7): [True: 19, False: 0]
  ------------------
 3525|     19|#endif
 3526|     19|		if (y == z) {
  ------------------
  |  Branch (3526:7): [True: 19, False: 0]
  ------------------
 3527|       |			/* Can we stop now? */
 3528|     19|			L = (Long)aadj;
 3529|     19|			aadj -= L;
 3530|       |			/* The tolerances below are conservative. */
 3531|     19|			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  299|     36|#define word1(x) (x)->L[0]
  |  |  ------------------
  |  |  |  Branch (299:18): [True: 17, False: 0]
  |  |  ------------------
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              			if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
  ------------------
  |  |  352|      0|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (3531:8): [True: 2, False: 17]
  |  Branch (3531:34): [True: 0, False: 0]
  ------------------
 3532|     19|				if (aadj < .4999999 || aadj > .5000001)
  ------------------
  |  Branch (3532:9): [True: 19, False: 0]
  |  Branch (3532:28): [True: 0, False: 0]
  ------------------
 3533|     19|					break;
 3534|     19|				}
 3535|      0|			else if (aadj < .4999999/FLT_RADIX)
  ------------------
  |  Branch (3535:13): [True: 0, False: 0]
  ------------------
 3536|      0|				break;
 3537|     19|			}
 3538|     19|		}
 3539|      0|#endif
 3540|      0| cont:
 3541|      0|		Bfree(dalloc, bb);
 3542|      0|		Bfree(dalloc, bd);
 3543|      0|		Bfree(dalloc, bs);
 3544|      0|		Bfree(dalloc, delta);
 3545|      0|		}
 3546|  9.75k|	Bfree(dalloc, bb);
 3547|  9.75k|	Bfree(dalloc, bd);
 3548|  9.75k|	Bfree(dalloc, bs);
 3549|  9.75k|	Bfree(dalloc, bd0);
 3550|  9.75k|	Bfree(dalloc, delta);
 3551|  9.75k|#ifndef NO_STRTOD_BIGCOMP
 3552|  9.75k|	if (req_bigcomp) {
  ------------------
  |  Branch (3552:6): [True: 0, False: 9.75k]
  ------------------
 3553|      0|		bd0 = 0;
 3554|      0|		bc.e0 += nz1;
 3555|      0|		bigcomp(dalloc, &rv, s0, &bc);
 3556|      0|		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		y = word0(&rv) & Exp_mask;
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
 3557|      0|		if (y == Exp_mask)
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3557:7): [True: 0, False: 0]
  ------------------
 3558|      0|			goto ovfl;
 3559|      0|		if (y == 0 && rv.d == 0.)
  ------------------
  |  Branch (3559:7): [True: 0, False: 0]
  |  Branch (3559:17): [True: 0, False: 0]
  ------------------
 3560|      0|			goto undfl;
 3561|      0|		}
 3562|  9.75k|#endif
 3563|       |#ifdef SET_INEXACT
 3564|       |	if (bc.inexact) {
 3565|       |		if (!oldinexact) {
 3566|       |			word0(&rv0) = Exp_1 + (70 << Exp_shift);
 3567|       |			word1(&rv0) = 0;
 3568|       |			dval(&rv0) += 1.;
 3569|       |			}
 3570|       |		}
 3571|       |	else if (!oldinexact)
 3572|       |		clear_inexact();
 3573|       |#endif
 3574|  9.75k|#ifdef Avoid_Underflow
 3575|  9.75k|	if (bc.scale) {
  ------------------
  |  Branch (3575:6): [True: 0, False: 9.75k]
  ------------------
 3576|      0|		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  345|      0|#define Exp_1  0x3ff00000
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              		word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
 3577|      0|		word1(&rv0) = 0;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 3578|      0|		dval(&rv) *= dval(&rv0);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              		dval(&rv) *= dval(&rv0);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
 3579|      0|#ifndef NO_ERRNO
 3580|       |		/* try to avoid the bug of testing an 8087 register value */
 3581|      0|#ifdef IEEE_Arith
 3582|      0|		if (!(word0(&rv) & Exp_mask))
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		if (!(word0(&rv) & Exp_mask))
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (3582:7): [True: 0, False: 0]
  ------------------
 3583|       |#else
 3584|       |		if (word0(&rv) == 0 && word1(&rv) == 0)
 3585|       |#endif
 3586|      0|			errno = ERANGE;
 3587|      0|#endif
 3588|      0|		}
 3589|  9.75k|#endif /* Avoid_Underflow */
 3590|       |#ifdef SET_INEXACT
 3591|       |	if (bc.inexact && !(word0(&rv) & Exp_mask)) {
 3592|       |		/* set underflow bit */
 3593|       |		dval(&rv0) = 1e-300;
 3594|       |		dval(&rv0) *= dval(&rv0);
 3595|       |		}
 3596|       |#endif
 3597|  12.3k| ret:
 3598|  12.3k|	if (se)
  ------------------
  |  Branch (3598:6): [True: 12.3k, False: 0]
  ------------------
 3599|  12.3k|		*se = (char *)s;
 3600|  12.3k|	return sign ? -dval(&rv) : dval(&rv);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              	return sign ? -dval(&rv) : dval(&rv);
  ------------------
  |  |  304|  12.3k|#define dval(x) (x)->d
  ------------------
  |  Branch (3600:9): [True: 0, False: 12.3k]
  ------------------
 3601|  9.75k|	}
dtoa.c:s2b:
  713|  9.75k|{
  714|  9.75k|	Bigint *b;
  715|  9.75k|	int i, k;
  716|  9.75k|	Long x, y;
  717|       |
  718|  9.75k|	x = (nd + 8) / 9;
  719|  20.1k|	for(k = 0, y = 1; x > y; y <<= 1, k++) ;
  ------------------
  |  Branch (719:20): [True: 10.4k, False: 9.75k]
  ------------------
  720|  9.75k|#ifdef Pack_32
  721|  9.75k|	b = Balloc(dalloc, k);
  722|  9.75k|	b->x[0] = y9;
  723|  9.75k|	b->wds = 1;
  724|       |#else
  725|       |	b = Balloc(k+1);
  726|       |	b->x[0] = y9 & 0xffff;
  727|       |	b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
  728|       |#endif
  729|       |
  730|  9.75k|	i = 9;
  731|  9.75k|	if (9 < nd0) {
  ------------------
  |  Branch (731:6): [True: 9.35k, False: 408]
  ------------------
  732|  9.35k|		s += 9;
  733|  85.6k|		do b = multadd(dalloc, b, 10, *s++ - '0');
  734|  85.6k|			while(++i < nd0);
  ------------------
  |  Branch (734:10): [True: 76.3k, False: 9.35k]
  ------------------
  735|  9.35k|		s += dplen;
  736|  9.35k|		}
  737|    408|	else
  738|    408|		s += dplen + 9;
  739|  15.7k|	for(; i < nd; i++)
  ------------------
  |  Branch (739:8): [True: 6.01k, False: 9.75k]
  ------------------
  740|  6.01k|		b = multadd(dalloc, b, 10, *s++ - '0');
  741|  9.75k|	return b;
  742|  9.75k|	}
dtoa.c:sulp:
 2306|  9.08k|{
 2307|  9.08k|	U u;
 2308|  9.08k|	double rv;
 2309|  9.08k|	int i;
 2310|       |
 2311|  9.08k|	rv = ulp(x);
 2312|  9.08k|	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  339|      0|#define Exp_mask  0x7ff00000
  ------------------
              	if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
  ------------------
  |  |  335|      0|#define Exp_shift  20
  ------------------
  |  Branch (2312:6): [True: 9.08k, False: 0]
  |  Branch (2312:20): [True: 0, False: 0]
  ------------------
 2313|  9.08k|		return rv; /* Is there an example where i <= 0 ? */
 2314|      0|	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  345|      0|#define Exp_1  0x3ff00000
  ------------------
              	word0(&u) = Exp_1 + (i << Exp_shift);
  ------------------
  |  |  335|      0|#define Exp_shift  20
  ------------------
 2315|      0|	word1(&u) = 0;
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
 2316|      0|	return rv * u.d;
 2317|  9.08k|	}
dtoa.c:ratio:
 1456|     19|{
 1457|     19|	U da, db;
 1458|     19|	int k, ka, kb;
 1459|       |
 1460|     19|	dval(&da) = b2d(a, &ka);
  ------------------
  |  |  304|     19|#define dval(x) (x)->d
  ------------------
 1461|     19|	dval(&db) = b2d(b, &kb);
  ------------------
  |  |  304|     19|#define dval(x) (x)->d
  ------------------
 1462|     19|#ifdef Pack_32
 1463|     19|	k = ka - kb + 32*(a->wds - b->wds);
 1464|       |#else
 1465|       |	k = ka - kb + 16*(a->wds - b->wds);
 1466|       |#endif
 1467|       |#ifdef IBM
 1468|       |	if (k > 0) {
 1469|       |		word0(&da) += (k >> 2)*Exp_msk1;
 1470|       |		if (k &= 3)
 1471|       |			dval(&da) *= 1 << k;
 1472|       |		}
 1473|       |	else {
 1474|       |		k = -k;
 1475|       |		word0(&db) += (k >> 2)*Exp_msk1;
 1476|       |		if (k &= 3)
 1477|       |			dval(&db) *= 1 << k;
 1478|       |		}
 1479|       |#else
 1480|     19|	if (k > 0)
  ------------------
  |  Branch (1480:6): [True: 1, False: 18]
  ------------------
 1481|      1|		word0(&da) += k*Exp_msk1;
  ------------------
  |  |  298|      1|#define word0(x) (x)->L[1]
  ------------------
              		word0(&da) += k*Exp_msk1;
  ------------------
  |  |  337|      1|#define Exp_msk1    0x100000
  ------------------
 1482|     18|	else {
 1483|     18|		k = -k;
 1484|     18|		word0(&db) += k*Exp_msk1;
  ------------------
  |  |  298|     18|#define word0(x) (x)->L[1]
  ------------------
              		word0(&db) += k*Exp_msk1;
  ------------------
  |  |  337|     18|#define Exp_msk1    0x100000
  ------------------
 1485|     18|		}
 1486|     19|#endif
 1487|     19|	return dval(&da) / dval(&db);
  ------------------
  |  |  304|     19|#define dval(x) (x)->d
  ------------------
              	return dval(&da) / dval(&db);
  ------------------
  |  |  304|     19|#define dval(x) (x)->d
  ------------------
 1488|     19|	}
dtoa.c:b2d:
 1252|     38|{
 1253|     38|	ULong *xa, *xa0, w, y, z;
 1254|     38|	int k;
 1255|     38|	U d;
 1256|       |#ifdef VAX
 1257|       |	ULong d0, d1;
 1258|       |#else
 1259|     38|#define d0 word0(&d)
 1260|     38|#define d1 word1(&d)
 1261|     38|#endif
 1262|       |
 1263|     38|	xa0 = a->x;
 1264|     38|	xa = xa0 + a->wds;
 1265|     38|	y = *--xa;
 1266|       |#ifdef DEBUG
 1267|       |	if (!y) Bug("zero y in b2d");
 1268|       |#endif
 1269|     38|	k = hi0bits(y);
 1270|     38|	*e = 32 - k;
 1271|     38|#ifdef Pack_32
 1272|     38|	if (k < Ebits) {
  ------------------
  |  |  347|     38|#define Ebits 11
  ------------------
  |  Branch (1272:6): [True: 4, False: 34]
  ------------------
 1273|      4|		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  | 1259|      4|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  298|      4|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  |  345|      4|#define Exp_1  0x3ff00000
  ------------------
              		d0 = Exp_1 | y >> (Ebits - k);
  ------------------
  |  |  347|      4|#define Ebits 11
  ------------------
 1274|      4|		w = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1274:7): [True: 0, False: 4]
  ------------------
 1275|      4|		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  | 1260|      4|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  299|      4|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
              		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  |  347|      4|#define Ebits 11
  ------------------
              		d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
  ------------------
  |  |  347|      4|#define Ebits 11
  ------------------
 1276|      4|		goto ret_d;
 1277|      4|		}
 1278|     34|	z = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1278:6): [True: 2, False: 32]
  ------------------
 1279|     34|	if (k -= Ebits) {
  ------------------
  |  |  347|     34|#define Ebits 11
  ------------------
  |  Branch (1279:6): [True: 34, False: 0]
  ------------------
 1280|     34|		d0 = Exp_1 | y << k | z >> (32 - k);
  ------------------
  |  | 1259|     34|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  298|     34|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y << k | z >> (32 - k);
  ------------------
  |  |  345|     34|#define Exp_1  0x3ff00000
  ------------------
 1281|     34|		y = xa > xa0 ? *--xa : 0;
  ------------------
  |  Branch (1281:7): [True: 0, False: 34]
  ------------------
 1282|     34|		d1 = z << k | y >> (32 - k);
  ------------------
  |  | 1260|     34|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  299|     34|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
 1283|     34|		}
 1284|      0|	else {
 1285|      0|		d0 = Exp_1 | y;
  ------------------
  |  | 1259|      0|#define d0 word0(&d)
  |  |  ------------------
  |  |  |  |  298|      0|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              		d0 = Exp_1 | y;
  ------------------
  |  |  345|      0|#define Exp_1  0x3ff00000
  ------------------
 1286|      0|		d1 = z;
  ------------------
  |  | 1260|      0|#define d1 word1(&d)
  |  |  ------------------
  |  |  |  |  299|      0|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
 1287|      0|		}
 1288|       |#else
 1289|       |	if (k < Ebits + 16) {
 1290|       |		z = xa > xa0 ? *--xa : 0;
 1291|       |		d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
 1292|       |		w = xa > xa0 ? *--xa : 0;
 1293|       |		y = xa > xa0 ? *--xa : 0;
 1294|       |		d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
 1295|       |		goto ret_d;
 1296|       |		}
 1297|       |	z = xa > xa0 ? *--xa : 0;
 1298|       |	w = xa > xa0 ? *--xa : 0;
 1299|       |	k -= Ebits + 16;
 1300|       |	d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
 1301|       |	y = xa > xa0 ? *--xa : 0;
 1302|       |	d1 = w << k + 16 | y << k;
 1303|       |#endif
 1304|     38| ret_d:
 1305|       |#ifdef VAX
 1306|       |	word0(&d) = d0 >> 16 | d0 << 16;
 1307|       |	word1(&d) = d1 >> 16 | d1 << 16;
 1308|       |#else
 1309|     38|#undef d0
 1310|     38|#undef d1
 1311|     38|#endif
 1312|     38|	return dval(&d);
  ------------------
  |  |  304|     38|#define dval(x) (x)->d
  ------------------
 1313|     34|	}
dtoa.c:hi0bits:
  751|  3.99k|{
  752|  3.99k|	int k = 0;
  753|       |
  754|  3.99k|	if (!(x & 0xffff0000)) {
  ------------------
  |  Branch (754:6): [True: 3.97k, False: 22]
  ------------------
  755|  3.97k|		k = 16;
  756|  3.97k|		x <<= 16;
  757|  3.97k|		}
  758|  3.99k|	if (!(x & 0xff000000)) {
  ------------------
  |  Branch (758:6): [True: 3.95k, False: 42]
  ------------------
  759|  3.95k|		k += 8;
  760|  3.95k|		x <<= 8;
  761|  3.95k|		}
  762|  3.99k|	if (!(x & 0xf0000000)) {
  ------------------
  |  Branch (762:6): [True: 24, False: 3.96k]
  ------------------
  763|     24|		k += 4;
  764|     24|		x <<= 4;
  765|     24|		}
  766|  3.99k|	if (!(x & 0xc0000000)) {
  ------------------
  |  Branch (766:6): [True: 48, False: 3.94k]
  ------------------
  767|     48|		k += 2;
  768|     48|		x <<= 2;
  769|     48|		}
  770|  3.99k|	if (!(x & 0x80000000)) {
  ------------------
  |  Branch (770:6): [True: 23, False: 3.96k]
  ------------------
  771|     23|		k++;
  772|     23|		if (!(x & 0x40000000))
  ------------------
  |  Branch (772:7): [True: 0, False: 23]
  ------------------
  773|      0|			return 32;
  774|     23|		}
  775|  3.99k|	return k;
  776|  3.99k|	}
dtoa.c:ulp:
 1210|  9.10k|{
 1211|  9.10k|	Long L;
 1212|  9.10k|	U u;
 1213|       |
 1214|  9.10k|	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  298|  9.10k|#define word0(x) (x)->L[1]
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  339|  9.10k|#define Exp_mask  0x7ff00000
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  340|  9.10k|#define P 53
  ------------------
              	L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
  ------------------
  |  |  337|  9.10k|#define Exp_msk1    0x100000
  ------------------
 1215|       |#ifndef Avoid_Underflow
 1216|       |#ifndef Sudden_Underflow
 1217|       |	if (L > 0) {
 1218|       |#endif
 1219|       |#endif
 1220|       |#ifdef IBM
 1221|       |		L |= Exp_msk1 >> 4;
 1222|       |#endif
 1223|  9.10k|		word0(&u) = L;
  ------------------
  |  |  298|  9.10k|#define word0(x) (x)->L[1]
  ------------------
 1224|  9.10k|		word1(&u) = 0;
  ------------------
  |  |  299|  9.10k|#define word1(x) (x)->L[0]
  ------------------
 1225|       |#ifndef Avoid_Underflow
 1226|       |#ifndef Sudden_Underflow
 1227|       |		}
 1228|       |	else {
 1229|       |		L = -L >> Exp_shift;
 1230|       |		if (L < Exp_shift) {
 1231|       |			word0(&u) = 0x80000 >> L;
 1232|       |			word1(&u) = 0;
 1233|       |			}
 1234|       |		else {
 1235|       |			word0(&u) = 0;
 1236|       |			L -= Exp_shift;
 1237|       |			word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
 1238|       |			}
 1239|       |		}
 1240|       |#endif
 1241|       |#endif
 1242|  9.10k|	return dval(&u);
  ------------------
  |  |  304|  9.10k|#define dval(x) (x)->d
  ------------------
 1243|  9.10k|	}
dtoa.c:Bfree:
  631|   164k|{
  632|   164k|	if (v) {
  ------------------
  |  Branch (632:6): [True: 164k, False: 0]
  ------------------
  633|   164k|		if (v->k > Kmax)
  ------------------
  |  |  516|   164k|#define Kmax 7
  ------------------
  |  Branch (633:7): [True: 0, False: 164k]
  ------------------
  634|       |#ifdef FREE
  635|       |			FREE((void*)v);
  636|       |#else
  637|      0|			free((void*)v);
  638|   164k|#endif
  639|   164k|		else {
  640|   164k|			v->next = dalloc->freelist[v->k];
  641|   164k|			dalloc->freelist[v->k] = v;
  642|   164k|			}
  643|   164k|		}
  644|   164k|	}
dtoa.c:d2b:
 1322|  13.8k|{
 1323|  13.8k|	Bigint *b;
 1324|  13.8k|	int de, k;
 1325|  13.8k|	ULong *x, y, z;
 1326|  13.8k|#ifndef Sudden_Underflow
 1327|  13.8k|	int i;
 1328|  13.8k|#endif
 1329|       |#ifdef VAX
 1330|       |	ULong d0, d1;
 1331|       |	d0 = word0(d) >> 16 | word0(d) << 16;
 1332|       |	d1 = word1(d) >> 16 | word1(d) << 16;
 1333|       |#else
 1334|  13.8k|#define d0 word0(d)
 1335|  13.8k|#define d1 word1(d)
 1336|  13.8k|#endif
 1337|       |
 1338|  13.8k|#ifdef Pack_32
 1339|  13.8k|	b = Balloc(dalloc, 1);
 1340|       |#else
 1341|       |	b = Balloc(dalloc, 2);
 1342|       |#endif
 1343|  13.8k|	x = b->x;
 1344|       |
 1345|  13.8k|	z = d0 & Frac_mask;
  ------------------
  |  | 1334|  13.8k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  298|  13.8k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              	z = d0 & Frac_mask;
  ------------------
  |  |  348|  13.8k|#define Frac_mask  0xfffff
  ------------------
 1346|  13.8k|	d0 &= 0x7fffffff;	/* clear sign bit, which we ignore */
  ------------------
  |  | 1334|  13.8k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  298|  13.8k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
 1347|       |#ifdef Sudden_Underflow
 1348|       |	de = (int)(d0 >> Exp_shift);
 1349|       |#ifndef IBM
 1350|       |	z |= Exp_msk11;
 1351|       |#endif
 1352|       |#else
 1353|  13.8k|	if ((de = (int)(d0 >> Exp_shift)))
  ------------------
  |  | 1334|  13.8k|#define d0 word0(d)
  |  |  ------------------
  |  |  |  |  298|  13.8k|#define word0(x) (x)->L[1]
  |  |  ------------------
  ------------------
              	if ((de = (int)(d0 >> Exp_shift)))
  ------------------
  |  |  335|  13.8k|#define Exp_shift  20
  ------------------
  |  Branch (1353:6): [True: 13.8k, False: 0]
  ------------------
 1354|  13.8k|		z |= Exp_msk1;
  ------------------
  |  |  337|  13.8k|#define Exp_msk1    0x100000
  ------------------
 1355|  13.8k|#endif
 1356|  13.8k|#ifdef Pack_32
 1357|  13.8k|	if ((y = d1)) {
  ------------------
  |  | 1335|  13.8k|#define d1 word1(d)
  |  |  ------------------
  |  |  |  |  299|  13.8k|#define word1(x) (x)->L[0]
  |  |  ------------------
  ------------------
  |  Branch (1357:6): [True: 13.6k, False: 147]
  ------------------
 1358|  13.6k|		if ((k = lo0bits(&y))) {
  ------------------
  |  Branch (1358:7): [True: 4.53k, False: 9.12k]
  ------------------
 1359|  4.53k|			x[0] = y | z << (32 - k);
 1360|  4.53k|			z >>= k;
 1361|  4.53k|			}
 1362|  9.12k|		else
 1363|  9.12k|			x[0] = y;
 1364|  13.6k|#ifndef Sudden_Underflow
 1365|  13.6k|		i =
 1366|  13.6k|#endif
 1367|  13.6k|		    b->wds = (x[1] = z) ? 2 : 1;
  ------------------
  |  Branch (1367:16): [True: 13.6k, False: 2]
  ------------------
 1368|  13.6k|		}
 1369|    147|	else {
 1370|    147|		k = lo0bits(&z);
 1371|    147|		x[0] = z;
 1372|    147|#ifndef Sudden_Underflow
 1373|    147|		i =
 1374|    147|#endif
 1375|    147|			b->wds = 1;
 1376|    147|		k += 32;
 1377|    147|		}
 1378|       |#else
 1379|       |	if (y = d1) {
 1380|       |		if (k = lo0bits(&y))
 1381|       |			if (k >= 16) {
 1382|       |				x[0] = y | z << 32 - k & 0xffff;
 1383|       |				x[1] = z >> k - 16 & 0xffff;
 1384|       |				x[2] = z >> k;
 1385|       |				i = 2;
 1386|       |				}
 1387|       |			else {
 1388|       |				x[0] = y & 0xffff;
 1389|       |				x[1] = y >> 16 | z << 16 - k & 0xffff;
 1390|       |				x[2] = z >> k & 0xffff;
 1391|       |				x[3] = z >> k+16;
 1392|       |				i = 3;
 1393|       |				}
 1394|       |		else {
 1395|       |			x[0] = y & 0xffff;
 1396|       |			x[1] = y >> 16;
 1397|       |			x[2] = z & 0xffff;
 1398|       |			x[3] = z >> 16;
 1399|       |			i = 3;
 1400|       |			}
 1401|       |		}
 1402|       |	else {
 1403|       |#ifdef DEBUG
 1404|       |		if (!z)
 1405|       |			Bug("Zero passed to d2b");
 1406|       |#endif
 1407|       |		k = lo0bits(&z);
 1408|       |		if (k >= 16) {
 1409|       |			x[0] = z;
 1410|       |			i = 0;
 1411|       |			}
 1412|       |		else {
 1413|       |			x[0] = z & 0xffff;
 1414|       |			x[1] = z >> 16;
 1415|       |			i = 1;
 1416|       |			}
 1417|       |		k += 32;
 1418|       |		}
 1419|       |	while(!x[i])
 1420|       |		--i;
 1421|       |	b->wds = i + 1;
 1422|       |#endif
 1423|  13.8k|#ifndef Sudden_Underflow
 1424|  13.8k|	if (de) {
  ------------------
  |  Branch (1424:6): [True: 13.8k, False: 0]
  ------------------
 1425|  13.8k|#endif
 1426|       |#ifdef IBM
 1427|       |		*e = (de - Bias - (P-1) << 2) + k;
 1428|       |		*bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
 1429|       |#else
 1430|  13.8k|		*e = de - Bias - (P-1) + k;
  ------------------
  |  |  342|  13.8k|#define Bias 1023
  ------------------
              		*e = de - Bias - (P-1) + k;
  ------------------
  |  |  340|  13.8k|#define P 53
  ------------------
 1431|  13.8k|		*bits = P - k;
  ------------------
  |  |  340|  13.8k|#define P 53
  ------------------
 1432|  13.8k|#endif
 1433|  13.8k|#ifndef Sudden_Underflow
 1434|  13.8k|		}
 1435|      0|	else {
 1436|      0|		*e = de - Bias - (P-1) + 1 + k;
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              		*e = de - Bias - (P-1) + 1 + k;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
 1437|      0|#ifdef Pack_32
 1438|      0|		*bits = 32*i - hi0bits(x[i-1]);
 1439|       |#else
 1440|       |		*bits = (i+2)*16 - hi0bits(x[i]);
 1441|       |#endif
 1442|      0|		}
 1443|  13.8k|#endif
 1444|  13.8k|	return b;
 1445|  13.8k|	}
dtoa.c:lo0bits:
  785|  13.8k|{
  786|  13.8k|	int k;
  787|  13.8k|	ULong x = *y;
  788|       |
  789|  13.8k|	if (x & 7) {
  ------------------
  |  Branch (789:6): [True: 13.5k, False: 294]
  ------------------
  790|  13.5k|		if (x & 1)
  ------------------
  |  Branch (790:7): [True: 9.12k, False: 4.38k]
  ------------------
  791|  9.12k|			return 0;
  792|  4.38k|		if (x & 2) {
  ------------------
  |  Branch (792:7): [True: 29, False: 4.35k]
  ------------------
  793|     29|			*y = x >> 1;
  794|     29|			return 1;
  795|     29|			}
  796|  4.35k|		*y = x >> 2;
  797|  4.35k|		return 2;
  798|  4.38k|		}
  799|    294|	k = 0;
  800|    294|	if (!(x & 0xffff)) {
  ------------------
  |  Branch (800:6): [True: 110, False: 184]
  ------------------
  801|    110|		k = 16;
  802|    110|		x >>= 16;
  803|    110|		}
  804|    294|	if (!(x & 0xff)) {
  ------------------
  |  Branch (804:6): [True: 51, False: 243]
  ------------------
  805|     51|		k += 8;
  806|     51|		x >>= 8;
  807|     51|		}
  808|    294|	if (!(x & 0xf)) {
  ------------------
  |  Branch (808:6): [True: 133, False: 161]
  ------------------
  809|    133|		k += 4;
  810|    133|		x >>= 4;
  811|    133|		}
  812|    294|	if (!(x & 0x3)) {
  ------------------
  |  Branch (812:6): [True: 158, False: 136]
  ------------------
  813|    158|		k += 2;
  814|    158|		x >>= 2;
  815|    158|		}
  816|    294|	if (!(x & 1)) {
  ------------------
  |  Branch (816:6): [True: 162, False: 132]
  ------------------
  817|    162|		k++;
  818|    162|		x >>= 1;
  819|    162|		if (!x)
  ------------------
  |  Branch (819:7): [True: 0, False: 162]
  ------------------
  820|      0|			return 32;
  821|    162|		}
  822|    294|	*y = x;
  823|    294|	return k;
  824|    294|	}
dtoa.c:rv_alloc:
 3628|  4.04k|{
 3629|  4.04k|	int j, k, *r;
 3630|       |
 3631|  4.04k|	j = sizeof(ULong);
 3632|  4.04k|	for(k = 0;
 3633|  4.04k|		sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;
  ------------------
  |  Branch (3633:3): [True: 0, False: 4.04k]
  ------------------
 3634|  4.04k|		j <<= 1)
 3635|      0|			k++;
 3636|  4.04k|	r = (int*)Balloc(dalloc, k);
 3637|  4.04k|	*r = k;
 3638|  4.04k|	return
 3639|       |#ifndef MULTIPLE_THREADS
 3640|       |	dtoa_result =
 3641|       |#endif
 3642|  4.04k|		(char *)(r+1);
 3643|  4.04k|	}
dtoa.c:i2b:
  833|  17.6k|{
  834|  17.6k|	Bigint *b;
  835|       |
  836|  17.6k|	b = Balloc(dalloc, 1);
  837|  17.6k|	b->x[0] = i;
  838|  17.6k|	b->wds = 1;
  839|  17.6k|	return b;
  840|  17.6k|	}
dtoa.c:pow5mult:
  963|  4.36k|{
  964|  4.36k|	Bigint *b1, *p5, *p51;
  965|  4.36k|	int i;
  966|  4.36k|	static int p05[3] = { 5, 25, 125 };
  967|       |
  968|  4.36k|	if ((i = k & 3))
  ------------------
  |  Branch (968:6): [True: 4.34k, False: 24]
  ------------------
  969|  4.34k|		b = multadd(dalloc, b, p05[i-1], 0);
  970|       |
  971|  4.36k|	if (!(k >>= 2))
  ------------------
  |  Branch (971:6): [True: 0, False: 4.36k]
  ------------------
  972|      0|		return b;
  973|  4.36k|	if (!(p5 = p5s)) {
  ------------------
  |  Branch (973:6): [True: 1, False: 4.36k]
  ------------------
  974|       |		/* first time */
  975|      1|#ifdef MULTIPLE_THREADS
  976|      1|		ACQUIRE_DTOA_LOCK(1);
  977|      1|		if (!(p5 = p5s)) {
  ------------------
  |  Branch (977:7): [True: 1, False: 0]
  ------------------
  978|      1|			dalloc_init(&cache.h, PRIVATE_MEM);
  ------------------
  |  |  217|      1|#define PRIVATE_MEM 2304
  ------------------
  979|      1|			p5 = p5s = i2b(&cache.h, 625);
  980|      1|			p5->next = 0;
  981|      1|			}
  982|      1|		FREE_DTOA_LOCK(1);
  983|       |#else
  984|       |		dalloc_init(&cache.h, PRIVATE_MEM);
  985|       |		p5 = p5s = i2b(&cache.h, 625);
  986|       |		p5->next = 0;
  987|       |#endif
  988|      1|		}
  989|  13.1k|	for(;;) {
  990|  13.1k|		if (k & 1) {
  ------------------
  |  Branch (990:7): [True: 4.39k, False: 8.71k]
  ------------------
  991|  4.39k|			b1 = mult(dalloc, b, p5);
  992|  4.39k|			Bfree(dalloc, b);
  993|  4.39k|			b = b1;
  994|  4.39k|			}
  995|  13.1k|		if (!(k >>= 1))
  ------------------
  |  Branch (995:7): [True: 4.36k, False: 8.74k]
  ------------------
  996|  4.36k|			break;
  997|  8.74k|		if (!(p51 = p5->next)) {
  ------------------
  |  Branch (997:7): [True: 6, False: 8.74k]
  ------------------
  998|      6|#ifdef MULTIPLE_THREADS
  999|      6|			ACQUIRE_DTOA_LOCK(1);
 1000|      6|			if (!(p51 = p5->next)) {
  ------------------
  |  Branch (1000:8): [True: 6, False: 0]
  ------------------
 1001|      6|				p51 = p5->next = mult(&cache.h,p5,p5);
 1002|      6|				p51->next = 0;
 1003|      6|				}
 1004|      6|			FREE_DTOA_LOCK(1);
 1005|       |#else
 1006|       |			p51 = p5->next = mult(&cache.h,p5,p5);
 1007|       |			p51->next = 0;
 1008|       |#endif
 1009|      6|			}
 1010|  8.74k|		p5 = p51;
 1011|  8.74k|		}
 1012|  4.36k|	return b;
 1013|  4.36k|	}
dtoa.c:mult:
  849|  4.80k|{
  850|  4.80k|	Bigint *c;
  851|  4.80k|	int k, wa, wb, wc;
  852|  4.80k|	ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
  853|  4.80k|	ULong y;
  854|  4.80k|#ifdef ULLong
  855|  4.80k|	ULLong carry, z;
  ------------------
  |  |  504|  4.80k|#define ULLong unsigned Llong
  ------------------
  856|       |#else
  857|       |	ULong carry, z;
  858|       |#ifdef Pack_32
  859|       |	ULong z2;
  860|       |#endif
  861|       |#endif
  862|       |
  863|  4.80k|	if (a->wds < b->wds) {
  ------------------
  |  Branch (863:6): [True: 4.36k, False: 440]
  ------------------
  864|  4.36k|		c = a;
  865|  4.36k|		a = b;
  866|  4.36k|		b = c;
  867|  4.36k|		}
  868|  4.80k|	k = a->k;
  869|  4.80k|	wa = a->wds;
  870|  4.80k|	wb = b->wds;
  871|  4.80k|	wc = wa + wb;
  872|  4.80k|	if (wc > a->maxwds)
  ------------------
  |  Branch (872:6): [True: 4.36k, False: 446]
  ------------------
  873|  4.36k|		k++;
  874|  4.80k|	c = Balloc(dalloc, k);
  875|  19.7k|	for(x = c->x, xa = x + wc; x < xa; x++)
  ------------------
  |  Branch (875:29): [True: 14.9k, False: 4.80k]
  ------------------
  876|  14.9k|		*x = 0;
  877|  4.80k|	xa = a->x;
  878|  4.80k|	xae = xa + wa;
  879|  4.80k|	xb = b->x;
  880|  4.80k|	xbe = xb + wb;
  881|  4.80k|	xc0 = c->x;
  882|  4.80k|#ifdef ULLong
  883|  10.0k|	for(; xb < xbe; xc0++) {
  ------------------
  |  Branch (883:8): [True: 5.24k, False: 4.80k]
  ------------------
  884|  5.24k|		if ((y = *xb++)) {
  ------------------
  |  Branch (884:7): [True: 5.24k, False: 0]
  ------------------
  885|  5.24k|			x = xa;
  886|  5.24k|			xc = xc0;
  887|  5.24k|			carry = 0;
  888|  10.7k|			do {
  889|  10.7k|				z = *x++ * (ULLong)y + *xc + carry;
  890|  10.7k|				carry = z >> 32;
  891|  10.7k|				*xc++ = z & FFFFFFFF;
  ------------------
  |  |  486|  10.7k|#define FFFFFFFF 0xffffffffUL
  ------------------
  892|  10.7k|				}
  893|  10.7k|				while(x < xae);
  ------------------
  |  Branch (893:11): [True: 5.52k, False: 5.24k]
  ------------------
  894|  5.24k|			*xc = carry;
  895|  5.24k|			}
  896|  5.24k|		}
  897|       |#else
  898|       |#ifdef Pack_32
  899|       |	for(; xb < xbe; xb++, xc0++) {
  900|       |		if (y = *xb & 0xffff) {
  901|       |			x = xa;
  902|       |			xc = xc0;
  903|       |			carry = 0;
  904|       |			do {
  905|       |				z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
  906|       |				carry = z >> 16;
  907|       |				z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
  908|       |				carry = z2 >> 16;
  909|       |				Storeinc(xc, z2, z);
  910|       |				}
  911|       |				while(x < xae);
  912|       |			*xc = carry;
  913|       |			}
  914|       |		if (y = *xb >> 16) {
  915|       |			x = xa;
  916|       |			xc = xc0;
  917|       |			carry = 0;
  918|       |			z2 = *xc;
  919|       |			do {
  920|       |				z = (*x & 0xffff) * y + (*xc >> 16) + carry;
  921|       |				carry = z >> 16;
  922|       |				Storeinc(xc, z, z2);
  923|       |				z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
  924|       |				carry = z2 >> 16;
  925|       |				}
  926|       |				while(x < xae);
  927|       |			*xc = z2;
  928|       |			}
  929|       |		}
  930|       |#else
  931|       |	for(; xb < xbe; xc0++) {
  932|       |		if (y = *xb++) {
  933|       |			x = xa;
  934|       |			xc = xc0;
  935|       |			carry = 0;
  936|       |			do {
  937|       |				z = *x++ * y + *xc + carry;
  938|       |				carry = z >> 16;
  939|       |				*xc++ = z & 0xffff;
  940|       |				}
  941|       |				while(x < xae);
  942|       |			*xc = carry;
  943|       |			}
  944|       |		}
  945|       |#endif
  946|       |#endif
  947|  9.60k|	for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
  ------------------
  |  Branch (947:33): [True: 9.60k, False: 0]
  |  Branch (947:43): [True: 4.79k, False: 4.80k]
  ------------------
  948|  4.80k|	c->wds = wc;
  949|  4.80k|	return c;
  950|  4.80k|	}
dtoa.c:dshift:
 2167|  3.95k|{
 2168|  3.95k|	int rv = hi0bits(b->x[b->wds-1]) - 4;
 2169|  3.95k|	if (p2 > 0)
  ------------------
  |  Branch (2169:6): [True: 3.95k, False: 4]
  ------------------
 2170|  3.95k|		rv -= p2;
 2171|  3.95k|	return rv & kmask;
  ------------------
  |  | 1686|  3.95k|#define kmask 31
  ------------------
 2172|  3.95k|	}
dtoa.c:lshift:
 1022|  31.3k|{
 1023|  31.3k|	int i, k1, n, n1;
 1024|  31.3k|	Bigint *b1;
 1025|  31.3k|	ULong *x, *x1, *xe, z;
 1026|       |
 1027|  31.3k|#ifdef Pack_32
 1028|  31.3k|	n = k >> 5;
 1029|       |#else
 1030|       |	n = k >> 4;
 1031|       |#endif
 1032|  31.3k|	k1 = b->k;
 1033|  31.3k|	n1 = n + b->wds + 1;
 1034|  44.8k|	for(i = b->maxwds; n1 > i; i <<= 1)
  ------------------
  |  Branch (1034:21): [True: 13.4k, False: 31.3k]
  ------------------
 1035|  13.4k|		k1++;
 1036|  31.3k|	b1 = Balloc(dalloc, k1);
 1037|  31.3k|	x1 = b1->x;
 1038|  31.8k|	for(i = 0; i < n; i++)
  ------------------
  |  Branch (1038:13): [True: 424, False: 31.3k]
  ------------------
 1039|    424|		*x1++ = 0;
 1040|  31.3k|	x = b->x;
 1041|  31.3k|	xe = x + b->wds;
 1042|  31.3k|#ifdef Pack_32
 1043|  31.3k|	if (k &= 0x1f) {
  ------------------
  |  Branch (1043:6): [True: 31.3k, False: 37]
  ------------------
 1044|  31.3k|		k1 = 32 - k;
 1045|  31.3k|		z = 0;
 1046|  50.1k|		do {
 1047|  50.1k|			*x1++ = *x << k | z;
 1048|  50.1k|			z = *x++ >> k1;
 1049|  50.1k|			}
 1050|  50.1k|			while(x < xe);
  ------------------
  |  Branch (1050:10): [True: 18.8k, False: 31.3k]
  ------------------
 1051|  31.3k|		if ((*x1 = z))
  ------------------
  |  Branch (1051:7): [True: 894, False: 30.4k]
  ------------------
 1052|    894|			++n1;
 1053|  31.3k|		}
 1054|       |#else
 1055|       |	if (k &= 0xf) {
 1056|       |		k1 = 16 - k;
 1057|       |		z = 0;
 1058|       |		do {
 1059|       |			*x1++ = *x << k  & 0xffff | z;
 1060|       |			z = *x++ >> k1;
 1061|       |			}
 1062|       |			while(x < xe);
 1063|       |		if (*x1 = z)
 1064|       |			++n1;
 1065|       |		}
 1066|       |#endif
 1067|     37|	else do
 1068|     39|		*x1++ = *x++;
 1069|     39|		while(x < xe);
  ------------------
  |  Branch (1069:9): [True: 2, False: 37]
  ------------------
 1070|  31.3k|	b1->wds = n1 - 1;
 1071|  31.3k|	Bfree(dalloc, b);
 1072|  31.3k|	return b1;
 1073|  31.3k|	}
dtoa.c:cmp:
 1082|   272k|{
 1083|   272k|	ULong *xa, *xa0, *xb, *xb0;
 1084|   272k|	int i, j;
 1085|       |
 1086|   272k|	i = a->wds;
 1087|   272k|	j = b->wds;
 1088|       |#ifdef DEBUG
 1089|       |	if (i > 1 && !a->x[i-1])
 1090|       |		Bug("cmp called with a->x[a->wds-1] == 0");
 1091|       |	if (j > 1 && !b->x[j-1])
 1092|       |		Bug("cmp called with b->x[b->wds-1] == 0");
 1093|       |#endif
 1094|   272k|	if (i -= j)
  ------------------
  |  Branch (1094:6): [True: 63.3k, False: 209k]
  ------------------
 1095|  63.3k|		return i;
 1096|   209k|	xa0 = a->x;
 1097|   209k|	xa = xa0 + j;
 1098|   209k|	xb0 = b->x;
 1099|   209k|	xb = xb0 + j;
 1100|   219k|	for(;;) {
 1101|   219k|		if (*--xa != *--xb)
  ------------------
  |  Branch (1101:7): [True: 200k, False: 19.4k]
  ------------------
 1102|   200k|			return *xa < *xb ? -1 : 1;
  ------------------
  |  Branch (1102:11): [True: 131k, False: 68.5k]
  ------------------
 1103|  19.4k|		if (xa <= xa0)
  ------------------
  |  Branch (1103:7): [True: 9.14k, False: 10.3k]
  ------------------
 1104|  9.14k|			break;
 1105|  19.4k|		}
 1106|  9.14k|	return 0;
 1107|   209k|	}
dtoa.c:multadd:
  656|   214k|{
  657|   214k|	int i, wds;
  658|   214k|#ifdef ULLong
  659|   214k|	ULong *x;
  660|   214k|	ULLong carry, y;
  ------------------
  |  |  504|   214k|#define ULLong unsigned Llong
  ------------------
  661|       |#else
  662|       |	ULong carry, *x, y;
  663|       |#ifdef Pack_32
  664|       |	ULong xi, z;
  665|       |#endif
  666|       |#endif
  667|   214k|	Bigint *b1;
  668|       |
  669|   214k|	wds = b->wds;
  670|   214k|	x = b->x;
  671|   214k|	i = 0;
  672|   214k|	carry = a;
  673|   377k|	do {
  674|   377k|#ifdef ULLong
  675|   377k|		y = *x * (ULLong)m + carry;
  676|   377k|		carry = y >> 32;
  677|   377k|		*x++ = y & FFFFFFFF;
  ------------------
  |  |  486|   377k|#define FFFFFFFF 0xffffffffUL
  ------------------
  678|       |#else
  679|       |#ifdef Pack_32
  680|       |		xi = *x;
  681|       |		y = (xi & 0xffff) * m + carry;
  682|       |		z = (xi >> 16) * m + (y >> 16);
  683|       |		carry = z >> 16;
  684|       |		*x++ = (z << 16) + (y & 0xffff);
  685|       |#else
  686|       |		y = *x * m + carry;
  687|       |		carry = y >> 16;
  688|       |		*x++ = y & 0xffff;
  689|       |#endif
  690|       |#endif
  691|   377k|		}
  692|   377k|		while(++i < wds);
  ------------------
  |  Branch (692:9): [True: 162k, False: 214k]
  ------------------
  693|   214k|	if (carry) {
  ------------------
  |  Branch (693:6): [True: 14.3k, False: 200k]
  ------------------
  694|  14.3k|		if (wds >= b->maxwds) {
  ------------------
  |  Branch (694:7): [True: 0, False: 14.3k]
  ------------------
  695|      0|			b1 = Balloc(dalloc, b->k+1);
  696|      0|			Bcopy(b1, b);
  ------------------
  |  |  646|      0|#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
  |  |  647|      0|y->wds*sizeof(Long) + 2*sizeof(int))
  ------------------
  697|      0|			Bfree(dalloc, b);
  698|      0|			b = b1;
  699|      0|			}
  700|  14.3k|		b->x[wds++] = carry;
  701|  14.3k|		b->wds = wds;
  702|  14.3k|		}
  703|   214k|	return b;
  704|   214k|	}
dtoa.c:Balloc:
  598|   164k|{
  599|   164k|	int x;
  600|   164k|	Bigint *rv;
  601|   164k|	unsigned int len;
  602|       |
  603|   164k|	if (k <= Kmax && (rv = dalloc->freelist[k]))
  ------------------
  |  |  516|   328k|#define Kmax 7
  ------------------
  |  Branch (603:6): [True: 164k, False: 0]
  |  Branch (603:19): [True: 77.3k, False: 86.9k]
  ------------------
  604|  77.3k|		dalloc->freelist[k] = rv->next;
  605|  86.9k|	else {
  606|  86.9k|		x = 1 << k;
  607|  86.9k|		len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
  608|  86.9k|			/sizeof(double);
  609|  86.9k|		if (k <= Kmax && dalloc->pmem_next - dalloc->private_mem + len <= dalloc->pmem_len) {
  ------------------
  |  |  516|   173k|#define Kmax 7
  ------------------
  |  Branch (609:7): [True: 86.9k, False: 0]
  |  Branch (609:20): [True: 86.9k, False: 0]
  ------------------
  610|  86.9k|			rv = (Bigint*)dalloc->pmem_next;
  611|  86.9k|			dalloc->pmem_next += len;
  612|  86.9k|			}
  613|      0|		else {
  614|      0|			rv = (Bigint*)MALLOC(len*sizeof(double));
  ------------------
  |  |  213|      0|#define MALLOC malloc
  ------------------
  615|      0|			dalloc->used_heap = 1;
  616|      0|						}
  617|  86.9k|		rv->k = k;
  618|  86.9k|		rv->maxwds = x;
  619|  86.9k|		}
  620|   164k|	rv->sign = rv->wds = 0;
  621|   164k|	return rv;
  622|   164k|	}
dtoa.c:quorem:
 2181|  63.2k|{
 2182|  63.2k|	int n;
 2183|  63.2k|	ULong *bx, *bxe, q, *sx, *sxe;
 2184|  63.2k|#ifdef ULLong
 2185|  63.2k|	ULLong borrow, carry, y, ys;
  ------------------
  |  |  504|  63.2k|#define ULLong unsigned Llong
  ------------------
 2186|       |#else
 2187|       |	ULong borrow, carry, y, ys;
 2188|       |#ifdef Pack_32
 2189|       |	ULong si, z, zs;
 2190|       |#endif
 2191|       |#endif
 2192|       |
 2193|  63.2k|	n = S->wds;
 2194|       |#ifdef DEBUG
 2195|       |	/*debug*/ if (b->wds > n)
 2196|       |	/*debug*/	Bug("oversize b in quorem");
 2197|       |#endif
 2198|  63.2k|	if (b->wds < n)
  ------------------
  |  Branch (2198:6): [True: 0, False: 63.2k]
  ------------------
 2199|      0|		return 0;
 2200|  63.2k|	sx = S->x;
 2201|  63.2k|	sxe = sx + --n;
 2202|  63.2k|	bx = b->x;
 2203|  63.2k|	bxe = bx + n;
 2204|  63.2k|	q = *bxe / (*sxe + 1);	/* ensure q <= true quotient */
 2205|       |#ifdef DEBUG
 2206|       |#ifdef NO_STRTOD_BIGCOMP
 2207|       |	/*debug*/ if (q > 9)
 2208|       |#else
 2209|       |	/* An oversized q is possible when quorem is called from bigcomp and */
 2210|       |	/* the input is near, e.g., twice the smallest denormalized number. */
 2211|       |	/*debug*/ if (q > 15)
 2212|       |#endif
 2213|       |	/*debug*/	Bug("oversized quotient in quorem");
 2214|       |#endif
 2215|  63.2k|	if (q) {
  ------------------
  |  Branch (2215:6): [True: 51.4k, False: 11.8k]
  ------------------
 2216|  51.4k|		borrow = 0;
 2217|  51.4k|		carry = 0;
 2218|   103k|		do {
 2219|   103k|#ifdef ULLong
 2220|   103k|			ys = *sx++ * (ULLong)q + carry;
 2221|   103k|			carry = ys >> 32;
 2222|   103k|			y = *bx - (ys & FFFFFFFF) - borrow;
  ------------------
  |  |  486|   103k|#define FFFFFFFF 0xffffffffUL
  ------------------
 2223|   103k|			borrow = y >> 32 & (ULong)1;
 2224|   103k|			*bx++ = y & FFFFFFFF;
  ------------------
  |  |  486|   103k|#define FFFFFFFF 0xffffffffUL
  ------------------
 2225|       |#else
 2226|       |#ifdef Pack_32
 2227|       |			si = *sx++;
 2228|       |			ys = (si & 0xffff) * q + carry;
 2229|       |			zs = (si >> 16) * q + (ys >> 16);
 2230|       |			carry = zs >> 16;
 2231|       |			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 2232|       |			borrow = (y & 0x10000) >> 16;
 2233|       |			z = (*bx >> 16) - (zs & 0xffff) - borrow;
 2234|       |			borrow = (z & 0x10000) >> 16;
 2235|       |			Storeinc(bx, z, y);
 2236|       |#else
 2237|       |			ys = *sx++ * q + carry;
 2238|       |			carry = ys >> 16;
 2239|       |			y = *bx - (ys & 0xffff) - borrow;
 2240|       |			borrow = (y & 0x10000) >> 16;
 2241|       |			*bx++ = y & 0xffff;
 2242|       |#endif
 2243|       |#endif
 2244|   103k|			}
 2245|   103k|			while(sx <= sxe);
  ------------------
  |  Branch (2245:10): [True: 51.5k, False: 51.4k]
  ------------------
 2246|  51.4k|		if (!*bxe) {
  ------------------
  |  Branch (2246:7): [True: 0, False: 51.4k]
  ------------------
 2247|      0|			bx = b->x;
 2248|      0|			while(--bxe > bx && !*bxe)
  ------------------
  |  Branch (2248:10): [True: 0, False: 0]
  |  Branch (2248:24): [True: 0, False: 0]
  ------------------
 2249|      0|				--n;
 2250|      0|			b->wds = n;
 2251|      0|			}
 2252|  51.4k|		}
 2253|  63.2k|	if (cmp(b, S) >= 0) {
  ------------------
  |  Branch (2253:6): [True: 7, False: 63.2k]
  ------------------
 2254|      7|		q++;
 2255|      7|		borrow = 0;
 2256|      7|		carry = 0;
 2257|      7|		bx = b->x;
 2258|      7|		sx = S->x;
 2259|     14|		do {
 2260|     14|#ifdef ULLong
 2261|     14|			ys = *sx++ + carry;
 2262|     14|			carry = ys >> 32;
 2263|     14|			y = *bx - (ys & FFFFFFFF) - borrow;
  ------------------
  |  |  486|     14|#define FFFFFFFF 0xffffffffUL
  ------------------
 2264|     14|			borrow = y >> 32 & (ULong)1;
 2265|     14|			*bx++ = y & FFFFFFFF;
  ------------------
  |  |  486|     14|#define FFFFFFFF 0xffffffffUL
  ------------------
 2266|       |#else
 2267|       |#ifdef Pack_32
 2268|       |			si = *sx++;
 2269|       |			ys = (si & 0xffff) + carry;
 2270|       |			zs = (si >> 16) + (ys >> 16);
 2271|       |			carry = zs >> 16;
 2272|       |			y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 2273|       |			borrow = (y & 0x10000) >> 16;
 2274|       |			z = (*bx >> 16) - (zs & 0xffff) - borrow;
 2275|       |			borrow = (z & 0x10000) >> 16;
 2276|       |			Storeinc(bx, z, y);
 2277|       |#else
 2278|       |			ys = *sx++ + carry;
 2279|       |			carry = ys >> 16;
 2280|       |			y = *bx - (ys & 0xffff) - borrow;
 2281|       |			borrow = (y & 0x10000) >> 16;
 2282|       |			*bx++ = y & 0xffff;
 2283|       |#endif
 2284|       |#endif
 2285|     14|			}
 2286|     14|			while(sx <= sxe);
  ------------------
  |  Branch (2286:10): [True: 7, False: 7]
  ------------------
 2287|      7|		bx = b->x;
 2288|      7|		bxe = bx + n;
 2289|      7|		if (!*bxe) {
  ------------------
  |  Branch (2289:7): [True: 7, False: 0]
  ------------------
 2290|      7|			while(--bxe > bx && !*bxe)
  ------------------
  |  Branch (2290:10): [True: 0, False: 7]
  |  Branch (2290:24): [True: 0, False: 0]
  ------------------
 2291|      0|				--n;
 2292|      7|			b->wds = n;
 2293|      7|			}
 2294|      7|		}
 2295|  63.2k|	return q;
 2296|  63.2k|	}
dtoa.c:diff:
 1116|  73.0k|{
 1117|  73.0k|	Bigint *c;
 1118|  73.0k|	int i, wa, wb;
 1119|  73.0k|	ULong *xa, *xae, *xb, *xbe, *xc;
 1120|  73.0k|#ifdef ULLong
 1121|  73.0k|	ULLong borrow, y;
  ------------------
  |  |  504|  73.0k|#define ULLong unsigned Llong
  ------------------
 1122|       |#else
 1123|       |	ULong borrow, y;
 1124|       |#ifdef Pack_32
 1125|       |	ULong z;
 1126|       |#endif
 1127|       |#endif
 1128|       |
 1129|  73.0k|	i = cmp(a,b);
 1130|  73.0k|	if (!i) {
  ------------------
  |  Branch (1130:6): [True: 37, False: 72.9k]
  ------------------
 1131|     37|		c = Balloc(dalloc, 0);
 1132|     37|		c->wds = 1;
 1133|     37|		c->x[0] = 0;
 1134|     37|		return c;
 1135|     37|		}
 1136|  72.9k|	if (i < 0) {
  ------------------
  |  Branch (1136:6): [True: 564, False: 72.4k]
  ------------------
 1137|    564|		c = a;
 1138|    564|		a = b;
 1139|    564|		b = c;
 1140|    564|		i = 1;
 1141|    564|		}
 1142|  72.4k|	else
 1143|  72.4k|		i = 0;
 1144|  72.9k|	c = Balloc(dalloc, a->k);
 1145|  72.9k|	c->sign = i;
 1146|  72.9k|	wa = a->wds;
 1147|  72.9k|	xa = a->x;
 1148|  72.9k|	xae = xa + wa;
 1149|  72.9k|	wb = b->wds;
 1150|  72.9k|	xb = b->x;
 1151|  72.9k|	xbe = xb + wb;
 1152|  72.9k|	xc = c->x;
 1153|  72.9k|	borrow = 0;
 1154|  72.9k|#ifdef ULLong
 1155|   115k|	do {
 1156|   115k|		y = (ULLong)*xa++ - *xb++ - borrow;
 1157|   115k|		borrow = y >> 32 & (ULong)1;
 1158|   115k|		*xc++ = y & FFFFFFFF;
  ------------------
  |  |  486|   115k|#define FFFFFFFF 0xffffffffUL
  ------------------
 1159|   115k|		}
 1160|   115k|		while(xb < xbe);
  ------------------
  |  Branch (1160:9): [True: 42.5k, False: 72.9k]
  ------------------
 1161|   104k|	while(xa < xae) {
  ------------------
  |  Branch (1161:8): [True: 31.6k, False: 72.9k]
  ------------------
 1162|  31.6k|		y = *xa++ - borrow;
 1163|  31.6k|		borrow = y >> 32 & (ULong)1;
 1164|  31.6k|		*xc++ = y & FFFFFFFF;
  ------------------
  |  |  486|  31.6k|#define FFFFFFFF 0xffffffffUL
  ------------------
 1165|  31.6k|		}
 1166|       |#else
 1167|       |#ifdef Pack_32
 1168|       |	do {
 1169|       |		y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
 1170|       |		borrow = (y & 0x10000) >> 16;
 1171|       |		z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
 1172|       |		borrow = (z & 0x10000) >> 16;
 1173|       |		Storeinc(xc, z, y);
 1174|       |		}
 1175|       |		while(xb < xbe);
 1176|       |	while(xa < xae) {
 1177|       |		y = (*xa & 0xffff) - borrow;
 1178|       |		borrow = (y & 0x10000) >> 16;
 1179|       |		z = (*xa++ >> 16) - borrow;
 1180|       |		borrow = (z & 0x10000) >> 16;
 1181|       |		Storeinc(xc, z, y);
 1182|       |		}
 1183|       |#else
 1184|       |	do {
 1185|       |		y = *xa++ - *xb++ - borrow;
 1186|       |		borrow = (y & 0x10000) >> 16;
 1187|       |		*xc++ = y & 0xffff;
 1188|       |		}
 1189|       |		while(xb < xbe);
 1190|       |	while(xa < xae) {
 1191|       |		y = *xa++ - borrow;
 1192|       |		borrow = (y & 0x10000) >> 16;
 1193|       |		*xc++ = y & 0xffff;
 1194|       |		}
 1195|       |#endif
 1196|       |#endif
 1197|  83.2k|	while(!*--xc)
  ------------------
  |  Branch (1197:8): [True: 10.2k, False: 72.9k]
  ------------------
 1198|  10.2k|		wa--;
 1199|  72.9k|	c->wds = wa;
 1200|  72.9k|	return c;
 1201|  73.0k|	}

_ZN13DtoaAllocatorILi1200EEC2Ev:
  146|  4.04k|  DtoaAllocator() {
  147|  4.04k|    dalloc_ = dtoa_alloc_init(&mem_, bytelen);
  148|  4.04k|  }
_ZN13DtoaAllocatorILi1200EED2Ev:
  149|  4.04k|  ~DtoaAllocator() {
  150|  4.04k|    dtoa_alloc_done(dalloc_);
  151|  4.04k|  }
_ZN13DtoaAllocatorILi1200EEcvP10dtoa_allocEv:
  153|  8.08k|  operator dtoa_alloc *() {
  154|  8.08k|    return dalloc_;
  155|  8.08k|  }

g_dtoa:
   43|  4.04k|{
   44|       | /*	Arguments ndigits, decpt, sign are similar to those
   45|       |	of ecvt and fcvt; trailing zeros are suppressed from
   46|       |	the returned string.  If not null, *rve is set to point
   47|       |	to the end of the return value.  If d is +-Infinity or NaN,
   48|       |	then *decpt is set to 9999.
   49|       |
   50|       |	mode:
   51|       |		0 ==> shortest string that yields d when read in
   52|       |			and rounded to nearest.
   53|       |		1 ==> like 0, but with Steele & White stopping rule;
   54|       |			e.g. with IEEE P754 arithmetic , mode 0 gives
   55|       |			1e23 whereas mode 1 gives 9.999999999999999e22.
   56|       |		2 ==> max(1,ndigits) significant digits.  This gives a
   57|       |			return value similar to that of ecvt, except
   58|       |			that trailing zeros are suppressed.
   59|       |		3 ==> through ndigits past the decimal point.  This
   60|       |			gives a return value similar to that from fcvt,
   61|       |			except that trailing zeros are suppressed, and
   62|       |			ndigits can be negative.
   63|       |		4,5 ==> similar to 2 and 3, respectively, but (in
   64|       |			round-nearest mode) with the tests of mode 0 to
   65|       |			possibly return a shorter string that rounds to d.
   66|       |			With IEEE arithmetic and compilation with
   67|       |			-DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
   68|       |			as modes 2 and 3 when FLT_ROUNDS != 1.
   69|       |		6-9 ==> Debugging modes similar to mode - 4:  don't try
   70|       |			fast floating-point estimate (if applicable).
   71|       |
   72|       |		Values of mode other than 0-9 are treated as mode 0.
   73|       |
   74|       |		Sufficient space is allocated to the return value
   75|       |		to hold the suppressed trailing zeros.
   76|       |	*/
   77|       |
   78|  4.04k|	int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
   79|  4.04k|		j, j1 = 0, k, k0, k_check, leftright, m2, m5, s2, s5,
   80|  4.04k|		spec_case, try_quick;
   81|  4.04k|	Long L;
   82|  4.04k|#ifndef Sudden_Underflow
   83|  4.04k|	int denorm;
   84|  4.04k|	ULong x;
   85|  4.04k|#endif
   86|  4.04k|	Bigint *b, *b1, *delta, *mlo, *mhi, *S;
   87|  4.04k|	U d2, eps, u;
   88|  4.04k|	double ds;
   89|  4.04k|	char *s, *s0;
   90|  4.04k|#ifndef No_leftright
   91|  4.04k|#ifdef IEEE_Arith
   92|  4.04k|	U eps1;
   93|  4.04k|#endif
   94|  4.04k|#endif
   95|       |#ifdef SET_INEXACT
   96|       |	int inexact, oldinexact;
   97|       |#endif
   98|       |#ifdef Honor_FLT_ROUNDS /*{*/
   99|       |	int Rounding;
  100|       |#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
  101|       |	Rounding = Flt_Rounds;
  102|       |#else /*}{*/
  103|       |	Rounding = 1;
  104|       |	switch(fegetround()) {
  105|       |	  case FE_TOWARDZERO:	Rounding = 0; break;
  106|       |	  case FE_UPWARD:	Rounding = 2; break;
  107|       |	  case FE_DOWNWARD:	Rounding = 3;
  108|       |	  }
  109|       |#endif /*}}*/
  110|       |#endif /*}*/
  111|       |
  112|       |#ifndef MULTIPLE_THREADS
  113|       |	if (dtoa_result) {
  114|       |		g_freedtoa(dtoa_result);
  115|       |		dtoa_result = 0;
  116|       |		}
  117|       |#endif
  118|       |
  119|  4.04k|	u.d = dd;
  120|  4.04k|	if (word0(&u) & Sign_bit) {
  ------------------
  |  |  298|  4.04k|#define word0(x) (x)->L[1]
  ------------------
              	if (word0(&u) & Sign_bit) {
  ------------------
  |  |  355|  4.04k|#define Sign_bit 0x80000000
  ------------------
  |  Branch (120:6): [True: 3.97k, False: 63]
  ------------------
  121|       |		/* set sign for everything, including 0's and NaNs */
  122|  3.97k|		*sign = 1;
  123|  3.97k|		word0(&u) &= ~Sign_bit;	/* clear sign bit */
  ------------------
  |  |  298|  3.97k|#define word0(x) (x)->L[1]
  ------------------
              		word0(&u) &= ~Sign_bit;	/* clear sign bit */
  ------------------
  |  |  355|  3.97k|#define Sign_bit 0x80000000
  ------------------
  124|  3.97k|		}
  125|     63|	else
  126|     63|		*sign = 0;
  127|       |
  128|  4.04k|#if defined(IEEE_Arith) + defined(VAX)
  129|  4.04k|#ifdef IEEE_Arith
  130|  4.04k|	if ((word0(&u) & Exp_mask) == Exp_mask)
  ------------------
  |  |  298|  4.04k|#define word0(x) (x)->L[1]
  ------------------
              	if ((word0(&u) & Exp_mask) == Exp_mask)
  ------------------
  |  |  339|  4.04k|#define Exp_mask  0x7ff00000
  ------------------
              	if ((word0(&u) & Exp_mask) == Exp_mask)
  ------------------
  |  |  339|  4.04k|#define Exp_mask  0x7ff00000
  ------------------
  |  Branch (130:6): [True: 0, False: 4.04k]
  ------------------
  131|       |#else
  132|       |	if (word0(&u)  == 0x8000)
  133|       |#endif
  134|      0|		{
  135|       |		/* Infinity or NaN */
  136|      0|		*decpt = 9999;
  137|      0|#ifdef IEEE_Arith
  138|      0|		if (!word1(&u) && !(word0(&u) & 0xfffff))
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
              		if (!word1(&u) && !(word0(&u) & 0xfffff))
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
  |  Branch (138:7): [True: 0, False: 0]
  |  Branch (138:21): [True: 0, False: 0]
  ------------------
  139|      0|			return nrv_alloc(dalloc, "Infinity", rve, 8);
  140|      0|#endif
  141|      0|		return nrv_alloc(dalloc, "NaN", rve, 3);
  142|      0|		}
  143|  4.04k|#endif
  144|       |#ifdef IBM
  145|       |	dval(&u) += 0; /* normalize */
  146|       |#endif
  147|  4.04k|	if (!dval(&u)) {
  ------------------
  |  |  304|  4.04k|#define dval(x) (x)->d
  ------------------
  |  Branch (147:6): [True: 0, False: 4.04k]
  ------------------
  148|      0|		*decpt = 1;
  149|      0|		return nrv_alloc(dalloc, "0", rve, 1);
  150|      0|		}
  151|       |
  152|       |#ifdef SET_INEXACT
  153|       |	try_quick = oldinexact = get_inexact();
  154|       |	inexact = 1;
  155|       |#endif
  156|       |#ifdef Honor_FLT_ROUNDS
  157|       |	if (Rounding >= 2) {
  158|       |		if (*sign)
  159|       |			Rounding = Rounding == 2 ? 0 : 2;
  160|       |		else
  161|       |			if (Rounding != 2)
  162|       |				Rounding = 0;
  163|       |		}
  164|       |#endif
  165|       |
  166|  4.04k|	b = d2b(dalloc, &u, &be, &bbits);
  167|       |#ifdef Sudden_Underflow
  168|       |	i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
  169|       |#else
  170|  4.04k|	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
  ------------------
  |  |  298|  4.04k|#define word0(x) (x)->L[1]
  ------------------
              	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
  ------------------
  |  |  336|  4.04k|#define Exp_shift1 20
  ------------------
              	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
  ------------------
  |  |  339|  4.04k|#define Exp_mask  0x7ff00000
  ------------------
              	if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
  ------------------
  |  |  336|  4.04k|#define Exp_shift1 20
  ------------------
  |  Branch (170:6): [True: 4.04k, False: 0]
  ------------------
  171|  4.04k|#endif
  172|  4.04k|		dval(&d2) = dval(&u);
  ------------------
  |  |  304|  4.04k|#define dval(x) (x)->d
  ------------------
              		dval(&d2) = dval(&u);
  ------------------
  |  |  304|  4.04k|#define dval(x) (x)->d
  ------------------
  173|  4.04k|		word0(&d2) &= Frac_mask1;
  ------------------
  |  |  298|  4.04k|#define word0(x) (x)->L[1]
  ------------------
              		word0(&d2) &= Frac_mask1;
  ------------------
  |  |  349|  4.04k|#define Frac_mask1 0xfffff
  ------------------
  174|  4.04k|		word0(&d2) |= Exp_11;
  ------------------
  |  |  298|  4.04k|#define word0(x) (x)->L[1]
  ------------------
              		word0(&d2) |= Exp_11;
  ------------------
  |  |  346|  4.04k|#define Exp_11 0x3ff00000
  ------------------
  175|       |#ifdef IBM
  176|       |		if (j = 11 - hi0bits(word0(&d2) & Frac_mask))
  177|       |			dval(&d2) /= 1 << j;
  178|       |#endif
  179|       |
  180|       |		/* log(x)	~=~ log(1.5) + (x-1.5)/1.5
  181|       |		 * log10(x)	 =  log(x) / log(10)
  182|       |		 *		~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
  183|       |		 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
  184|       |		 *
  185|       |		 * This suggests computing an approximation k to log10(d) by
  186|       |		 *
  187|       |		 * k = (i - Bias)*0.301029995663981
  188|       |		 *	+ ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
  189|       |		 *
  190|       |		 * We want k to be too large rather than too small.
  191|       |		 * The error in the first-order Taylor series approximation
  192|       |		 * is in our favor, so we just round up the constant enough
  193|       |		 * to compensate for any error in the multiplication of
  194|       |		 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
  195|       |		 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
  196|       |		 * adding 1e-13 to the constant term more than suffices.
  197|       |		 * Hence we adjust the constant term to 0.1760912590558.
  198|       |		 * (We could get a more accurate k by invoking log10,
  199|       |		 *  but this is probably not worthwhile.)
  200|       |		 */
  201|       |
  202|  4.04k|		i -= Bias;
  ------------------
  |  |  342|  4.04k|#define Bias 1023
  ------------------
  203|       |#ifdef IBM
  204|       |		i <<= 2;
  205|       |		i += j;
  206|       |#endif
  207|  4.04k|#ifndef Sudden_Underflow
  208|  4.04k|		denorm = 0;
  209|  4.04k|		}
  210|      0|	else {
  211|       |		/* d is denormalized */
  212|       |
  213|      0|		i = bbits + be + (Bias + (P-1) - 1);
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              		i = bbits + be + (Bias + (P-1) - 1);
  ------------------
  |  |  340|      0|#define P 53
  ------------------
  214|      0|		x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (214:7): [True: 0, False: 0]
  ------------------
  215|      0|			    : word1(&u) << (32 - i);
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
  216|      0|		dval(&d2) = x;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  217|      0|		word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  218|      0|		i -= (Bias + (P-1) - 1) + 1;
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              		i -= (Bias + (P-1) - 1) + 1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
  219|      0|		denorm = 1;
  220|      0|		}
  221|  4.04k|#endif
  222|  4.04k|	ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
  ------------------
  |  |  304|  4.04k|#define dval(x) (x)->d
  ------------------
  223|  4.04k|	k = (int)ds;
  224|  4.04k|	if (ds < 0. && ds != k)
  ------------------
  |  Branch (224:6): [True: 0, False: 4.04k]
  |  Branch (224:17): [True: 0, False: 0]
  ------------------
  225|      0|		k--;	/* want k = floor(ds) */
  226|  4.04k|	k_check = 1;
  227|  4.04k|	if (k >= 0 && k <= Ten_pmax) {
  ------------------
  |  |  350|  4.04k|#define Ten_pmax 22
  ------------------
  |  Branch (227:6): [True: 4.04k, False: 0]
  |  Branch (227:16): [True: 4.02k, False: 14]
  ------------------
  228|  4.02k|		if (dval(&u) < tens[k])
  ------------------
  |  |  304|  4.02k|#define dval(x) (x)->d
  ------------------
  |  Branch (228:7): [True: 0, False: 4.02k]
  ------------------
  229|      0|			k--;
  230|  4.02k|		k_check = 0;
  231|  4.02k|		}
  232|  4.04k|	j = bbits - i - 1;
  233|  4.04k|	if (j >= 0) {
  ------------------
  |  Branch (233:6): [True: 54, False: 3.98k]
  ------------------
  234|     54|		b2 = 0;
  235|     54|		s2 = j;
  236|     54|		}
  237|  3.98k|	else {
  238|  3.98k|		b2 = -j;
  239|  3.98k|		s2 = 0;
  240|  3.98k|		}
  241|  4.04k|	if (k >= 0) {
  ------------------
  |  Branch (241:6): [True: 4.04k, False: 0]
  ------------------
  242|  4.04k|		b5 = 0;
  243|  4.04k|		s5 = k;
  244|  4.04k|		s2 += k;
  245|  4.04k|		}
  246|      0|	else {
  247|      0|		b2 -= k;
  248|      0|		b5 = -k;
  249|      0|		s5 = 0;
  250|      0|		}
  251|  4.04k|	if (mode < 0 || mode > 9)
  ------------------
  |  Branch (251:6): [True: 0, False: 4.04k]
  |  Branch (251:18): [True: 0, False: 4.04k]
  ------------------
  252|      0|		mode = 0;
  253|       |
  254|  4.04k|#ifndef SET_INEXACT
  255|       |#ifdef Check_FLT_ROUNDS
  256|       |	try_quick = Rounding == 1;
  257|       |#else
  258|  4.04k|	try_quick = 1;
  259|  4.04k|#endif
  260|  4.04k|#endif /*SET_INEXACT*/
  261|       |
  262|  4.04k|	if (mode > 5) {
  ------------------
  |  Branch (262:6): [True: 0, False: 4.04k]
  ------------------
  263|      0|		mode -= 4;
  264|      0|		try_quick = 0;
  265|      0|		}
  266|  4.04k|	leftright = 1;
  267|  4.04k|	ilim = ilim1 = -1;	/* Values for cases 0 and 1; done here to */
  268|       |				/* silence erroneous "gcc -Wall" warning. */
  269|  4.04k|	switch(mode) {
  ------------------
  |  Branch (269:9): [True: 0, False: 4.04k]
  ------------------
  270|  4.04k|		case 0:
  ------------------
  |  Branch (270:3): [True: 4.04k, False: 0]
  ------------------
  271|  4.04k|		case 1:
  ------------------
  |  Branch (271:3): [True: 0, False: 4.04k]
  ------------------
  272|  4.04k|			i = 18;
  273|  4.04k|			ndigits = 0;
  274|  4.04k|			break;
  275|      0|		case 2:
  ------------------
  |  Branch (275:3): [True: 0, False: 4.04k]
  ------------------
  276|      0|			leftright = 0;
  277|       |			/* no break */
  278|      0|		case 4:
  ------------------
  |  Branch (278:3): [True: 0, False: 4.04k]
  ------------------
  279|      0|			if (ndigits <= 0)
  ------------------
  |  Branch (279:8): [True: 0, False: 0]
  ------------------
  280|      0|				ndigits = 1;
  281|      0|			ilim = ilim1 = i = ndigits;
  282|      0|			break;
  283|      0|		case 3:
  ------------------
  |  Branch (283:3): [True: 0, False: 4.04k]
  ------------------
  284|      0|			leftright = 0;
  285|       |			/* no break */
  286|      0|		case 5:
  ------------------
  |  Branch (286:3): [True: 0, False: 4.04k]
  ------------------
  287|      0|			i = ndigits + k + 1;
  288|      0|			ilim = i;
  289|      0|			ilim1 = i - 1;
  290|      0|			if (i <= 0)
  ------------------
  |  Branch (290:8): [True: 0, False: 0]
  ------------------
  291|      0|				i = 1;
  292|  4.04k|		}
  293|  4.04k|	s = s0 = rv_alloc(dalloc, i);
  294|       |
  295|       |#ifdef Honor_FLT_ROUNDS
  296|       |	if (mode > 1 && Rounding != 1)
  297|       |		leftright = 0;
  298|       |#endif
  299|       |
  300|  4.04k|	if (ilim >= 0 && ilim <= Quick_max && try_quick) {
  ------------------
  |  |  359|  4.04k|#define Quick_max 14
  ------------------
  |  Branch (300:6): [True: 0, False: 4.04k]
  |  Branch (300:19): [True: 0, False: 0]
  |  Branch (300:40): [True: 0, False: 0]
  ------------------
  301|       |
  302|       |		/* Try to get by with floating-point arithmetic. */
  303|       |
  304|      0|		i = 0;
  305|      0|		dval(&d2) = dval(&u);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              		dval(&d2) = dval(&u);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  306|      0|		k0 = k;
  307|      0|		ilim0 = ilim;
  308|      0|		ieps = 2; /* conservative */
  309|      0|		if (k > 0) {
  ------------------
  |  Branch (309:7): [True: 0, False: 0]
  ------------------
  310|      0|			ds = tens[k&0xf];
  311|      0|			j = k >> 4;
  312|      0|			if (j & Bletch) {
  ------------------
  |  |  351|      0|#define Bletch 0x10
  ------------------
  |  Branch (312:8): [True: 0, False: 0]
  ------------------
  313|       |				/* prevent overflows */
  314|      0|				j &= Bletch - 1;
  ------------------
  |  |  351|      0|#define Bletch 0x10
  ------------------
  315|      0|				dval(&u) /= bigtens[n_bigtens-1];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              				dval(&u) /= bigtens[n_bigtens-1];
  ------------------
  |  | 1514|      0|#define n_bigtens 5
  ------------------
  316|      0|				ieps++;
  317|      0|				}
  318|      0|			for(; j; j >>= 1, i++)
  ------------------
  |  Branch (318:10): [True: 0, False: 0]
  ------------------
  319|      0|				if (j & 1) {
  ------------------
  |  Branch (319:9): [True: 0, False: 0]
  ------------------
  320|      0|					ieps++;
  321|      0|					ds *= bigtens[i];
  322|      0|					}
  323|      0|			dval(&u) /= ds;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  324|      0|			}
  325|      0|		else if ((j1 = -k)) {
  ------------------
  |  Branch (325:12): [True: 0, False: 0]
  ------------------
  326|      0|			dval(&u) *= tens[j1 & 0xf];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  327|      0|			for(j = j1 >> 4; j; j >>= 1, i++)
  ------------------
  |  Branch (327:21): [True: 0, False: 0]
  ------------------
  328|      0|				if (j & 1) {
  ------------------
  |  Branch (328:9): [True: 0, False: 0]
  ------------------
  329|      0|					ieps++;
  330|      0|					dval(&u) *= bigtens[i];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  331|      0|					}
  332|      0|			}
  333|      0|		if (k_check && dval(&u) < 1. && ilim > 0) {
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (333:7): [True: 0, False: 0]
  |  Branch (333:18): [True: 0, False: 0]
  |  Branch (333:35): [True: 0, False: 0]
  ------------------
  334|      0|			if (ilim1 <= 0)
  ------------------
  |  Branch (334:8): [True: 0, False: 0]
  ------------------
  335|      0|				goto fast_failed;
  336|      0|			ilim = ilim1;
  337|      0|			k--;
  338|      0|			dval(&u) *= 10.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  339|      0|			ieps++;
  340|      0|			}
  341|      0|		dval(&eps) = ieps*dval(&u) + 7.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              		dval(&eps) = ieps*dval(&u) + 7.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  342|      0|		word0(&eps) -= (P-1)*Exp_msk1;
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              		word0(&eps) -= (P-1)*Exp_msk1;
  ------------------
  |  |  340|      0|#define P 53
  ------------------
              		word0(&eps) -= (P-1)*Exp_msk1;
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
  343|      0|		if (ilim == 0) {
  ------------------
  |  Branch (343:7): [True: 0, False: 0]
  ------------------
  344|      0|			S = mhi = 0;
  345|      0|			dval(&u) -= 5.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  346|      0|			if (dval(&u) > dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              			if (dval(&u) > dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (346:8): [True: 0, False: 0]
  ------------------
  347|      0|				goto one_digit;
  348|      0|			if (dval(&u) < -dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              			if (dval(&u) < -dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (348:8): [True: 0, False: 0]
  ------------------
  349|      0|				goto no_digits;
  350|      0|			goto fast_failed;
  351|      0|			}
  352|      0|#ifndef No_leftright
  353|      0|		if (leftright) {
  ------------------
  |  Branch (353:7): [True: 0, False: 0]
  ------------------
  354|       |			/* Use Steele & White method of only
  355|       |			 * generating digits needed.
  356|       |			 */
  357|      0|			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              			dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  358|      0|#ifdef IEEE_Arith
  359|      0|			if (k0 < 0 && j1 >= 307) {
  ------------------
  |  Branch (359:8): [True: 0, False: 0]
  |  Branch (359:18): [True: 0, False: 0]
  ------------------
  360|      0|				eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */
  361|      0|				word0(&eps1) -= Exp_msk1 * (Bias+P-1);
  ------------------
  |  |  298|      0|#define word0(x) (x)->L[1]
  ------------------
              				word0(&eps1) -= Exp_msk1 * (Bias+P-1);
  ------------------
  |  |  337|      0|#define Exp_msk1    0x100000
  ------------------
              				word0(&eps1) -= Exp_msk1 * (Bias+P-1);
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              				word0(&eps1) -= Exp_msk1 * (Bias+P-1);
  ------------------
  |  |  340|      0|#define P 53
  ------------------
  362|      0|				dval(&eps1) *= tens[j1 & 0xf];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  363|      0|				for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)
  ------------------
  |  Branch (363:35): [True: 0, False: 0]
  ------------------
  364|      0|					if (j & 1)
  ------------------
  |  Branch (364:10): [True: 0, False: 0]
  ------------------
  365|      0|						dval(&eps1) *= bigtens[i];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  366|      0|				if (eps.d < eps1.d)
  ------------------
  |  Branch (366:9): [True: 0, False: 0]
  ------------------
  367|      0|					eps.d = eps1.d;
  368|      0|				}
  369|      0|#endif
  370|      0|			for(i = 0;;) {
  371|      0|				L = dval(&u);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  372|      0|				dval(&u) -= L;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  373|      0|				*s++ = '0' + (int)L;
  374|      0|				if (1. - dval(&u) < dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              				if (1. - dval(&u) < dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (374:9): [True: 0, False: 0]
  ------------------
  375|      0|					goto bump_up;
  376|      0|				if (dval(&u) < dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              				if (dval(&u) < dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (376:9): [True: 0, False: 0]
  ------------------
  377|      0|					goto ret1;
  378|      0|				if (++i >= ilim)
  ------------------
  |  Branch (378:9): [True: 0, False: 0]
  ------------------
  379|      0|					break;
  380|      0|				dval(&eps) *= 10.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  381|      0|				dval(&u) *= 10.;
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  382|      0|				}
  383|      0|			}
  384|      0|		else {
  385|      0|#endif
  386|       |			/* Generate ilim digits, then fix them up. */
  387|      0|			dval(&eps) *= tens[ilim-1];
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  388|      0|			for(i = 1;; i++, dval(&u) *= 10.) {
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  389|      0|				L = (Long)(dval(&u));
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  390|      0|				if (!(dval(&u) -= L))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (390:9): [True: 0, False: 0]
  ------------------
  391|      0|					ilim = i;
  392|      0|				*s++ = '0' + (int)L;
  393|      0|				if (i == ilim) {
  ------------------
  |  Branch (393:9): [True: 0, False: 0]
  ------------------
  394|      0|					if (dval(&u) > 0.5 + dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              					if (dval(&u) > 0.5 + dval(&eps))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (394:10): [True: 0, False: 0]
  ------------------
  395|      0|						goto bump_up;
  396|      0|					else if (dval(&u) < 0.5 - dval(&eps)) {
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              					else if (dval(&u) < 0.5 - dval(&eps)) {
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (396:15): [True: 0, False: 0]
  ------------------
  397|      0|						while(*--s == '0');
  ------------------
  |  Branch (397:13): [True: 0, False: 0]
  ------------------
  398|      0|						s++;
  399|      0|						goto ret1;
  400|      0|						}
  401|      0|					break;
  402|      0|					}
  403|      0|				}
  404|      0|#ifndef No_leftright
  405|      0|			}
  406|      0|#endif
  407|      0| fast_failed:
  408|      0|		s = s0;
  409|      0|		dval(&u) = dval(&d2);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              		dval(&u) = dval(&d2);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  410|      0|		k = k0;
  411|      0|		ilim = ilim0;
  412|      0|		}
  413|       |
  414|       |	/* Do we have a "small" integer? */
  415|       |
  416|  4.04k|	if (be >= 0 && k <= Int_max) {
  ------------------
  |  |  360|  4.04k|#define Int_max 14
  ------------------
  |  Branch (416:6): [True: 4.04k, False: 0]
  |  Branch (416:17): [True: 87, False: 3.95k]
  ------------------
  417|       |		/* Yes. */
  418|     87|		ds = tens[k];
  419|     87|		if (ndigits < 0 && ilim <= 0) {
  ------------------
  |  Branch (419:7): [True: 0, False: 87]
  |  Branch (419:22): [True: 0, False: 0]
  ------------------
  420|      0|			S = mhi = 0;
  421|      0|			if (ilim < 0 || dval(&u) <= 5*ds)
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (421:8): [True: 0, False: 0]
  |  Branch (421:20): [True: 0, False: 0]
  ------------------
  422|      0|				goto no_digits;
  423|      0|			goto one_digit;
  424|      0|			}
  425|    357|		for(i = 1;; i++, dval(&u) *= 10.) {
  ------------------
  |  |  304|    270|#define dval(x) (x)->d
  ------------------
  426|    357|			L = (Long)(dval(&u) / ds);
  ------------------
  |  |  304|    357|#define dval(x) (x)->d
  ------------------
  427|    357|			dval(&u) -= L*ds;
  ------------------
  |  |  304|    357|#define dval(x) (x)->d
  ------------------
  428|       |#ifdef Check_FLT_ROUNDS
  429|       |			/* If FLT_ROUNDS == 2, L will usually be high by 1 */
  430|       |			if (dval(&u) < 0) {
  431|       |				L--;
  432|       |				dval(&u) += ds;
  433|       |				}
  434|       |#endif
  435|    357|			*s++ = '0' + (int)L;
  436|    357|			if (!dval(&u)) {
  ------------------
  |  |  304|    357|#define dval(x) (x)->d
  ------------------
  |  Branch (436:8): [True: 87, False: 270]
  ------------------
  437|       |#ifdef SET_INEXACT
  438|       |				inexact = 0;
  439|       |#endif
  440|     87|				break;
  441|     87|				}
  442|    270|			if (i == ilim) {
  ------------------
  |  Branch (442:8): [True: 0, False: 270]
  ------------------
  443|       |#ifdef Honor_FLT_ROUNDS
  444|       |				if (mode > 1)
  445|       |				switch(Rounding) {
  446|       |				  case 0: goto ret1;
  447|       |				  case 2: goto bump_up;
  448|       |				  }
  449|       |#endif
  450|      0|				dval(&u) += dval(&u);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              				dval(&u) += dval(&u);
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  451|       |#ifdef ROUND_BIASED
  452|       |				if (dval(&u) >= ds)
  453|       |#else
  454|      0|				if (dval(&u) > ds || (dval(&u) == ds && L & 1))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
              				if (dval(&u) > ds || (dval(&u) == ds && L & 1))
  ------------------
  |  |  304|      0|#define dval(x) (x)->d
  ------------------
  |  Branch (454:9): [True: 0, False: 0]
  |  Branch (454:27): [True: 0, False: 0]
  |  Branch (454:45): [True: 0, False: 0]
  ------------------
  455|      0|#endif
  456|      0|					{
  457|      0| bump_up:
  458|      0|					while(*--s == '9')
  ------------------
  |  Branch (458:12): [True: 0, False: 0]
  ------------------
  459|      0|						if (s == s0) {
  ------------------
  |  Branch (459:11): [True: 0, False: 0]
  ------------------
  460|      0|							k++;
  461|      0|							*s = '0';
  462|      0|							break;
  463|      0|							}
  464|      0|					++*s++;
  465|      0|					}
  466|      0|				break;
  467|      0|				}
  468|    270|			}
  469|     87|		goto ret1;
  470|     87|		}
  471|       |
  472|  3.95k|	m2 = b2;
  473|  3.95k|	m5 = b5;
  474|  3.95k|	mhi = mlo = 0;
  475|  3.95k|	if (leftright) {
  ------------------
  |  Branch (475:6): [True: 3.95k, False: 0]
  ------------------
  476|  3.95k|		i =
  477|  3.95k|#ifndef Sudden_Underflow
  478|  3.95k|			denorm ? be + (Bias + (P-1) - 1 + 1) :
  ------------------
  |  |  342|      0|#define Bias 1023
  ------------------
              			denorm ? be + (Bias + (P-1) - 1 + 1) :
  ------------------
  |  |  340|      0|#define P 53
  ------------------
  |  Branch (478:4): [True: 0, False: 3.95k]
  ------------------
  479|  3.95k|#endif
  480|       |#ifdef IBM
  481|       |			1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
  482|       |#else
  483|  3.95k|			1 + P - bbits;
  ------------------
  |  |  340|  3.95k|#define P 53
  ------------------
  484|  3.95k|#endif
  485|  3.95k|		b2 += i;
  486|  3.95k|		s2 += i;
  487|  3.95k|		mhi = i2b(dalloc, 1);
  488|  3.95k|		}
  489|  3.95k|	if (m2 > 0 && s2 > 0) {
  ------------------
  |  Branch (489:6): [True: 3.95k, False: 0]
  |  Branch (489:16): [True: 3.95k, False: 0]
  ------------------
  490|  3.95k|		i = m2 < s2 ? m2 : s2;
  ------------------
  |  Branch (490:7): [True: 3.94k, False: 14]
  ------------------
  491|  3.95k|		b2 -= i;
  492|  3.95k|		m2 -= i;
  493|  3.95k|		s2 -= i;
  494|  3.95k|		}
  495|  3.95k|	if (b5 > 0) {
  ------------------
  |  Branch (495:6): [True: 0, False: 3.95k]
  ------------------
  496|      0|		if (leftright) {
  ------------------
  |  Branch (496:7): [True: 0, False: 0]
  ------------------
  497|      0|			if (m5 > 0) {
  ------------------
  |  Branch (497:8): [True: 0, False: 0]
  ------------------
  498|      0|				mhi = pow5mult(dalloc, mhi, m5);
  499|      0|				b1 = mult(dalloc, mhi, b);
  500|      0|				Bfree(dalloc, b);
  501|      0|				b = b1;
  502|      0|				}
  503|      0|			if ((j = b5 - m5))
  ------------------
  |  Branch (503:8): [True: 0, False: 0]
  ------------------
  504|      0|				b = pow5mult(dalloc, b, j);
  505|      0|			}
  506|      0|		else
  507|      0|			b = pow5mult(dalloc, b, b5);
  508|      0|		}
  509|  3.95k|	S = i2b(dalloc, 1);
  510|  3.95k|	if (s5 > 0)
  ------------------
  |  Branch (510:6): [True: 3.95k, False: 0]
  ------------------
  511|  3.95k|		S = pow5mult(dalloc, S, s5);
  512|       |
  513|       |	/* Check for special case that d is a normalized power of 2. */
  514|       |
  515|  3.95k|	spec_case = 0;
  516|  3.95k|	if ((mode < 2 || leftright)
  ------------------
  |  Branch (516:7): [True: 3.95k, False: 0]
  |  Branch (516:19): [True: 0, False: 0]
  ------------------
  517|       |#ifdef Honor_FLT_ROUNDS
  518|       |			&& Rounding == 1
  519|       |#endif
  520|  3.95k|				) {
  521|  3.95k|		if (!word1(&u) && !(word0(&u) & Bndry_mask)
  ------------------
  |  |  299|  7.90k|#define word1(x) (x)->L[0]
  ------------------
              		if (!word1(&u) && !(word0(&u) & Bndry_mask)
  ------------------
  |  |  298|     10|#define word0(x) (x)->L[1]
  ------------------
              		if (!word1(&u) && !(word0(&u) & Bndry_mask)
  ------------------
  |  |  352|     10|#define Bndry_mask  0xfffff
  ------------------
  |  Branch (521:7): [True: 10, False: 3.94k]
  |  Branch (521:21): [True: 10, False: 0]
  ------------------
  522|  3.95k|#ifndef Sudden_Underflow
  523|  3.95k|		 && word0(&u) & (Exp_mask & ~Exp_msk1)
  ------------------
  |  |  298|     10|#define word0(x) (x)->L[1]
  ------------------
              		 && word0(&u) & (Exp_mask & ~Exp_msk1)
  ------------------
  |  |  339|     10|#define Exp_mask  0x7ff00000
  ------------------
              		 && word0(&u) & (Exp_mask & ~Exp_msk1)
  ------------------
  |  |  337|     10|#define Exp_msk1    0x100000
  ------------------
  |  Branch (523:7): [True: 10, False: 0]
  ------------------
  524|  3.95k|#endif
  525|  3.95k|				) {
  526|       |			/* The special case */
  527|     10|			b2 += Log2P;
  ------------------
  |  |  356|     10|#define Log2P 1
  ------------------
  528|     10|			s2 += Log2P;
  ------------------
  |  |  356|     10|#define Log2P 1
  ------------------
  529|     10|			spec_case = 1;
  530|     10|			}
  531|  3.95k|		}
  532|       |
  533|       |	/* Arrange for convenient computation of quotients:
  534|       |	 * shift left if necessary so divisor has 4 leading 0 bits.
  535|       |	 *
  536|       |	 * Perhaps we should just compute leading 28 bits of S once
  537|       |	 * and for all and pass them and a shift to quorem, so it
  538|       |	 * can do shifts and ors to compute the numerator for q.
  539|       |	 */
  540|  3.95k|	i = dshift(S, s2);
  541|  3.95k|	b2 += i;
  542|  3.95k|	m2 += i;
  543|  3.95k|	s2 += i;
  544|  3.95k|	if (b2 > 0)
  ------------------
  |  Branch (544:6): [True: 3.95k, False: 0]
  ------------------
  545|  3.95k|		b = lshift(dalloc, b, b2);
  546|  3.95k|	if (s2 > 0)
  ------------------
  |  Branch (546:6): [True: 3.95k, False: 0]
  ------------------
  547|  3.95k|		S = lshift(dalloc, S, s2);
  548|  3.95k|	if (k_check) {
  ------------------
  |  Branch (548:6): [True: 14, False: 3.94k]
  ------------------
  549|     14|		if (cmp(b,S) < 0) {
  ------------------
  |  Branch (549:7): [True: 0, False: 14]
  ------------------
  550|      0|			k--;
  551|      0|			b = multadd(dalloc, b, 10, 0);	/* we botched the k estimate */
  552|      0|			if (leftright)
  ------------------
  |  Branch (552:8): [True: 0, False: 0]
  ------------------
  553|      0|				mhi = multadd(dalloc, mhi, 10, 0);
  554|      0|			ilim = ilim1;
  555|      0|			}
  556|     14|		}
  557|  3.95k|	if (ilim <= 0 && (mode == 3 || mode == 5)) {
  ------------------
  |  Branch (557:6): [True: 3.95k, False: 0]
  |  Branch (557:20): [True: 0, False: 3.95k]
  |  Branch (557:33): [True: 0, False: 3.95k]
  ------------------
  558|      0|#ifndef HERMES_FIXEDPOINT_HACK
  559|      0|		if (ilim < 0 || cmp(b,S = multadd(dalloc, S,5,0)) <= 0) {
  ------------------
  |  Branch (559:7): [True: 0, False: 0]
  |  Branch (559:19): [True: 0, False: 0]
  ------------------
  560|       |#else
  561|       |                /// NOTE: The original line here checks that the cmp result is <= 0.
  562|       |                /// This only works for IEEE-754 unbiased rounding, which would
  563|       |                /// make 0.5 round to 0. However, for fixed-point rounding in
  564|       |                /// ES5.1, we need 0.5 to round to 1. JSC modifies the check the same way.
  565|       |		if (ilim < 0 || cmp(b,S = multadd(dalloc, S,5,0)) < 0) {
  566|       |#endif
  567|       |			/* no digits, fcvt style */
  568|      0| no_digits:
  569|      0|			k = -1 - ndigits;
  570|      0|			goto ret;
  571|      0|			}
  572|      0| one_digit:
  573|      0|		*s++ = '1';
  574|      0|		k++;
  575|      0|		goto ret;
  576|      0|		}
  577|  3.95k|	if (leftright) {
  ------------------
  |  Branch (577:6): [True: 3.95k, False: 0]
  ------------------
  578|  3.95k|		if (m2 > 0)
  ------------------
  |  Branch (578:7): [True: 3.95k, False: 0]
  ------------------
  579|  3.95k|			mhi = lshift(dalloc, mhi, m2);
  580|       |
  581|       |		/* Compute mlo -- check for special case
  582|       |		 * that d is a normalized power of 2.
  583|       |		 */
  584|       |
  585|  3.95k|		mlo = mhi;
  586|  3.95k|		if (spec_case) {
  ------------------
  |  Branch (586:7): [True: 10, False: 3.94k]
  ------------------
  587|     10|			mhi = Balloc(dalloc, mhi->k);
  588|     10|			Bcopy(mhi, mlo);
  ------------------
  |  |  646|     10|#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
  |  |  647|     10|y->wds*sizeof(Long) + 2*sizeof(int))
  ------------------
  589|     10|			mhi = lshift(dalloc, mhi, Log2P);
  ------------------
  |  |  356|     10|#define Log2P 1
  ------------------
  590|     10|			}
  591|       |
  592|  63.2k|		for(i = 1;;i++) {
  593|  63.2k|			dig = quorem(b,S) + '0';
  594|       |			/* Do we yet have the shortest decimal string
  595|       |			 * that will round to d?
  596|       |			 */
  597|  63.2k|			j = cmp(b, mlo);
  598|  63.2k|			delta = diff(dalloc, S, mhi);
  599|  63.2k|			j1 = delta->sign ? 1 : cmp(b, delta);
  ------------------
  |  Branch (599:9): [True: 8, False: 63.2k]
  ------------------
  600|  63.2k|			Bfree(dalloc, delta);
  601|  63.2k|#ifndef ROUND_BIASED
  602|  63.2k|			if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
  ------------------
  |  |  299|      8|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (602:8): [True: 8, False: 63.2k]
  |  Branch (602:19): [True: 8, False: 0]
  |  Branch (602:32): [True: 7, False: 1]
  ------------------
  603|       |#ifdef Honor_FLT_ROUNDS
  604|       |				&& Rounding >= 1
  605|       |#endif
  606|  63.2k|								   ) {
  607|      7|				if (dig == '9')
  ------------------
  |  Branch (607:9): [True: 0, False: 7]
  ------------------
  608|      0|					goto round_9_up;
  609|      7|				if (j > 0)
  ------------------
  |  Branch (609:9): [True: 7, False: 0]
  ------------------
  610|      7|					dig++;
  611|       |#ifdef SET_INEXACT
  612|       |				else if (!b->x[0] && b->wds <= 1)
  613|       |					inexact = 0;
  614|       |#endif
  615|      7|				*s++ = dig;
  616|      7|				goto ret;
  617|      7|				}
  618|  63.2k|#endif
  619|  63.2k|			if (j < 0 || (j == 0 && mode != 1
  ------------------
  |  Branch (619:8): [True: 3.93k, False: 59.3k]
  |  Branch (619:18): [True: 0, False: 59.3k]
  |  Branch (619:28): [True: 0, False: 0]
  ------------------
  620|  59.3k|#ifndef ROUND_BIASED
  621|  59.3k|							&& !(word1(&u) & 1)
  ------------------
  |  |  299|      0|#define word1(x) (x)->L[0]
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|  59.3k|#endif
  623|  59.3k|					)) {
  624|  3.93k|				if (!b->x[0] && b->wds <= 1) {
  ------------------
  |  Branch (624:9): [True: 7, False: 3.93k]
  |  Branch (624:21): [True: 7, False: 0]
  ------------------
  625|       |#ifdef SET_INEXACT
  626|       |					inexact = 0;
  627|       |#endif
  628|      7|					goto accept_dig;
  629|      7|					}
  630|       |#ifdef Honor_FLT_ROUNDS
  631|       |				if (mode > 1)
  632|       |				 switch(Rounding) {
  633|       |				  case 0: goto accept_dig;
  634|       |				  case 2: goto keep_dig;
  635|       |				  }
  636|       |#endif /*Honor_FLT_ROUNDS*/
  637|  3.93k|				if (j1 > 0) {
  ------------------
  |  Branch (637:9): [True: 8, False: 3.92k]
  ------------------
  638|      8|					b = lshift(dalloc, b, 1);
  639|      8|					j1 = cmp(b, S);
  640|       |#ifdef ROUND_BIASED
  641|       |					if (j1 >= 0 /*)*/
  642|       |#else
  643|      8|					if ((j1 > 0 || (j1 == 0 && dig & 1))
  ------------------
  |  Branch (643:11): [True: 8, False: 0]
  |  Branch (643:22): [True: 0, False: 0]
  |  Branch (643:33): [True: 0, False: 0]
  ------------------
  644|      8|#endif
  645|      8|					&& dig++ == '9')
  ------------------
  |  Branch (645:9): [True: 0, False: 8]
  ------------------
  646|      0|						goto round_9_up;
  647|      8|					}
  648|  3.93k| accept_dig:
  649|  3.93k|				*s++ = dig;
  650|  3.93k|				goto ret;
  651|  3.93k|				}
  652|  59.3k|			if (j1 > 0) {
  ------------------
  |  Branch (652:8): [True: 10, False: 59.3k]
  ------------------
  653|       |#ifdef Honor_FLT_ROUNDS
  654|       |				if (!Rounding)
  655|       |					goto accept_dig;
  656|       |#endif
  657|     10|				if (dig == '9') { /* possible if i == 1 */
  ------------------
  |  Branch (657:9): [True: 0, False: 10]
  ------------------
  658|      0| round_9_up:
  659|      0|					*s++ = '9';
  660|      0|					goto roundoff;
  661|      0|					}
  662|     10|				*s++ = dig + 1;
  663|     10|				goto ret;
  664|     10|				}
  665|       |#ifdef Honor_FLT_ROUNDS
  666|       | keep_dig:
  667|       |#endif
  668|  59.3k|			*s++ = dig;
  669|  59.3k|			if (i == ilim)
  ------------------
  |  Branch (669:8): [True: 0, False: 59.3k]
  ------------------
  670|      0|				break;
  671|  59.3k|			b = multadd(dalloc, b, 10, 0);
  672|  59.3k|			if (mlo == mhi)
  ------------------
  |  Branch (672:8): [True: 59.1k, False: 150]
  ------------------
  673|  59.1k|				mlo = mhi = multadd(dalloc, mhi, 10, 0);
  674|    150|			else {
  675|    150|				mlo = multadd(dalloc, mlo, 10, 0);
  676|    150|				mhi = multadd(dalloc, mhi, 10, 0);
  677|    150|				}
  678|  59.3k|			}
  679|  3.95k|		}
  680|      0|	else
  681|      0|		for(i = 1;; i++) {
  682|      0|			*s++ = dig = quorem(b,S) + '0';
  683|      0|			if (!b->x[0] && b->wds <= 1) {
  ------------------
  |  Branch (683:8): [True: 0, False: 0]
  |  Branch (683:20): [True: 0, False: 0]
  ------------------
  684|       |#ifdef SET_INEXACT
  685|       |				inexact = 0;
  686|       |#endif
  687|      0|				goto ret;
  688|      0|				}
  689|      0|			if (i >= ilim)
  ------------------
  |  Branch (689:8): [True: 0, False: 0]
  ------------------
  690|      0|				break;
  691|      0|			b = multadd(dalloc, b, 10, 0);
  692|      0|			}
  693|       |
  694|       |	/* Round off last digit */
  695|       |
  696|       |#ifdef Honor_FLT_ROUNDS
  697|       |	switch(Rounding) {
  698|       |	  case 0: goto trimzeros;
  699|       |	  case 2: goto roundoff;
  700|       |	  }
  701|       |#endif
  702|      0|	b = lshift(dalloc, b, 1);
  703|      0|	j = cmp(b, S);
  704|       |#ifdef ROUND_BIASED
  705|       |	if (j >= 0)
  706|       |#else
  707|      0|	if (j > 0 || (j == 0 && dig & 1))
  ------------------
  |  Branch (707:6): [True: 0, False: 0]
  |  Branch (707:16): [True: 0, False: 0]
  |  Branch (707:26): [True: 0, False: 0]
  ------------------
  708|      0|#endif
  709|      0|		{
  710|      0| roundoff:
  711|      0|		while(*--s == '9')
  ------------------
  |  Branch (711:9): [True: 0, False: 0]
  ------------------
  712|      0|			if (s == s0) {
  ------------------
  |  Branch (712:8): [True: 0, False: 0]
  ------------------
  713|      0|				k++;
  714|      0|				*s++ = '1';
  715|      0|				goto ret;
  716|      0|				}
  717|      0|		++*s++;
  718|      0|		}
  719|      0|	else {
  720|       |#ifdef Honor_FLT_ROUNDS
  721|       | trimzeros:
  722|       |#endif
  723|      0|		while(*--s == '0');
  ------------------
  |  Branch (723:9): [True: 0, False: 0]
  ------------------
  724|      0|		s++;
  725|      0|		}
  726|  3.95k| ret:
  727|  3.95k|	Bfree(dalloc, S);
  728|  3.95k|	if (mhi) {
  ------------------
  |  Branch (728:6): [True: 3.95k, False: 0]
  ------------------
  729|  3.95k|		if (mlo && mlo != mhi)
  ------------------
  |  Branch (729:7): [True: 3.95k, False: 0]
  |  Branch (729:14): [True: 10, False: 3.94k]
  ------------------
  730|     10|			Bfree(dalloc, mlo);
  731|  3.95k|		Bfree(dalloc, mhi);
  732|  3.95k|		}
  733|  4.04k| ret1:
  734|       |#ifdef SET_INEXACT
  735|       |	if (inexact) {
  736|       |		if (!oldinexact) {
  737|       |			word0(&u) = Exp_1 + (70 << Exp_shift);
  738|       |			word1(&u) = 0;
  739|       |			dval(&u) += 1.;
  740|       |			}
  741|       |		}
  742|       |	else if (!oldinexact)
  743|       |		clear_inexact();
  744|       |#endif
  745|  4.04k|	Bfree(dalloc, b);
  746|  4.04k|	*s = 0;
  747|  4.04k|	*decpt = k + 1;
  748|  4.04k|	if (rve)
  ------------------
  |  Branch (748:6): [True: 4.04k, False: 0]
  ------------------
  749|  4.04k|		*rve = s;
  750|  4.04k|	return s0;
  751|  3.95k|	}

ACQUIRE_DTOA_LOCK:
    9|      7|extern "C" void ACQUIRE_DTOA_LOCK(int n) {
   10|      7|  assert(n == 1 && "only dtoa lock 1 is supported");
   11|      0|  mutex.lock();
   12|      7|}
FREE_DTOA_LOCK:
   14|      7|extern "C" void FREE_DTOA_LOCK(int n) {
   15|      7|  assert(n == 1 && "only dtoa lock 1 is supported");
   16|      0|  mutex.unlock();
   17|      7|}

_ZN4llvh8ArrayRefIhEC2Ev:
   61|  7.54k|    /*implicit*/ ArrayRef() = default;
_ZNK4llvh15MutableArrayRefImE4dataEv:
  329|  17.5M|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefImE4dataEv:
  146|  17.5M|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIcE4sizeEv:
  149|  2.76M|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIcE5beginEv:
  137|  3.39M|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIcE3endEv:
  138|  4.33M|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIcEC2EPKcm:
   72|  2.40M|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIhE4sizeEv:
  149|   447k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIhE4dataEv:
  146|   881k|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIhEC2EPKhm:
   72|   425k|      : Data(data), Length(length) {}
_ZN4llvh12makeArrayRefIhEENS_8ArrayRefIT_EEPKS2_m:
  457|   404k|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|   404k|    return ArrayRef<T>(data, length);
  459|   404k|  }
_ZN4llvh8ArrayRefIDsEC2EPKDsm:
   72|  1.72M|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIDsE4sizeEv:
  149|  3.92M|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIDsE5beginEv:
  137|  1.34M|    iterator begin() const { return Data; }
_ZN4llvh12makeArrayRefIcEENS_8ArrayRefIT_EEPKS2_m:
  457|    147|  ArrayRef<T> makeArrayRef(const T *data, size_t length) {
  458|    147|    return ArrayRef<T>(data, length);
  459|    147|  }
_ZN4llvheqIhEEbNS_8ArrayRefIT_EES3_:
  518|  1.04k|  inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
  519|  1.04k|    return LHS.equals(RHS);
  520|  1.04k|  }
_ZNK4llvh8ArrayRefIhE6equalsES1_:
  171|  1.04k|    bool equals(ArrayRef RHS) const {
  172|  1.04k|      if (Length != RHS.Length)
  ------------------
  |  Branch (172:11): [True: 0, False: 1.04k]
  ------------------
  173|      0|        return false;
  174|  1.04k|      return std::equal(begin(), end(), RHS.begin());
  175|  1.04k|    }
_ZNK4llvh8ArrayRefIhE3endEv:
  138|  2.61k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefINS_9StringRefEE5beginEv:
  137|   385k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefINS_9StringRefEE3endEv:
  138|   771k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIhE5sliceEmm:
  179|  14.2k|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|  14.2k|      assert(N+M <= size() && "Invalid specifier");
  181|      0|      return ArrayRef<T>(data()+N, M);
  182|  14.2k|    }
_ZNK4llvh8ArrayRefIhE5sliceEm:
  185|  12.9k|    ArrayRef<T> slice(size_t N) const { return slice(N, size() - N); }
_ZNK4llvh15MutableArrayRefImEixEm:
  417|  13.5M|    T &operator[](size_t Index) const {
  418|  13.5M|      assert(Index < this->size() && "Invalid index!");
  419|      0|      return data()[Index];
  420|  13.5M|    }
_ZNK4llvh8ArrayRefImE4sizeEv:
  149|  17.1M|    size_t size() const { return Length; }
_ZNK4llvh15MutableArrayRefImE10drop_frontEm:
  362|   349k|    MutableArrayRef<T> drop_front(size_t N = 1) const {
  363|   349k|      assert(this->size() >= N && "Dropping more elements than exist");
  364|      0|      return slice(N, this->size() - N);
  365|   349k|    }
_ZNK4llvh15MutableArrayRefImE5sliceEmm:
  351|   349k|    MutableArrayRef<T> slice(size_t N, size_t M) const {
  352|   349k|      assert(N + M <= this->size() && "Invalid specifier");
  353|      0|      return MutableArrayRef<T>(this->data() + N, M);
  354|   349k|    }
_ZNK4llvh8ArrayRefIhE5beginEv:
  137|  11.8k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE4sizeEv:
  149|   114k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE5beginEv:
  137|   114k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE3endEv:
  138|   114k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEEixEm:
  240|  36.1k|    const T &operator[](size_t Index) const {
  241|  36.1k|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|  36.1k|    }
_ZNK4llvh8ArrayRefIDsE3endEv:
  138|  2.52M|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIcE4dataEv:
  146|   916k|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIDsE4dataEv:
  146|  2.14M|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIhEixEm:
  240|  1.47M|    const T &operator[](size_t Index) const {
  241|  1.47M|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|  1.47M|    }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE5emptyEv:
  144|    620|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefIDsEC2IvEERKNS_25SmallVectorTemplateCommonIDsT_EE:
   83|  94.4k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  94.4k|    }
_ZNK4llvh8ArrayRefIjE5beginEv:
  137|  82.1k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIjE3endEv:
  138|  59.6k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIjE4sizeEv:
  149|   136k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIjE10take_frontEm:
  212|  3.42k|    ArrayRef<T> take_front(size_t N = 1) const {
  213|  3.42k|      if (N >= size())
  ------------------
  |  Branch (213:11): [True: 22, False: 3.40k]
  ------------------
  214|     22|        return *this;
  215|  3.40k|      return drop_back(size() - N);
  216|  3.42k|    }
_ZNK4llvh8ArrayRefIjE9drop_backEm:
  194|  3.40k|    ArrayRef<T> drop_back(size_t N = 1) const {
  195|  3.40k|      assert(size() >= N && "Dropping more elements than exist");
  196|      0|      return slice(0, size() - N);
  197|  3.40k|    }
_ZNK4llvh8ArrayRefIjE5sliceEmm:
  179|  29.3k|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|  29.3k|      assert(N+M <= size() && "Invalid specifier");
  181|      0|      return ArrayRef<T>(data()+N, M);
  182|  29.3k|    }
_ZNK4llvh8ArrayRefIjE4dataEv:
  146|  29.3k|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIjE10drop_frontEm:
  188|  25.9k|    ArrayRef<T> drop_front(size_t N = 1) const {
  189|  25.9k|      assert(size() >= N && "Dropping more elements than exist");
  190|      0|      return slice(N, size() - N);
  191|  25.9k|    }
_ZNK4llvh8ArrayRefIjE5emptyEv:
  144|  22.4k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIjE10take_whileIPFbjEEES1_T_:
  227|  11.2k|    template <class PredicateT> ArrayRef<T> take_while(PredicateT Pred) const {
  228|  11.2k|      return ArrayRef<T>(begin(), find_if_not(*this, Pred));
  229|  11.2k|    }
_ZNK4llvh8ArrayRefIjE10take_untilIPFbjEEES1_T_:
  233|  11.2k|    template <class PredicateT> ArrayRef<T> take_until(PredicateT Pred) const {
  234|  11.2k|      return ArrayRef<T>(begin(), find_if(*this, Pred));
  235|  11.2k|    }
_ZN4llvh19makeMutableArrayRefIN6hermes2vm18PropertyCacheEntryEEENS_15MutableArrayRefIT_EEPS5_m:
  509|  46.1k|  MutableArrayRef<T> makeMutableArrayRef(T *data, size_t length) {
  510|  46.1k|    return MutableArrayRef<T>(data, length);
  511|  46.1k|  }
_ZN4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEEC2EPS3_m:
  307|  46.1k|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEEC2EPKS3_m:
   72|  46.1k|      : Data(data), Length(length) {}
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE5beginEv:
  331|  46.1k|    iterator begin() const { return data(); }
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE4dataEv:
  329|  92.3k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEE4dataEv:
  146|  92.3k|    const T *data() const { return Data; }
_ZNK4llvh15MutableArrayRefIN6hermes2vm18PropertyCacheEntryEE3endEv:
  332|  46.1k|    iterator end() const { return data() + this->size(); }
_ZNK4llvh8ArrayRefIN6hermes2vm18PropertyCacheEntryEE4sizeEv:
  149|  46.1k|    size_t size() const { return Length; }
_ZN4llvh15MutableArrayRefImEC2Ev:
  297|   116k|    /*implicit*/ MutableArrayRef() = default;
_ZN4llvh8ArrayRefImEC2Ev:
   61|   116k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh15MutableArrayRefImEC2EPmm:
  307|   464k|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefImEC2EPKmm:
   72|   464k|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIDsEC2EPKDsS3_:
   76|    234|      : Data(begin), Length(end - begin) {}
_ZNK4llvh8ArrayRefIDsE5sliceEmm:
  179|  1.17M|    ArrayRef<T> slice(size_t N, size_t M) const {
  180|  1.17M|      assert(N+M <= size() && "Invalid specifier");
  181|      0|      return ArrayRef<T>(data()+N, M);
  182|  1.17M|    }
_ZN4llvh8ArrayRefIhEC2INSt3__19allocatorIhEEEERKNS3_6vectorIhT_EE:
   89|  2.38k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvheqIDsEEbNS_8ArrayRefIT_EES3_:
  518|    273|  inline bool operator==(ArrayRef<T> LHS, ArrayRef<T> RHS) {
  519|    273|    return LHS.equals(RHS);
  520|    273|  }
_ZNK4llvh8ArrayRefIDsE6equalsES1_:
  171|    273|    bool equals(ArrayRef RHS) const {
  172|    273|      if (Length != RHS.Length)
  ------------------
  |  Branch (172:11): [True: 0, False: 273]
  ------------------
  173|      0|        return false;
  174|    273|      return std::equal(begin(), end(), RHS.begin());
  175|    273|    }
_ZN4llvh8ArrayRefIjEC2IvEERKNS_25SmallVectorTemplateCommonIjT_EE:
   83|  11.2k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  11.2k|    }
_ZN4llvh8ArrayRefIjEC2EPKjS3_:
   76|  22.4k|      : Data(begin), Length(end - begin) {}
_ZN4llvh8ArrayRefIjEC2EPKjm:
   72|  29.5k|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIDsEC2ERKDs:
   68|  12.6k|      : Data(&OneElt), Length(1) {}
_ZN4llvh8ArrayRefIcEC2IvEERKNS_25SmallVectorTemplateCommonIcT_EE:
   83|  4.49k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  4.49k|    }
_ZN4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEEC2Ev:
  297|     99|    /*implicit*/ MutableArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEEC2Ev:
   61|     99|    /*implicit*/ ArrayRef() = default;
_ZN4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEEC2EPS3_m:
  307|     99|      : ArrayRef<T>(data, length) {}
_ZN4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEEC2EPKS3_m:
   72|     99|      : Data(data), Length(length) {}
_ZN4llvh15MutableArrayRefIPN6hermes2vm8CallableEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    198|    : ArrayRef<T>(Vec) {}
_ZN4llvh8ArrayRefIPN6hermes2vm8CallableEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|    198|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE5emptyEv:
  144|     99|    bool empty() const { return Length == 0; }
_ZNK4llvh15MutableArrayRefIN6hermes2vm17PinnedHermesValueEE4dataEv:
  329|    198|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE4dataEv:
  146|    198|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes2vm17PinnedHermesValueEE4sizeEv:
  149|     99|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIhE5emptyEv:
  144|  1.08k|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefIcEC2EPKcS3_:
   76|     24|      : Data(begin), Length(end - begin) {}
_ZNK4llvh8ArrayRefIcEixEm:
  240|  54.7k|    const T &operator[](size_t Index) const {
  241|  54.7k|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|  54.7k|    }
_ZN4llvh8ArrayRefIcEC2ERKc:
   68|  12.6k|      : Data(&OneElt), Length(1) {}
_ZNK4llvh15MutableArrayRefIPN6hermes2vm8CallableEEixEm:
  417|  2.87k|    T &operator[](size_t Index) const {
  418|  2.87k|      assert(Index < this->size() && "Invalid index!");
  419|      0|      return data()[Index];
  420|  2.87k|    }
_ZNK4llvh8ArrayRefIPN6hermes2vm8CallableEE4sizeEv:
  149|  2.87k|    size_t size() const { return Length; }
_ZNK4llvh15MutableArrayRefIPN6hermes2vm8CallableEE4dataEv:
  329|  2.87k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIPN6hermes2vm8CallableEE4dataEv:
  146|  2.87k|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIcEC2Ev:
   61|     99|    /*implicit*/ ArrayRef() = default;
_ZNK4llvh8ArrayRefIN6hermes10StringKind5EntryEE5beginEv:
  137|    254|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes10StringKind5EntryEE3endEv:
  138|    254|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIjEixEm:
  240|  7.64k|    const T &operator[](size_t Index) const {
  241|  7.64k|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|  7.64k|    }
_ZNK4llvh8ArrayRefIN6hermes16RegExpTableEntryEE4sizeEv:
  149|    242|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes16RegExpTableEntryEEixEm:
  240|    242|    const T &operator[](size_t Index) const {
  241|    242|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|    242|    }
_ZNK4llvh8ArrayRefIcE5emptyEv:
  144|    147|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIDsE5emptyEv:
  144|    280|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefIDsEC2ILm11EEERAT__KDs:
   98|   590k|    /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {}
_ZN4llvh8ArrayRefIDsEC2ILm10EEERAT__KDs:
   98|   582k|    /*implicit*/ constexpr ArrayRef(const T (&Arr)[N]) : Data(Arr), Length(N) {}
_ZN4llvh8ArrayRefIN6hermes16StringTableEntryEEC2INSt3__19allocatorIS2_EEEERKNS5_6vectorIS2_T_EE:
   89|  1.16k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIhEC2EPKhS3_:
   76|  1.24k|      : Data(begin), Length(end - begin) {}
_ZN4llvh8ArrayRefIPN6hermes7LiteralEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|  35.2k|      : Data(Vec.data()), Length(Vec.size()) {
   84|  35.2k|    }
_ZN4llvh8ArrayRefIPN6hermes10BasicBlockEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|   228k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   228k|    }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE5beginEv:
  137|   685k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE3endEv:
  138|   685k|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIjEC2Ev:
   61|  1.12k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2INS1_9allocatorIS3_EEEERKNS1_6vectorIS3_T_EE:
   89|    168|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|     56|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|     56|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2INSt3__19allocatorIS2_EEEERKNS5_6vectorIS2_T_EE:
   89|     56|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|     24|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIjEC2INSt3__19allocatorIjEEEERKNS3_6vectorIjT_EE:
   89|     56|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEE4dataEv:
  146|    198|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEEC2EPKS3_m:
   72|    198|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEE4sizeEv:
  149|  1.90k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes16StringTableEntryEE4dataEv:
  146|  1.84k|    const T *data() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEE4sizeEv:
  149|     24|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEE4dataEv:
  146|    198|    const T *data() const { return Data; }
_ZN4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEEC2EPKS3_m:
   72|    198|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes10IdentifierEEC2INSt3__19allocatorIS2_EEEERKNS5_6vectorIS2_T_EE:
   89|   114k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|   114k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIPN6hermes8FunctionEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|    112|      : Data(Vec.data()), Length(Vec.size()) {
   84|    112|    }
_ZNK4llvh8ArrayRefIPN6hermes8FunctionEE4sizeEv:
  149|    112|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes8FunctionEEixEm:
  240|   229k|    const T &operator[](size_t Index) const {
  241|   229k|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|   229k|    }
_ZN4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEEC2INSt3__19allocatorIS3_EEEERKNS6_6vectorIS3_T_EE:
   89|   114k|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2Ev:
   61|  1.12k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2Ev:
   61|  1.12k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2Ev:
   61|  1.12k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2Ev:
   61|  3.37k|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc24OverflowStringTableEntryEEC2Ev:
   61|    396|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc15SmallFuncHeaderEEC2Ev:
   61|    198|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes3hbc21SmallStringTableEntryEEC2Ev:
   61|    198|    /*implicit*/ ArrayRef() = default;
_ZN4llvh8ArrayRefIN6hermes10StringKind5EntryEEC2EPKS3_m:
   72|    198|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes3hbc24OverflowStringTableEntryEEC2EPKS3_m:
   72|    198|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes6bigint16BigIntTableEntryEEC2EPKS3_m:
   72|    198|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefIN6hermes16RegExpTableEntryEEC2EPKS2_m:
   72|    198|      : Data(data), Length(length) {}
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2EPKS3_m:
   72|    396|      : Data(data), Length(length) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc23HBCExceptionHandlerInfoEEixEm:
  240|      6|    const T &operator[](size_t Index) const {
  241|      6|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|      6|    }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4sizeEv:
  149|    280|    size_t size() const { return Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE5beginEv:
  137|    280|    iterator begin() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE3endEv:
  138|    280|    iterator end() const { return Data + Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE5beginEv:
  331|    280|    iterator begin() const { return data(); }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4dataEv:
  329|    560|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE4dataEv:
  146|    560|    const T *data() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEE3endEv:
  332|    280|    iterator end() const { return data() + this->size(); }
ConsecutiveStringStorage.cpp:_ZN4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    280|    : ArrayRef<T>(Vec) {}
ConsecutiveStringStorage.cpp:_ZN4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIhE11StringEntryEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|    560|      : Data(Vec.data()), Length(Vec.size()) {}
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4sizeEv:
  149|    280|    size_t size() const { return Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE5beginEv:
  137|    280|    iterator begin() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE3endEv:
  138|    280|    iterator end() const { return Data + Length; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE5beginEv:
  331|    280|    iterator begin() const { return data(); }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4dataEv:
  329|    560|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
ConsecutiveStringStorage.cpp:_ZNK4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE4dataEv:
  146|    560|    const T *data() const { return Data; }
ConsecutiveStringStorage.cpp:_ZNK4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEE3endEv:
  332|    280|    iterator end() const { return data() + this->size(); }
ConsecutiveStringStorage.cpp:_ZN4llvh15MutableArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEEC2ERNSt3__16vectorIS4_NS6_9allocatorIS4_EEEE:
  318|    280|    : ArrayRef<T>(Vec) {}
ConsecutiveStringStorage.cpp:_ZN4llvh8ArrayRefIN12_GLOBAL__N_112StringPackerIDsE11StringEntryEEC2INSt3__19allocatorIS4_EEEERKNS7_6vectorIS4_T_EE:
   89|    560|      : Data(Vec.data()), Length(Vec.size()) {}
_ZN4llvh8ArrayRefIDsEC2INSt3__19allocatorIDsEEEERKNS3_6vectorIDsT_EE:
   89|    833|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE5emptyEv:
  144|   114k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE5beginEv:
  137|   114k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc19DebugSourceLocationEE3endEv:
  138|   114k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE5emptyEv:
  144|     56|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE4sizeEv:
  149|   114k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE5beginEv:
  137|   114k|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes10IdentifierEE3endEv:
  138|   114k|    iterator end() const { return Data + Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE5emptyEv:
  144|   114k|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE4sizeEv:
  149|      4|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE5beginEv:
  137|      4|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes3hbc20DebugTextifiedCalleeEE3endEv:
  138|      4|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIPN6hermes5ValueEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|   114k|      : Data(Vec.data()), Length(Vec.size()) {
   84|   114k|    }
_ZNK4llvh8ArrayRefIPN6hermes7LiteralEE4sizeEv:
  149|  35.2k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes7LiteralEEixEm:
  240|  1.91M|    const T &operator[](size_t Index) const {
  241|  1.91M|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|  1.91M|    }
_ZN4llvh15MutableArrayRefIN6hermes16StringTableEntryEEC2ERNSt3__16vectorIS2_NS4_9allocatorIS2_EEEE:
  318|     56|    : ArrayRef<T>(Vec) {}
_ZN4llvh8ArrayRefINS_9StringRefEEC2INSt3__19allocatorIS1_EEEERKNS4_6vectorIS1_T_EE:
   89|     56|      : Data(Vec.data()), Length(Vec.size()) {}
_ZNK4llvh15MutableArrayRefIN6hermes16StringTableEntryEEixEm:
  417|  1.84k|    T &operator[](size_t Index) const {
  418|  1.84k|      assert(Index < this->size() && "Invalid index!");
  419|      0|      return data()[Index];
  420|  1.84k|    }
_ZNK4llvh15MutableArrayRefIN6hermes16StringTableEntryEE4dataEv:
  329|  1.84k|    T *data() const { return const_cast<T*>(ArrayRef<T>::data()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE6rbeginEv:
  140|     42|    reverse_iterator rbegin() const { return reverse_iterator(end()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE4rendEv:
  141|     42|    reverse_iterator rend() const { return reverse_iterator(begin()); }
_ZNK4llvh8ArrayRefIPN6hermes10BasicBlockEE4sizeEv:
  149|   114k|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIPN6hermes5ValueEE5emptyEv:
  144|   114k|    bool empty() const { return Length == 0; }
_ZN4llvh8ArrayRefINS_9StringRefEEC2ERKSt16initializer_listIS1_E:
  103|  8.20k|      Length(Vec.size()) {}
_ZN4llvh8ArrayRefIN6hermes6parser9TokenKindEEC2ERKS3_:
   68|      7|      : Data(&OneElt), Length(1) {}
_ZNK4llvh8ArrayRefIN6hermes6parser9TokenKindEE4sizeEv:
  149|     14|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefIN6hermes6parser9TokenKindEEixEm:
  240|      7|    const T &operator[](size_t Index) const {
  241|      7|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|      7|    }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE5beginEv:
  137|      2|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE3endEv:
  138|      2|    iterator end() const { return Data + Length; }
_ZN4llvh8ArrayRefIN6hermes14CodePointRangeEEC2IvEERKNS_25SmallVectorTemplateCommonIS2_T_EE:
   83|      4|      : Data(Vec.data()), Length(Vec.size()) {
   84|      4|    }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE5emptyEv:
  144|      1|    bool empty() const { return Length == 0; }
_ZNK4llvh8ArrayRefIN6hermes14CodePointRangeEE4sizeEv:
  149|      1|    size_t size() const { return Length; }
_ZN4llvh8ArrayRefINS_7SMRangeEEC2ERKS1_:
   68|    174|      : Data(&OneElt), Length(1) {}
_ZN4llvh8ArrayRefINS_7SMRangeEEC2ENS_8NoneTypeE:
   64|     74|    /*implicit*/ ArrayRef(NoneType) {}
_ZN4llvh8ArrayRefINS_7SMFixItEEC2ENS_8NoneTypeE:
   64|    248|    /*implicit*/ ArrayRef(NoneType) {}
_ZNK4llvh8ArrayRefINS_7SMRangeEE4sizeEv:
  149|    205|    size_t size() const { return Length; }
_ZNK4llvh8ArrayRefINS_7SMRangeEEixEm:
  240|    174|    const T &operator[](size_t Index) const {
  241|    174|      assert(Index < Length && "Invalid index!");
  242|      0|      return Data[Index];
  243|    174|    }
_ZN4llvh8ArrayRefINSt3__14pairIjjEEEC2IvEERKNS_25SmallVectorTemplateCommonIS3_T_EE:
   83|    248|      : Data(Vec.data()), Length(Vec.size()) {
   84|    248|    }
_ZNK4llvh8ArrayRefINSt3__14pairIjjEEE3vecEv:
  264|    248|    std::vector<T> vec() const {
  265|    248|      return std::vector<T>(Data, Data+Length);
  266|    248|    }
_ZNK4llvh8ArrayRefINS_7SMFixItEE5beginEv:
  137|    248|    iterator begin() const { return Data; }
_ZNK4llvh8ArrayRefINS_7SMFixItEE3endEv:
  138|    248|    iterator end() const { return Data + Length; }

_ZN4llvh9BitVectorD2Ev:
  164|   116k|  ~BitVector() { std::free(Bits.data()); }
_ZN4llvh9BitVector9referenceC2ERS0_j:
   95|   199k|    reference(BitVector &b, unsigned Idx) {
   96|   199k|      WordRef = &b.Bits[Idx / BITWORD_SIZE];
   97|   199k|      BitPos = Idx % BITWORD_SIZE;
   98|   199k|    }
_ZN4llvh9BitVector9referenceaSEb:
  108|   199k|    reference& operator=(bool t) {
  109|   199k|      if (t)
  ------------------
  |  Branch (109:11): [True: 199k, False: 0]
  ------------------
  110|   199k|        *WordRef |= BitWord(1) << BitPos;
  111|      0|      else
  112|      0|        *WordRef &= ~(BitWord(1) << BitPos);
  113|   199k|      return *this;
  114|   199k|    }
_ZNK4llvh9BitVector14set_bits_beginEv:
  124|    141|  const_set_bits_iterator set_bits_begin() const {
  125|    141|    return const_set_bits_iterator(*this);
  126|    141|  }
_ZNK4llvh9BitVector12set_bits_endEv:
  127|    141|  const_set_bits_iterator set_bits_end() const {
  128|    141|    return const_set_bits_iterator(*this, -1);
  129|    141|  }
_ZNK4llvh9BitVector8set_bitsEv:
  130|    141|  iterator_range<const_set_bits_iterator> set_bits() const {
  131|    141|    return make_range(set_bits_begin(), set_bits_end());
  132|    141|  }
_ZN4llvh9BitVectorC2Ev:
  135|   115k|  BitVector() : Size(0) {}
_ZN4llvh9BitVectorC2Ejb:
  139|    286|  explicit BitVector(unsigned s, bool t = false) : Size(s) {
  140|    286|    size_t Capacity = NumBitWords(s);
  141|    286|    Bits = allocate(Capacity);
  142|    286|    init_words(Bits, t);
  143|    286|    if (t)
  ------------------
  |  Branch (143:9): [True: 0, False: 286]
  ------------------
  144|      0|      clear_unused_bits();
  145|    286|  }
_ZN4llvh9BitVectorC2EOS0_:
  159|    470|  BitVector(BitVector &&RHS) : Bits(RHS.Bits), Size(RHS.Size) {
  160|    470|    RHS.Bits = MutableArrayRef<BitWord>();
  161|    470|    RHS.Size = 0;
  162|    470|  }
_ZNK4llvh9BitVector4sizeEv:
  170|  3.16M|  size_type size() const { return Size; }
_ZNK4llvh9BitVector3anyEv:
  181|  1.30M|  bool any() const {
  182|  1.85M|    for (unsigned i = 0; i < NumBitWords(size()); ++i)
  ------------------
  |  Branch (182:26): [True: 1.32M, False: 526k]
  ------------------
  183|  1.32M|      if (Bits[i] != 0)
  ------------------
  |  Branch (183:11): [True: 778k, False: 550k]
  ------------------
  184|   778k|        return true;
  185|   526k|    return false;
  186|  1.30M|  }
_ZNK4llvh9BitVector4noneEv:
  202|  1.30M|  bool none() const {
  203|  1.30M|    return !any();
  204|  1.30M|  }
_ZNK4llvh9BitVector13find_first_inEjj:
  208|   805k|  int find_first_in(unsigned Begin, unsigned End) const {
  209|   805k|    assert(Begin <= End && End <= Size);
  210|   805k|    if (Begin == End)
  ------------------
  |  Branch (210:9): [True: 0, False: 805k]
  ------------------
  211|      0|      return -1;
  212|       |
  213|   805k|    unsigned FirstWord = Begin / BITWORD_SIZE;
  214|   805k|    unsigned LastWord = (End - 1) / BITWORD_SIZE;
  215|       |
  216|       |    // Check subsequent words.
  217|   806k|    for (unsigned i = FirstWord; i <= LastWord; ++i) {
  ------------------
  |  Branch (217:34): [True: 806k, False: 141]
  ------------------
  218|   806k|      BitWord Copy = Bits[i];
  219|       |
  220|   806k|      if (i == FirstWord) {
  ------------------
  |  Branch (220:11): [True: 805k, False: 1.02k]
  ------------------
  221|   805k|        unsigned FirstBit = Begin % BITWORD_SIZE;
  222|   805k|        Copy &= maskTrailingZeros<BitWord>(FirstBit);
  223|   805k|      }
  224|       |
  225|   806k|      if (i == LastWord) {
  ------------------
  |  Branch (225:11): [True: 756k, False: 49.5k]
  ------------------
  226|   756k|        unsigned LastBit = (End - 1) % BITWORD_SIZE;
  227|   756k|        Copy &= maskTrailingOnes<BitWord>(LastBit + 1);
  228|   756k|      }
  229|   806k|      if (Copy != 0)
  ------------------
  |  Branch (229:11): [True: 805k, False: 1.16k]
  ------------------
  230|   805k|        return i * BITWORD_SIZE + countTrailingZeros(Copy);
  231|   806k|    }
  232|    141|    return -1;
  233|   805k|  }
_ZNK4llvh9BitVector10find_firstEv:
  332|   778k|  int find_first() const { return find_first_in(0, Size); }
_ZNK4llvh9BitVector9find_nextEj:
  340|  26.6k|  int find_next(unsigned Prev) const { return find_first_in(Prev + 1, Size); }
_ZN4llvh9BitVector6resizeEjb:
  372|   641k|  void resize(unsigned N, bool t = false) {
  373|   641k|    if (N > getBitCapacity()) {
  ------------------
  |  Branch (373:9): [True: 115k, False: 526k]
  ------------------
  374|   115k|      unsigned OldCapacity = Bits.size();
  375|   115k|      grow(N);
  376|   115k|      init_words(Bits.drop_front(OldCapacity), t);
  377|   115k|    }
  378|       |
  379|       |    // Set any old unused bits that are now included in the BitVector. This
  380|       |    // may set bits that are not included in the new vector, but we will clear
  381|       |    // them back out below.
  382|   641k|    if (N > Size)
  ------------------
  |  Branch (382:9): [True: 641k, False: 0]
  ------------------
  383|   641k|      set_unused_bits(t);
  384|       |
  385|       |    // Update the size, and clear out any bits that are now unused
  386|   641k|    unsigned OldSize = Size;
  387|   641k|    Size = N;
  388|   641k|    if (t || N < OldSize)
  ------------------
  |  Branch (388:9): [True: 114k, False: 527k]
  |  Branch (388:14): [True: 0, False: 527k]
  ------------------
  389|   114k|      clear_unused_bits();
  390|   641k|  }
_ZN4llvh9BitVector7reserveEj:
  392|    353|  void reserve(unsigned N) {
  393|    353|    if (N > getBitCapacity())
  ------------------
  |  Branch (393:9): [True: 99, False: 254]
  ------------------
  394|     99|      grow(N);
  395|    353|  }
_ZN4llvh9BitVector3setEj:
  404|  3.02M|  BitVector &set(unsigned Idx) {
  405|  3.02M|    assert(Bits.data() && "Bits never allocated");
  406|      0|    Bits[Idx / BITWORD_SIZE] |= BitWord(1) << (Idx % BITWORD_SIZE);
  407|  3.02M|    return *this;
  408|  3.02M|  }
_ZN4llvh9BitVector5resetEv:
  439|    284|  BitVector &reset() {
  440|    284|    init_words(Bits, false);
  441|    284|    return *this;
  442|    284|  }
_ZN4llvh9BitVector5resetEj:
  444|   778k|  BitVector &reset(unsigned Idx) {
  445|   778k|    Bits[Idx / BITWORD_SIZE] &= ~(BitWord(1) << (Idx % BITWORD_SIZE));
  446|   778k|    return *this;
  447|   778k|  }
_ZN4llvh9BitVector5resetEjj:
  450|   114k|  BitVector &reset(unsigned I, unsigned E) {
  451|   114k|    assert(I <= E && "Attempted to reset backwards range!");
  452|      0|    assert(E <= size() && "Attempted to reset out-of-bounds range!");
  453|       |
  454|   114k|    if (I == E) return *this;
  ------------------
  |  Branch (454:9): [True: 0, False: 114k]
  ------------------
  455|       |
  456|   114k|    if (I / BITWORD_SIZE == E / BITWORD_SIZE) {
  ------------------
  |  Branch (456:9): [True: 114k, False: 0]
  ------------------
  457|   114k|      BitWord EMask = 1UL << (E % BITWORD_SIZE);
  458|   114k|      BitWord IMask = 1UL << (I % BITWORD_SIZE);
  459|   114k|      BitWord Mask = EMask - IMask;
  460|   114k|      Bits[I / BITWORD_SIZE] &= ~Mask;
  461|   114k|      return *this;
  462|   114k|    }
  463|       |
  464|      0|    BitWord PrefixMask = ~0UL << (I % BITWORD_SIZE);
  465|      0|    Bits[I / BITWORD_SIZE] &= ~PrefixMask;
  466|      0|    I = alignTo(I, BITWORD_SIZE);
  467|       |
  468|      0|    for (; I + BITWORD_SIZE <= E; I += BITWORD_SIZE)
  ------------------
  |  Branch (468:12): [True: 0, False: 0]
  ------------------
  469|      0|      Bits[I / BITWORD_SIZE] = 0UL;
  470|       |
  471|      0|    BitWord PostfixMask = (1UL << (E % BITWORD_SIZE)) - 1;
  472|      0|    if (I < E)
  ------------------
  |  Branch (472:9): [True: 0, False: 0]
  ------------------
  473|      0|      Bits[I / BITWORD_SIZE] &= ~PostfixMask;
  474|       |
  475|      0|    return *this;
  476|   114k|  }
_ZN4llvh9BitVector4flipEv:
  478|    141|  BitVector &flip() {
  479|  1.69k|    for (unsigned i = 0; i < NumBitWords(size()); ++i)
  ------------------
  |  Branch (479:26): [True: 1.55k, False: 141]
  ------------------
  480|  1.55k|      Bits[i] = ~Bits[i];
  481|    141|    clear_unused_bits();
  482|    141|    return *this;
  483|    141|  }
_ZN4llvh9BitVectorixEj:
  491|   199k|  reference operator[](unsigned Idx) {
  492|   199k|    assert (Idx < Size && "Out-of-bounds Bit access.");
  493|      0|    return reference(*this, Idx);
  494|   199k|  }
_ZNK4llvh9BitVectorixEj:
  496|  6.34M|  bool operator[](unsigned Idx) const {
  497|  6.34M|    assert (Idx < Size && "Out-of-bounds Bit access.");
  498|      0|    BitWord Mask = BitWord(1) << (Idx % BITWORD_SIZE);
  499|  6.34M|    return (Bits[Idx / BITWORD_SIZE] & Mask) != 0;
  500|  6.34M|  }
_ZNK4llvh9BitVector4testEj:
  502|  6.34M|  bool test(unsigned Idx) const {
  503|  6.34M|    return (*this)[Idx];
  504|  6.34M|  }
_ZN4llvh9BitVector9push_backEb:
  507|   130k|  void push_back(bool Val) {
  508|   130k|    unsigned OldSize = Size;
  509|   130k|    unsigned NewSize = Size + 1;
  510|       |
  511|       |    // Resize, which will insert zeros.
  512|       |    // If we already fit then the unused bits will be already zero.
  513|   130k|    if (NewSize > getBitCapacity())
  ------------------
  |  Branch (513:9): [True: 119, False: 130k]
  ------------------
  514|    119|      resize(NewSize, false);
  515|   130k|    else
  516|   130k|      Size = NewSize;
  517|       |
  518|       |    // If true, set single bit.
  519|   130k|    if (Val)
  ------------------
  |  Branch (519:9): [True: 130k, False: 0]
  ------------------
  520|   130k|      set(OldSize);
  521|   130k|  }
_ZN4llvh9BitVector5resetERKS0_:
  577|  1.14k|  BitVector &reset(const BitVector &RHS) {
  578|  1.14k|    unsigned ThisWords = NumBitWords(size());
  579|  1.14k|    unsigned RHSWords  = NumBitWords(RHS.size());
  580|  1.14k|    unsigned i;
  581|  84.6k|    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
  ------------------
  |  Branch (581:17): [True: 83.5k, False: 1.14k]
  ------------------
  582|  83.5k|      Bits[i] &= ~RHS.Bits[i];
  583|  1.14k|    return *this;
  584|  1.14k|  }
_ZNK4llvh9BitVector4testERKS0_:
  588|    334|  bool test(const BitVector &RHS) const {
  589|    334|    unsigned ThisWords = NumBitWords(size());
  590|    334|    unsigned RHSWords  = NumBitWords(RHS.size());
  591|    334|    unsigned i;
  592|  10.8k|    for (i = 0; i != std::min(ThisWords, RHSWords); ++i)
  ------------------
  |  Branch (592:17): [True: 10.6k, False: 171]
  ------------------
  593|  10.6k|      if ((Bits[i] & ~RHS.Bits[i]) != 0)
  ------------------
  |  Branch (593:11): [True: 163, False: 10.4k]
  ------------------
  594|    163|        return true;
  595|       |
  596|    171|    for (; i != ThisWords ; ++i)
  ------------------
  |  Branch (596:12): [True: 0, False: 171]
  ------------------
  597|      0|      if (Bits[i] != 0)
  ------------------
  |  Branch (597:11): [True: 0, False: 0]
  ------------------
  598|      0|        return true;
  599|       |
  600|    171|    return false;
  601|    171|  }
_ZN4llvh9BitVectoroRERKS0_:
  603|  1.18k|  BitVector &operator|=(const BitVector &RHS) {
  604|  1.18k|    if (size() < RHS.size())
  ------------------
  |  Branch (604:9): [True: 0, False: 1.18k]
  ------------------
  605|      0|      resize(RHS.size());
  606|  64.5k|    for (size_t i = 0, e = NumBitWords(RHS.size()); i != e; ++i)
  ------------------
  |  Branch (606:53): [True: 63.3k, False: 1.18k]
  ------------------
  607|  63.3k|      Bits[i] |= RHS.Bits[i];
  608|  1.18k|    return *this;
  609|  1.18k|  }
_ZN4llvh9BitVectoraSERKS0_:
  719|    368|  const BitVector &operator=(const BitVector &RHS) {
  720|    368|    if (this == &RHS) return *this;
  ------------------
  |  Branch (720:9): [True: 0, False: 368]
  ------------------
  721|       |
  722|    368|    Size = RHS.size();
  723|    368|    unsigned RHSWords = NumBitWords(Size);
  724|    368|    if (Size <= getBitCapacity()) {
  ------------------
  |  Branch (724:9): [True: 368, False: 0]
  ------------------
  725|    368|      if (Size)
  ------------------
  |  Branch (725:11): [True: 368, False: 0]
  ------------------
  726|    368|        std::memcpy(Bits.data(), RHS.Bits.data(), RHSWords * sizeof(BitWord));
  727|    368|      clear_unused_bits();
  728|    368|      return *this;
  729|    368|    }
  730|       |
  731|       |    // Grow the bitvector to have enough elements.
  732|      0|    unsigned NewCapacity = RHSWords;
  733|      0|    assert(NewCapacity > 0 && "negative capacity?");
  734|      0|    auto NewBits = allocate(NewCapacity);
  735|      0|    std::memcpy(NewBits.data(), RHS.Bits.data(), NewCapacity * sizeof(BitWord));
  736|       |
  737|       |    // Destroy the old bits.
  738|      0|    std::free(Bits.data());
  739|      0|    Bits = NewBits;
  740|       |
  741|      0|    return *this;
  742|    368|  }
_ZN4llvh9BitVector8allocateEm:
  847|    286|  MutableArrayRef<BitWord> allocate(size_t NumWords) {
  848|    286|    BitWord *RawBits = static_cast<BitWord *>(
  849|    286|        safe_malloc(NumWords * sizeof(BitWord)));
  850|    286|    return MutableArrayRef<BitWord>(RawBits, NumWords);
  851|    286|  }
_ZNK4llvh9BitVector11NumBitWordsEj:
  858|  2.84M|  unsigned NumBitWords(unsigned S) const {
  859|  2.84M|    return (S + BITWORD_SIZE-1) / BITWORD_SIZE;
  860|  2.84M|  }
_ZN4llvh9BitVector15set_unused_bitsEb:
  863|   871k|  void set_unused_bits(bool t = true) {
  864|       |    //  Set high words first.
  865|   871k|    unsigned UsedWords = NumBitWords(Size);
  866|   871k|    if (Bits.size() > UsedWords)
  ------------------
  |  Branch (866:9): [True: 233k, False: 638k]
  ------------------
  867|   233k|      init_words(Bits.drop_front(UsedWords), t);
  868|       |
  869|       |    //  Then set any stray high bits of the last used word.
  870|   871k|    unsigned ExtraBits = Size % BITWORD_SIZE;
  871|   871k|    if (ExtraBits) {
  ------------------
  |  Branch (871:9): [True: 641k, False: 230k]
  ------------------
  872|   641k|      BitWord ExtraBitMask = ~0UL << ExtraBits;
  873|   641k|      if (t)
  ------------------
  |  Branch (873:11): [True: 0, False: 641k]
  ------------------
  874|      0|        Bits[UsedWords-1] |= ExtraBitMask;
  875|   641k|      else
  876|   641k|        Bits[UsedWords-1] &= ~ExtraBitMask;
  877|   641k|    }
  878|   871k|  }
_ZN4llvh9BitVector17clear_unused_bitsEv:
  881|   230k|  void clear_unused_bits() {
  882|   230k|    set_unused_bits(false);
  883|   230k|  }
_ZN4llvh9BitVector4growEj:
  885|   115k|  void grow(unsigned NewSize) {
  886|   115k|    size_t NewCapacity = std::max<size_t>(NumBitWords(NewSize), Bits.size() * 2);
  887|   115k|    assert(NewCapacity > 0 && "realloc-ing zero space");
  888|      0|    BitWord *NewBits = static_cast<BitWord *>(
  889|   115k|        safe_realloc(Bits.data(), NewCapacity * sizeof(BitWord)));
  890|   115k|    Bits = MutableArrayRef<BitWord>(NewBits, NewCapacity);
  891|   115k|    clear_unused_bits();
  892|   115k|  }
_ZN4llvh9BitVector10init_wordsENS_15MutableArrayRefImEEb:
  894|   349k|  void init_words(MutableArrayRef<BitWord> B, bool t) {
  895|   349k|    if (B.size() > 0)
  ------------------
  |  Branch (895:9): [True: 349k, False: 0]
  ------------------
  896|   349k|      memset(B.data(), 0 - (int)t, B.size() * sizeof(BitWord));
  897|   349k|  }
_ZNK4llvh9BitVector14getBitCapacityEv:
  929|   773k|  size_t getBitCapacity() const { return Bits.size() * BITWORD_SIZE; }
_ZN4llvh28const_set_bits_iterator_implINS_9BitVectorEEC2ERKS1_:
   45|    141|      : const_set_bits_iterator_impl(Parent, Parent.find_first()) {}
_ZN4llvh28const_set_bits_iterator_implINS_9BitVectorEEC2ERKS1_i:
   43|    282|      : Parent(Parent), Current(Current) {}
_ZNK4llvh28const_set_bits_iterator_implINS_9BitVectorEEneERKS2_:
   67|  26.7k|  bool operator!=(const const_set_bits_iterator_impl &Other) const {
   68|  26.7k|    assert(&Parent == &Other.Parent &&
   69|  26.7k|           "Comparing iterators from different BitVectors");
   70|      0|    return Current != Other.Current;
   71|  26.7k|  }
_ZN4llvh28const_set_bits_iterator_implINS_9BitVectorEEppEv:
   54|  26.6k|  const_set_bits_iterator_impl &operator++() {
   55|  26.6k|    advance();
   56|  26.6k|    return *this;
   57|  26.6k|  }
_ZN4llvh28const_set_bits_iterator_implINS_9BitVectorEE7advanceEv:
   36|  26.6k|  void advance() {
   37|  26.6k|    assert(Current != -1 && "Trying to advance past end.");
   38|      0|    Current = Parent.find_next(Current);
   39|  26.6k|  }
_ZNK4llvh28const_set_bits_iterator_implINS_9BitVectorEEdeEv:
   59|  26.6k|  unsigned operator*() const { return Current; }

_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEED2Ev:
  687|    198|  ~DenseMap() {
  688|    198|    this->destroyAll();
  689|    198|    operator delete(Buckets);
  690|    198|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E10destroyAllEv:
  334|    198|  void destroyAll() {
  335|    198|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 198, False: 0]
  ------------------
  336|    198|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getNumBucketsEv:
  497|    758|  unsigned getNumBuckets() const {
  498|    758|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    758|  }
_ZNK4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE13getNumBucketsEv:
  791|    758|  unsigned getNumBuckets() const {
  792|    758|    return NumBuckets;
  793|    758|  }
_ZNK4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE10getBucketsEv:
  787|    560|  BucketT *getBuckets() const {
  788|    560|    return Buckets;
  789|    560|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEED2Ev:
  687|    604|  ~DenseMap() {
  688|    604|    this->destroyAll();
  689|    604|    operator delete(Buckets);
  690|    604|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10destroyAllEv:
  334|    660|  void destroyAll() {
  335|    660|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 448, False: 212]
  ------------------
  336|    448|      return;
  337|       |
  338|    212|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  15.8k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 15.6k, False: 212]
  ------------------
  340|  15.6k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 2.49k, False: 13.1k]
  ------------------
  341|  15.6k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 2.49k, False: 0]
  ------------------
  342|  2.49k|        P->getSecond().~ValueT();
  343|  15.6k|      P->getFirst().~KeyT();
  344|  15.6k|    }
  345|    212|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getNumBucketsEv:
  497|  2.40M|  unsigned getNumBuckets() const {
  498|  2.40M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.40M|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13getNumBucketsEv:
  791|  2.40M|  unsigned getNumBuckets() const {
  792|  2.40M|    return NumBuckets;
  793|  2.40M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E11getEmptyKeyEv:
  426|   604k|  static const KeyT getEmptyKey() {
  427|   604k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   604k|                  "Must pass the derived type to this template!");
  429|   604k|    return KeyInfoT::getEmptyKey();
  430|   604k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15getTombstoneKeyEv:
  432|   601k|  static const KeyT getTombstoneKey() {
  433|   601k|    return KeyInfoT::getTombstoneKey();
  434|   601k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10getBucketsEv:
  493|  1.79M|  BucketT *getBuckets() {
  494|  1.79M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.79M|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE10getBucketsEv:
  787|  2.39M|  BucketT *getBuckets() const {
  788|  2.39M|    return Buckets;
  789|  2.39M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getBucketsEndEv:
  501|  1.79M|  BucketT *getBucketsEnd() {
  502|  1.79M|    return getBuckets() + getNumBuckets();
  503|  1.79M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEjE8getFirstEv:
   47|  66.5k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEjE9getSecondEv:
   49|  9.53k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E4findERKS5_:
  154|  11.4k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  11.4k|    BucketT *TheBucket;
  156|  11.4k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 11.4k, False: 28]
  ------------------
  157|  11.4k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|     28|    return end();
  159|  11.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15LookupBucketForIS5_EEbRKT_RPSA_:
  632|  11.4k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  11.4k|    const BucketT *ConstFoundBucket;
  634|  11.4k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  11.4k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  11.4k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  11.4k|    return Result;
  638|  11.4k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15LookupBucketForIS5_EEbRKT_RPKSA_:
  582|  11.4k|                       const BucketT *&FoundBucket) const {
  583|  11.4k|    const BucketT *BucketsPtr = getBuckets();
  584|  11.4k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  11.4k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 16, False: 11.4k]
  ------------------
  587|     16|      FoundBucket = nullptr;
  588|     16|      return false;
  589|     16|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  11.4k|    const BucketT *FoundTombstone = nullptr;
  593|  11.4k|    const KeyT EmptyKey = getEmptyKey();
  594|  11.4k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  11.4k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  11.4k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  11.4k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  11.4k|    unsigned ProbeAmt = 1;
  601|  11.4k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  11.4k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  11.4k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  11.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 11.4k, False: 48]
  |  |  ------------------
  ------------------
  605|  11.4k|        FoundBucket = ThisBucket;
  606|  11.4k|        return true;
  607|  11.4k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     48|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     48|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 48, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     48|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 48]
  ------------------
  615|     48|        return false;
  616|     48|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|  11.4k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10getBucketsEv:
  489|  11.4k|  const BucketT *getBuckets() const {
  490|  11.4k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  11.4k|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE10getBucketsEv:
  787|  45.8k|  BucketT *getBuckets() const {
  788|  45.8k|    return Buckets;
  789|  45.8k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getNumBucketsEv:
  497|  45.9k|  unsigned getNumBuckets() const {
  498|  45.9k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  45.9k|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13getNumBucketsEv:
  791|  45.9k|  unsigned getNumBuckets() const {
  792|  45.9k|    return NumBuckets;
  793|  45.9k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E11getEmptyKeyEv:
  426|  11.5k|  static const KeyT getEmptyKey() {
  427|  11.5k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  11.5k|                  "Must pass the derived type to this template!");
  429|  11.5k|    return KeyInfoT::getEmptyKey();
  430|  11.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E15getTombstoneKeyEv:
  432|  11.4k|  static const KeyT getTombstoneKey() {
  433|  11.4k|    return KeyInfoT::getTombstoneKey();
  434|  11.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E12getHashValueERKS5_:
  417|  11.4k|  static unsigned getHashValue(const KeyT &Val) {
  418|  11.4k|    return KeyInfoT::getHashValue(Val);
  419|  11.4k|  }
_ZNK4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE8getFirstEv:
   48|  11.5k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|  22.8k|                        bool NoAdvance=false) {
  440|  22.8k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 22.8k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  22.8k|    return iterator(P, E, Epoch, NoAdvance);
  445|  22.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10getBucketsEv:
  493|  34.4k|  BucketT *getBuckets() {
  494|  34.4k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  34.4k|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE8getFirstEv:
   47|  1.62k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getBucketsEndEv:
  501|  34.3k|  BucketT *getBucketsEnd() {
  502|  34.3k|    return getBuckets() + getNumBuckets();
  503|  34.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E3endEv:
   85|  11.4k|  inline iterator end() {
   86|  11.4k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  11.4k|  }
_ZNK4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEneERKNS0_IS4_jS6_S9_Lb1EEE:
 1179|  11.4k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  11.4k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  11.4k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  11.4k|  }
_ZNK4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEptEv:
 1165|  11.4k|  pointer operator->() const {
 1166|  11.4k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|  11.4k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 11.4k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|  11.4k|    return Ptr;
 1170|  11.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_EixEOS5_:
  315|     28|  ValueT &operator[](KeyT &&Key) {
  316|     28|    return FindAndConstruct(std::move(Key)).second;
  317|     28|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16FindAndConstructEOS5_:
  307|     28|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     28|    BucketT *TheBucket;
  309|     28|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 28]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|     28|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     28|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16InsertIntoBucketIS5_JEEEPSA_SE_OT_DpOT0_:
  519|     28|                            ValueArgs &&... Values) {
  520|     28|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     28|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     28|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     28|    return TheBucket;
  525|     28|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E20InsertIntoBucketImplIS5_EEPSA_RKS5_RKT_SE_:
  539|     28|                                BucketT *TheBucket) {
  540|     28|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     28|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     28|    unsigned NumBuckets = getNumBuckets();
  553|     28|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     28|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 8, False: 20]
  |  |  ------------------
  ------------------
  554|      8|      this->grow(NumBuckets * 2);
  555|      8|      LookupBucketFor(Lookup, TheBucket);
  556|      8|      NumBuckets = getNumBuckets();
  557|     20|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     20|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 20]
  |  |  ------------------
  ------------------
  558|     20|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     28|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     28|    const KeyT EmptyKey = getEmptyKey();
  570|     28|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 28]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     28|    return TheBucket;
  574|     28|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13getNumEntriesEv:
  457|     56|  unsigned getNumEntries() const {
  458|     56|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     56|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13getNumEntriesEv:
  771|     56|  unsigned getNumEntries() const {
  772|     56|    return NumEntries;
  773|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E4growEj:
  509|      8|  void grow(unsigned AtLeast) {
  510|      8|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      8|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE4growEj:
  736|      8|  void grow(unsigned AtLeast) {
  737|      8|    unsigned OldNumBuckets = NumBuckets;
  738|      8|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      8|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      8|    assert(Buckets);
  742|      8|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 8, False: 0]
  ------------------
  743|      8|      this->BaseT::initEmpty();
  744|      8|      return;
  745|      8|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE15allocateBucketsEj:
  795|     64|  bool allocateBuckets(unsigned Num) {
  796|     64|    NumBuckets = Num;
  797|     64|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 8]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|      8|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      8|    return true;
  804|     64|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E9initEmptyEv:
  347|      8|  void initEmpty() {
  348|      8|    setNumEntries(0);
  349|      8|    setNumTombstones(0);
  350|       |
  351|      8|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      8|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    520|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 512, False: 8]
  ------------------
  355|    512|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      8|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E13setNumEntriesEj:
  461|     36|  void setNumEntries(unsigned Num) {
  462|     36|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     36|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE13setNumEntriesEj:
  775|     36|  void setNumEntries(unsigned Num) {
  776|     36|    NumEntries = Num;
  777|     36|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16setNumTombstonesEj:
  477|      8|  void setNumTombstones(unsigned Num) {
  478|      8|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      8|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE16setNumTombstonesEj:
  783|      8|  void setNumTombstones(unsigned Num) {
  784|      8|    NumTombstones = Num;
  785|      8|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E16getNumTombstonesEv:
  473|     20|  unsigned getNumTombstones() const {
  474|     20|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     20|  }
_ZNK4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE16getNumTombstonesEv:
  779|     20|  unsigned getNumTombstones() const {
  780|     20|    return NumTombstones;
  781|     20|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E19incrementNumEntriesEv:
  465|     28|  void incrementNumEntries() {
  466|     28|    setNumEntries(getNumEntries() + 1);
  467|     28|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairINS_9StringRefES4_EEjE9getSecondEv:
   49|     56|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|     56|  unsigned getNumBuckets() const {
  498|     56|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     56|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|     56|  unsigned getNumBuckets() const {
  792|     56|    return NumBuckets;
  793|     56|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|     56|  bool allocateBuckets(unsigned Num) {
  796|     56|    NumBuckets = Num;
  797|     56|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 0]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4sizeEv:
  102|   315k|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13getNumEntriesEv:
  457|   322k|  unsigned getNumEntries() const {
  458|   322k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   322k|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13getNumEntriesEv:
  771|   322k|  unsigned getNumEntries() const {
  772|   322k|    return NumEntries;
  773|   322k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4findERKS2_:
  154|   597k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   597k|    BucketT *TheBucket;
  156|   597k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 594k, False: 2.24k]
  ------------------
  157|   594k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|  2.24k|    return end();
  159|   597k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15LookupBucketForIS2_EEbRKT_RPS7_:
  632|   601k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   601k|    const BucketT *ConstFoundBucket;
  634|   601k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   601k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   601k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   601k|    return Result;
  638|   601k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E15LookupBucketForIS2_EEbRKT_RPKS7_:
  582|   601k|                       const BucketT *&FoundBucket) const {
  583|   601k|    const BucketT *BucketsPtr = getBuckets();
  584|   601k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   601k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 423, False: 601k]
  ------------------
  587|    423|      FoundBucket = nullptr;
  588|    423|      return false;
  589|    423|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   601k|    const BucketT *FoundTombstone = nullptr;
  593|   601k|    const KeyT EmptyKey = getEmptyKey();
  594|   601k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   601k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   601k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   601k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   601k|    unsigned ProbeAmt = 1;
  601|   693k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   693k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   693k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   693k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 594k, False: 98.6k]
  |  |  ------------------
  ------------------
  605|   594k|        FoundBucket = ThisBucket;
  606|   594k|        return true;
  607|   594k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  98.6k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  98.6k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 6.06k, False: 92.5k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  6.06k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 6.06k]
  ------------------
  615|  6.06k|        return false;
  616|  6.06k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  92.5k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 92.5k]
  ------------------
  621|  92.5k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  92.5k|      BucketNo += ProbeAmt++;
  627|  92.5k|      BucketNo &= (NumBuckets-1);
  628|  92.5k|    }
  629|   601k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E10getBucketsEv:
  489|   601k|  const BucketT *getBuckets() const {
  490|   601k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   601k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E12getHashValueERKS2_:
  417|   601k|  static unsigned getHashValue(const KeyT &Val) {
  418|   601k|    return KeyInfoT::getHashValue(Val);
  419|   601k|  }
_ZNK4llvh6detail12DenseMapPairINS_9StringRefEjE8getFirstEv:
   48|   884k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E12makeIteratorEPS7_SA_RNS_14DebugEpochBaseEb:
  439|  1.19M|                        bool NoAdvance=false) {
  440|  1.19M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 1.19M]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  1.19M|    return iterator(P, E, Epoch, NoAdvance);
  445|  1.19M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E3endEv:
   85|   599k|  inline iterator end() {
   86|   599k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   599k|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEneERKNS0_IS1_jS3_S6_Lb1EEE:
 1179|   315k|  bool operator!=(const ConstIterator &RHS) const {
 1180|   315k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|   315k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|   315k|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEptEv:
 1165|   594k|  pointer operator->() const {
 1166|   594k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   594k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 594k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   594k|    return Ptr;
 1170|   594k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E6insertEONSt3__14pairIS2_jEE:
  206|  2.49k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|  2.49k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|  2.49k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E11try_emplaceIJjEEENSt3__14pairINS_16DenseMapIteratorIS2_jS4_S7_Lb0EEEbEEOS2_DpOT_:
  214|  2.49k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|  2.49k|    BucketT *TheBucket;
  216|  2.49k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 2.49k]
  ------------------
  217|      0|      return std::make_pair(
  218|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  219|      0|               false); // Already in map.
  220|       |
  221|       |    // Otherwise, insert the new element.
  222|  2.49k|    TheBucket =
  223|  2.49k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|  2.49k|    return std::make_pair(
  225|  2.49k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|  2.49k|             true);
  227|  2.49k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16InsertIntoBucketIS2_JjEEEPS7_SB_OT_DpOT0_:
  519|  2.49k|                            ValueArgs &&... Values) {
  520|  2.49k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  2.49k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  2.49k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  2.49k|    return TheBucket;
  525|  2.49k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E20InsertIntoBucketImplIS2_EEPS7_RKS2_RKT_SB_:
  539|  2.49k|                                BucketT *TheBucket) {
  540|  2.49k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  2.49k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  2.49k|    unsigned NumBuckets = getNumBuckets();
  553|  2.49k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  2.49k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 234, False: 2.26k]
  |  |  ------------------
  ------------------
  554|    234|      this->grow(NumBuckets * 2);
  555|    234|      LookupBucketFor(Lookup, TheBucket);
  556|    234|      NumBuckets = getNumBuckets();
  557|  2.26k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  2.26k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.26k]
  |  |  ------------------
  ------------------
  558|  2.26k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  2.49k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  2.49k|    const KeyT EmptyKey = getEmptyKey();
  570|  2.49k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 2.49k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  2.49k|    return TheBucket;
  574|  2.49k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E4growEj:
  509|    234|  void grow(unsigned AtLeast) {
  510|    234|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    234|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4growEj:
  736|    234|  void grow(unsigned AtLeast) {
  737|    234|    unsigned OldNumBuckets = NumBuckets;
  738|    234|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    234|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    234|    assert(Buckets);
  742|    234|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 212, False: 22]
  ------------------
  743|    212|      this->BaseT::initEmpty();
  744|    212|      return;
  745|    212|    }
  746|       |
  747|     22|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     22|    operator delete(OldBuckets);
  751|     22|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE15allocateBucketsEj:
  795|    894|  bool allocateBuckets(unsigned Num) {
  796|    894|    NumBuckets = Num;
  797|    894|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 660, False: 234]
  ------------------
  798|    660|      Buckets = nullptr;
  799|    660|      return false;
  800|    660|    }
  801|       |
  802|    234|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    234|    return true;
  804|    894|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E9initEmptyEv:
  347|    234|  void initEmpty() {
  348|    234|    setNumEntries(0);
  349|    234|    setNumTombstones(0);
  350|       |
  351|    234|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    234|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  17.8k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 17.6k, False: 234]
  ------------------
  355|  17.6k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    234|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E13setNumEntriesEj:
  461|  4.24k|  void setNumEntries(unsigned Num) {
  462|  4.24k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  4.24k|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE13setNumEntriesEj:
  775|  4.24k|  void setNumEntries(unsigned Num) {
  776|  4.24k|    NumEntries = Num;
  777|  4.24k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16setNumTombstonesEj:
  477|    234|  void setNumTombstones(unsigned Num) {
  478|    234|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    234|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE16setNumTombstonesEj:
  783|    234|  void setNumTombstones(unsigned Num) {
  784|    234|    NumTombstones = Num;
  785|    234|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E18moveFromOldBucketsEPS7_SA_:
  369|     22|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     22|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     22|    const KeyT EmptyKey = getEmptyKey();
  374|     22|    const KeyT TombstoneKey = getTombstoneKey();
  375|  2.07k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 2.04k, False: 22]
  ------------------
  376|  2.04k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 1.51k, False: 534]
  ------------------
  377|  2.04k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 1.51k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  1.51k|        BucketT *DestBucket;
  380|  1.51k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  1.51k|        (void)FoundVal; // silence warning.
  382|  1.51k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  1.51k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  1.51k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  1.51k|        B->getSecond().~ValueT();
  389|  1.51k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  2.04k|    }
  392|     22|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E16getNumTombstonesEv:
  473|  2.26k|  unsigned getNumTombstones() const {
  474|  2.26k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  2.26k|  }
_ZNK4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE16getNumTombstonesEv:
  779|  2.26k|  unsigned getNumTombstones() const {
  780|  2.26k|    return NumTombstones;
  781|  2.26k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E19incrementNumEntriesEv:
  465|  4.00k|  void incrementNumEntries() {
  466|  4.00k|    setNumEntries(getNumEntries() + 1);
  467|  4.00k|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEeqERKNS0_IS1_jS3_S6_Lb1EEE:
 1172|   281k|  bool operator==(const ConstIterator &RHS) const {
 1173|   281k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   281k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   281k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE15allocateBucketsEj:
  795|    527|  bool allocateBuckets(unsigned Num) {
  796|    527|    NumBuckets = Num;
  797|    527|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 428]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|    428|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    428|    return true;
  804|    527|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E9initEmptyEv:
  347|    428|  void initEmpty() {
  348|    428|    setNumEntries(0);
  349|    428|    setNumTombstones(0);
  350|       |
  351|    428|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    428|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   555k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 554k, False: 428]
  ------------------
  355|   554k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    428|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13setNumEntriesEj:
  461|   346k|  void setNumEntries(unsigned Num) {
  462|   346k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   346k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13setNumEntriesEj:
  775|   346k|  void setNumEntries(unsigned Num) {
  776|   346k|    NumEntries = Num;
  777|   346k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16setNumTombstonesEj:
  477|    428|  void setNumTombstones(unsigned Num) {
  478|    428|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    428|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE16setNumTombstonesEj:
  783|    428|  void setNumTombstones(unsigned Num) {
  784|    428|    NumTombstones = Num;
  785|    428|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getNumBucketsEv:
  497|  16.8M|  unsigned getNumBuckets() const {
  498|  16.8M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  16.8M|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13getNumBucketsEv:
  791|  16.8M|  unsigned getNumBuckets() const {
  792|  16.8M|    return NumBuckets;
  793|  16.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E11getEmptyKeyEv:
  426|  4.50M|  static const KeyT getEmptyKey() {
  427|  4.50M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  4.50M|                  "Must pass the derived type to this template!");
  429|  4.50M|    return KeyInfoT::getEmptyKey();
  430|  4.50M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10getBucketsEv:
  493|  12.3M|  BucketT *getBuckets() {
  494|  12.3M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  12.3M|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE10getBucketsEv:
  787|  16.6M|  BucketT *getBuckets() const {
  788|  16.6M|    return Buckets;
  789|  16.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getBucketsEndEv:
  501|  12.3M|  BucketT *getBucketsEnd() {
  502|  12.3M|    return getBuckets() + getNumBuckets();
  503|  12.3M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE8getFirstEv:
   47|  2.90M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 99]
  ------------------
  336|      0|      return;
  337|       |
  338|     99|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   280k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 280k, False: 99]
  ------------------
  340|   280k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 140k, False: 140k]
  ------------------
  341|   280k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 140k, False: 0]
  ------------------
  342|   140k|        P->getSecond().~ValueT();
  343|   280k|      P->getFirst().~KeyT();
  344|   280k|    }
  345|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15getTombstoneKeyEv:
  432|  4.36M|  static const KeyT getTombstoneKey() {
  433|  4.36M|    return KeyInfoT::getTombstoneKey();
  434|  4.36M|  }
_ZN4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE9getSecondEv:
   49|   896k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E4findERKS2_:
  154|  4.01M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  4.01M|    BucketT *TheBucket;
  156|  4.01M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 3.87M, False: 140k]
  ------------------
  157|  3.87M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   140k|    return end();
  159|  4.01M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15LookupBucketForIS2_EEbRKT_RPSA_:
  632|  4.36M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  4.36M|    const BucketT *ConstFoundBucket;
  634|  4.36M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  4.36M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  4.36M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  4.36M|    return Result;
  638|  4.36M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E15LookupBucketForIS2_EEbRKT_RPKSA_:
  582|  4.36M|                       const BucketT *&FoundBucket) const {
  583|  4.36M|    const BucketT *BucketsPtr = getBuckets();
  584|  4.36M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  4.36M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 198, False: 4.36M]
  ------------------
  587|    198|      FoundBucket = nullptr;
  588|    198|      return false;
  589|    198|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  4.36M|    const BucketT *FoundTombstone = nullptr;
  593|  4.36M|    const KeyT EmptyKey = getEmptyKey();
  594|  4.36M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  4.36M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  4.36M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  4.36M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  4.36M|    unsigned ProbeAmt = 1;
  601|  7.75M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  7.75M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  7.75M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  7.75M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.87M, False: 3.87M]
  |  |  ------------------
  ------------------
  605|  3.87M|        FoundBucket = ThisBucket;
  606|  3.87M|        return true;
  607|  3.87M|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  3.87M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  3.87M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 486k, False: 3.39M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   486k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 486k]
  ------------------
  615|   486k|        return false;
  616|   486k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  3.39M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 3.39M]
  ------------------
  621|  3.39M|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  3.39M|      BucketNo += ProbeAmt++;
  627|  3.39M|      BucketNo &= (NumBuckets-1);
  628|  3.39M|    }
  629|  4.36M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E10getBucketsEv:
  489|  4.36M|  const BucketT *getBuckets() const {
  490|  4.36M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  4.36M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E12getHashValueERKS2_:
  417|  4.36M|  static unsigned getHashValue(const KeyT &Val) {
  418|  4.36M|    return KeyInfoT::getHashValue(Val);
  419|  4.36M|  }
_ZNK4llvh6detail12DenseMapPairINS_9StringRefEPN6hermes12UniqueStringEE8getFirstEv:
   48|  15.0M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|  8.17M|                        bool NoAdvance=false) {
  440|  8.17M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 8.17M]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  8.17M|    return iterator(P, E, Epoch, NoAdvance);
  445|  8.17M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E3endEv:
   85|  4.15M|  inline iterator end() {
   86|  4.15M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  4.15M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEneERKNS0_IS1_S4_S6_S9_Lb1EEE:
 1179|  4.01M|  bool operator!=(const ConstIterator &RHS) const {
 1180|  4.01M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  4.01M|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  4.01M|  }
_ZNK4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEptEv:
 1165|  3.87M|  pointer operator->() const {
 1166|  3.87M|    assert(isHandleInSync() && "invalid iterator access!");
 1167|  3.87M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 3.87M]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|  3.87M|    return Ptr;
 1170|  3.87M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E6insertEONSt3__14pairIS2_S5_EE:
  206|   140k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|   140k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|   140k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E11try_emplaceIJS5_EEENSt3__14pairINS_16DenseMapIteratorIS2_S5_S7_SA_Lb0EEEbEEOS2_DpOT_:
  214|   140k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|   140k|    BucketT *TheBucket;
  216|   140k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 140k]
  ------------------
  217|      0|      return std::make_pair(
  218|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  219|      0|               false); // Already in map.
  220|       |
  221|       |    // Otherwise, insert the new element.
  222|   140k|    TheBucket =
  223|   140k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|   140k|    return std::make_pair(
  225|   140k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|   140k|             true);
  227|   140k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16InsertIntoBucketIS2_JS5_EEEPSA_SE_OT_DpOT0_:
  519|   140k|                            ValueArgs &&... Values) {
  520|   140k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   140k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   140k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   140k|    return TheBucket;
  525|   140k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E20InsertIntoBucketImplIS2_EEPSA_RKS2_RKT_SE_:
  539|   140k|                                BucketT *TheBucket) {
  540|   140k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   140k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   140k|    unsigned NumBuckets = getNumBuckets();
  553|   140k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   140k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 428, False: 140k]
  |  |  ------------------
  ------------------
  554|    428|      this->grow(NumBuckets * 2);
  555|    428|      LookupBucketFor(Lookup, TheBucket);
  556|    428|      NumBuckets = getNumBuckets();
  557|   140k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   140k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 140k]
  |  |  ------------------
  ------------------
  558|   140k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   140k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   140k|    const KeyT EmptyKey = getEmptyKey();
  570|   140k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 140k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   140k|    return TheBucket;
  574|   140k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E13getNumEntriesEv:
  457|   486k|  unsigned getNumEntries() const {
  458|   486k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   486k|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE13getNumEntriesEv:
  771|   486k|  unsigned getNumEntries() const {
  772|   486k|    return NumEntries;
  773|   486k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E4growEj:
  509|    428|  void grow(unsigned AtLeast) {
  510|    428|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    428|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE4growEj:
  736|    428|  void grow(unsigned AtLeast) {
  737|    428|    unsigned OldNumBuckets = NumBuckets;
  738|    428|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    428|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    428|    assert(Buckets);
  742|    428|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 99, False: 329]
  ------------------
  743|     99|      this->BaseT::initEmpty();
  744|     99|      return;
  745|     99|    }
  746|       |
  747|    329|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    329|    operator delete(OldBuckets);
  751|    329|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|    329|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    329|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    329|    const KeyT EmptyKey = getEmptyKey();
  374|    329|    const KeyT TombstoneKey = getTombstoneKey();
  375|   274k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 274k, False: 329]
  ------------------
  376|   274k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 205k, False: 68.8k]
  ------------------
  377|   274k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 205k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   205k|        BucketT *DestBucket;
  380|   205k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   205k|        (void)FoundVal; // silence warning.
  382|   205k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   205k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   205k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   205k|        B->getSecond().~ValueT();
  389|   205k|      }
  390|      0|      B->getFirst().~KeyT();
  391|   274k|    }
  392|    329|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E16getNumTombstonesEv:
  473|   140k|  unsigned getNumTombstones() const {
  474|   140k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   140k|  }
_ZNK4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEE16getNumTombstonesEv:
  779|   140k|  unsigned getNumTombstones() const {
  780|   140k|    return NumTombstones;
  781|   140k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S7_SA_E19incrementNumEntriesEv:
  465|   345k|  void incrementNumEntries() {
  466|   345k|    setNumEntries(getNumEntries() + 1);
  467|   345k|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4initEj:
  726|    660|  void init(unsigned InitNumEntries) {
  727|    660|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    660|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 660]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    660|    } else {
  731|    660|      NumEntries = 0;
  732|    660|      NumTombstones = 0;
  733|    660|    }
  734|    660|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEES2_jS4_S7_E31getMinBucketToReserveForEntriesEj:
  360|    660|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    660|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 660, False: 0]
  ------------------
  363|    660|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    660|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE4initEj:
  726|    198|  void init(unsigned InitNumEntries) {
  727|    198|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    198|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 198]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    198|    } else {
  731|    198|      NumEntries = 0;
  732|    198|      NumTombstones = 0;
  733|    198|    }
  734|    198|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    198|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    198|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 198, False: 0]
  ------------------
  363|    198|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    198|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEE15allocateBucketsEj:
  795|    198|  bool allocateBuckets(unsigned Num) {
  796|    198|    NumBuckets = Num;
  797|    198|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 198, False: 0]
  ------------------
  798|    198|      Buckets = nullptr;
  799|    198|      return false;
  800|    198|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    198|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E15LookupBucketForIjEEbRKT_RPKSD_:
  582|    112|                       const BucketT *&FoundBucket) const {
  583|    112|    const BucketT *BucketsPtr = getBuckets();
  584|    112|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    112|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 112, False: 0]
  ------------------
  587|    112|      FoundBucket = nullptr;
  588|    112|      return false;
  589|    112|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      0|    const BucketT *FoundTombstone = nullptr;
  593|      0|    const KeyT EmptyKey = getEmptyKey();
  594|      0|    const KeyT TombstoneKey = getTombstoneKey();
  595|      0|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      0|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      0|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      0|    unsigned ProbeAmt = 1;
  601|      0|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      0|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E10getBucketsEv:
  489|    560|  const BucketT *getBuckets() const {
  490|    560|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    560|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E4findERKj:
  160|    112|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|    112|    const BucketT *TheBucket;
  162|    112|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 0, False: 112]
  ------------------
  163|      0|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|    112|    return end();
  165|    112|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E17makeConstIteratorEPKSD_SH_RKNS_14DebugEpochBaseEb:
  449|    224|                                   const bool NoAdvance=false) const {
  450|    224|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 224]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|    224|    return const_iterator(P, E, Epoch, NoAdvance);
  455|    224|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E13getBucketsEndEv:
  505|    448|  const BucketT *getBucketsEnd() const {
  506|    448|    return getBuckets() + getNumBuckets();
  507|    448|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEEjS8_SA_SD_E3endEv:
   95|    224|  inline const_iterator end() const {
   96|    224|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|    224|  }
_ZNK4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEeqERKSD_:
 1172|     56|  bool operator==(const ConstIterator &RHS) const {
 1173|     56|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|     56|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|     56|  }
_ZNK4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEneERKSD_:
 1179|     56|  bool operator!=(const ConstIterator &RHS) const {
 1180|     56|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|     56|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|     56|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE15allocateBucketsEj:
  795|    109|  bool allocateBuckets(unsigned Num) {
  796|    109|    NumBuckets = Num;
  797|    109|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 10]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|     10|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     10|    return true;
  804|    109|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E9initEmptyEv:
  347|     10|  void initEmpty() {
  348|     10|    setNumEntries(0);
  349|     10|    setNumTombstones(0);
  350|       |
  351|     10|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     10|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  3.01k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 3.00k, False: 10]
  ------------------
  355|  3.00k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13setNumEntriesEj:
  461|  1.83k|  void setNumEntries(unsigned Num) {
  462|  1.83k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.83k|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13setNumEntriesEj:
  775|  1.83k|  void setNumEntries(unsigned Num) {
  776|  1.83k|    NumEntries = Num;
  777|  1.83k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16setNumTombstonesEj:
  477|     10|  void setNumTombstones(unsigned Num) {
  478|     10|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     10|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE16setNumTombstonesEj:
  783|     10|  void setNumTombstones(unsigned Num) {
  784|     10|    NumTombstones = Num;
  785|     10|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getNumBucketsEv:
  497|  4.29k|  unsigned getNumBuckets() const {
  498|  4.29k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.29k|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13getNumBucketsEv:
  791|  4.29k|  unsigned getNumBuckets() const {
  792|  4.29k|    return NumBuckets;
  793|  4.29k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E11getEmptyKeyEv:
  426|  4.17k|  static const KeyT getEmptyKey() {
  427|  4.17k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  4.17k|                  "Must pass the derived type to this template!");
  429|  4.17k|    return KeyInfoT::getEmptyKey();
  430|  4.17k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10getBucketsEv:
  493|     26|  BucketT *getBuckets() {
  494|     26|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     26|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE10getBucketsEv:
  787|  3.40k|  BucketT *getBuckets() const {
  788|  3.40k|    return Buckets;
  789|  3.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getBucketsEndEv:
  501|     13|  BucketT *getBucketsEnd() {
  502|     13|    return getBuckets() + getNumBuckets();
  503|     13|  }
_ZN4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE8getFirstEv:
   47|  15.5k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 96, False: 3]
  ------------------
  336|     96|      return;
  337|       |
  338|      3|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.60k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.60k, False: 3]
  ------------------
  340|  1.60k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 779, False: 821]
  ------------------
  341|  1.60k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 779, False: 0]
  ------------------
  342|    779|        P->getSecond().~ValueT();
  343|  1.60k|      P->getFirst().~KeyT();
  344|  1.60k|    }
  345|      3|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15getTombstoneKeyEv:
  432|  3.38k|  static const KeyT getTombstoneKey() {
  433|  3.38k|    return KeyInfoT::getTombstoneKey();
  434|  3.38k|  }
_ZN4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE9getSecondEv:
   49|  4.70k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE4initEj:
  959|   168k|  void init(unsigned InitBuckets) {
  960|   168k|    Small = true;
  961|   168k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 168k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|   168k|    this->BaseT::initEmpty();
  966|   168k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E9initEmptyEv:
  347|   168k|  void initEmpty() {
  348|   168k|    setNumEntries(0);
  349|   168k|    setNumTombstones(0);
  350|       |
  351|   168k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   168k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   843k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 675k, False: 168k]
  ------------------
  355|   675k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   168k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13setNumEntriesEj:
  461|   336k|  void setNumEntries(unsigned Num) {
  462|   336k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   336k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13setNumEntriesEj:
 1046|   336k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|   336k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|   336k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E16setNumTombstonesEj:
  477|   336k|  void setNumTombstones(unsigned Num) {
  478|   336k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   336k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16setNumTombstonesEj:
 1056|   336k|  void setNumTombstones(unsigned Num) {
 1057|   336k|    NumTombstones = Num;
 1058|   336k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getNumBucketsEv:
  497|  2.36M|  unsigned getNumBuckets() const {
  498|  2.36M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.36M|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13getNumBucketsEv:
 1093|  2.53M|  unsigned getNumBuckets() const {
 1094|  2.53M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 2.53M, False: 0]
  ------------------
 1095|  2.53M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E11getEmptyKeyEv:
  426|  1.19M|  static const KeyT getEmptyKey() {
  427|  1.19M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.19M|                  "Must pass the derived type to this template!");
  429|  1.19M|    return KeyInfoT::getEmptyKey();
  430|  1.19M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10getBucketsEv:
  493|  1.17M|  BucketT *getBuckets() {
  494|  1.17M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.17M|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE10getBucketsEv:
 1088|  1.17M|  BucketT *getBuckets() {
 1089|  1.17M|    return const_cast<BucketT *>(
 1090|  1.17M|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|  1.17M|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE10getBucketsEv:
 1084|  2.03M|  const BucketT *getBuckets() const {
 1085|  2.03M|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 2.03M, False: 0]
  ------------------
 1086|  2.03M|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getInlineBucketsEv:
 1060|  2.03M|  const BucketT *getInlineBuckets() const {
 1061|  2.03M|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|  2.03M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getBucketsEndEv:
  501|   505k|  BucketT *getBucketsEnd() {
  502|   505k|    return getBuckets() + getNumBuckets();
  503|   505k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE4swapERS8_:
  862|    495|  void swap(SmallDenseMap& RHS) {
  863|    495|    unsigned TmpNumEntries = RHS.NumEntries;
  864|    495|    RHS.NumEntries = NumEntries;
  865|    495|    NumEntries = TmpNumEntries;
  866|    495|    std::swap(NumTombstones, RHS.NumTombstones);
  867|       |
  868|    495|    const KeyT EmptyKey = this->getEmptyKey();
  869|    495|    const KeyT TombstoneKey = this->getTombstoneKey();
  870|    495|    if (Small && RHS.Small) {
  ------------------
  |  Branch (870:9): [True: 495, False: 0]
  |  Branch (870:18): [True: 495, False: 0]
  ------------------
  871|       |      // If we're swapping inline bucket arrays, we have to cope with some of
  872|       |      // the tricky bits of DenseMap's storage system: the buckets are not
  873|       |      // fully initialized. Thus we swap every key, but we may have
  874|       |      // a one-directional move of the value.
  875|  2.47k|      for (unsigned i = 0, e = InlineBuckets; i != e; ++i) {
  ------------------
  |  Branch (875:47): [True: 1.98k, False: 495]
  ------------------
  876|  1.98k|        BucketT *LHSB = &getInlineBuckets()[i],
  877|  1.98k|                *RHSB = &RHS.getInlineBuckets()[i];
  878|  1.98k|        bool hasLHSValue = (!KeyInfoT::isEqual(LHSB->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (878:29): [True: 0, False: 1.98k]
  ------------------
  879|  1.98k|                            !KeyInfoT::isEqual(LHSB->getFirst(), TombstoneKey));
  ------------------
  |  Branch (879:29): [True: 0, False: 0]
  ------------------
  880|  1.98k|        bool hasRHSValue = (!KeyInfoT::isEqual(RHSB->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (880:29): [True: 0, False: 1.98k]
  ------------------
  881|  1.98k|                            !KeyInfoT::isEqual(RHSB->getFirst(), TombstoneKey));
  ------------------
  |  Branch (881:29): [True: 0, False: 0]
  ------------------
  882|  1.98k|        if (hasLHSValue && hasRHSValue) {
  ------------------
  |  Branch (882:13): [True: 0, False: 1.98k]
  |  Branch (882:28): [True: 0, False: 0]
  ------------------
  883|       |          // Swap together if we can...
  884|      0|          std::swap(*LHSB, *RHSB);
  885|      0|          continue;
  886|      0|        }
  887|       |        // Swap separately and handle any assymetry.
  888|  1.98k|        std::swap(LHSB->getFirst(), RHSB->getFirst());
  889|  1.98k|        if (hasLHSValue) {
  ------------------
  |  Branch (889:13): [True: 0, False: 1.98k]
  ------------------
  890|      0|          ::new (&RHSB->getSecond()) ValueT(std::move(LHSB->getSecond()));
  891|      0|          LHSB->getSecond().~ValueT();
  892|  1.98k|        } else if (hasRHSValue) {
  ------------------
  |  Branch (892:20): [True: 0, False: 1.98k]
  ------------------
  893|      0|          ::new (&LHSB->getSecond()) ValueT(std::move(RHSB->getSecond()));
  894|      0|          RHSB->getSecond().~ValueT();
  895|      0|        }
  896|  1.98k|      }
  897|    495|      return;
  898|    495|    }
  899|      0|    if (!Small && !RHS.Small) {
  ------------------
  |  Branch (899:9): [True: 0, False: 0]
  |  Branch (899:19): [True: 0, False: 0]
  ------------------
  900|      0|      std::swap(getLargeRep()->Buckets, RHS.getLargeRep()->Buckets);
  901|      0|      std::swap(getLargeRep()->NumBuckets, RHS.getLargeRep()->NumBuckets);
  902|      0|      return;
  903|      0|    }
  904|       |
  905|      0|    SmallDenseMap &SmallSide = Small ? *this : RHS;
  ------------------
  |  Branch (905:32): [True: 0, False: 0]
  ------------------
  906|      0|    SmallDenseMap &LargeSide = Small ? RHS : *this;
  ------------------
  |  Branch (906:32): [True: 0, False: 0]
  ------------------
  907|       |
  908|       |    // First stash the large side's rep and move the small side across.
  909|      0|    LargeRep TmpRep = std::move(*LargeSide.getLargeRep());
  910|      0|    LargeSide.getLargeRep()->~LargeRep();
  911|      0|    LargeSide.Small = true;
  912|       |    // This is similar to the standard move-from-old-buckets, but the bucket
  913|       |    // count hasn't actually rotated in this case. So we have to carefully
  914|       |    // move construct the keys and values into their new locations, but there
  915|       |    // is no need to re-hash things.
  916|      0|    for (unsigned i = 0, e = InlineBuckets; i != e; ++i) {
  ------------------
  |  Branch (916:45): [True: 0, False: 0]
  ------------------
  917|      0|      BucketT *NewB = &LargeSide.getInlineBuckets()[i],
  918|      0|              *OldB = &SmallSide.getInlineBuckets()[i];
  919|      0|      ::new (&NewB->getFirst()) KeyT(std::move(OldB->getFirst()));
  920|      0|      OldB->getFirst().~KeyT();
  921|      0|      if (!KeyInfoT::isEqual(NewB->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (921:11): [True: 0, False: 0]
  ------------------
  922|      0|          !KeyInfoT::isEqual(NewB->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (922:11): [True: 0, False: 0]
  ------------------
  923|      0|        ::new (&NewB->getSecond()) ValueT(std::move(OldB->getSecond()));
  924|      0|        OldB->getSecond().~ValueT();
  925|      0|      }
  926|      0|    }
  927|       |
  928|       |    // The hard part of moving the small buckets across is done, just move
  929|       |    // the TmpRep into its new home.
  930|      0|    SmallSide.Small = false;
  931|      0|    new (SmallSide.getLargeRep()) LargeRep(std::move(TmpRep));
  932|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E15getTombstoneKeyEv:
  432|  1.02M|  static const KeyT getTombstoneKey() {
  433|  1.02M|    return KeyInfoT::getTombstoneKey();
  434|  1.02M|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getInlineBucketsEv:
 1068|  3.96k|  BucketT *getInlineBuckets() {
 1069|  3.96k|    return const_cast<BucketT *>(
 1070|  3.96k|      const_cast<const SmallDenseMap *>(this)->getInlineBuckets());
 1071|  3.96k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10destroyAllEv:
  334|   336k|  void destroyAll() {
  335|   336k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 336k]
  ------------------
  336|      0|      return;
  337|       |
  338|   336k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.68M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.34M, False: 336k]
  ------------------
  340|  1.34M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 1.34M]
  ------------------
  341|  1.34M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  1.34M|      P->getFirst().~KeyT();
  344|  1.34M|    }
  345|   336k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE17deallocateBucketsEv:
 1097|   336k|  void deallocateBuckets() {
 1098|   336k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 336k, False: 0]
  ------------------
 1099|   336k|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE15allocateBucketsEj:
  795|    168|  bool allocateBuckets(unsigned Num) {
  796|    168|    NumBuckets = Num;
  797|    168|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 112]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|    112|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    112|    return true;
  804|    168|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E9initEmptyEv:
  347|    112|  void initEmpty() {
  348|    112|    setNumEntries(0);
  349|    112|    setNumTombstones(0);
  350|       |
  351|    112|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    112|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  10.8k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 10.7k, False: 112]
  ------------------
  355|  10.7k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13setNumEntriesEj:
  461|  6.20k|  void setNumEntries(unsigned Num) {
  462|  6.20k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  6.20k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13setNumEntriesEj:
  775|  6.20k|  void setNumEntries(unsigned Num) {
  776|  6.20k|    NumEntries = Num;
  777|  6.20k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16setNumTombstonesEj:
  477|    168|  void setNumTombstones(unsigned Num) {
  478|    168|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    168|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE16setNumTombstonesEj:
  783|    168|  void setNumTombstones(unsigned Num) {
  784|    168|    NumTombstones = Num;
  785|    168|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getNumBucketsEv:
  497|  10.2k|  unsigned getNumBuckets() const {
  498|  10.2k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  10.2k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13getNumBucketsEv:
  791|  10.2k|  unsigned getNumBuckets() const {
  792|  10.2k|    return NumBuckets;
  793|  10.2k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E11getEmptyKeyEv:
  426|  9.77k|  static const KeyT getEmptyKey() {
  427|  9.77k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  9.77k|                  "Must pass the derived type to this template!");
  429|  9.77k|    return KeyInfoT::getEmptyKey();
  430|  9.77k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10getBucketsEv:
  493|    448|  BucketT *getBuckets() {
  494|    448|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    448|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE10getBucketsEv:
  787|  6.59k|  BucketT *getBuckets() const {
  788|  6.59k|    return Buckets;
  789|  6.59k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getBucketsEndEv:
  501|    224|  BucketT *getBucketsEnd() {
  502|    224|    return getBuckets() + getNumBuckets();
  503|    224|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE8getFirstEv:
   47|  56.7k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|     56|  bool allocateBuckets(unsigned Num) {
  796|     56|    NumBuckets = Num;
  797|     56|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 0]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|  1.71M|  unsigned getNumBuckets() const {
  498|  1.71M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.71M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|  1.71M|  unsigned getNumBuckets() const {
  792|  1.71M|    return NumBuckets;
  793|  1.71M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|  1.71M|  BucketT *getBuckets() const {
  788|  1.71M|    return Buckets;
  789|  1.71M|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|    112|  void init(unsigned InitNumEntries) {
  727|    112|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    112|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 112]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    112|    } else {
  731|    112|      NumEntries = 0;
  732|    112|      NumTombstones = 0;
  733|    112|    }
  734|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|    112|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    112|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 112, False: 0]
  ------------------
  363|    112|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    112|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|    168|  bool allocateBuckets(unsigned Num) {
  796|    168|    NumBuckets = Num;
  797|    168|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 112, False: 56]
  ------------------
  798|    112|      Buckets = nullptr;
  799|    112|      return false;
  800|    112|    }
  801|       |
  802|     56|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     56|    return true;
  804|    168|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E9initEmptyEv:
  347|     56|  void initEmpty() {
  348|     56|    setNumEntries(0);
  349|     56|    setNumTombstones(0);
  350|       |
  351|     56|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     56|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  3.64k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 3.58k, False: 56]
  ------------------
  355|  3.58k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13setNumEntriesEj:
  461|    122|  void setNumEntries(unsigned Num) {
  462|    122|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    122|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13setNumEntriesEj:
  775|    122|  void setNumEntries(unsigned Num) {
  776|    122|    NumEntries = Num;
  777|    122|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16setNumTombstonesEj:
  477|     56|  void setNumTombstones(unsigned Num) {
  478|     56|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE16setNumTombstonesEj:
  783|     56|  void setNumTombstones(unsigned Num) {
  784|     56|    NumTombstones = Num;
  785|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|   230k|  unsigned getNumBuckets() const {
  498|   230k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   230k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|   230k|  unsigned getNumBuckets() const {
  792|   230k|    return NumBuckets;
  793|   230k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E11getEmptyKeyEv:
  426|   115k|  static const KeyT getEmptyKey() {
  427|   115k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   115k|                  "Must pass the derived type to this template!");
  429|   115k|    return KeyInfoT::getEmptyKey();
  430|   115k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  493|   115k|  BucketT *getBuckets() {
  494|   115k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   115k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|   230k|  BucketT *getBuckets() const {
  788|   230k|    return Buckets;
  789|   230k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getBucketsEndEv:
  501|   114k|  BucketT *getBucketsEnd() {
  502|   114k|    return getBuckets() + getNumBuckets();
  503|   114k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE8getFirstEv:
   47|  10.9k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS2_9allocatorIS6_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS9_EEEEjS9_SB_SE_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE15allocateBucketsEj:
  795|     56|  bool allocateBuckets(unsigned Num) {
  796|     56|    NumBuckets = Num;
  797|     56|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 0]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS2_9allocatorIS6_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS9_EEEEjS9_SB_SE_E13getNumBucketsEv:
  497|     56|  unsigned getNumBuckets() const {
  498|     56|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     56|  }
_ZNK4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEE13getNumBucketsEv:
  791|     56|  unsigned getNumBuckets() const {
  792|     56|    return NumBuckets;
  793|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  7.22k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.16k, False: 56]
  ------------------
  340|  7.16k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 7.16k]
  ------------------
  341|  7.16k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  7.16k|      P->getFirst().~KeyT();
  344|  7.16k|    }
  345|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15getTombstoneKeyEv:
  432|  6.26k|  static const KeyT getTombstoneKey() {
  433|  6.26k|    return KeyInfoT::getTombstoneKey();
  434|  6.26k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE9getSecondEv:
   49|  11.3k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|    112|  void destroyAll() {
  335|    112|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 56, False: 56]
  ------------------
  336|     56|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.64k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 3.58k, False: 56]
  ------------------
  340|  3.58k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 66, False: 3.51k]
  ------------------
  341|  3.58k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 66, False: 0]
  ------------------
  342|     66|        P->getSecond().~ValueT();
  343|  3.58k|      P->getFirst().~KeyT();
  344|  3.58k|    }
  345|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15getTombstoneKeyEv:
  432|   114k|  static const KeyT getTombstoneKey() {
  433|   114k|    return KeyInfoT::getTombstoneKey();
  434|   114k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE9getSecondEv:
   49|    132|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 56, False: 0]
  ------------------
  336|     56|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS2_9allocatorIS6_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS9_EEEEjS9_SB_SE_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 56, False: 0]
  ------------------
  336|     56|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|   114k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   114k|    const BucketT *ConstFoundBucket;
  634|   114k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   114k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   114k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   114k|    return Result;
  638|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|   114k|                       const BucketT *&FoundBucket) const {
  583|   114k|    const BucketT *BucketsPtr = getBuckets();
  584|   114k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 114k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   114k|    const BucketT *FoundTombstone = nullptr;
  593|   114k|    const KeyT EmptyKey = getEmptyKey();
  594|   114k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   114k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   114k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   114k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   114k|    unsigned ProbeAmt = 1;
  601|   114k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   114k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   114k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   114k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 66]
  |  |  ------------------
  ------------------
  605|   114k|        FoundBucket = ThisBucket;
  606|   114k|        return true;
  607|   114k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     66|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     66|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 66, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     66|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 66]
  ------------------
  615|     66|        return false;
  616|     66|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  489|   114k|  const BucketT *getBuckets() const {
  490|   114k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12getHashValueERKS3_:
  417|   114k|  static unsigned getHashValue(const KeyT &Val) {
  418|   114k|    return KeyInfoT::getHashValue(Val);
  419|   114k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEjE8getFirstEv:
   48|   114k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E12makeIteratorEPS8_SB_RNS_14DebugEpochBaseEb:
  439|   114k|                        bool NoAdvance=false) {
  440|   114k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 114k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   114k|    return iterator(P, E, Epoch, NoAdvance);
  445|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E20InsertIntoBucketImplIS3_EEPS8_RKS3_RKT_SC_:
  539|     66|                                BucketT *TheBucket) {
  540|     66|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     66|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     66|    unsigned NumBuckets = getNumBuckets();
  553|     66|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     66|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56, False: 10]
  |  |  ------------------
  ------------------
  554|     56|      this->grow(NumBuckets * 2);
  555|     56|      LookupBucketFor(Lookup, TheBucket);
  556|     56|      NumBuckets = getNumBuckets();
  557|     56|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  558|     10|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     66|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     66|    const KeyT EmptyKey = getEmptyKey();
  570|     66|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 66]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     66|    return TheBucket;
  574|     66|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|    132|  unsigned getNumEntries() const {
  458|    132|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    132|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|    132|  unsigned getNumEntries() const {
  772|    132|    return NumEntries;
  773|    132|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4growEj:
  509|     56|  void grow(unsigned AtLeast) {
  510|     56|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4growEj:
  736|     56|  void grow(unsigned AtLeast) {
  737|     56|    unsigned OldNumBuckets = NumBuckets;
  738|     56|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     56|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     56|    assert(Buckets);
  742|     56|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 0]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16getNumTombstonesEv:
  473|     10|  unsigned getNumTombstones() const {
  474|     10|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     10|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE16getNumTombstonesEv:
  779|     10|  unsigned getNumTombstones() const {
  780|     10|    return NumTombstones;
  781|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E19incrementNumEntriesEv:
  465|     66|  void incrementNumEntries() {
  466|     66|    setNumEntries(getNumEntries() + 1);
  467|     66|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEptEv:
 1165|   229k|  pointer operator->() const {
 1166|   229k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   229k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 229k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   229k|    return Ptr;
 1170|   229k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|  1.71M|  const BucketT *getBuckets() const {
  490|  1.71M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.71M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  160|   343k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   343k|    const BucketT *TheBucket;
  162|   343k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 0, False: 343k]
  ------------------
  163|      0|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|   343k|    return end();
  165|   343k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|   343k|                       const BucketT *&FoundBucket) const {
  583|   343k|    const BucketT *BucketsPtr = getBuckets();
  584|   343k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   343k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 343k, False: 0]
  ------------------
  587|   343k|      FoundBucket = nullptr;
  588|   343k|      return false;
  589|   343k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      0|    const BucketT *FoundTombstone = nullptr;
  593|      0|    const KeyT EmptyKey = getEmptyKey();
  594|      0|    const KeyT TombstoneKey = getTombstoneKey();
  595|      0|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      0|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      0|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      0|    unsigned ProbeAmt = 1;
  601|      0|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      0|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E17makeConstIteratorEPKSC_SG_RKNS_14DebugEpochBaseEb:
  449|   687k|                                   const bool NoAdvance=false) const {
  450|   687k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 687k]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|   687k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|   687k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  505|  1.37M|  const BucketT *getBucketsEnd() const {
  506|  1.37M|    return getBuckets() + getNumBuckets();
  507|  1.37M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEPNS2_6Module9CJSModuleENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   95|   687k|  inline const_iterator end() const {
   96|   687k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   687k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEeqERKSC_:
 1172|   343k|  bool operator==(const ConstIterator &RHS) const {
 1173|   343k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   343k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   343k|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10destroyAllEv:
  334|    297|  void destroyAll() {
  335|    297|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 297, False: 0]
  ------------------
  336|    297|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumBucketsEv:
  497|    297|  unsigned getNumBuckets() const {
  498|    297|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    297|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumBucketsEv:
  791|    297|  unsigned getNumBuckets() const {
  792|    297|    return NumBuckets;
  793|    297|  }
_ZN4llvh6detail12DenseMapPairIjjE8getFirstEv:
   47|  17.6M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|  8.34k|  unsigned getNumBuckets() const {
  498|  8.34k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  8.34k|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|  8.34k|  unsigned getNumBuckets() const {
  792|  8.34k|    return NumBuckets;
  793|  8.34k|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE10getBucketsEv:
  787|  8.24k|  BucketT *getBuckets() const {
  788|  8.24k|    return Buckets;
  789|  8.24k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEEjS3_S5_S8_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEEjS3_S5_S8_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEEdjS6_S9_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEEdjS6_S9_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E6lookupERKj:
  189|    283|  ValueT lookup(const_arg_type_t<KeyT> Val) const {
  190|    283|    const BucketT *TheBucket;
  191|    283|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (191:9): [True: 214, False: 69]
  ------------------
  192|    214|      return TheBucket->getSecond();
  193|     69|    return ValueT();
  194|    283|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15LookupBucketForIjEEbRKT_RPKSA_:
  582|    433|                       const BucketT *&FoundBucket) const {
  583|    433|    const BucketT *BucketsPtr = getBuckets();
  584|    433|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    433|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 36, False: 397]
  ------------------
  587|     36|      FoundBucket = nullptr;
  588|     36|      return false;
  589|     36|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    397|    const BucketT *FoundTombstone = nullptr;
  593|    397|    const KeyT EmptyKey = getEmptyKey();
  594|    397|    const KeyT TombstoneKey = getTombstoneKey();
  595|    397|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    397|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    397|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    397|    unsigned ProbeAmt = 1;
  601|    397|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    397|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    397|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    397|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 214, False: 183]
  |  |  ------------------
  ------------------
  605|    214|        FoundBucket = ThisBucket;
  606|    214|        return true;
  607|    214|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    183|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    183|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 183, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    183|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 183]
  ------------------
  615|    183|        return false;
  616|    183|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|    397|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10getBucketsEv:
  489|    433|  const BucketT *getBuckets() const {
  490|    433|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    433|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE10getBucketsEv:
  787|  68.6k|  BucketT *getBuckets() const {
  788|  68.6k|    return Buckets;
  789|  68.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getNumBucketsEv:
  497|  68.4k|  unsigned getNumBuckets() const {
  498|  68.4k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  68.4k|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumBucketsEv:
  791|  68.4k|  unsigned getNumBuckets() const {
  792|  68.4k|    return NumBuckets;
  793|  68.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E11getEmptyKeyEv:
  426|    490|  static const KeyT getEmptyKey() {
  427|    490|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    490|                  "Must pass the derived type to this template!");
  429|    490|    return KeyInfoT::getEmptyKey();
  430|    490|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15getTombstoneKeyEv:
  432|    409|  static const KeyT getTombstoneKey() {
  433|    409|    return KeyInfoT::getTombstoneKey();
  434|    409|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E12getHashValueERKj:
  417|    397|  static unsigned getHashValue(const KeyT &Val) {
  418|    397|    return KeyInfoT::getHashValue(Val);
  419|    397|  }
_ZNK4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE8getFirstEv:
   48|    580|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE9getSecondEv:
   50|    214|  const ValueT &getSecond() const { return std::pair<KeyT, ValueT>::second; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5countERKj:
  149|     69|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|     69|    const BucketT *TheBucket;
  151|     69|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 69]
  ------------------
  152|     69|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_EixERKj:
  303|     69|  ValueT &operator[](const KeyT &Key) {
  304|     69|    return FindAndConstruct(Key).second;
  305|     69|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16FindAndConstructERKj:
  295|     69|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     69|    BucketT *TheBucket;
  297|     69|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 69]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|     69|    return *InsertIntoBucket(TheBucket, Key);
  301|     69|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E15LookupBucketForIjEEbRKT_RPSA_:
  632|     81|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     81|    const BucketT *ConstFoundBucket;
  634|     81|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     81|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     81|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     81|    return Result;
  638|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16InsertIntoBucketIRKjJEEEPSA_SG_OT_DpOT0_:
  519|     69|                            ValueArgs &&... Values) {
  520|     69|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     69|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     69|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     69|    return TheBucket;
  525|     69|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E20InsertIntoBucketImplIjEEPSA_RKjRKT_SE_:
  539|     69|                                BucketT *TheBucket) {
  540|     69|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     69|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     69|    unsigned NumBuckets = getNumBuckets();
  553|     69|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 12, False: 57]
  |  |  ------------------
  ------------------
  554|     12|      this->grow(NumBuckets * 2);
  555|     12|      LookupBucketFor(Lookup, TheBucket);
  556|     12|      NumBuckets = getNumBuckets();
  557|     57|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     57|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 57]
  |  |  ------------------
  ------------------
  558|     57|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     69|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     69|    const KeyT EmptyKey = getEmptyKey();
  570|     69|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 69]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     69|    return TheBucket;
  574|     69|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getNumEntriesEv:
  457|  17.1k|  unsigned getNumEntries() const {
  458|  17.1k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  17.1k|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13getNumEntriesEv:
  771|  17.1k|  unsigned getNumEntries() const {
  772|  17.1k|    return NumEntries;
  773|  17.1k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E4growEj:
  509|     12|  void grow(unsigned AtLeast) {
  510|     12|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     12|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4growEj:
  736|     12|  void grow(unsigned AtLeast) {
  737|     12|    unsigned OldNumBuckets = NumBuckets;
  738|     12|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     12|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     12|    assert(Buckets);
  742|     12|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 12, False: 0]
  ------------------
  743|     12|      this->BaseT::initEmpty();
  744|     12|      return;
  745|     12|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE15allocateBucketsEj:
  795|    940|  bool allocateBuckets(unsigned Num) {
  796|    940|    NumBuckets = Num;
  797|    940|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 928, False: 12]
  ------------------
  798|    928|      Buckets = nullptr;
  799|    928|      return false;
  800|    928|    }
  801|       |
  802|     12|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     12|    return true;
  804|    940|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E9initEmptyEv:
  347|     12|  void initEmpty() {
  348|     12|    setNumEntries(0);
  349|     12|    setNumTombstones(0);
  350|       |
  351|     12|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     12|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    780|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 768, False: 12]
  ------------------
  355|    768|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     12|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13setNumEntriesEj:
  461|     81|  void setNumEntries(unsigned Num) {
  462|     81|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     81|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE13setNumEntriesEj:
  775|     81|  void setNumEntries(unsigned Num) {
  776|     81|    NumEntries = Num;
  777|     81|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16setNumTombstonesEj:
  477|     12|  void setNumTombstones(unsigned Num) {
  478|     12|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     12|  }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE16setNumTombstonesEj:
  783|     12|  void setNumTombstones(unsigned Num) {
  784|     12|    NumTombstones = Num;
  785|     12|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10getBucketsEv:
  493|  68.2k|  BucketT *getBuckets() {
  494|  68.2k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  68.2k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E13getBucketsEndEv:
  501|  67.0k|  BucketT *getBucketsEnd() {
  502|  67.0k|    return getBuckets() + getNumBuckets();
  503|  67.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E16getNumTombstonesEv:
  473|     57|  unsigned getNumTombstones() const {
  474|     57|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     57|  }
_ZNK4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE16getNumTombstonesEv:
  779|     57|  unsigned getNumTombstones() const {
  780|     57|    return NumTombstones;
  781|     57|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E19incrementNumEntriesEv:
  465|     69|  void incrementNumEntries() {
  466|     69|    setNumEntries(getNumEntries() + 1);
  467|     69|  }
_ZN4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE8getFirstEv:
   47|  90.5k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIjPN6hermes2vm8JSObjectEE9getSecondEv:
   49|    138|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEEmjS3_S6_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes4inst4InstENS2_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S9_EEEES6_S9_SB_SE_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10destroyAllEv:
  334|  1.32k|  void destroyAll() {
  335|  1.32k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 1.32k]
  ------------------
  336|      0|      return;
  337|       |
  338|  1.32k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  30.6k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 29.3k, False: 1.32k]
  ------------------
  340|  29.3k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 6.96k, False: 22.3k]
  ------------------
  341|  29.3k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 6.96k, False: 0]
  ------------------
  342|  6.96k|        P->getSecond().~ValueT();
  343|  29.3k|      P->getFirst().~KeyT();
  344|  29.3k|    }
  345|  1.32k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumBucketsEv:
  497|   475k|  unsigned getNumBuckets() const {
  498|   475k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   475k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumBucketsEv:
 1093|   475k|  unsigned getNumBuckets() const {
 1094|   475k|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 370k, False: 104k]
  ------------------
 1095|   475k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE11getLargeRepEv:
 1073|   210k|  const LargeRep *getLargeRep() const {
 1074|   210k|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|      0|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|   210k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11getEmptyKeyEv:
  426|  86.6k|  static const KeyT getEmptyKey() {
  427|  86.6k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  86.6k|                  "Must pass the derived type to this template!");
  429|  86.6k|    return KeyInfoT::getEmptyKey();
  430|  86.6k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15getTombstoneKeyEv:
  432|  78.0k|  static const KeyT getTombstoneKey() {
  433|  78.0k|    return KeyInfoT::getTombstoneKey();
  434|  78.0k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  493|   402k|  BucketT *getBuckets() {
  494|   402k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   402k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
 1088|   403k|  BucketT *getBuckets() {
 1089|   403k|    return const_cast<BucketT *>(
 1090|   403k|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|   403k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
 1084|   479k|  const BucketT *getBuckets() const {
 1085|   479k|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 374k, False: 104k]
  ------------------
 1086|   479k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getInlineBucketsEv:
 1060|   374k|  const BucketT *getInlineBuckets() const {
 1061|   374k|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   374k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getBucketsEndEv:
  501|   387k|  BucketT *getBucketsEnd() {
  502|   387k|    return getBuckets() + getNumBuckets();
  503|   387k|  }
_ZN4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE8getFirstEv:
   47|   475k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE9getSecondEv:
   49|  24.7k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE17deallocateBucketsEv:
 1097|  1.32k|  void deallocateBuckets() {
 1098|  1.32k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 994, False: 327]
  ------------------
 1099|    994|      return;
 1100|       |
 1101|    327|    operator delete(getLargeRep()->Buckets);
 1102|    327|    getLargeRep()->~LargeRep();
 1103|    327|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE11getLargeRepEv:
 1079|    996|  LargeRep *getLargeRep() {
 1080|    996|    return const_cast<LargeRep *>(
 1081|    996|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|    996|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4findERKS5_:
  154|  66.7k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  66.7k|    BucketT *TheBucket;
  156|  66.7k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 62.0k, False: 4.72k]
  ------------------
  157|  62.0k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|  4.72k|    return end();
  159|  66.7k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPSD_:
  632|  76.0k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  76.0k|    const BucketT *ConstFoundBucket;
  634|  76.0k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  76.0k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  76.0k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  76.0k|    return Result;
  638|  76.0k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPKSD_:
  582|  76.0k|                       const BucketT *&FoundBucket) const {
  583|  76.0k|    const BucketT *BucketsPtr = getBuckets();
  584|  76.0k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  76.0k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 76.0k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  76.0k|    const BucketT *FoundTombstone = nullptr;
  593|  76.0k|    const KeyT EmptyKey = getEmptyKey();
  594|  76.0k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  76.0k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  76.0k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  76.0k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  76.0k|    unsigned ProbeAmt = 1;
  601|  80.8k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  80.8k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  80.8k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  80.8k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 62.0k, False: 18.8k]
  |  |  ------------------
  ------------------
  605|  62.0k|        FoundBucket = ThisBucket;
  606|  62.0k|        return true;
  607|  62.0k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  18.8k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  18.8k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 13.9k, False: 4.84k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  13.9k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 13.9k]
  ------------------
  615|  13.9k|        return false;
  616|  13.9k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  4.84k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 4.84k]
  ------------------
  621|  4.84k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  4.84k|      BucketNo += ProbeAmt++;
  627|  4.84k|      BucketNo &= (NumBuckets-1);
  628|  4.84k|    }
  629|  76.0k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  489|  76.0k|  const BucketT *getBuckets() const {
  490|  76.0k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  76.0k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12getHashValueERKS5_:
  417|  76.0k|  static unsigned getHashValue(const KeyT &Val) {
  418|  76.0k|    return KeyInfoT::getHashValue(Val);
  419|  76.0k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEEE8getFirstEv:
   48|   104k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12makeIteratorEPSD_SG_RNS_14DebugEpochBaseEb:
  439|   232k|                        bool NoAdvance=false) {
  440|   232k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 232k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   232k|    return iterator(P, E, Epoch, NoAdvance);
  445|   232k|  }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|  77.7k|  void AdvancePastEmptyBuckets() {
 1205|  77.7k|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|  77.7k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|   289k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 276k, False: 12.8k]
  |  Branch (1209:27): [True: 211k, False: 64.8k]
  ------------------
 1210|   276k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 64.8k]
  ------------------
 1211|   211k|      ++Ptr;
 1212|  77.7k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEeqERKNS0_IS4_S7_S9_SC_Lb1EEE:
 1172|   132k|  bool operator==(const ConstIterator &RHS) const {
 1173|   132k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   132k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   132k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEptEv:
 1165|   188k|  pointer operator->() const {
 1166|   188k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   188k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 188k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   188k|    return Ptr;
 1170|   188k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E3endEv:
   85|   151k|  inline iterator end() {
   86|   151k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   151k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEneERKNS0_IS4_S7_S9_SC_Lb1EEE:
 1179|  78.6k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  78.6k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  78.6k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  78.6k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11try_emplaceIJS8_EEENSt3__14pairINS_16DenseMapIteratorIS5_S8_SA_SD_Lb0EEEbEERKS5_DpOT_:
  233|  6.96k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|  6.96k|    BucketT *TheBucket;
  235|  6.96k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 6.96k]
  ------------------
  236|      0|      return std::make_pair(
  237|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|      0|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|  6.96k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|  6.96k|    return std::make_pair(
  243|  6.96k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|  6.96k|             true);
  245|  6.96k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16InsertIntoBucketIRKS5_JS8_EEEPSD_SJ_OT_DpOT0_:
  519|  6.96k|                            ValueArgs &&... Values) {
  520|  6.96k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  6.96k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  6.96k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  6.96k|    return TheBucket;
  525|  6.96k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E20InsertIntoBucketImplIS5_EEPSD_RKS5_RKT_SH_:
  539|  6.96k|                                BucketT *TheBucket) {
  540|  6.96k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  6.96k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  6.96k|    unsigned NumBuckets = getNumBuckets();
  553|  6.96k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  6.96k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 332, False: 6.63k]
  |  |  ------------------
  ------------------
  554|    332|      this->grow(NumBuckets * 2);
  555|    332|      LookupBucketFor(Lookup, TheBucket);
  556|    332|      NumBuckets = getNumBuckets();
  557|  6.63k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  6.63k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6.63k]
  |  |  ------------------
  ------------------
  558|  6.63k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  6.96k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  6.96k|    const KeyT EmptyKey = getEmptyKey();
  570|  6.96k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 6.96k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  6.96k|    return TheBucket;
  574|  6.96k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumEntriesEv:
  457|  36.1k|  unsigned getNumEntries() const {
  458|  36.1k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  36.1k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumEntriesEv:
 1042|  36.1k|  unsigned getNumEntries() const {
 1043|  36.1k|    return NumEntries;
 1044|  36.1k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4growEj:
  509|    332|  void grow(unsigned AtLeast) {
  510|    332|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    332|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4growEj:
  968|    332|  void grow(unsigned AtLeast) {
  969|    332|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 332, False: 0]
  ------------------
  970|    332|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|    332|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 327, False: 5]
  ------------------
  973|    327|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 327]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|    327|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|    327|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|    327|      BucketT *TmpEnd = TmpBegin;
  980|       |
  981|       |      // Loop over the buckets, moving non-empty, non-tombstones into the
  982|       |      // temporary storage. Have the loop move the TmpEnd forward as it goes.
  983|    327|      const KeyT EmptyKey = this->getEmptyKey();
  984|    327|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|  2.94k|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 2.61k, False: 327]
  ------------------
  986|  2.61k|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 1.63k, False: 981]
  ------------------
  987|  2.61k|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 1.63k, False: 0]
  ------------------
  988|  1.63k|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|  1.63k|                 "Too many inline buckets!");
  990|      0|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|  1.63k|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|  1.63k|          ++TmpEnd;
  993|  1.63k|          P->getSecond().~ValueT();
  994|  1.63k|        }
  995|      0|        P->getFirst().~KeyT();
  996|  2.61k|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|    327|      Small = false;
 1001|    327|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|    327|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|    327|      return;
 1004|    327|    }
 1005|       |
 1006|      5|    LargeRep OldRep = std::move(*getLargeRep());
 1007|      5|    getLargeRep()->~LargeRep();
 1008|      5|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 5]
  ------------------
 1009|      0|      Small = true;
 1010|      5|    } else {
 1011|      5|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|      5|    }
 1013|       |
 1014|      5|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|      5|    operator delete(OldRep.Buckets);
 1018|      5|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE15allocateBucketsEj:
 1105|    332|  LargeRep allocateBuckets(unsigned Num) {
 1106|    332|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|      0|    LargeRep Rep = {
 1108|    332|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|    332|    };
 1110|    332|    return Rep;
 1111|    332|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E18moveFromOldBucketsEPSD_SG_:
  369|    332|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    332|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    332|    const KeyT EmptyKey = getEmptyKey();
  374|    332|    const KeyT TombstoneKey = getTombstoneKey();
  375|  2.41k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 2.08k, False: 332]
  ------------------
  376|  2.08k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 1.96k, False: 117]
  ------------------
  377|  2.08k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 1.96k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  1.96k|        BucketT *DestBucket;
  380|  1.96k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  1.96k|        (void)FoundVal; // silence warning.
  382|  1.96k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  1.96k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  1.96k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  1.96k|        B->getSecond().~ValueT();
  389|  1.96k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  2.08k|    }
  392|    332|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E9initEmptyEv:
  347|  1.65k|  void initEmpty() {
  348|  1.65k|    setNumEntries(0);
  349|  1.65k|    setNumTombstones(0);
  350|       |
  351|  1.65k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  1.65k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  34.0k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 32.3k, False: 1.65k]
  ------------------
  355|  32.3k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  1.65k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13setNumEntriesEj:
  461|  10.5k|  void setNumEntries(unsigned Num) {
  462|  10.5k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  10.5k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13setNumEntriesEj:
 1046|  10.5k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|  10.5k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|  10.5k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16setNumTombstonesEj:
  477|  1.65k|  void setNumTombstones(unsigned Num) {
  478|  1.65k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  1.65k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16setNumTombstonesEj:
 1056|  1.65k|  void setNumTombstones(unsigned Num) {
 1057|  1.65k|    NumTombstones = Num;
 1058|  1.65k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16getNumTombstonesEv:
  473|  6.63k|  unsigned getNumTombstones() const {
  474|  6.63k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  6.63k|  }
_ZNK4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getNumTombstonesEv:
 1052|  6.63k|  unsigned getNumTombstones() const {
 1053|  6.63k|    return NumTombstones;
 1054|  6.63k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E19incrementNumEntriesEv:
  465|  8.92k|  void incrementNumEntries() {
  466|  8.92k|    setNumEntries(getNumEntries() + 1);
  467|  8.92k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4sizeEv:
  102|  7.39k|  unsigned size() const { return getNumEntries(); }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5beginEv:
   76|  12.8k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  12.8k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 12.8k]
  ------------------
   80|      0|      return end();
   81|  12.8k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 12.8k]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|  12.8k|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|  12.8k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIN6hermes2vm6detail10TransitionENS3_7WeakRefINS3_11HiddenClassEEELj8ENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5emptyEv:
   99|  12.8k|  LLVM_NODISCARD bool empty() const {
  100|  12.8k|    return getNumEntries() == 0;
  101|  12.8k|  }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEppEv:
 1187|  64.8k|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|  64.8k|    assert(isHandleInSync() && "invalid iterator access!");
 1189|  64.8k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 64.8k]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|  64.8k|    ++Ptr;
 1195|  64.8k|    AdvancePastEmptyBuckets();
 1196|  64.8k|    return *this;
 1197|  64.8k|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|    254|  void init(unsigned InitNumEntries) {
  727|    254|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    254|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 254]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    254|    } else {
  731|    254|      NumEntries = 0;
  732|    254|      NumTombstones = 0;
  733|    254|    }
  734|    254|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|    254|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    254|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 254, False: 0]
  ------------------
  363|    254|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    254|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|    254|  bool allocateBuckets(unsigned Num) {
  796|    254|    NumBuckets = Num;
  797|    254|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 254, False: 0]
  ------------------
  798|    254|      Buckets = nullptr;
  799|    254|      return false;
  800|    254|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    254|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|    254|  unsigned getNumBuckets() const {
  498|    254|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    254|  }
_ZNK4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|    254|  unsigned getNumBuckets() const {
  792|    254|    return NumBuckets;
  793|    254|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS6_9allocatorIbEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SA_EEEES5_SA_SC_SF_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS6_9allocatorIbEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SA_EEEES5_SA_SC_SF_E13getNumBucketsEv:
  497|     99|  unsigned getNumBuckets() const {
  498|     99|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     99|  }
_ZNK4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEE13getNumBucketsEv:
  791|     99|  unsigned getNumBuckets() const {
  792|     99|    return NumBuckets;
  793|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  4.85k|  unsigned getNumBuckets() const {
  498|  4.85k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.85k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
  791|  4.85k|  unsigned getNumBuckets() const {
  792|  4.85k|    return NumBuckets;
  793|  4.85k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|  4.75k|  BucketT *getBuckets() {
  494|  4.75k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  4.75k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
  787|  4.75k|  BucketT *getBuckets() const {
  788|  4.75k|    return Buckets;
  789|  4.75k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|  4.75k|  BucketT *getBucketsEnd() {
  502|  4.75k|    return getBuckets() + getNumBuckets();
  503|  4.75k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS6_9allocatorIbEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SA_EEEES5_SA_SC_SF_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 99, False: 0]
  ------------------
  336|     99|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|    112|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|    254|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|    254|  ~DenseMap() {
  688|    254|    this->destroyAll();
  689|    254|    operator delete(Buckets);
  690|    254|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes2vm8SymbolIDEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|    254|  void destroyAll() {
  335|    254|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 254, False: 0]
  ------------------
  336|    254|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjN6hermes2vm6GCBase33SamplingAllocationLocationTracker6SampleENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEED2Ev:
  687|    297|  ~DenseMap() {
  688|    297|    this->destroyAll();
  689|    297|    operator delete(Buckets);
  690|    297|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEC2Ej:
  669|    297|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE4initEj:
  726|    297|  void init(unsigned InitNumEntries) {
  727|    297|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    297|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 297]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    297|    } else {
  731|    297|      NumEntries = 0;
  732|    297|      NumTombstones = 0;
  733|    297|    }
  734|    297|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|    297|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    297|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 297, False: 0]
  ------------------
  363|    297|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    297|  }
_ZN4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE15allocateBucketsEj:
  795|    297|  bool allocateBuckets(unsigned Num) {
  796|    297|    NumBuckets = Num;
  797|    297|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 297, False: 0]
  ------------------
  798|    297|      Buckets = nullptr;
  799|    297|      return false;
  800|    297|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    297|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS3_EEEEjS3_S5_S8_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIjNS_11SmallVectorIjLj1EEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS2_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEEEdjS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIdjN6hermes2vm6GCBase9IDTracker16DoubleComparatorENS_6detail12DenseMapPairIdjEEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumEntriesEv:
  457|    888|  unsigned getNumEntries() const {
  458|    888|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    888|  }
_ZNK4llvh8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumEntriesEv:
  771|    888|  unsigned getNumEntries() const {
  772|    888|    return NumEntries;
  773|    888|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E5emptyEv:
   99|     99|  LLVM_NODISCARD bool empty() const {
  100|     99|    return getNumEntries() == 0;
  101|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|     99|  unsigned getNumEntries() const {
  458|     99|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     99|  }
_ZNK4llvh8DenseMapIPKvjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|     99|  unsigned getNumEntries() const {
  772|     99|    return NumEntries;
  773|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjjNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E5emptyEv:
   99|    888|  LLVM_NODISCARD bool empty() const {
  100|    888|    return getNumEntries() == 0;
  101|    888|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|  8.24k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  8.24k|    const BucketT *ConstFoundBucket;
  634|  8.24k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  8.24k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  8.24k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  8.24k|    return Result;
  638|  8.24k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|  8.24k|                       const BucketT *&FoundBucket) const {
  583|  8.24k|    const BucketT *BucketsPtr = getBuckets();
  584|  8.24k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  8.24k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 8.24k, False: 0]
  ------------------
  587|  8.24k|      FoundBucket = nullptr;
  588|  8.24k|      return false;
  589|  8.24k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      0|    const BucketT *FoundTombstone = nullptr;
  593|      0|    const KeyT EmptyKey = getEmptyKey();
  594|      0|    const KeyT TombstoneKey = getTombstoneKey();
  595|      0|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      0|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      0|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      0|    unsigned ProbeAmt = 1;
  601|      0|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      0|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10getBucketsEv:
  489|  8.24k|  const BucketT *getBuckets() const {
  490|  8.24k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  8.24k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKvjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E5eraseERKS3_:
  276|  8.24k|  bool erase(const KeyT &Val) {
  277|  8.24k|    BucketT *TheBucket;
  278|  8.24k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 8.24k, False: 0]
  ------------------
  279|  8.24k|      return false; // not in map.
  280|       |
  281|      0|    TheBucket->getSecond().~ValueT();
  282|      0|    TheBucket->getFirst() = getTombstoneKey();
  283|      0|    decrementNumEntries();
  284|      0|    incrementNumTombstones();
  285|      0|    return true;
  286|  8.24k|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIjPN6hermes2vm19StackTracesTreeNodeENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE15allocateBucketsEj:
  795|     99|  bool allocateBuckets(unsigned Num) {
  796|     99|    NumBuckets = Num;
  797|     99|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 0]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     99|  }
_ZN4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb0EEC2EPS6_S8_RKNS_14DebugEpochBaseEb:
 1139|  1.19M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  1.19M|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  1.19M|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 1.19M, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh16DenseMapIteratorINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEELb1EEC2ILb0EvEERKNS0_IS1_jS3_S6_XT_EEE:
 1157|   597k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEC2Ej:
  669|    492|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb0EEC2EPSC_SE_RKNS_14DebugEpochBaseEb:
 1139|   232k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   232k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   232k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 220k, False: 12.8k]
  ------------------
 1143|  12.8k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 12.8k]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|  12.8k|    AdvancePastEmptyBuckets();
 1148|  12.8k|  }
_ZN4llvh16DenseMapIteratorIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EELb1EEC2ILb0EvEERKNS0_IS4_S7_S9_SC_XT_EEE:
 1157|   211k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEED2Ev:
  857|  1.32k|  ~SmallDenseMap() {
  858|  1.32k|    this->destroyAll();
  859|  1.32k|    deallocateBuckets();
  860|  1.32k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEC2Ej:
  837|  1.32k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|  1.32k|    init(NumInitBuckets);
  839|  1.32k|  }
_ZN4llvh13SmallDenseMapIN6hermes2vm6detail10TransitionENS2_7WeakRefINS2_11HiddenClassEEELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4initEj:
  959|  1.32k|  void init(unsigned InitBuckets) {
  960|  1.32k|    Small = true;
  961|  1.32k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 1.32k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|  1.32k|    this->BaseT::initEmpty();
  966|  1.32k|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEC2Ej:
  669|     24|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE4initEj:
  726|     24|  void init(unsigned InitNumEntries) {
  727|     24|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     24|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 24]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     24|    } else {
  731|     24|      NumEntries = 0;
  732|     24|      NumTombstones = 0;
  733|     24|    }
  734|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E31getMinBucketToReserveForEntriesEj:
  360|     24|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     24|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 24, False: 0]
  ------------------
  363|     24|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     24|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE15allocateBucketsEj:
  795|     24|  bool allocateBuckets(unsigned Num) {
  796|     24|    NumBuckets = Num;
  797|     24|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 24, False: 0]
  ------------------
  798|     24|      Buckets = nullptr;
  799|     24|      return false;
  800|     24|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     24|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E13getNumBucketsEv:
  497|     24|  unsigned getNumBuckets() const {
  498|     24|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     24|  }
_ZNK4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEE13getNumBucketsEv:
  791|     24|  unsigned getNumBuckets() const {
  792|     24|    return NumBuckets;
  793|     24|  }
_ZN4llvh8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEED2Ev:
  687|     24|  ~DenseMap() {
  688|     24|    this->destroyAll();
  689|     24|    operator delete(Buckets);
  690|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes2vm9CodeBlockEjNS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_jEEEES6_jS8_SB_E10destroyAllEv:
  334|     24|  void destroyAll() {
  335|     24|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 24, False: 0]
  ------------------
  336|     24|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|  45.8k|  ~DenseMap() {
  688|  45.8k|    this->destroyAll();
  689|  45.8k|    operator delete(Buckets);
  690|  45.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|  45.8k|  void destroyAll() {
  335|  45.8k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 45.8k, False: 0]
  ------------------
  336|  45.8k|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumBucketsEv:
  497|  45.8k|  unsigned getNumBuckets() const {
  498|  45.8k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  45.8k|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumBucketsEv:
  791|  45.8k|  unsigned getNumBuckets() const {
  792|  45.8k|    return NumBuckets;
  793|  45.8k|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEED2Ev:
  857|   366k|  ~SmallDenseMap() {
  858|   366k|    this->destroyAll();
  859|   366k|    deallocateBuckets();
  860|   366k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10destroyAllEv:
  334|   366k|  void destroyAll() {
  335|   366k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 366k]
  ------------------
  336|      0|      return;
  337|       |
  338|   366k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.23M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 5.87M, False: 366k]
  ------------------
  340|  5.87M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 5.87M]
  ------------------
  341|  5.87M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  5.87M|      P->getFirst().~KeyT();
  344|  5.87M|    }
  345|   366k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getNumBucketsEv:
  497|  1.83M|  unsigned getNumBuckets() const {
  498|  1.83M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.83M|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13getNumBucketsEv:
 1093|  1.83M|  unsigned getNumBuckets() const {
 1094|  1.83M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 1.83M, False: 0]
  ------------------
 1095|  1.83M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E11getEmptyKeyEv:
  426|   733k|  static const KeyT getEmptyKey() {
  427|   733k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   733k|                  "Must pass the derived type to this template!");
  429|   733k|    return KeyInfoT::getEmptyKey();
  430|   733k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E15getTombstoneKeyEv:
  432|   366k|  static const KeyT getTombstoneKey() {
  433|   366k|    return KeyInfoT::getTombstoneKey();
  434|   366k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E10getBucketsEv:
  493|  1.46M|  BucketT *getBuckets() {
  494|  1.46M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.46M|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE10getBucketsEv:
 1088|  1.46M|  BucketT *getBuckets() {
 1089|  1.46M|    return const_cast<BucketT *>(
 1090|  1.46M|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|  1.46M|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE10getBucketsEv:
 1084|  1.46M|  const BucketT *getBuckets() const {
 1085|  1.46M|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 1.46M, False: 0]
  ------------------
 1086|  1.46M|  }
_ZNK4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16getInlineBucketsEv:
 1060|  1.46M|  const BucketT *getInlineBuckets() const {
 1061|  1.46M|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|  1.46M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13getBucketsEndEv:
  501|   733k|  BucketT *getBucketsEnd() {
  502|   733k|    return getBuckets() + getNumBuckets();
  503|   733k|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE17deallocateBucketsEv:
 1097|   366k|  void deallocateBuckets() {
 1098|   366k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 366k, False: 0]
  ------------------
 1099|   366k|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEC2Ej:
  837|   366k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|   366k|    init(NumInitBuckets);
  839|   366k|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE4initEj:
  959|   366k|  void init(unsigned InitBuckets) {
  960|   366k|    Small = true;
  961|   366k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 366k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|   366k|    this->BaseT::initEmpty();
  966|   366k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E9initEmptyEv:
  347|   366k|  void initEmpty() {
  348|   366k|    setNumEntries(0);
  349|   366k|    setNumTombstones(0);
  350|       |
  351|   366k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   366k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  6.23M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 5.87M, False: 366k]
  ------------------
  355|  5.87M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   366k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E13setNumEntriesEj:
  461|   366k|  void setNumEntries(unsigned Num) {
  462|   366k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   366k|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE13setNumEntriesEj:
 1046|   366k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|   366k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|   366k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEEEjjS3_S6_E16setNumTombstonesEj:
  477|   366k|  void setNumTombstones(unsigned Num) {
  478|   366k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   366k|  }
_ZN4llvh13SmallDenseMapIjjLj16ENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjjEEE16setNumTombstonesEj:
 1056|   366k|  void setNumTombstones(unsigned Num) {
 1057|   366k|    NumTombstones = Num;
 1058|   366k|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|  11.4k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|  45.8k|  void init(unsigned InitNumEntries) {
  727|  45.8k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|  45.8k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 45.8k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|  45.8k|    } else {
  731|  45.8k|      NumEntries = 0;
  732|  45.8k|      NumTombstones = 0;
  733|  45.8k|    }
  734|  45.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|  45.8k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|  45.8k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 45.8k, False: 0]
  ------------------
  363|  45.8k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|  45.8k|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE15allocateBucketsEj:
  795|  45.8k|  bool allocateBuckets(unsigned Num) {
  796|  45.8k|    NumBuckets = Num;
  797|  45.8k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 45.8k, False: 0]
  ------------------
  798|  45.8k|      Buckets = nullptr;
  799|  45.8k|      return false;
  800|  45.8k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|  45.8k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E13getNumEntriesEv:
  457|  22.9k|  unsigned getNumEntries() const {
  458|  22.9k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  22.9k|  }
_ZNK4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE13getNumEntriesEv:
  771|  22.9k|  unsigned getNumEntries() const {
  772|  22.9k|    return NumEntries;
  773|  22.9k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E4sizeEv:
  102|  22.9k|  unsigned size() const { return getNumEntries(); }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes4inst4InstENS1_2vm8Debugger18BreakpointLocationENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIN6hermes2vm8SymbolIDENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm13RuntimeModuleENSt3__16vectorIbNS5_9allocatorIbEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S9_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEC2Ej:
  669|    928|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE4initEj:
  726|    928|  void init(unsigned InitNumEntries) {
  727|    928|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    928|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 928]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    928|    } else {
  731|    928|      NumEntries = 0;
  732|    928|      NumTombstones = 0;
  733|    928|    }
  734|    928|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|    928|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    928|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 928, False: 0]
  ------------------
  363|    928|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    928|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE15allocateBucketsEj:
  795|    939|  bool allocateBuckets(unsigned Num) {
  796|    939|    NumBuckets = Num;
  797|    939|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 928, False: 11]
  ------------------
  798|    928|      Buckets = nullptr;
  799|    928|      return false;
  800|    928|    }
  801|       |
  802|     11|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     11|    return true;
  804|    939|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E9initEmptyEv:
  347|     11|  void initEmpty() {
  348|     11|    setNumEntries(0);
  349|     11|    setNumTombstones(0);
  350|       |
  351|     11|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     11|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    907|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 896, False: 11]
  ------------------
  355|    896|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     11|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13setNumEntriesEj:
  461|    384|  void setNumEntries(unsigned Num) {
  462|    384|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    384|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13setNumEntriesEj:
  775|    384|  void setNumEntries(unsigned Num) {
  776|    384|    NumEntries = Num;
  777|    384|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E16setNumTombstonesEj:
  477|     11|  void setNumTombstones(unsigned Num) {
  478|     11|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     11|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE16setNumTombstonesEj:
  783|     11|  void setNumTombstones(unsigned Num) {
  784|     11|    NumTombstones = Num;
  785|     11|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumBucketsEv:
  497|  54.8k|  unsigned getNumBuckets() const {
  498|  54.8k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  54.8k|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumBucketsEv:
  791|  54.8k|  unsigned getNumBuckets() const {
  792|  54.8k|    return NumBuckets;
  793|  54.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E11getEmptyKeyEv:
  426|  1.72k|  static const KeyT getEmptyKey() {
  427|  1.72k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.72k|                  "Must pass the derived type to this template!");
  429|  1.72k|    return KeyInfoT::getEmptyKey();
  430|  1.72k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10getBucketsEv:
  493|  48.4k|  BucketT *getBuckets() {
  494|  48.4k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  48.4k|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE10getBucketsEv:
  787|  53.6k|  BucketT *getBuckets() const {
  788|  53.6k|    return Buckets;
  789|  53.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getBucketsEndEv:
  501|  48.3k|  BucketT *getBucketsEnd() {
  502|  48.3k|    return getBuckets() + getNumBuckets();
  503|  48.3k|  }
_ZN4llvh6detail12DenseMapPairIjN6hermes2vm8WeakRootINS3_11HiddenClassEEEE8getFirstEv:
   47|  3.94k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEEC2Ej:
  669|    928|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEE4initEj:
  726|    928|  void init(unsigned InitNumEntries) {
  727|    928|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    928|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 928]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    928|    } else {
  731|    928|      NumEntries = 0;
  732|    928|      NumTombstones = 0;
  733|    928|    }
  734|    928|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|    928|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    928|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 928, False: 0]
  ------------------
  363|    928|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    928|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEED2Ev:
  687|    928|  ~DenseMap() {
  688|    928|    this->destroyAll();
  689|    928|    operator delete(Buckets);
  690|    928|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10destroyAllEv:
  334|    928|  void destroyAll() {
  335|    928|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 920, False: 8]
  ------------------
  336|    920|      return;
  337|       |
  338|      8|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    712|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 704, False: 8]
  ------------------
  340|    704|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 232, False: 472]
  ------------------
  341|    704|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 232, False: 0]
  ------------------
  342|    232|        P->getSecond().~ValueT();
  343|    704|      P->getFirst().~KeyT();
  344|    704|    }
  345|      8|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E15getTombstoneKeyEv:
  432|  1.48k|  static const KeyT getTombstoneKey() {
  433|  1.48k|    return KeyInfoT::getTombstoneKey();
  434|  1.48k|  }
_ZN4llvh6detail12DenseMapPairIjN6hermes2vm8WeakRootINS3_11HiddenClassEEEE9getSecondEv:
   49|    887|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EEED2Ev:
  687|    928|  ~DenseMap() {
  688|    928|    this->destroyAll();
  689|    928|    operator delete(Buckets);
  690|    928|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E10destroyAllEv:
  334|    928|  void destroyAll() {
  335|    928|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 916, False: 12]
  ------------------
  336|    916|      return;
  337|       |
  338|     12|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    780|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 768, False: 12]
  ------------------
  340|    768|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 69, False: 699]
  ------------------
  341|    768|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 69, False: 0]
  ------------------
  342|     69|        P->getSecond().~ValueT();
  343|    768|      P->getFirst().~KeyT();
  344|    768|    }
  345|     12|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5beginEv:
   76|  17.0k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  17.0k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 15.8k, False: 1.18k]
  ------------------
   80|  15.8k|      return end();
   81|  1.18k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 1.18k]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|  1.18k|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|  1.18k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E5emptyEv:
   99|  17.0k|  LLVM_NODISCARD bool empty() const {
  100|  17.0k|    return getNumEntries() == 0;
  101|  17.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|  34.0k|                        bool NoAdvance=false) {
  440|  34.0k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 34.0k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  34.0k|    return iterator(P, E, Epoch, NoAdvance);
  445|  34.0k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1139|  34.0k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  34.0k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  34.0k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 32.9k, False: 1.18k]
  ------------------
 1143|  1.18k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 1.18k]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|  1.18k|    AdvancePastEmptyBuckets();
 1148|  1.18k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|  13.5k|  void AdvancePastEmptyBuckets() {
 1205|  13.5k|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|  13.5k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|  76.8k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 75.7k, False: 1.18k]
  |  Branch (1209:27): [True: 63.3k, False: 12.3k]
  ------------------
 1210|  75.7k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 12.3k]
  ------------------
 1211|  63.3k|      ++Ptr;
 1212|  13.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEEEjS5_S7_SA_E3endEv:
   85|  32.9k|  inline iterator end() {
   86|  32.9k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  32.9k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb1EEC2ILb0EvEERKNS0_IjS4_S6_S9_XT_EEE:
 1157|  29.3k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEneERKNS0_IjS4_S6_S9_Lb1EEE:
 1179|  29.3k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  29.3k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  29.3k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  29.3k|  }
_ZN4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEppEv:
 1187|  12.3k|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|  12.3k|    assert(isHandleInSync() && "invalid iterator access!");
 1189|  12.3k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 12.3k]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|  12.3k|    ++Ptr;
 1195|  12.3k|    AdvancePastEmptyBuckets();
 1196|  12.3k|    return *this;
 1197|  12.3k|  }
_ZNK4llvh16DenseMapIteratorIjPN6hermes2vm8JSObjectENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS4_EELb0EEdeEv:
 1159|  12.3k|  reference operator*() const {
 1160|  12.3k|    assert(isHandleInSync() && "invalid iterator access!");
 1161|  12.3k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1161:9): [True: 0, False: 12.3k]
  ------------------
 1162|      0|      return Ptr[-1];
 1163|  12.3k|    return *Ptr;
 1164|  12.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E5beginEv:
   76|  12.0k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  12.0k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 12.0k, False: 0]
  ------------------
   80|  12.0k|      return end();
   81|      0|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 0]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|      0|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E5emptyEv:
   99|  12.0k|  LLVM_NODISCARD bool empty() const {
  100|  12.0k|    return getNumEntries() == 0;
  101|  12.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getNumEntriesEv:
  457|  12.6k|  unsigned getNumEntries() const {
  458|  12.6k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  12.6k|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE13getNumEntriesEv:
  771|  12.6k|  unsigned getNumEntries() const {
  772|  12.6k|    return NumEntries;
  773|  12.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  24.1k|                        bool NoAdvance=false) {
  440|  24.1k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 24.1k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  24.1k|    return iterator(P, E, Epoch, NoAdvance);
  445|  24.1k|  }
_ZN4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1139|  24.1k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  24.1k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  24.1k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 24.1k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E3endEv:
   85|  24.1k|  inline iterator end() {
   86|  24.1k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  24.1k|  }
_ZN4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb1EEC2ILb0EvEERKNS0_IjS5_S7_SA_XT_EEE:
 1157|  12.0k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb0EEneERKNS0_IjS5_S7_SA_Lb1EEE:
 1179|  12.0k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  12.0k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  12.0k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  12.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E4findERKj:
  160|  1.10k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|  1.10k|    const BucketT *TheBucket;
  162|  1.10k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 645, False: 464]
  ------------------
  163|    645|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|    464|    return end();
  165|  1.10k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E15LookupBucketForIjEEbRKT_RPKSB_:
  582|  1.49k|                       const BucketT *&FoundBucket) const {
  583|  1.49k|    const BucketT *BucketsPtr = getBuckets();
  584|  1.49k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.49k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 24, False: 1.46k]
  ------------------
  587|     24|      FoundBucket = nullptr;
  588|     24|      return false;
  589|     24|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.46k|    const BucketT *FoundTombstone = nullptr;
  593|  1.46k|    const KeyT EmptyKey = getEmptyKey();
  594|  1.46k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.46k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.46k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.46k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.46k|    unsigned ProbeAmt = 1;
  601|  41.4k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  41.4k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  41.4k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  41.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 645, False: 40.8k]
  |  |  ------------------
  ------------------
  605|    645|        FoundBucket = ThisBucket;
  606|    645|        return true;
  607|    645|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  40.8k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  40.8k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 824, False: 40.0k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    824|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 824]
  ------------------
  615|    824|        return false;
  616|    824|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  40.0k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 40.0k]
  ------------------
  621|  40.0k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  40.0k|      BucketNo += ProbeAmt++;
  627|  40.0k|      BucketNo &= (NumBuckets-1);
  628|  40.0k|    }
  629|  1.46k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E10getBucketsEv:
  489|  5.28k|  const BucketT *getBuckets() const {
  490|  5.28k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  5.28k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E12getHashValueERKj:
  417|  1.46k|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.46k|    return KeyInfoT::getHashValue(Val);
  419|  1.46k|  }
_ZNK4llvh6detail12DenseMapPairIjN6hermes2vm8WeakRootINS3_11HiddenClassEEEE8getFirstEv:
   48|   122k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E17makeConstIteratorEPKSB_SF_RKNS_14DebugEpochBaseEb:
  449|  2.21k|                                   const bool NoAdvance=false) const {
  450|  2.21k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 2.21k]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|  2.21k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|  2.21k|  }
_ZN4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb1EEC2EPKSA_SD_RKNS_14DebugEpochBaseEb:
 1139|  2.21k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  2.21k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  2.21k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 2.21k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E13getBucketsEndEv:
  505|  3.79k|  const BucketT *getBucketsEnd() const {
  506|  3.79k|    return getBuckets() + getNumBuckets();
  507|  3.79k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E3endEv:
   95|  1.57k|  inline const_iterator end() const {
   96|  1.57k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|  1.57k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb1EEneERKSB_:
 1179|  1.10k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  1.10k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  1.10k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  1.10k|  }
_ZNK4llvh16DenseMapIteratorIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EELb1EEptEv:
 1165|    645|  pointer operator->() const {
 1166|    645|    assert(isHandleInSync() && "invalid iterator access!");
 1167|    645|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 645]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|    645|    return Ptr;
 1170|    645|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_EixEOj:
  315|    232|  ValueT &operator[](KeyT &&Key) {
  316|    232|    return FindAndConstruct(std::move(Key)).second;
  317|    232|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E16FindAndConstructEOj:
  307|    232|  value_type& FindAndConstruct(KeyT &&Key) {
  308|    232|    BucketT *TheBucket;
  309|    232|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 232]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|    232|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|    232|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E15LookupBucketForIjEEbRKT_RPSB_:
  632|    384|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    384|    const BucketT *ConstFoundBucket;
  634|    384|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    384|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    384|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    384|    return Result;
  638|    384|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E16InsertIntoBucketIjJEEEPSB_SF_OT_DpOT0_:
  519|    232|                            ValueArgs &&... Values) {
  520|    232|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    232|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    232|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    232|    return TheBucket;
  525|    232|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E20InsertIntoBucketImplIjEEPSB_RKjRKT_SF_:
  539|    232|                                BucketT *TheBucket) {
  540|    232|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    232|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    232|    unsigned NumBuckets = getNumBuckets();
  553|    232|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    232|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 11, False: 221]
  |  |  ------------------
  ------------------
  554|     11|      this->grow(NumBuckets * 2);
  555|     11|      LookupBucketFor(Lookup, TheBucket);
  556|     11|      NumBuckets = getNumBuckets();
  557|    221|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    221|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 221]
  |  |  ------------------
  ------------------
  558|    221|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    232|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    232|    const KeyT EmptyKey = getEmptyKey();
  570|    232|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 232]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    232|    return TheBucket;
  574|    232|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E4growEj:
  509|     11|  void grow(unsigned AtLeast) {
  510|     11|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     11|  }
_ZN4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE4growEj:
  736|     11|  void grow(unsigned AtLeast) {
  737|     11|    unsigned OldNumBuckets = NumBuckets;
  738|     11|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     11|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     11|    assert(Buckets);
  742|     11|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 8, False: 3]
  ------------------
  743|      8|      this->BaseT::initEmpty();
  744|      8|      return;
  745|      8|    }
  746|       |
  747|      3|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      3|    operator delete(OldBuckets);
  751|      3|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E18moveFromOldBucketsEPSB_SE_:
  369|      3|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|      3|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|      3|    const KeyT EmptyKey = getEmptyKey();
  374|      3|    const KeyT TombstoneKey = getTombstoneKey();
  375|    195|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 192, False: 3]
  ------------------
  376|    192|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 141, False: 51]
  ------------------
  377|    192|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 141, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|    141|        BucketT *DestBucket;
  380|    141|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|    141|        (void)FoundVal; // silence warning.
  382|    141|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|    141|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|    141|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|    141|        B->getSecond().~ValueT();
  389|    141|      }
  390|      0|      B->getFirst().~KeyT();
  391|    192|    }
  392|      3|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E16getNumTombstonesEv:
  473|    221|  unsigned getNumTombstones() const {
  474|    221|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    221|  }
_ZNK4llvh8DenseMapIjN6hermes2vm8WeakRootINS2_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS5_EEE16getNumTombstonesEv:
  779|    221|  unsigned getNumTombstones() const {
  780|    221|    return NumTombstones;
  781|    221|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjN6hermes2vm8WeakRootINS3_11HiddenClassEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS6_EEEEjS6_S8_SB_E19incrementNumEntriesEv:
  465|    373|  void incrementNumEntries() {
  466|    373|    setNumEntries(getNumEntries() + 1);
  467|    373|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5beginEv:
   76|  1.18k|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|  1.18k|    if (empty())
  ------------------
  |  Branch (79:9): [True: 1.18k, False: 0]
  ------------------
   80|  1.18k|      return end();
   81|      0|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 0]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|      0|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5emptyEv:
   99|  1.18k|  LLVM_NODISCARD bool empty() const {
  100|  1.18k|    return getNumEntries() == 0;
  101|  1.18k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|  1.18k|  unsigned getNumEntries() const {
  458|  1.18k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.18k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
  771|  1.18k|  unsigned getNumEntries() const {
  772|  1.18k|    return NumEntries;
  773|  1.18k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E3endEv:
   85|  2.37k|  inline iterator end() {
   86|  2.37k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  2.37k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|  2.37k|                        bool NoAdvance=false) {
  440|  2.37k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 2.37k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  2.37k|    return iterator(P, E, Epoch, NoAdvance);
  445|  2.37k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1139|  2.37k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  2.37k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  2.37k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 2.37k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb1EEC2ILb0EvEERKNS0_IS4_S6_S8_SA_XT_EEE:
 1157|  1.18k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm6DomainENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEneERKNS0_IS4_S6_S8_SA_Lb1EEE:
 1179|  1.18k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  1.18k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  1.18k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  1.18k|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4initEj:
  726|     99|  void init(unsigned InitNumEntries) {
  727|     99|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     99|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 99]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     99|    } else {
  731|     99|      NumEntries = 0;
  732|     99|      NumTombstones = 0;
  733|     99|    }
  734|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E31getMinBucketToReserveForEntriesEj:
  360|     99|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     99|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 99, False: 0]
  ------------------
  363|     99|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE15allocateBucketsEj:
  795|    198|  bool allocateBuckets(unsigned Num) {
  796|    198|    NumBuckets = Num;
  797|    198|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 99, False: 99]
  ------------------
  798|     99|      Buckets = nullptr;
  799|     99|      return false;
  800|     99|    }
  801|       |
  802|     99|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     99|    return true;
  804|    198|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E9initEmptyEv:
  347|     99|  void initEmpty() {
  348|     99|    setNumEntries(0);
  349|     99|    setNumTombstones(0);
  350|       |
  351|     99|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     99|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  6.43k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 6.33k, False: 99]
  ------------------
  355|  6.33k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13setNumEntriesEj:
  461|    297|  void setNumEntries(unsigned Num) {
  462|    297|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    297|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13setNumEntriesEj:
  775|    297|  void setNumEntries(unsigned Num) {
  776|    297|    NumEntries = Num;
  777|    297|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16setNumTombstonesEj:
  477|    198|  void setNumTombstones(unsigned Num) {
  478|    198|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    198|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE16setNumTombstonesEj:
  783|    198|  void setNumTombstones(unsigned Num) {
  784|    198|    NumTombstones = Num;
  785|    198|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumBucketsEv:
  497|  1.28k|  unsigned getNumBuckets() const {
  498|  1.28k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.28k|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumBucketsEv:
  791|  1.28k|  unsigned getNumBuckets() const {
  792|  1.28k|    return NumBuckets;
  793|  1.28k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E11getEmptyKeyEv:
  426|    495|  static const KeyT getEmptyKey() {
  427|    495|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    495|                  "Must pass the derived type to this template!");
  429|    495|    return KeyInfoT::getEmptyKey();
  430|    495|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  493|    792|  BucketT *getBuckets() {
  494|    792|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    792|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE10getBucketsEv:
  787|  1.08k|  BucketT *getBuckets() const {
  788|  1.08k|    return Buckets;
  789|  1.08k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getBucketsEndEv:
  501|    495|  BucketT *getBucketsEnd() {
  502|    495|    return getBuckets() + getNumBuckets();
  503|    495|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE8getFirstEv:
   47|  25.8k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10destroyAllEv:
  334|     99|  void destroyAll() {
  335|     99|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 99]
  ------------------
  336|      0|      return;
  337|       |
  338|     99|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  6.43k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 6.33k, False: 99]
  ------------------
  340|  6.33k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 99, False: 6.23k]
  ------------------
  341|  6.33k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 99]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  6.33k|      P->getFirst().~KeyT();
  344|  6.33k|    }
  345|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15getTombstoneKeyEv:
  432|    396|  static const KeyT getTombstoneKey() {
  433|    396|    return KeyInfoT::getTombstoneKey();
  434|    396|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE9getSecondEv:
   49|    198|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_EixEOS5_:
  315|     99|  ValueT &operator[](KeyT &&Key) {
  316|     99|    return FindAndConstruct(std::move(Key)).second;
  317|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16FindAndConstructEOS5_:
  307|     99|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     99|    BucketT *TheBucket;
  309|     99|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 99]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|     99|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPSJ_:
  632|    297|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    297|    const BucketT *ConstFoundBucket;
  634|    297|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    297|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    297|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    297|    return Result;
  638|    297|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E15LookupBucketForIS5_EEbRKT_RPKSJ_:
  582|    297|                       const BucketT *&FoundBucket) const {
  583|    297|    const BucketT *BucketsPtr = getBuckets();
  584|    297|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    297|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 99, False: 198]
  ------------------
  587|     99|      FoundBucket = nullptr;
  588|     99|      return false;
  589|     99|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    198|    const BucketT *FoundTombstone = nullptr;
  593|    198|    const KeyT EmptyKey = getEmptyKey();
  594|    198|    const KeyT TombstoneKey = getTombstoneKey();
  595|    198|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    198|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    198|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    198|    unsigned ProbeAmt = 1;
  601|    198|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    198|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    198|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    198|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 99]
  |  |  ------------------
  ------------------
  605|     99|        FoundBucket = ThisBucket;
  606|     99|        return true;
  607|     99|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     99|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     99|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     99|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 99]
  ------------------
  615|     99|        return false;
  616|     99|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|    198|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E10getBucketsEv:
  489|    297|  const BucketT *getBuckets() const {
  490|    297|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|    297|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12getHashValueERKS5_:
  417|    198|  static unsigned getHashValue(const KeyT &Val) {
  418|    198|    return KeyInfoT::getHashValue(Val);
  419|    198|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEEE8getFirstEv:
   48|    297|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16InsertIntoBucketIS5_JEEEPSJ_SN_OT_DpOT0_:
  519|     99|                            ValueArgs &&... Values) {
  520|     99|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     99|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     99|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     99|    return TheBucket;
  525|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E20InsertIntoBucketImplIS5_EEPSJ_RKS5_RKT_SN_:
  539|     99|                                BucketT *TheBucket) {
  540|     99|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     99|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     99|    unsigned NumBuckets = getNumBuckets();
  553|     99|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  554|     99|      this->grow(NumBuckets * 2);
  555|     99|      LookupBucketFor(Lookup, TheBucket);
  556|     99|      NumBuckets = getNumBuckets();
  557|     99|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  558|      0|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     99|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     99|    const KeyT EmptyKey = getEmptyKey();
  570|     99|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 99]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     99|    return TheBucket;
  574|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E13getNumEntriesEv:
  457|    396|  unsigned getNumEntries() const {
  458|    396|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    396|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE13getNumEntriesEv:
  771|    396|  unsigned getNumEntries() const {
  772|    396|    return NumEntries;
  773|    396|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E4growEj:
  509|     99|  void grow(unsigned AtLeast) {
  510|     99|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     99|  }
_ZN4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE4growEj:
  736|     99|  void grow(unsigned AtLeast) {
  737|     99|    unsigned OldNumBuckets = NumBuckets;
  738|     99|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     99|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     99|    assert(Buckets);
  742|     99|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 99, False: 0]
  ------------------
  743|     99|      this->BaseT::initEmpty();
  744|     99|      return;
  745|     99|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E16getNumTombstonesEv:
  473|     99|  unsigned getNumTombstones() const {
  474|     99|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     99|  }
_ZNK4llvh8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EEE16getNumTombstonesEv:
  779|     99|  unsigned getNumTombstones() const {
  780|     99|    return NumTombstones;
  781|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E19incrementNumEntriesEv:
  465|     99|  void incrementNumEntries() {
  466|     99|    setNumEntries(getNumEntries() + 1);
  467|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5eraseERKS5_:
  276|     99|  bool erase(const KeyT &Val) {
  277|     99|    BucketT *TheBucket;
  278|     99|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 99]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|     99|    TheBucket->getSecond().~ValueT();
  282|     99|    TheBucket->getFirst() = getTombstoneKey();
  283|     99|    decrementNumEntries();
  284|     99|    incrementNumTombstones();
  285|     99|    return true;
  286|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E19decrementNumEntriesEv:
  469|     99|  void decrementNumEntries() {
  470|     99|    setNumEntries(getNumEntries() - 1);
  471|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E22incrementNumTombstonesEv:
  481|     99|  void incrementNumTombstones() {
  482|     99|    setNumTombstones(getNumTombstones() + 1);
  483|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5beginEv:
   76|     99|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|     99|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 99]
  ------------------
   80|      0|      return end();
   81|     99|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 99]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|     99|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|     99|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E5emptyEv:
   99|     99|  LLVM_NODISCARD bool empty() const {
  100|     99|    return getNumEntries() == 0;
  101|     99|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E12makeIteratorEPSJ_SM_RNS_14DebugEpochBaseEb:
  439|    198|                        bool NoAdvance=false) {
  440|    198|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 198]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|    198|    return iterator(P, E, Epoch, NoAdvance);
  445|    198|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEC2EPSI_SK_RKNS_14DebugEpochBaseEb:
 1139|    198|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    198|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    198|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 99, False: 99]
  ------------------
 1143|     99|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 99]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|     99|    AdvancePastEmptyBuckets();
 1148|     99|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|    198|  void AdvancePastEmptyBuckets() {
 1205|    198|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|    198|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|  6.43k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 6.33k, False: 99]
  |  Branch (1209:27): [True: 6.23k, False: 99]
  ------------------
 1210|  6.33k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 99]
  ------------------
 1211|  6.23k|      ++Ptr;
 1212|    198|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS7_12steady_clockENS7_8durationIxNS6_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_SE_EEEES5_SE_SG_SJ_E3endEv:
   85|     99|  inline iterator end() {
   86|     99|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     99|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb1EEC2ILb0EvEERKNS0_IS4_SD_SF_SI_XT_EEE:
 1157|    198|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEneERKNS0_IS4_SD_SF_SI_Lb1EEE:
 1179|    198|  bool operator!=(const ConstIterator &RHS) const {
 1180|    198|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|    198|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|    198|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEppEi:
 1198|     99|  DenseMapIterator operator++(int) {  // Postincrement
 1199|     99|    assert(isHandleInSync() && "invalid iterator access!");
 1200|      0|    DenseMapIterator tmp = *this; ++*this; return tmp;
 1201|     99|  }
_ZN4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEppEv:
 1187|     99|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|     99|    assert(isHandleInSync() && "invalid iterator access!");
 1189|     99|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 99]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|     99|    ++Ptr;
 1195|     99|    AdvancePastEmptyBuckets();
 1196|     99|    return *this;
 1197|     99|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes2vm7RuntimeENSt3__16chrono10time_pointINS6_12steady_clockENS6_8durationIxNS5_5ratioILl1ELl1000000000EEEEEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SD_EELb0EEptEv:
 1165|    198|  pointer operator->() const {
 1166|    198|    assert(isHandleInSync() && "invalid iterator access!");
 1167|    198|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 198]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|    198|    return Ptr;
 1170|    198|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENSt3__16vectorIPNS2_6detail10WeakRefKeyENS7_9allocatorISB_EEEENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_SE_EEEC2Ej:
  669|    141|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENSt3__16vectorIPNS2_6detail10WeakRefKeyENS7_9allocatorISB_EEEENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_SE_EEE4initEj:
  726|    141|  void init(unsigned InitNumEntries) {
  727|    141|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    141|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 141]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    141|    } else {
  731|    141|      NumEntries = 0;
  732|    141|      NumTombstones = 0;
  733|    141|    }
  734|    141|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENSt3__16vectorIPNS3_6detail10WeakRefKeyENS8_9allocatorISC_EEEENS_12DenseMapInfoIS7_EENS_6detail12DenseMapPairIS7_SF_EEEES7_SF_SH_SK_E31getMinBucketToReserveForEntriesEj:
  360|    141|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    141|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 141, False: 0]
  ------------------
  363|    141|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    141|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENSt3__16vectorIPNS2_6detail10WeakRefKeyENS7_9allocatorISB_EEEENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_SE_EEE15allocateBucketsEj:
  795|    141|  bool allocateBuckets(unsigned Num) {
  796|    141|    NumBuckets = Num;
  797|    141|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 141, False: 0]
  ------------------
  798|    141|      Buckets = nullptr;
  799|    141|      return false;
  800|    141|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    141|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENSt3__16vectorIPNS3_6detail10WeakRefKeyENS8_9allocatorISC_EEEENS_12DenseMapInfoIS7_EENS_6detail12DenseMapPairIS7_SF_EEEES7_SF_SH_SK_E13getNumBucketsEv:
  497|    141|  unsigned getNumBuckets() const {
  498|    141|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    141|  }
_ZNK4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENSt3__16vectorIPNS2_6detail10WeakRefKeyENS7_9allocatorISB_EEEENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_SE_EEE13getNumBucketsEv:
  791|    141|  unsigned getNumBuckets() const {
  792|    141|    return NumBuckets;
  793|    141|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2Ej:
  669|    141|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4initEj:
  726|    141|  void init(unsigned InitNumEntries) {
  727|    141|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    141|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 141]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    141|    } else {
  731|    141|      NumEntries = 0;
  732|    141|      NumTombstones = 0;
  733|    141|    }
  734|    141|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E31getMinBucketToReserveForEntriesEj:
  360|    141|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    141|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 141, False: 0]
  ------------------
  363|    141|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    141|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE15allocateBucketsEj:
  795|    141|  bool allocateBuckets(unsigned Num) {
  796|    141|    NumBuckets = Num;
  797|    141|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 141, False: 0]
  ------------------
  798|    141|      Buckets = nullptr;
  799|    141|      return false;
  800|    141|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    141|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E13getNumBucketsEv:
  497|    141|  unsigned getNumBuckets() const {
  498|    141|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    141|  }
_ZNK4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE13getNumBucketsEv:
  791|    141|  unsigned getNumBuckets() const {
  792|    141|    return NumBuckets;
  793|    141|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEED2Ev:
  687|    141|  ~DenseMap() {
  688|    141|    this->destroyAll();
  689|    141|    operator delete(Buckets);
  690|    141|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E10destroyAllEv:
  334|    141|  void destroyAll() {
  335|    141|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 141, False: 0]
  ------------------
  336|    141|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIPN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENSt3__16vectorIPNS2_6detail10WeakRefKeyENS7_9allocatorISB_EEEENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_SE_EEED2Ev:
  687|    141|  ~DenseMap() {
  688|    141|    this->destroyAll();
  689|    141|    operator delete(Buckets);
  690|    141|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENSt3__16vectorIPNS3_6detail10WeakRefKeyENS8_9allocatorISC_EEEENS_12DenseMapInfoIS7_EENS_6detail12DenseMapPairIS7_SF_EEEES7_SF_SH_SK_E10destroyAllEv:
  334|    141|  void destroyAll() {
  335|    141|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 141, False: 0]
  ------------------
  336|    141|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 104]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|    104|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    104|    return true;
  804|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|    104|  void initEmpty() {
  348|    104|    setNumEntries(0);
  349|    104|    setNumTombstones(0);
  350|       |
  351|    104|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    104|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   465k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 465k, False: 104]
  ------------------
  355|   465k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    104|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|   287k|  void setNumEntries(unsigned Num) {
  462|   287k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   287k|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|   287k|  void setNumEntries(unsigned Num) {
  776|   287k|    NumEntries = Num;
  777|   287k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|    104|  void setNumTombstones(unsigned Num) {
  478|    104|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    104|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|    104|  void setNumTombstones(unsigned Num) {
  784|    104|    NumTombstones = Num;
  785|    104|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|  1.89M|  unsigned getNumBuckets() const {
  498|  1.89M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.89M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|  1.89M|  unsigned getNumBuckets() const {
  792|  1.89M|    return NumBuckets;
  793|  1.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|   746k|  static const KeyT getEmptyKey() {
  427|   746k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   746k|                  "Must pass the derived type to this template!");
  429|   746k|    return KeyInfoT::getEmptyKey();
  430|   746k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|  1.14M|  BucketT *getBuckets() {
  494|  1.14M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  1.14M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|  1.77M|  BucketT *getBuckets() const {
  788|  1.77M|    return Buckets;
  789|  1.77M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|  1.14M|  BucketT *getBucketsEnd() {
  502|  1.14M|    return getBuckets() + getNumBuckets();
  503|  1.14M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE8getFirstEv:
   47|  2.43M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE15allocateBucketsEj:
  795|    160|  bool allocateBuckets(unsigned Num) {
  796|    160|    NumBuckets = Num;
  797|    160|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 104]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|    104|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    104|    return true;
  804|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E9initEmptyEv:
  347|    104|  void initEmpty() {
  348|    104|    setNumEntries(0);
  349|    104|    setNumTombstones(0);
  350|       |
  351|    104|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    104|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   465k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 465k, False: 104]
  ------------------
  355|   465k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    104|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13setNumEntriesEj:
  461|   287k|  void setNumEntries(unsigned Num) {
  462|   287k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   287k|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13setNumEntriesEj:
  775|   287k|  void setNumEntries(unsigned Num) {
  776|   287k|    NumEntries = Num;
  777|   287k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16setNumTombstonesEj:
  477|    104|  void setNumTombstones(unsigned Num) {
  478|    104|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    104|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16setNumTombstonesEj:
  783|    104|  void setNumTombstones(unsigned Num) {
  784|    104|    NumTombstones = Num;
  785|    104|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumBucketsEv:
  497|  1.09M|  unsigned getNumBuckets() const {
  498|  1.09M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.09M|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumBucketsEv:
  791|  1.09M|  unsigned getNumBuckets() const {
  792|  1.09M|    return NumBuckets;
  793|  1.09M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E11getEmptyKeyEv:
  426|   632k|  static const KeyT getEmptyKey() {
  427|   632k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   632k|                  "Must pass the derived type to this template!");
  429|   632k|    return KeyInfoT::getEmptyKey();
  430|   632k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  493|   459k|  BucketT *getBuckets() {
  494|   459k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   459k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE10getBucketsEv:
  787|   977k|  BucketT *getBuckets() const {
  788|   977k|    return Buckets;
  789|   977k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  501|   459k|  BucketT *getBucketsEnd() {
  502|   459k|    return getBuckets() + getNumBuckets();
  503|   459k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE8getFirstEv:
   47|  2.43M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEC2Ej:
  669|    112|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4initEj:
  726|    168|  void init(unsigned InitNumEntries) {
  727|    168|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    168|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 168]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    168|    } else {
  731|    168|      NumEntries = 0;
  732|    168|      NumTombstones = 0;
  733|    168|    }
  734|    168|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|    168|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    168|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 168, False: 0]
  ------------------
  363|    168|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    168|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE15allocateBucketsEj:
  795|    253|  bool allocateBuckets(unsigned Num) {
  796|    253|    NumBuckets = Num;
  797|    253|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 168, False: 85]
  ------------------
  798|    168|      Buckets = nullptr;
  799|    168|      return false;
  800|    168|    }
  801|       |
  802|     85|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     85|    return true;
  804|    253|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E9initEmptyEv:
  347|     85|  void initEmpty() {
  348|     85|    setNumEntries(0);
  349|     85|    setNumTombstones(0);
  350|       |
  351|     85|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     85|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   125k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 125k, False: 85]
  ------------------
  355|   125k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     85|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13setNumEntriesEj:
  461|  81.0k|  void setNumEntries(unsigned Num) {
  462|  81.0k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  81.0k|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13setNumEntriesEj:
  775|  81.0k|  void setNumEntries(unsigned Num) {
  776|  81.0k|    NumEntries = Num;
  777|  81.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16setNumTombstonesEj:
  477|     85|  void setNumTombstones(unsigned Num) {
  478|     85|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     85|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16setNumTombstonesEj:
  783|     85|  void setNumTombstones(unsigned Num) {
  784|     85|    NumTombstones = Num;
  785|     85|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumBucketsEv:
  497|   192k|  unsigned getNumBuckets() const {
  498|   192k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   192k|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumBucketsEv:
  791|   192k|  unsigned getNumBuckets() const {
  792|   192k|    return NumBuckets;
  793|   192k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E11getEmptyKeyEv:
  426|   191k|  static const KeyT getEmptyKey() {
  427|   191k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   191k|                  "Must pass the derived type to this template!");
  429|   191k|    return KeyInfoT::getEmptyKey();
  430|   191k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  493|    212|  BucketT *getBuckets() {
  494|    212|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    212|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE10getBucketsEv:
  787|   157k|  BucketT *getBuckets() const {
  788|   157k|    return Buckets;
  789|   157k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getBucketsEndEv:
  501|    106|  BucketT *getBucketsEnd() {
  502|    106|    return getBuckets() + getNumBuckets();
  503|    106|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE8getFirstEv:
   47|   666k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|     56|  bool allocateBuckets(unsigned Num) {
  796|     56|    NumBuckets = Num;
  797|     56|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 0]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|     56|  unsigned getNumBuckets() const {
  498|     56|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     56|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|     56|  unsigned getNumBuckets() const {
  792|     56|    return NumBuckets;
  793|     56|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEC2EOS7_:
  676|    112|  DenseMap(DenseMap &&other) : BaseT() {
  677|    112|    init(0);
  678|    112|    swap(other);
  679|    112|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEE4swapERS7_:
  692|    168|  void swap(DenseMap& RHS) {
  693|    168|    this->incrementEpoch();
  694|    168|    RHS.incrementEpoch();
  695|    168|    std::swap(Buckets, RHS.Buckets);
  696|    168|    std::swap(NumEntries, RHS.NumEntries);
  697|    168|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    168|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    168|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5countES5_:
  149|  55.3k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  55.3k|    const BucketT *TheBucket;
  151|  55.3k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 21.0k, False: 34.3k]
  ------------------
  152|  55.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPKSD_:
  582|   157k|                       const BucketT *&FoundBucket) const {
  583|   157k|    const BucketT *BucketsPtr = getBuckets();
  584|   157k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   157k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 42, False: 157k]
  ------------------
  587|     42|      FoundBucket = nullptr;
  588|     42|      return false;
  589|     42|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   157k|    const BucketT *FoundTombstone = nullptr;
  593|   157k|    const KeyT EmptyKey = getEmptyKey();
  594|   157k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   157k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   157k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   157k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   157k|    unsigned ProbeAmt = 1;
  601|   282k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   282k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   282k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   282k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 42.0k, False: 240k]
  |  |  ------------------
  ------------------
  605|  42.0k|        FoundBucket = ThisBucket;
  606|  42.0k|        return true;
  607|  42.0k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   240k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   240k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 115k, False: 125k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   115k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 115k]
  ------------------
  615|   115k|        return false;
  616|   115k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   125k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 125k]
  ------------------
  621|   125k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   125k|      BucketNo += ProbeAmt++;
  627|   125k|      BucketNo &= (NumBuckets-1);
  628|   125k|    }
  629|   157k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10getBucketsEv:
  489|   157k|  const BucketT *getBuckets() const {
  490|   157k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   157k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15getTombstoneKeyEv:
  432|   157k|  static const KeyT getTombstoneKey() {
  433|   157k|    return KeyInfoT::getTombstoneKey();
  434|   157k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E12getHashValueERKS5_:
  417|   157k|  static unsigned getHashValue(const KeyT &Val) {
  418|   157k|    return KeyInfoT::getHashValue(Val);
  419|   157k|  }
_ZNK4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE8getFirstEv:
   48|   648k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_EixERKS5_:
  303|  55.3k|  ValueT &operator[](const KeyT &Key) {
  304|  55.3k|    return FindAndConstruct(Key).second;
  305|  55.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16FindAndConstructERKS5_:
  295|  55.3k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  55.3k|    BucketT *TheBucket;
  297|  55.3k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 21.0k, False: 34.3k]
  ------------------
  298|  21.0k|      return *TheBucket;
  299|       |
  300|  34.3k|    return *InsertIntoBucket(TheBucket, Key);
  301|  55.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E15LookupBucketForIS5_EEbRKT_RPSD_:
  632|   102k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   102k|    const BucketT *ConstFoundBucket;
  634|   102k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   102k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   102k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   102k|    return Result;
  638|   102k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16InsertIntoBucketIRKS5_JEEEPSD_SJ_OT_DpOT0_:
  519|  34.3k|                            ValueArgs &&... Values) {
  520|  34.3k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  34.3k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  34.3k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  34.3k|    return TheBucket;
  525|  34.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E20InsertIntoBucketImplIS5_EEPSD_RKS5_RKT_SH_:
  539|  34.3k|                                BucketT *TheBucket) {
  540|  34.3k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  34.3k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  34.3k|    unsigned NumBuckets = getNumBuckets();
  553|  34.3k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  34.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 85, False: 34.2k]
  |  |  ------------------
  ------------------
  554|     85|      this->grow(NumBuckets * 2);
  555|     85|      LookupBucketFor(Lookup, TheBucket);
  556|     85|      NumBuckets = getNumBuckets();
  557|  34.2k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  34.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 34.2k]
  |  |  ------------------
  ------------------
  558|  34.2k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  34.3k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  34.3k|    const KeyT EmptyKey = getEmptyKey();
  570|  34.3k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 34.3k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  34.3k|    return TheBucket;
  574|  34.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E13getNumEntriesEv:
  457|   115k|  unsigned getNumEntries() const {
  458|   115k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   115k|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE13getNumEntriesEv:
  771|   115k|  unsigned getNumEntries() const {
  772|   115k|    return NumEntries;
  773|   115k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E4growEj:
  509|     85|  void grow(unsigned AtLeast) {
  510|     85|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     85|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4growEj:
  736|     85|  void grow(unsigned AtLeast) {
  737|     85|    unsigned OldNumBuckets = NumBuckets;
  738|     85|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     85|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     85|    assert(Buckets);
  742|     85|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 21, False: 64]
  ------------------
  743|     21|      this->BaseT::initEmpty();
  744|     21|      return;
  745|     21|    }
  746|       |
  747|     64|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     64|    operator delete(OldBuckets);
  751|     64|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E18moveFromOldBucketsEPSD_SG_:
  369|     64|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     64|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     64|    const KeyT EmptyKey = getEmptyKey();
  374|     64|    const KeyT TombstoneKey = getTombstoneKey();
  375|  62.2k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 62.2k, False: 64]
  ------------------
  376|  62.2k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 46.5k, False: 15.6k]
  ------------------
  377|  62.2k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 46.5k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  46.5k|        BucketT *DestBucket;
  380|  46.5k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  46.5k|        (void)FoundVal; // silence warning.
  382|  46.5k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  46.5k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  46.5k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  46.5k|        B->getSecond().~ValueT();
  389|  46.5k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  62.2k|    }
  392|     64|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E16getNumTombstonesEv:
  473|  34.2k|  unsigned getNumTombstones() const {
  474|  34.2k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  34.2k|  }
_ZNK4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE16getNumTombstonesEv:
  779|  34.2k|  unsigned getNumTombstones() const {
  780|  34.2k|    return NumTombstones;
  781|  34.2k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E19incrementNumEntriesEv:
  465|  80.9k|  void incrementNumEntries() {
  466|  80.9k|    setNumEntries(getNumEntries() + 1);
  467|  80.9k|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes11InstructionENSt3__14pairIjjEEE9getSecondEv:
   49|   208k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEED2Ev:
  687|    112|  ~DenseMap() {
  688|    112|    this->destroyAll();
  689|    112|    operator delete(Buckets);
  690|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E10destroyAllEv:
  334|    168|  void destroyAll() {
  335|    168|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 147, False: 21]
  ------------------
  336|    147|      return;
  337|       |
  338|     21|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  63.5k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 63.5k, False: 21]
  ------------------
  340|  63.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 34.3k, False: 29.2k]
  ------------------
  341|  63.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 34.3k, False: 0]
  ------------------
  342|  34.3k|        P->getSecond().~ValueT();
  343|  63.5k|      P->getFirst().~KeyT();
  344|  63.5k|    }
  345|     21|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEC2EPKSB_SE_RKNS_14DebugEpochBaseEb:
 1139|   687k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   687k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   687k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 687k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE15allocateBucketsEj:
  795|    154|  bool allocateBuckets(unsigned Num) {
  796|    154|    NumBuckets = Num;
  797|    154|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 98]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|     98|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     98|    return true;
  804|    154|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E9initEmptyEv:
  347|     98|  void initEmpty() {
  348|     98|    setNumEntries(0);
  349|     98|    setNumTombstones(0);
  350|       |
  351|     98|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     98|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   462k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 462k, False: 98]
  ------------------
  355|   462k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     98|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13setNumEntriesEj:
  461|   286k|  void setNumEntries(unsigned Num) {
  462|   286k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   286k|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13setNumEntriesEj:
  775|   286k|  void setNumEntries(unsigned Num) {
  776|   286k|    NumEntries = Num;
  777|   286k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16setNumTombstonesEj:
  477|     98|  void setNumTombstones(unsigned Num) {
  478|     98|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     98|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE16setNumTombstonesEj:
  783|     98|  void setNumTombstones(unsigned Num) {
  784|     98|    NumTombstones = Num;
  785|     98|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getNumBucketsEv:
  497|  1.42M|  unsigned getNumBuckets() const {
  498|  1.42M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.42M|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13getNumBucketsEv:
  791|  1.42M|  unsigned getNumBuckets() const {
  792|  1.42M|    return NumBuckets;
  793|  1.42M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E11getEmptyKeyEv:
  426|   629k|  static const KeyT getEmptyKey() {
  427|   629k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   629k|                  "Must pass the derived type to this template!");
  429|   629k|    return KeyInfoT::getEmptyKey();
  430|   629k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10getBucketsEv:
  493|   799k|  BucketT *getBuckets() {
  494|   799k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   799k|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE10getBucketsEv:
  787|  1.31M|  BucketT *getBuckets() const {
  788|  1.31M|    return Buckets;
  789|  1.31M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getBucketsEndEv:
  501|   799k|  BucketT *getBucketsEnd() {
  502|   799k|    return getBuckets() + getNumBuckets();
  503|   799k|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE8getFirstEv:
   47|  2.41M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 41]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|     41|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     41|    return true;
  804|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|     41|  void initEmpty() {
  348|     41|    setNumEntries(0);
  349|     41|    setNumTombstones(0);
  350|       |
  351|     41|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     41|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  2.79k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.75k, False: 41]
  ------------------
  355|  2.75k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     41|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|    376|  void setNumEntries(unsigned Num) {
  462|    376|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    376|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|    376|  void setNumEntries(unsigned Num) {
  776|    376|    NumEntries = Num;
  777|    376|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|     80|  void setNumTombstones(unsigned Num) {
  478|     80|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     80|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|     80|  void setNumTombstones(unsigned Num) {
  784|     80|    NumTombstones = Num;
  785|     80|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  1.13M|  unsigned getNumBuckets() const {
  498|  1.13M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.13M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|  1.13M|  unsigned getNumBuckets() const {
  792|  1.13M|    return NumBuckets;
  793|  1.13M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|  1.02M|  static const KeyT getEmptyKey() {
  427|  1.02M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.02M|                  "Must pass the derived type to this template!");
  429|  1.02M|    return KeyInfoT::getEmptyKey();
  430|  1.02M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|    550|  BucketT *getBuckets() {
  494|    550|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    550|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|  1.02M|  BucketT *getBuckets() const {
  788|  1.02M|    return Buckets;
  789|  1.02M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|    353|  BucketT *getBucketsEnd() {
  502|    353|    return getBuckets() + getNumBuckets();
  503|    353|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE8getFirstEv:
   47|  17.7k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|   228k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|   228k|  void init(unsigned InitNumEntries) {
  727|   228k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   228k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 228k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   228k|    } else {
  731|   228k|      NumEntries = 0;
  732|   228k|      NumTombstones = 0;
  733|   228k|    }
  734|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|   228k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   228k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 228k, False: 0]
  ------------------
  363|   228k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   228k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|   228k|  bool allocateBuckets(unsigned Num) {
  796|   228k|    NumBuckets = Num;
  797|   228k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 228k, False: 324]
  ------------------
  798|   228k|      Buckets = nullptr;
  799|   228k|      return false;
  800|   228k|    }
  801|       |
  802|    324|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    324|    return true;
  804|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|    324|  void initEmpty() {
  348|    324|    setNumEntries(0);
  349|    324|    setNumTombstones(0);
  350|       |
  351|    324|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    324|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  2.11M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 2.11M, False: 324]
  ------------------
  355|  2.11M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    324|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|  1.33M|  void setNumEntries(unsigned Num) {
  462|  1.33M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  1.33M|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|  1.33M|  void setNumEntries(unsigned Num) {
  776|  1.33M|    NumEntries = Num;
  777|  1.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|    324|  void setNumTombstones(unsigned Num) {
  478|    324|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|    324|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|    324|  void setNumTombstones(unsigned Num) {
  784|    324|    NumTombstones = Num;
  785|    324|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|  20.6M|  unsigned getNumBuckets() const {
  498|  20.6M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  20.6M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|  20.6M|  unsigned getNumBuckets() const {
  792|  20.6M|    return NumBuckets;
  793|  20.6M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|  7.14M|  static const KeyT getEmptyKey() {
  427|  7.14M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  7.14M|                  "Must pass the derived type to this template!");
  429|  7.14M|    return KeyInfoT::getEmptyKey();
  430|  7.14M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|  13.2M|  BucketT *getBuckets() {
  494|  13.2M|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  13.2M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|  19.8M|  BucketT *getBuckets() const {
  788|  19.8M|    return Buckets;
  789|  19.8M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|  13.2M|  BucketT *getBucketsEnd() {
  502|  13.2M|    return getBuckets() + getNumBuckets();
  503|  13.2M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE8getFirstEv:
   47|  11.1M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE15allocateBucketsEj:
  795|   228k|  bool allocateBuckets(unsigned Num) {
  796|   228k|    NumBuckets = Num;
  797|   228k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 114k]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|   114k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   114k|    return true;
  804|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  11.0M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 10.9M, False: 114k]
  ------------------
  355|  10.9M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13setNumEntriesEj:
  461|  3.15M|  void setNumEntries(unsigned Num) {
  462|  3.15M|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  3.15M|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13setNumEntriesEj:
  775|  3.15M|  void setNumEntries(unsigned Num) {
  776|  3.15M|    NumEntries = Num;
  777|  3.15M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16setNumTombstonesEj:
  783|   114k|  void setNumTombstones(unsigned Num) {
  784|   114k|    NumTombstones = Num;
  785|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumBucketsEv:
  497|  15.4M|  unsigned getNumBuckets() const {
  498|  15.4M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  15.4M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumBucketsEv:
  791|  15.4M|  unsigned getNumBuckets() const {
  792|  15.4M|    return NumBuckets;
  793|  15.4M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E11getEmptyKeyEv:
  426|  14.9M|  static const KeyT getEmptyKey() {
  427|  14.9M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  14.9M|                  "Must pass the derived type to this template!");
  429|  14.9M|    return KeyInfoT::getEmptyKey();
  430|  14.9M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  493|   457k|  BucketT *getBuckets() {
  494|   457k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   457k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE10getBucketsEv:
  787|  13.5M|  BucketT *getBuckets() const {
  788|  13.5M|    return Buckets;
  789|  13.5M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getBucketsEndEv:
  501|   228k|  BucketT *getBucketsEnd() {
  502|   228k|    return getBuckets() + getNumBuckets();
  503|   228k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE8getFirstEv:
   47|  43.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 114k]
  ------------------
  336|      0|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  9.22M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 9.11M, False: 114k]
  ------------------
  340|  9.11M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 1.68M, False: 7.42M]
  ------------------
  341|  9.11M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 1.68M, False: 0]
  ------------------
  342|  1.68M|        P->getSecond().~ValueT();
  343|  9.11M|      P->getFirst().~KeyT();
  344|  9.11M|    }
  345|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15getTombstoneKeyEv:
  432|  13.1M|  static const KeyT getTombstoneKey() {
  433|  13.1M|    return KeyInfoT::getTombstoneKey();
  434|  13.1M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE9getSecondEv:
   49|  7.43M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|   228k|  ~DenseMap() {
  688|   228k|    this->destroyAll();
  689|   228k|    operator delete(Buckets);
  690|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|   228k|  void destroyAll() {
  335|   228k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 228k, False: 39]
  ------------------
  336|   228k|      return;
  337|       |
  338|     39|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.05M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.05M, False: 39]
  ------------------
  340|  1.05M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 547k, False: 511k]
  ------------------
  341|  1.05M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 547k, False: 0]
  ------------------
  342|   547k|        P->getSecond().~ValueT();
  343|  1.05M|      P->getFirst().~KeyT();
  344|  1.05M|    }
  345|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|  6.59M|  static const KeyT getTombstoneKey() {
  433|  6.59M|    return KeyInfoT::getTombstoneKey();
  434|  6.59M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE9getSecondEv:
   49|  3.47M|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 39]
  ------------------
  336|   114k|      return;
  337|       |
  338|     39|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  2.66k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 2.62k, False: 39]
  ------------------
  340|  2.62k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 2.62k]
  ------------------
  341|  2.62k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  2.62k|      P->getFirst().~KeyT();
  344|  2.62k|    }
  345|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|  1.02M|  static const KeyT getTombstoneKey() {
  433|  1.02M|    return KeyInfoT::getTombstoneKey();
  434|  1.02M|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE9getSecondEv:
   49|    686|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|   228k|  bool allocateBuckets(unsigned Num) {
  796|   228k|    NumBuckets = Num;
  797|   228k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 114k]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|   114k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   114k|    return true;
  804|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  7.55M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 7.43M, False: 114k]
  ------------------
  355|  7.43M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|   431k|  void setNumEntries(unsigned Num) {
  462|   431k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   431k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|   431k|  void setNumEntries(unsigned Num) {
  776|   431k|    NumEntries = Num;
  777|   431k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|   114k|  void setNumTombstones(unsigned Num) {
  784|   114k|    NumTombstones = Num;
  785|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|  2.22M|  unsigned getNumBuckets() const {
  498|  2.22M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.22M|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|  2.22M|  unsigned getNumBuckets() const {
  792|  2.22M|    return NumBuckets;
  793|  2.22M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|  1.19M|  static const KeyT getEmptyKey() {
  427|  1.19M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.19M|                  "Must pass the derived type to this template!");
  429|  1.19M|    return KeyInfoT::getEmptyKey();
  430|  1.19M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|   913k|  BucketT *getBuckets() {
  494|   913k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   913k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|  1.73M|  BucketT *getBuckets() const {
  788|  1.73M|    return Buckets;
  789|  1.73M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|   685k|  BucketT *getBucketsEnd() {
  502|   685k|    return getBuckets() + getNumBuckets();
  503|   685k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE8getFirstEv:
   47|  23.4M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  669|   228k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  726|   342k|  void init(unsigned InitNumEntries) {
  727|   342k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   342k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 342k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   342k|    } else {
  731|   342k|      NumEntries = 0;
  732|   342k|      NumTombstones = 0;
  733|   342k|    }
  734|   342k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E31getMinBucketToReserveForEntriesEj:
  360|   342k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   342k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 342k, False: 0]
  ------------------
  363|   342k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   342k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
  795|   456k|  bool allocateBuckets(unsigned Num) {
  796|   456k|    NumBuckets = Num;
  797|   456k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 342k, False: 114k]
  ------------------
  798|   342k|      Buckets = nullptr;
  799|   342k|      return false;
  800|   342k|    }
  801|       |
  802|   114k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   114k|    return true;
  804|   456k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  7.42M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 7.30M, False: 114k]
  ------------------
  355|  7.30M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13setNumEntriesEj:
  461|   228k|  void setNumEntries(unsigned Num) {
  462|   228k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   228k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13setNumEntriesEj:
  775|   228k|  void setNumEntries(unsigned Num) {
  776|   228k|    NumEntries = Num;
  777|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16setNumTombstonesEj:
  783|   114k|  void setNumTombstones(unsigned Num) {
  784|   114k|    NumTombstones = Num;
  785|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  1.52M|  unsigned getNumBuckets() const {
  498|  1.52M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.52M|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
  791|  1.52M|  unsigned getNumBuckets() const {
  792|  1.52M|    return NumBuckets;
  793|  1.52M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11getEmptyKeyEv:
  426|   610k|  static const KeyT getEmptyKey() {
  427|   610k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   610k|                  "Must pass the derived type to this template!");
  429|   610k|    return KeyInfoT::getEmptyKey();
  430|   610k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|   570k|  BucketT *getBuckets() {
  494|   570k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   570k|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
  787|   953k|  BucketT *getBuckets() const {
  788|   953k|    return Buckets;
  789|   953k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|   342k|  BucketT *getBucketsEnd() {
  502|   342k|    return getBuckets() + getNumBuckets();
  503|   342k|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 2]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|      2|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      2|    return true;
  804|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E9initEmptyEv:
  347|      2|  void initEmpty() {
  348|      2|    setNumEntries(0);
  349|      2|    setNumTombstones(0);
  350|       |
  351|      2|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      2|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    130|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 128, False: 2]
  ------------------
  355|    128|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13setNumEntriesEj:
  461|     14|  void setNumEntries(unsigned Num) {
  462|     14|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     14|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13setNumEntriesEj:
  775|     14|  void setNumEntries(unsigned Num) {
  776|     14|    NumEntries = Num;
  777|     14|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16setNumTombstonesEj:
  477|      2|  void setNumTombstones(unsigned Num) {
  478|      2|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      2|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16setNumTombstonesEj:
  783|      2|  void setNumTombstones(unsigned Num) {
  784|      2|    NumTombstones = Num;
  785|      2|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumBucketsEv:
  497|   114k|  unsigned getNumBuckets() const {
  498|   114k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumBucketsEv:
  791|   114k|  unsigned getNumBuckets() const {
  792|   114k|    return NumBuckets;
  793|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E11getEmptyKeyEv:
  426|    100|  static const KeyT getEmptyKey() {
  427|    100|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    100|                  "Must pass the derived type to this template!");
  429|    100|    return KeyInfoT::getEmptyKey();
  430|    100|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  493|     16|  BucketT *getBuckets() {
  494|     16|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     16|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE10getBucketsEv:
  787|    102|  BucketT *getBuckets() const {
  788|    102|    return Buckets;
  789|    102|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getBucketsEndEv:
  501|     10|  BucketT *getBucketsEnd() {
  502|     10|    return getBuckets() + getNumBuckets();
  503|     10|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE8getFirstEv:
   47|    560|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 0]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|   114k|  unsigned getNumBuckets() const {
  498|   114k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|   114k|  unsigned getNumBuckets() const {
  792|   114k|    return NumBuckets;
  793|   114k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEC2Ej:
  669|   228k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE4initEj:
  726|   228k|  void init(unsigned InitNumEntries) {
  727|   228k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   228k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 228k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   228k|    } else {
  731|   228k|      NumEntries = 0;
  732|   228k|      NumTombstones = 0;
  733|   228k|    }
  734|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E31getMinBucketToReserveForEntriesEj:
  360|   228k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   228k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 228k, False: 0]
  ------------------
  363|   228k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   228k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE15allocateBucketsEj:
  795|   290k|  bool allocateBuckets(unsigned Num) {
  796|   290k|    NumBuckets = Num;
  797|   290k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 228k, False: 62.5k]
  ------------------
  798|   228k|      Buckets = nullptr;
  799|   228k|      return false;
  800|   228k|    }
  801|       |
  802|  62.5k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|  62.5k|    return true;
  804|   290k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E9initEmptyEv:
  347|  62.5k|  void initEmpty() {
  348|  62.5k|    setNumEntries(0);
  349|  62.5k|    setNumTombstones(0);
  350|       |
  351|  62.5k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|  62.5k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  4.06M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 4.00M, False: 62.5k]
  ------------------
  355|  4.00M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|  62.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13setNumEntriesEj:
  461|   125k|  void setNumEntries(unsigned Num) {
  462|   125k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   125k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13setNumEntriesEj:
  775|   125k|  void setNumEntries(unsigned Num) {
  776|   125k|    NumEntries = Num;
  777|   125k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16setNumTombstonesEj:
  477|  62.5k|  void setNumTombstones(unsigned Num) {
  478|  62.5k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  62.5k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE16setNumTombstonesEj:
  783|  62.5k|  void setNumTombstones(unsigned Num) {
  784|  62.5k|    NumTombstones = Num;
  785|  62.5k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getNumBucketsEv:
  497|   802k|  unsigned getNumBuckets() const {
  498|   802k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   802k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13getNumBucketsEv:
  791|   802k|  unsigned getNumBuckets() const {
  792|   802k|    return NumBuckets;
  793|   802k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E11getEmptyKeyEv:
  426|   323k|  static const KeyT getEmptyKey() {
  427|   323k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   323k|                  "Must pass the derived type to this template!");
  429|   323k|    return KeyInfoT::getEmptyKey();
  430|   323k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10getBucketsEv:
  493|   250k|  BucketT *getBuckets() {
  494|   250k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   250k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE10getBucketsEv:
  787|   448k|  BucketT *getBuckets() const {
  788|   448k|    return Buckets;
  789|   448k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getBucketsEndEv:
  501|   125k|  BucketT *getBucketsEnd() {
  502|   125k|    return getBuckets() + getNumBuckets();
  503|   125k|  }
_ZN4llvh6detail12DenseMapPairIjhE8getFirstEv:
   47|  12.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1139|  8.17M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  8.17M|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  8.17M|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 8.17M, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh16DenseMapIteratorINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EELb1EEC2ILb0EvEERKNS0_IS1_S4_S6_S9_XT_EEE:
 1157|  4.01M|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEED2Ev:
  687|   228k|  ~DenseMap() {
  688|   228k|    this->destroyAll();
  689|   228k|    operator delete(Buckets);
  690|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10destroyAllEv:
  334|   228k|  void destroyAll() {
  335|   228k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 165k, False: 62.5k]
  ------------------
  336|   165k|      return;
  337|       |
  338|  62.5k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  4.06M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 4.00M, False: 62.5k]
  ------------------
  340|  4.00M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 63.0k, False: 3.94M]
  ------------------
  341|  4.00M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 63.0k, False: 0]
  ------------------
  342|  63.0k|        P->getSecond().~ValueT();
  343|  4.00M|      P->getFirst().~KeyT();
  344|  4.00M|    }
  345|  62.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15getTombstoneKeyEv:
  432|   198k|  static const KeyT getTombstoneKey() {
  433|   198k|    return KeyInfoT::getTombstoneKey();
  434|   198k|  }
_ZN4llvh6detail12DenseMapPairIjhE9getSecondEv:
   49|   126k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 0]
  ------------------
  336|   114k|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 2]
  ------------------
  336|   114k|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    130|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 128, False: 2]
  ------------------
  340|    128|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 12, False: 116]
  ------------------
  341|    128|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 12, False: 0]
  ------------------
  342|     12|        P->getSecond().~ValueT();
  343|    128|      P->getFirst().~KeyT();
  344|    128|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15getTombstoneKeyEv:
  432|     86|  static const KeyT getTombstoneKey() {
  433|     86|    return KeyInfoT::getTombstoneKey();
  434|     86|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE9getSecondEv:
   49|     24|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  687|   228k|  ~DenseMap() {
  688|   228k|    this->destroyAll();
  689|   228k|    operator delete(Buckets);
  690|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|   342k|  void destroyAll() {
  335|   342k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 228k, False: 114k]
  ------------------
  336|   228k|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  7.42M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.30M, False: 114k]
  ------------------
  340|  7.30M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 114k, False: 7.19M]
  ------------------
  341|  7.30M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 114k, False: 0]
  ------------------
  342|   114k|        P->getSecond().~ValueT();
  343|  7.30M|      P->getFirst().~KeyT();
  344|  7.30M|    }
  345|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15getTombstoneKeyEv:
  432|   382k|  static const KeyT getTombstoneKey() {
  433|   382k|    return KeyInfoT::getTombstoneKey();
  434|   382k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 114k]
  ------------------
  336|      0|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  7.48M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.37M, False: 114k]
  ------------------
  340|  7.37M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 267k, False: 7.10M]
  ------------------
  341|  7.37M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 267k, False: 0]
  ------------------
  342|   267k|        P->getSecond().~ValueT();
  343|  7.37M|      P->getFirst().~KeyT();
  344|  7.37M|    }
  345|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|   817k|  static const KeyT getTombstoneKey() {
  433|   817k|    return KeyInfoT::getTombstoneKey();
  434|   817k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE9getSecondEv:
   49|   683k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 114k]
  ------------------
  336|      0|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  7.42M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.30M, False: 114k]
  ------------------
  340|  7.30M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 114k, False: 7.19M]
  ------------------
  341|  7.30M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 114k, False: 0]
  ------------------
  342|   114k|        P->getSecond().~ValueT();
  343|  7.30M|      P->getFirst().~KeyT();
  344|  7.30M|    }
  345|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  1.02M|  unsigned getNumBuckets() const {
  498|  1.02M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.02M|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|  1.02M|  unsigned getNumBuckets() const {
  792|  1.02M|    return NumBuckets;
  793|  1.02M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|   456k|  static const KeyT getEmptyKey() {
  427|   456k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   456k|                  "Must pass the derived type to this template!");
  429|   456k|    return KeyInfoT::getEmptyKey();
  430|   456k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|   228k|  static const KeyT getTombstoneKey() {
  433|   228k|    return KeyInfoT::getTombstoneKey();
  434|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|   456k|  BucketT *getBuckets() {
  494|   456k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   456k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|   685k|  BucketT *getBuckets() const {
  788|   685k|    return Buckets;
  789|   685k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|   228k|  BucketT *getBucketsEnd() {
  502|   228k|    return getBuckets() + getNumBuckets();
  503|   228k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE8getFirstEv:
   47|  22.2M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE9getSecondEv:
   49|   228k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   233k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 232k, False: 56]
  ------------------
  340|   232k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 114k, False: 118k]
  ------------------
  341|   232k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 114k, False: 0]
  ------------------
  342|   114k|        P->getSecond().~ValueT();
  343|   232k|      P->getFirst().~KeyT();
  344|   232k|    }
  345|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15getTombstoneKeyEv:
  432|   514k|  static const KeyT getTombstoneKey() {
  433|   514k|    return KeyInfoT::getTombstoneKey();
  434|   514k|  }
_ZN4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE9getSecondEv:
   49|   744k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 56, False: 0]
  ------------------
  336|     56|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairINS_9StringRefES4_EEjNS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_jEEEES5_jS7_SA_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 48, False: 8]
  ------------------
  336|     48|      return;
  337|       |
  338|      8|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    520|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 512, False: 8]
  ------------------
  340|    512|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 28, False: 484]
  ------------------
  341|    512|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 28, False: 0]
  ------------------
  342|     28|        P->getSecond().~ValueT();
  343|    512|      P->getFirst().~KeyT();
  344|    512|    }
  345|      8|  }
_ZN4llvh8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_8ArrayRefIhEEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 56, False: 0]
  ------------------
  336|     56|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   234k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 234k, False: 56]
  ------------------
  340|   234k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 114k, False: 119k]
  ------------------
  341|   234k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 114k, False: 0]
  ------------------
  342|   114k|        P->getSecond().~ValueT();
  343|   234k|      P->getFirst().~KeyT();
  344|   234k|    }
  345|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15getTombstoneKeyEv:
  432|   517k|  static const KeyT getTombstoneKey() {
  433|   517k|    return KeyInfoT::getTombstoneKey();
  434|   517k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE9getSecondEv:
   49|   748k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|   234k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 234k, False: 56]
  ------------------
  340|   234k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 114k, False: 119k]
  ------------------
  341|   234k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 114k, False: 0]
  ------------------
  342|   114k|        P->getSecond().~ValueT();
  343|   234k|      P->getFirst().~KeyT();
  344|   234k|    }
  345|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|   631k|  static const KeyT getTombstoneKey() {
  433|   631k|    return KeyInfoT::getTombstoneKey();
  434|   631k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE9getSecondEv:
   49|   748k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4findEPKS3_:
  160|    318|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|    318|    const BucketT *TheBucket;
  162|    318|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 158, False: 160]
  ------------------
  163|    158|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|    160|    return end();
  165|    318|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPKSG_:
  582|    318|                       const BucketT *&FoundBucket) const {
  583|    318|    const BucketT *BucketsPtr = getBuckets();
  584|    318|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    318|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 160, False: 158]
  ------------------
  587|    160|      FoundBucket = nullptr;
  588|    160|      return false;
  589|    160|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    158|    const BucketT *FoundTombstone = nullptr;
  593|    158|    const KeyT EmptyKey = getEmptyKey();
  594|    158|    const KeyT TombstoneKey = getTombstoneKey();
  595|    158|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    158|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    158|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    158|    unsigned ProbeAmt = 1;
  601|    304|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    304|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    304|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    304|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 158, False: 146]
  |  |  ------------------
  ------------------
  605|    158|        FoundBucket = ThisBucket;
  606|    158|        return true;
  607|    158|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    146|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    146|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 146]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    146|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 146]
  ------------------
  621|    146|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    146|      BucketNo += ProbeAmt++;
  627|    146|      BucketNo &= (NumBuckets-1);
  628|    146|    }
  629|    158|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  489|  1.85k|  const BucketT *getBuckets() const {
  490|  1.85k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.85k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE10getBucketsEv:
  787|  1.86k|  BucketT *getBuckets() const {
  788|  1.86k|    return Buckets;
  789|  1.86k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumBucketsEv:
  497|  2.03k|  unsigned getNumBuckets() const {
  498|  2.03k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.03k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumBucketsEv:
  791|  2.03k|  unsigned getNumBuckets() const {
  792|  2.03k|    return NumBuckets;
  793|  2.03k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E11getEmptyKeyEv:
  426|    742|  static const KeyT getEmptyKey() {
  427|    742|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|    742|                  "Must pass the derived type to this template!");
  429|    742|    return KeyInfoT::getEmptyKey();
  430|    742|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15getTombstoneKeyEv:
  432|    578|  static const KeyT getTombstoneKey() {
  433|    578|    return KeyInfoT::getTombstoneKey();
  434|    578|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueIPKS3_EEjRKT_:
  422|    158|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|    158|    return KeyInfoT::getHashValue(Val);
  424|    158|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE8getFirstEv:
   48|  2.32k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E17makeConstIteratorEPKSG_SK_RKNS_14DebugEpochBaseEb:
  449|    636|                                   const bool NoAdvance=false) const {
  450|    636|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 636]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|    636|    return const_iterator(P, E, Epoch, NoAdvance);
  455|    636|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  505|  1.11k|  const BucketT *getBucketsEnd() const {
  506|  1.11k|    return getBuckets() + getNumBuckets();
  507|  1.11k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E3endEv:
   95|    478|  inline const_iterator end() const {
   96|    478|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|    478|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEneERKSG_:
 1179|    318|  bool operator!=(const ConstIterator &RHS) const {
 1180|    318|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|    318|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|    318|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEptEv:
 1165|    158|  pointer operator->() const {
 1166|    158|    assert(isHandleInSync() && "invalid iterator access!");
 1167|    158|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 158]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|    158|    return Ptr;
 1170|    158|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E5clearEv:
  113|      2|  void clear() {
  114|      2|    incrementEpoch();
  115|      2|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 2, False: 0]
  |  Branch (115:33): [True: 2, False: 0]
  ------------------
  116|       |
  117|       |    // If the capacity of the array is huge, and the # elements used is small,
  118|       |    // shrink the array.
  119|      0|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 0, False: 0]
  |  Branch (119:50): [True: 0, False: 0]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|      0|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value) {
  ------------------
  |  Branch (125:9): [Folded - Ignored]
  |  Branch (125:35): [Folded - Ignored]
  ------------------
  126|       |      // Use a simpler loop when these are trivial types.
  127|      0|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 0, False: 0]
  ------------------
  128|      0|        P->getFirst() = EmptyKey;
  129|      0|    } else {
  130|      0|      unsigned NumEntries = getNumEntries();
  131|      0|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (131:61): [True: 0, False: 0]
  ------------------
  132|      0|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey)) {
  ------------------
  |  Branch (132:13): [True: 0, False: 0]
  ------------------
  133|      0|          if (!KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (133:15): [True: 0, False: 0]
  ------------------
  134|      0|            P->getSecond().~ValueT();
  135|      0|            --NumEntries;
  136|      0|          }
  137|      0|          P->getFirst() = EmptyKey;
  138|      0|        }
  139|      0|      }
  140|      0|      assert(NumEntries == 0 && "Node count imbalance!");
  141|       |      // Suppress -Wunused-but-set-variable warning with new compilers.
  142|      0|      (void)NumEntries;
  143|      0|    }
  144|      0|    setNumEntries(0);
  145|      0|    setNumTombstones(0);
  146|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumEntriesEv:
  457|    416|  unsigned getNumEntries() const {
  458|    416|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    416|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumEntriesEv:
  771|    416|  unsigned getNumEntries() const {
  772|    416|    return NumEntries;
  773|    416|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16getNumTombstonesEv:
  473|    158|  unsigned getNumTombstones() const {
  474|    158|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    158|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16getNumTombstonesEv:
  779|    158|  unsigned getNumTombstones() const {
  780|    158|    return NumTombstones;
  781|    158|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10destroyAllEv:
  334|      2|  void destroyAll() {
  335|      2|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 2]
  ------------------
  336|      0|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    258|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 256, False: 2]
  ------------------
  340|    256|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 160, False: 96]
  ------------------
  341|    256|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 160, False: 0]
  ------------------
  342|    160|        P->getSecond().~ValueT();
  343|    256|      P->getFirst().~KeyT();
  344|    256|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E9initEmptyEv:
  347|      4|  void initEmpty() {
  348|      4|    setNumEntries(0);
  349|      4|    setNumTombstones(0);
  350|       |
  351|      4|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      4|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    388|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 384, False: 4]
  ------------------
  355|    384|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      4|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4initEj:
  726|      2|  void init(unsigned InitNumEntries) {
  727|      2|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|      2|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 2]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|      2|    } else {
  731|      2|      NumEntries = 0;
  732|      2|      NumTombstones = 0;
  733|      2|    }
  734|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E31getMinBucketToReserveForEntriesEj:
  360|      2|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|      2|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 2, False: 0]
  ------------------
  363|      2|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|      2|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE15allocateBucketsEj:
  795|      6|  bool allocateBuckets(unsigned Num) {
  796|      6|    NumBuckets = Num;
  797|      6|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 2, False: 4]
  ------------------
  798|      2|      Buckets = nullptr;
  799|      2|      return false;
  800|      2|    }
  801|       |
  802|      4|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      4|    return true;
  804|      6|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  493|     12|  BucketT *getBuckets() {
  494|     12|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     12|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getBucketsEndEv:
  501|      6|  BucketT *getBucketsEnd() {
  502|      6|    return getBuckets() + getNumBuckets();
  503|      6|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE8getFirstEv:
   47|  2.00k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEEE9getSecondEv:
   49|    602|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13setNumEntriesEj:
  461|    258|  void setNumEntries(unsigned Num) {
  462|    258|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    258|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13setNumEntriesEj:
  775|    258|  void setNumEntries(unsigned Num) {
  776|    258|    NumEntries = Num;
  777|    258|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16setNumTombstonesEj:
  477|      4|  void setNumTombstones(unsigned Num) {
  478|      4|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      4|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16setNumTombstonesEj:
  783|      4|  void setNumTombstones(unsigned Num) {
  784|      4|    NumTombstones = Num;
  785|      4|  }
_ZN4llvh16DenseMapIteratorIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EELb1EEC2EPKSC_SF_RKNS_14DebugEpochBaseEb:
 1139|    224|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    224|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    224|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 224, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEC2Ej:
  837|   114k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|   114k|    init(NumInitBuckets);
  839|   114k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4initEj:
  959|   114k|  void init(unsigned InitBuckets) {
  960|   114k|    Small = true;
  961|   114k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 114k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|   114k|    this->BaseT::initEmpty();
  966|   114k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE11getLargeRepEv:
 1079|     72|  LargeRep *getLargeRep() {
 1080|     72|    return const_cast<LargeRep *>(
 1081|     72|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|     72|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE11getLargeRepEv:
 1073|   374k|  const LargeRep *getLargeRep() const {
 1074|   374k|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|      0|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|   374k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE15allocateBucketsEj:
 1105|     24|  LargeRep allocateBuckets(unsigned Num) {
 1106|     24|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|      0|    LargeRep Rep = {
 1108|     24|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|     24|    };
 1110|     24|    return Rep;
 1111|     24|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  2.07M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 1.95M, False: 114k]
  ------------------
  355|  1.95M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13setNumEntriesEj:
  461|   317k|  void setNumEntries(unsigned Num) {
  462|   317k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   317k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13setNumEntriesEj:
 1046|   317k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|   317k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|   317k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16setNumTombstonesEj:
 1056|   114k|  void setNumTombstones(unsigned Num) {
 1057|   114k|    NumTombstones = Num;
 1058|   114k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumBucketsEv:
  497|  1.12M|  unsigned getNumBuckets() const {
  498|  1.12M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.12M|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumBucketsEv:
 1093|  1.12M|  unsigned getNumBuckets() const {
 1094|  1.12M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 913k, False: 207k]
  ------------------
 1095|  1.12M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11getEmptyKeyEv:
  426|   624k|  static const KeyT getEmptyKey() {
  427|   624k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   624k|                  "Must pass the derived type to this template!");
  429|   624k|    return KeyInfoT::getEmptyKey();
  430|   624k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  493|   610k|  BucketT *getBuckets() {
  494|   610k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   610k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
 1088|   610k|  BucketT *getBuckets() {
 1089|   610k|    return const_cast<BucketT *>(
 1090|   610k|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|   610k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE10getBucketsEv:
 1084|   852k|  const BucketT *getBuckets() const {
 1085|   852k|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 685k, False: 167k]
  ------------------
 1086|   852k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getInlineBucketsEv:
 1060|   685k|  const BucketT *getInlineBuckets() const {
 1061|   685k|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   685k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getBucketsEndEv:
  501|   382k|  BucketT *getBucketsEnd() {
  502|   382k|    return getBuckets() + getNumBuckets();
  503|   382k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11try_emplaceIJRS7_EEENSt3__14pairINS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEEbEERKS5_DpOT_:
  233|   153k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   153k|    BucketT *TheBucket;
  235|   153k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 153k]
  ------------------
  236|      0|      return std::make_pair(
  237|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|      0|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|   153k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|   153k|    return std::make_pair(
  243|   153k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|   153k|             true);
  245|   153k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPSB_:
  632|   202k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   202k|    const BucketT *ConstFoundBucket;
  634|   202k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   202k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   202k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   202k|    return Result;
  638|   202k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPKSB_:
  582|   242k|                       const BucketT *&FoundBucket) const {
  583|   242k|    const BucketT *BucketsPtr = getBuckets();
  584|   242k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   242k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 242k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   242k|    const BucketT *FoundTombstone = nullptr;
  593|   242k|    const KeyT EmptyKey = getEmptyKey();
  594|   242k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   242k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   242k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   242k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   242k|    unsigned ProbeAmt = 1;
  601|   361k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   361k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   361k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   361k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1, False: 361k]
  |  |  ------------------
  ------------------
  605|      1|        FoundBucket = ThisBucket;
  606|      1|        return true;
  607|      1|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   361k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   361k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 242k, False: 119k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   242k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 242k]
  ------------------
  615|   242k|        return false;
  616|   242k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   119k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 119k]
  ------------------
  621|   119k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   119k|      BucketNo += ProbeAmt++;
  627|   119k|      BucketNo &= (NumBuckets-1);
  628|   119k|    }
  629|   242k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  489|   242k|  const BucketT *getBuckets() const {
  490|   242k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   242k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15getTombstoneKeyEv:
  432|   356k|  static const KeyT getTombstoneKey() {
  433|   356k|    return KeyInfoT::getTombstoneKey();
  434|   356k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12getHashValueERKS5_:
  417|   242k|  static unsigned getHashValue(const KeyT &Val) {
  418|   242k|    return KeyInfoT::getHashValue(Val);
  419|   242k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|   153k|                        bool NoAdvance=false) {
  440|   153k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 153k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   153k|    return iterator(P, E, Epoch, NoAdvance);
  445|   153k|  }
_ZN4llvh16DenseMapIteratorIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1139|   267k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   267k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   267k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 267k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16InsertIntoBucketIRKS5_JRS7_EEEPSB_SI_OT_DpOT0_:
  519|   153k|                            ValueArgs &&... Values) {
  520|   153k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   153k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   153k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   153k|    return TheBucket;
  525|   153k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E20InsertIntoBucketImplIS5_EEPSB_RKS5_RKT_SF_:
  539|   153k|                                BucketT *TheBucket) {
  540|   153k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   153k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   153k|    unsigned NumBuckets = getNumBuckets();
  553|   153k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   153k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 24, False: 153k]
  |  |  ------------------
  ------------------
  554|     24|      this->grow(NumBuckets * 2);
  555|     24|      LookupBucketFor(Lookup, TheBucket);
  556|     24|      NumBuckets = getNumBuckets();
  557|   153k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   153k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153k]
  |  |  ------------------
  ------------------
  558|   153k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   153k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   153k|    const KeyT EmptyKey = getEmptyKey();
  570|   153k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 153k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   153k|    return TheBucket;
  574|   153k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|   356k|  unsigned getNumEntries() const {
  458|   356k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   356k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
 1042|   356k|  unsigned getNumEntries() const {
 1043|   356k|    return NumEntries;
 1044|   356k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E4growEj:
  509|     24|  void grow(unsigned AtLeast) {
  510|     24|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     24|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4growEj:
  968|     24|  void grow(unsigned AtLeast) {
  969|     24|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 24, False: 0]
  ------------------
  970|     24|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|     24|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 4, False: 20]
  ------------------
  973|      4|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 4]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|      4|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|      4|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|      4|      BucketT *TmpEnd = TmpBegin;
  980|       |
  981|       |      // Loop over the buckets, moving non-empty, non-tombstones into the
  982|       |      // temporary storage. Have the loop move the TmpEnd forward as it goes.
  983|      4|      const KeyT EmptyKey = this->getEmptyKey();
  984|      4|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|     68|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 64, False: 4]
  ------------------
  986|     64|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 44, False: 20]
  ------------------
  987|     64|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 44, False: 0]
  ------------------
  988|     44|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|     44|                 "Too many inline buckets!");
  990|      0|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|     44|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|     44|          ++TmpEnd;
  993|     44|          P->getSecond().~ValueT();
  994|     44|        }
  995|      0|        P->getFirst().~KeyT();
  996|     64|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|      4|      Small = false;
 1001|      4|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|      4|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|      4|      return;
 1004|      4|    }
 1005|       |
 1006|     20|    LargeRep OldRep = std::move(*getLargeRep());
 1007|     20|    getLargeRep()->~LargeRep();
 1008|     20|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 20]
  ------------------
 1009|      0|      Small = true;
 1010|     20|    } else {
 1011|     20|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|     20|    }
 1013|       |
 1014|     20|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|     20|    operator delete(OldRep.Buckets);
 1018|     20|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E18moveFromOldBucketsEPSB_SE_:
  369|     24|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     24|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     24|    const KeyT EmptyKey = getEmptyKey();
  374|     24|    const KeyT TombstoneKey = getTombstoneKey();
  375|  65.6k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 65.5k, False: 24]
  ------------------
  376|  65.5k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 49.1k, False: 16.4k]
  ------------------
  377|  65.5k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 49.1k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  49.1k|        BucketT *DestBucket;
  380|  49.1k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  49.1k|        (void)FoundVal; // silence warning.
  382|  49.1k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  49.1k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  49.1k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  49.1k|        B->getSecond().~ValueT();
  389|  49.1k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  65.5k|    }
  392|     24|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16getNumTombstonesEv:
  473|   153k|  unsigned getNumTombstones() const {
  474|   153k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   153k|  }
_ZNK4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getNumTombstonesEv:
 1052|   153k|  unsigned getNumTombstones() const {
 1053|   153k|    return NumTombstones;
 1054|   153k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E19incrementNumEntriesEv:
  465|   202k|  void incrementNumEntries() {
  466|   202k|    setNumEntries(getNumEntries() + 1);
  467|   202k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5countES5_:
  149|  39.5k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  39.5k|    const BucketT *TheBucket;
  151|  39.5k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 1, False: 39.5k]
  ------------------
  152|  39.5k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEED2Ev:
  857|   114k|  ~SmallDenseMap() {
  858|   114k|    this->destroyAll();
  859|   114k|    deallocateBuckets();
  860|   114k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 114k]
  ------------------
  336|      0|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  2.00M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 1.89M, False: 114k]
  ------------------
  340|  1.89M|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 153k, False: 1.73M]
  ------------------
  341|  1.89M|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 153k, False: 0]
  ------------------
  342|   153k|        P->getSecond().~ValueT();
  343|  1.89M|      P->getFirst().~KeyT();
  344|  1.89M|    }
  345|   114k|  }
_ZN4llvh13SmallDenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE17deallocateBucketsEv:
 1097|   114k|  void deallocateBuckets() {
 1098|   114k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 114k, False: 4]
  ------------------
 1099|   114k|      return;
 1100|       |
 1101|      4|    operator delete(getLargeRep()->Buckets);
 1102|      4|    getLargeRep()->~LargeRep();
 1103|      4|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEaSEOSB_:
  707|   114k|  DenseMap& operator=(DenseMap &&other) {
  708|   114k|    this->destroyAll();
  709|   114k|    operator delete(Buckets);
  710|   114k|    init(0);
  711|   114k|    swap(other);
  712|   114k|    return *this;
  713|   114k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4swapERSB_:
  692|   114k|  void swap(DenseMap& RHS) {
  693|   114k|    this->incrementEpoch();
  694|   114k|    RHS.incrementEpoch();
  695|   114k|    std::swap(Buckets, RHS.Buckets);
  696|   114k|    std::swap(NumEntries, RHS.NumEntries);
  697|   114k|    std::swap(NumTombstones, RHS.NumTombstones);
  698|   114k|    std::swap(NumBuckets, RHS.NumBuckets);
  699|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E11try_emplaceIJRS7_EEENSt3__14pairINS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEEbEERKS5_DpOT_:
  233|   114k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   114k|    BucketT *TheBucket;
  235|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 114k]
  ------------------
  236|      0|      return std::make_pair(
  237|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|      0|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|   114k|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|   114k|    return std::make_pair(
  243|   114k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|   114k|             true);
  245|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPSB_:
  632|   228k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   228k|    const BucketT *ConstFoundBucket;
  634|   228k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   228k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   228k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   228k|    return Result;
  638|   228k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E15LookupBucketForIS5_EEbRKT_RPKSB_:
  582|   382k|                       const BucketT *&FoundBucket) const {
  583|   382k|    const BucketT *BucketsPtr = getBuckets();
  584|   382k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   382k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 114k, False: 267k]
  ------------------
  587|   114k|      FoundBucket = nullptr;
  588|   114k|      return false;
  589|   114k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   267k|    const BucketT *FoundTombstone = nullptr;
  593|   267k|    const KeyT EmptyKey = getEmptyKey();
  594|   267k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   267k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   267k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   267k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   267k|    unsigned ProbeAmt = 1;
  601|   268k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   268k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   268k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   268k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 154k]
  |  |  ------------------
  ------------------
  605|   114k|        FoundBucket = ThisBucket;
  606|   114k|        return true;
  607|   114k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   154k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   154k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 153k, False: 671]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   153k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 153k]
  ------------------
  615|   153k|        return false;
  616|   153k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    671|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 671]
  ------------------
  621|    671|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    671|      BucketNo += ProbeAmt++;
  627|    671|      BucketNo &= (NumBuckets-1);
  628|    671|    }
  629|   267k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E10getBucketsEv:
  489|   382k|  const BucketT *getBuckets() const {
  490|   382k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   382k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12getHashValueERKS5_:
  417|   267k|  static unsigned getHashValue(const KeyT &Val) {
  418|   267k|    return KeyInfoT::getHashValue(Val);
  419|   267k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|   114k|                        bool NoAdvance=false) {
  440|   114k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 114k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   114k|    return iterator(P, E, Epoch, NoAdvance);
  445|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16InsertIntoBucketIRKS5_JRS7_EEEPSB_SI_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E20InsertIntoBucketImplIS5_EEPSB_RKS5_RKT_SF_:
  539|   114k|                                BucketT *TheBucket) {
  540|   114k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   114k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   114k|    unsigned NumBuckets = getNumBuckets();
  553|   114k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 114k, False: 1]
  |  |  ------------------
  ------------------
  554|   114k|      this->grow(NumBuckets * 2);
  555|   114k|      LookupBucketFor(Lookup, TheBucket);
  556|   114k|      NumBuckets = getNumBuckets();
  557|   114k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  558|      1|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   114k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   114k|    const KeyT EmptyKey = getEmptyKey();
  570|   114k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 114k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   114k|    return TheBucket;
  574|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E13getNumEntriesEv:
  457|   228k|  unsigned getNumEntries() const {
  458|   228k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   228k|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE13getNumEntriesEv:
  771|   228k|  unsigned getNumEntries() const {
  772|   228k|    return NumEntries;
  773|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E4growEj:
  509|   114k|  void grow(unsigned AtLeast) {
  510|   114k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   114k|  }
_ZN4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE4growEj:
  736|   114k|  void grow(unsigned AtLeast) {
  737|   114k|    unsigned OldNumBuckets = NumBuckets;
  738|   114k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   114k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   114k|    assert(Buckets);
  742|   114k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 114k, False: 0]
  ------------------
  743|   114k|      this->BaseT::initEmpty();
  744|   114k|      return;
  745|   114k|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E16getNumTombstonesEv:
  473|      1|  unsigned getNumTombstones() const {
  474|      1|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|      1|  }
_ZNK4llvh8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEE16getNumTombstonesEv:
  779|      1|  unsigned getNumTombstones() const {
  780|      1|    return NumTombstones;
  781|      1|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E19incrementNumEntriesEv:
  465|   114k|  void incrementNumEntries() {
  466|   114k|    setNumEntries(getNumEntries() + 1);
  467|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixEOS4_:
  315|   347k|  ValueT &operator[](KeyT &&Key) {
  316|   347k|    return FindAndConstruct(std::move(Key)).second;
  317|   347k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructEOS4_:
  307|   347k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|   347k|    BucketT *TheBucket;
  309|   347k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 232k, False: 114k]
  ------------------
  310|   232k|      return *TheBucket;
  311|       |
  312|   114k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|   347k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|   703k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   703k|    const BucketT *ConstFoundBucket;
  634|   703k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   703k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   703k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   703k|    return Result;
  638|   703k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|   703k|                       const BucketT *&FoundBucket) const {
  583|   703k|    const BucketT *BucketsPtr = getBuckets();
  584|   703k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   703k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 114k, False: 589k]
  ------------------
  587|   114k|      FoundBucket = nullptr;
  588|   114k|      return false;
  589|   114k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   589k|    const BucketT *FoundTombstone = nullptr;
  593|   589k|    const KeyT EmptyKey = getEmptyKey();
  594|   589k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   589k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   589k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   589k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   589k|    unsigned ProbeAmt = 1;
  601|   738k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   738k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   738k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   738k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 272k, False: 466k]
  |  |  ------------------
  ------------------
  605|   272k|        FoundBucket = ThisBucket;
  606|   272k|        return true;
  607|   272k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   466k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   466k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 317k, False: 149k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   317k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 317k]
  ------------------
  615|   317k|        return false;
  616|   317k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   149k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 149k]
  ------------------
  621|   149k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   149k|      BucketNo += ProbeAmt++;
  627|   149k|      BucketNo &= (NumBuckets-1);
  628|   149k|    }
  629|   589k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|   817k|  const BucketT *getBuckets() const {
  490|   817k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   817k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|   589k|  static unsigned getHashValue(const KeyT &Val) {
  418|   589k|    return KeyInfoT::getHashValue(Val);
  419|   589k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjS4_EEE8getFirstEv:
   48|  1.58M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIS4_JEEEPSC_SG_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|   267k|                                BucketT *TheBucket) {
  540|   267k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   267k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   267k|    unsigned NumBuckets = getNumBuckets();
  553|   267k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   267k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 114k, False: 153k]
  |  |  ------------------
  ------------------
  554|   114k|      this->grow(NumBuckets * 2);
  555|   114k|      LookupBucketFor(Lookup, TheBucket);
  556|   114k|      NumBuckets = getNumBuckets();
  557|   153k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   153k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153k]
  |  |  ------------------
  ------------------
  558|   153k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   267k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   267k|    const KeyT EmptyKey = getEmptyKey();
  570|   267k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 267k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   267k|    return TheBucket;
  574|   267k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   584k|  unsigned getNumEntries() const {
  458|   584k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   584k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   584k|  unsigned getNumEntries() const {
  772|   584k|    return NumEntries;
  773|   584k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|   114k|  void grow(unsigned AtLeast) {
  510|   114k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   114k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|   114k|  void grow(unsigned AtLeast) {
  737|   114k|    unsigned OldNumBuckets = NumBuckets;
  738|   114k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   114k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   114k|    assert(Buckets);
  742|   114k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 114k, False: 20]
  ------------------
  743|   114k|      this->BaseT::initEmpty();
  744|   114k|      return;
  745|   114k|    }
  746|       |
  747|     20|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     20|    operator delete(OldBuckets);
  751|     20|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E18moveFromOldBucketsEPSC_SF_:
  369|     20|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     20|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     20|    const KeyT EmptyKey = getEmptyKey();
  374|     20|    const KeyT TombstoneKey = getTombstoneKey();
  375|  65.5k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 65.5k, False: 20]
  ------------------
  376|  65.5k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 49.1k, False: 16.4k]
  ------------------
  377|  65.5k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 49.1k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  49.1k|        BucketT *DestBucket;
  380|  49.1k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  49.1k|        (void)FoundVal; // silence warning.
  382|  49.1k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  49.1k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  49.1k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  49.1k|        B->getSecond().~ValueT();
  389|  49.1k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  65.5k|    }
  392|     20|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|   153k|  unsigned getNumTombstones() const {
  474|   153k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   153k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|   153k|  unsigned getNumTombstones() const {
  780|   153k|    return NumTombstones;
  781|   153k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|   317k|  void incrementNumEntries() {
  466|   317k|    setNumEntries(getNumEntries() + 1);
  467|   317k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixEOS4_:
  315|     36|  ValueT &operator[](KeyT &&Key) {
  316|     36|    return FindAndConstruct(std::move(Key)).second;
  317|     36|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructEOS4_:
  307|     36|  value_type& FindAndConstruct(KeyT &&Key) {
  308|     36|    BucketT *TheBucket;
  309|     36|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 36, False: 0]
  ------------------
  310|     36|      return *TheBucket;
  311|       |
  312|      0|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|     36|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|     86|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     86|    const BucketT *ConstFoundBucket;
  634|     86|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     86|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     86|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     86|    return Result;
  638|     86|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|     86|                       const BucketT *&FoundBucket) const {
  583|     86|    const BucketT *BucketsPtr = getBuckets();
  584|     86|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|     86|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 84]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|     84|    const BucketT *FoundTombstone = nullptr;
  593|     84|    const KeyT EmptyKey = getEmptyKey();
  594|     84|    const KeyT TombstoneKey = getTombstoneKey();
  595|     84|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|     84|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|     84|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|     84|    unsigned ProbeAmt = 1;
  601|     84|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|     84|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|     84|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|     84|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 72, False: 12]
  |  |  ------------------
  ------------------
  605|     72|        FoundBucket = ThisBucket;
  606|     72|        return true;
  607|     72|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     12|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     12|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 12, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     12|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 12]
  ------------------
  615|     12|        return false;
  616|     12|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|     84|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  489|     86|  const BucketT *getBuckets() const {
  490|     86|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|     86|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueERKS4_:
  417|     84|  static unsigned getHashValue(const KeyT &Val) {
  418|     84|    return KeyInfoT::getHashValue(Val);
  419|     84|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes9CatchInstENS2_17CatchCoverageInfoEE8getFirstEv:
   48|     96|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|     12|                                BucketT *TheBucket) {
  540|     12|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     12|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     12|    unsigned NumBuckets = getNumBuckets();
  553|     12|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     12|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 10]
  |  |  ------------------
  ------------------
  554|      2|      this->grow(NumBuckets * 2);
  555|      2|      LookupBucketFor(Lookup, TheBucket);
  556|      2|      NumBuckets = getNumBuckets();
  557|     10|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  558|     10|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     12|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     12|    const KeyT EmptyKey = getEmptyKey();
  570|     12|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 12]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     12|    return TheBucket;
  574|     12|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumEntriesEv:
  457|   114k|  unsigned getNumEntries() const {
  458|   114k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumEntriesEv:
  771|   114k|  unsigned getNumEntries() const {
  772|   114k|    return NumEntries;
  773|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E4growEj:
  509|      2|  void grow(unsigned AtLeast) {
  510|      2|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      2|  }
_ZN4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4growEj:
  736|      2|  void grow(unsigned AtLeast) {
  737|      2|    unsigned OldNumBuckets = NumBuckets;
  738|      2|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      2|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      2|    assert(Buckets);
  742|      2|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 2, False: 0]
  ------------------
  743|      2|      this->BaseT::initEmpty();
  744|      2|      return;
  745|      2|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16getNumTombstonesEv:
  473|     10|  unsigned getNumTombstones() const {
  474|     10|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     10|  }
_ZNK4llvh8DenseMapIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16getNumTombstonesEv:
  779|     10|  unsigned getNumTombstones() const {
  780|     10|    return NumTombstones;
  781|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E19incrementNumEntriesEv:
  465|     12|  void incrementNumEntries() {
  466|     12|    setNumEntries(getNumEntries() + 1);
  467|     12|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   114k|  unsigned getNumEntries() const {
  458|   114k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes13SwitchImmInstENS1_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   114k|  unsigned getNumEntries() const {
  772|   114k|    return NumEntries;
  773|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixERKS4_:
  303|   193k|  ValueT &operator[](const KeyT &Key) {
  304|   193k|    return FindAndConstruct(Key).second;
  305|   193k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructERKS4_:
  295|   193k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   193k|    BucketT *TheBucket;
  297|   193k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 39.3k, False: 153k]
  ------------------
  298|  39.3k|      return *TheBucket;
  299|       |
  300|   153k|    return *InsertIntoBucket(TheBucket, Key);
  301|   193k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIRKS4_JEEEPSC_SI_OT_DpOT0_:
  519|   153k|                            ValueArgs &&... Values) {
  520|   153k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   153k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   153k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   153k|    return TheBucket;
  525|   153k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5emptyEv:
   99|   114k|  LLVM_NODISCARD bool empty() const {
  100|   114k|    return getNumEntries() == 0;
  101|   114k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|      2|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|      2|  void init(unsigned InitNumEntries) {
  727|      2|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|      2|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 2]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|      2|    } else {
  731|      2|      NumEntries = 0;
  732|      2|      NumTombstones = 0;
  733|      2|    }
  734|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|      2|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|      2|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 2, False: 0]
  ------------------
  363|      2|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|      2|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|     22|  bool allocateBuckets(unsigned Num) {
  796|     22|    NumBuckets = Num;
  797|     22|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 2, False: 20]
  ------------------
  798|      2|      Buckets = nullptr;
  799|      2|      return false;
  800|      2|    }
  801|       |
  802|     20|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     20|    return true;
  804|     22|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|     20|  void initEmpty() {
  348|     20|    setNumEntries(0);
  349|     20|    setNumTombstones(0);
  350|       |
  351|     20|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     20|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|   130k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 130k, False: 20]
  ------------------
  355|   130k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     20|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|  88.3k|  void setNumEntries(unsigned Num) {
  462|  88.3k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  88.3k|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|  88.3k|  void setNumEntries(unsigned Num) {
  776|  88.3k|    NumEntries = Num;
  777|  88.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|     20|  void setNumTombstones(unsigned Num) {
  478|     20|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     20|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|     20|  void setNumTombstones(unsigned Num) {
  784|     20|    NumTombstones = Num;
  785|     20|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|   127k|  unsigned getNumBuckets() const {
  498|   127k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   127k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|   127k|  unsigned getNumBuckets() const {
  792|   127k|    return NumBuckets;
  793|   127k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|   127k|  static const KeyT getEmptyKey() {
  427|   127k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   127k|                  "Must pass the derived type to this template!");
  429|   127k|    return KeyInfoT::getEmptyKey();
  430|   127k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|    116|  BucketT *getBuckets() {
  494|    116|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    116|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|  88.5k|  BucketT *getBuckets() const {
  788|  88.5k|    return Buckets;
  789|  88.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|     94|  BucketT *getBucketsEnd() {
  502|     94|    return getBuckets() + getNumBuckets();
  503|     94|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE8getFirstEv:
   47|   706k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|      2|  ~DenseMap() {
  688|      2|    this->destroyAll();
  689|      2|    operator delete(Buckets);
  690|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|      2|  void destroyAll() {
  335|      2|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 2]
  ------------------
  336|      0|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  65.5k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 65.5k, False: 2]
  ------------------
  340|  65.5k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 39.3k, False: 26.2k]
  ------------------
  341|  65.5k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 39.3k, False: 0]
  ------------------
  342|  39.3k|        P->getSecond().~ValueT();
  343|  65.5k|      P->getFirst().~KeyT();
  344|  65.5k|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|  88.4k|  static const KeyT getTombstoneKey() {
  433|  88.4k|    return KeyInfoT::getTombstoneKey();
  434|  88.4k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE9getSecondEv:
   49|   225k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5beginEv:
   76|      2|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|      2|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 2]
  ------------------
   80|      0|      return end();
   81|      2|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 2]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|      2|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|      2|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5emptyEv:
   99|      2|  LLVM_NODISCARD bool empty() const {
  100|      2|    return getNumEntries() == 0;
  101|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|   228k|                        bool NoAdvance=false) {
  440|   228k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 228k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   228k|    return iterator(P, E, Epoch, NoAdvance);
  445|   228k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1139|   228k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   228k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   228k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 228k, False: 2]
  ------------------
 1143|      2|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 2]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      2|    AdvancePastEmptyBuckets();
 1148|      2|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|  39.3k|  void AdvancePastEmptyBuckets() {
 1205|  39.3k|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|  39.3k|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|  65.5k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 65.5k, False: 2]
  |  Branch (1209:27): [True: 26.2k, False: 39.3k]
  ------------------
 1210|  65.5k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 39.3k]
  ------------------
 1211|  26.2k|      ++Ptr;
 1212|  39.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   85|   228k|  inline iterator end() {
   86|   228k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   228k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEC2ILb0EvEERKNS0_IS3_S6_S8_SB_XT_EEE:
 1157|   153k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEneERKNS0_IS3_S6_S8_SB_Lb1EEE:
 1179|  39.3k|  bool operator!=(const ConstIterator &RHS) const {
 1180|  39.3k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  39.3k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  39.3k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEppEv:
 1187|  39.3k|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|  39.3k|    assert(isHandleInSync() && "invalid iterator access!");
 1189|  39.3k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 39.3k]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|  39.3k|    ++Ptr;
 1195|  39.3k|    AdvancePastEmptyBuckets();
 1196|  39.3k|    return *this;
 1197|  39.3k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEdeEv:
 1159|  39.3k|  reference operator*() const {
 1160|  39.3k|    assert(isHandleInSync() && "invalid iterator access!");
 1161|  39.3k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1161:9): [True: 0, False: 39.3k]
  ------------------
 1162|      0|      return Ptr[-1];
 1163|  39.3k|    return *Ptr;
 1164|  39.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_EixERKS4_:
  303|  39.3k|  ValueT &operator[](const KeyT &Key) {
  304|  39.3k|    return FindAndConstruct(Key).second;
  305|  39.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16FindAndConstructERKS4_:
  295|  39.3k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  39.3k|    BucketT *TheBucket;
  297|  39.3k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 39.3k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|  39.3k|    return *InsertIntoBucket(TheBucket, Key);
  301|  39.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|  88.3k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  88.3k|    const BucketT *ConstFoundBucket;
  634|  88.3k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  88.3k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  88.3k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  88.3k|    return Result;
  638|  88.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|  88.3k|                       const BucketT *&FoundBucket) const {
  583|  88.3k|    const BucketT *BucketsPtr = getBuckets();
  584|  88.3k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  88.3k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 88.3k]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  88.3k|    const BucketT *FoundTombstone = nullptr;
  593|  88.3k|    const KeyT EmptyKey = getEmptyKey();
  594|  88.3k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  88.3k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  88.3k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  88.3k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  88.3k|    unsigned ProbeAmt = 1;
  601|   521k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   521k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   521k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   521k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 521k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   521k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   521k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 88.3k, False: 433k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  88.3k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 88.3k]
  ------------------
  615|  88.3k|        return false;
  616|  88.3k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   433k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 433k]
  ------------------
  621|   433k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   433k|      BucketNo += ProbeAmt++;
  627|   433k|      BucketNo &= (NumBuckets-1);
  628|   433k|    }
  629|  88.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|  88.4k|  const BucketT *getBuckets() const {
  490|  88.4k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  88.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|  88.3k|  static unsigned getHashValue(const KeyT &Val) {
  418|  88.3k|    return KeyInfoT::getHashValue(Val);
  419|  88.3k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENSt3__14pairIjjEEE8getFirstEv:
   48|  1.47M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIRKS4_JEEEPSC_SI_OT_DpOT0_:
  519|  39.3k|                            ValueArgs &&... Values) {
  520|  39.3k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  39.3k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  39.3k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  39.3k|    return TheBucket;
  525|  39.3k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|  39.3k|                                BucketT *TheBucket) {
  540|  39.3k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  39.3k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  39.3k|    unsigned NumBuckets = getNumBuckets();
  553|  39.3k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  39.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 20, False: 39.2k]
  |  |  ------------------
  ------------------
  554|     20|      this->grow(NumBuckets * 2);
  555|     20|      LookupBucketFor(Lookup, TheBucket);
  556|     20|      NumBuckets = getNumBuckets();
  557|  39.2k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  39.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 39.2k]
  |  |  ------------------
  ------------------
  558|  39.2k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  39.3k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  39.3k|    const KeyT EmptyKey = getEmptyKey();
  570|  39.3k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 39.3k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  39.3k|    return TheBucket;
  574|  39.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   127k|  unsigned getNumEntries() const {
  458|   127k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   127k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   127k|  unsigned getNumEntries() const {
  772|   127k|    return NumEntries;
  773|   127k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|     20|  void grow(unsigned AtLeast) {
  510|     20|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     20|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|     20|  void grow(unsigned AtLeast) {
  737|     20|    unsigned OldNumBuckets = NumBuckets;
  738|     20|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     20|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     20|    assert(Buckets);
  742|     20|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 2, False: 18]
  ------------------
  743|      2|      this->BaseT::initEmpty();
  744|      2|      return;
  745|      2|    }
  746|       |
  747|     18|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     18|    operator delete(OldBuckets);
  751|     18|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E18moveFromOldBucketsEPSC_SF_:
  369|     18|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     18|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     18|    const KeyT EmptyKey = getEmptyKey();
  374|     18|    const KeyT TombstoneKey = getTombstoneKey();
  375|  65.4k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 65.4k, False: 18]
  ------------------
  376|  65.4k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 49.0k, False: 16.3k]
  ------------------
  377|  65.4k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 49.0k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  49.0k|        BucketT *DestBucket;
  380|  49.0k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  49.0k|        (void)FoundVal; // silence warning.
  382|  49.0k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  49.0k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  49.0k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  49.0k|        B->getSecond().~ValueT();
  389|  49.0k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  65.4k|    }
  392|     18|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|  39.2k|  unsigned getNumTombstones() const {
  474|  39.2k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  39.2k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|  39.2k|  unsigned getNumTombstones() const {
  780|  39.2k|    return NumTombstones;
  781|  39.2k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|  88.3k|  void incrementNumEntries() {
  466|  88.3k|    setNumEntries(getNumEntries() + 1);
  467|  88.3k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes13SwitchImmInstENS2_3hbc7HBCISel13SwitchImmInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5emptyEv:
   99|   114k|  LLVM_NODISCARD bool empty() const {
  100|   114k|    return getNumEntries() == 0;
  101|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixERKS4_:
  303|     48|  ValueT &operator[](const KeyT &Key) {
  304|     48|    return FindAndConstruct(Key).second;
  305|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructERKS4_:
  295|     48|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     48|    BucketT *TheBucket;
  297|     48|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 36, False: 12]
  ------------------
  298|     36|      return *TheBucket;
  299|       |
  300|     12|    return *InsertIntoBucket(TheBucket, Key);
  301|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16InsertIntoBucketIRKS4_JEEEPSA_SG_OT_DpOT0_:
  519|     12|                            ValueArgs &&... Values) {
  520|     12|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     12|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     12|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     12|    return TheBucket;
  525|     12|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes10BasicBlockENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS5_EENS6_12DenseSetPairIS5_EEEES5_S7_S9_SB_E5countES5_:
  149|   153k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   153k|    const BucketT *TheBucket;
  151|   153k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 114k, False: 39.5k]
  ------------------
  152|   153k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  154|   114k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   114k|    BucketT *TheBucket;
  156|   114k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 114k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   114k|    return end();
  159|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPSC_:
  632|   114k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   114k|    const BucketT *ConstFoundBucket;
  634|   114k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   114k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   114k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   114k|    return Result;
  638|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|   114k|                       const BucketT *&FoundBucket) const {
  583|   114k|    const BucketT *BucketsPtr = getBuckets();
  584|   114k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 114k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   114k|    const BucketT *FoundTombstone = nullptr;
  593|   114k|    const KeyT EmptyKey = getEmptyKey();
  594|   114k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   114k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   114k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   114k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   114k|    unsigned ProbeAmt = 1;
  601|   115k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   115k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   115k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   115k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 115k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   115k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   115k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 1.68k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   114k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 114k]
  ------------------
  615|   114k|        return false;
  616|   114k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  1.68k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.68k]
  ------------------
  621|  1.68k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  1.68k|      BucketNo += ProbeAmt++;
  627|  1.68k|      BucketNo &= (NumBuckets-1);
  628|  1.68k|    }
  629|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjS4_EENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueIPKS3_EEjRKT_:
  422|   114k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   114k|    return KeyInfoT::getHashValue(Val);
  424|   114k|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjS3_EENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEeqERKNS0_IS3_S6_S8_SB_Lb1EEE:
 1172|   114k|  bool operator==(const ConstIterator &RHS) const {
 1173|   114k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   114k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_EixERKj:
  303|   135k|  ValueT &operator[](const KeyT &Key) {
  304|   135k|    return FindAndConstruct(Key).second;
  305|   135k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16FindAndConstructERKj:
  295|   135k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   135k|    BucketT *TheBucket;
  297|   135k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 72.5k, False: 63.0k]
  ------------------
  298|  72.5k|      return *TheBucket;
  299|       |
  300|  63.0k|    return *InsertIntoBucket(TheBucket, Key);
  301|   135k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15LookupBucketForIjEEbRKT_RPS6_:
  632|   198k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   198k|    const BucketT *ConstFoundBucket;
  634|   198k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   198k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   198k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   198k|    return Result;
  638|   198k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E15LookupBucketForIjEEbRKT_RPKS6_:
  582|   198k|                       const BucketT *&FoundBucket) const {
  583|   198k|    const BucketT *BucketsPtr = getBuckets();
  584|   198k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   198k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 62.5k, False: 135k]
  ------------------
  587|  62.5k|      FoundBucket = nullptr;
  588|  62.5k|      return false;
  589|  62.5k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   135k|    const BucketT *FoundTombstone = nullptr;
  593|   135k|    const KeyT EmptyKey = getEmptyKey();
  594|   135k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   135k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   135k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   135k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   135k|    unsigned ProbeAmt = 1;
  601|   135k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   135k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   135k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   135k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 72.5k, False: 63.0k]
  |  |  ------------------
  ------------------
  605|  72.5k|        FoundBucket = ThisBucket;
  606|  72.5k|        return true;
  607|  72.5k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  63.0k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  63.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 63.0k, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  63.0k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 63.0k]
  ------------------
  615|  63.0k|        return false;
  616|  63.0k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|   135k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E10getBucketsEv:
  489|   198k|  const BucketT *getBuckets() const {
  490|   198k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   198k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E12getHashValueERKj:
  417|   135k|  static unsigned getHashValue(const KeyT &Val) {
  418|   135k|    return KeyInfoT::getHashValue(Val);
  419|   135k|  }
_ZNK4llvh6detail12DenseMapPairIjhE8getFirstEv:
   48|   198k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16InsertIntoBucketIRKjJEEEPS6_SC_OT_DpOT0_:
  519|  63.0k|                            ValueArgs &&... Values) {
  520|  63.0k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  63.0k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  63.0k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  63.0k|    return TheBucket;
  525|  63.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E20InsertIntoBucketImplIjEEPS6_RKjRKT_SA_:
  539|  63.0k|                                BucketT *TheBucket) {
  540|  63.0k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  63.0k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  63.0k|    unsigned NumBuckets = getNumBuckets();
  553|  63.0k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  63.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 62.5k, False: 482]
  |  |  ------------------
  ------------------
  554|  62.5k|      this->grow(NumBuckets * 2);
  555|  62.5k|      LookupBucketFor(Lookup, TheBucket);
  556|  62.5k|      NumBuckets = getNumBuckets();
  557|  62.5k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    482|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 482]
  |  |  ------------------
  ------------------
  558|    482|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  63.0k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  63.0k|    const KeyT EmptyKey = getEmptyKey();
  570|  63.0k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 63.0k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  63.0k|    return TheBucket;
  574|  63.0k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E13getNumEntriesEv:
  457|   126k|  unsigned getNumEntries() const {
  458|   126k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   126k|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE13getNumEntriesEv:
  771|   126k|  unsigned getNumEntries() const {
  772|   126k|    return NumEntries;
  773|   126k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E4growEj:
  509|  62.5k|  void grow(unsigned AtLeast) {
  510|  62.5k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|  62.5k|  }
_ZN4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE4growEj:
  736|  62.5k|  void grow(unsigned AtLeast) {
  737|  62.5k|    unsigned OldNumBuckets = NumBuckets;
  738|  62.5k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|  62.5k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|  62.5k|    assert(Buckets);
  742|  62.5k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 62.5k, False: 0]
  ------------------
  743|  62.5k|      this->BaseT::initEmpty();
  744|  62.5k|      return;
  745|  62.5k|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E16getNumTombstonesEv:
  473|    482|  unsigned getNumTombstones() const {
  474|    482|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    482|  }
_ZNK4llvh8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEE16getNumTombstonesEv:
  779|    482|  unsigned getNumTombstones() const {
  780|    482|    return NumTombstones;
  781|    482|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIjhNS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjhEEEEjhS3_S6_E19incrementNumEntriesEv:
  465|  63.0k|  void incrementNumEntries() {
  466|  63.0k|    setNumEntries(getNumEntries() + 1);
  467|  63.0k|  }
_ZN4llvh8DenseMapINS_9StringRefEjNS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_jEEEaSEOS7_:
  707|     56|  DenseMap& operator=(DenseMap &&other) {
  708|     56|    this->destroyAll();
  709|     56|    operator delete(Buckets);
  710|     56|    init(0);
  711|     56|    swap(other);
  712|     56|    return *this;
  713|     56|  }
_ZN4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1139|  22.8k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  22.8k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  22.8k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 22.8k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh16DenseMapIteratorINSt3__14pairINS_9StringRefES3_EEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEELb1EEC2ILb0EvEERKNS0_IS4_jS6_S9_XT_EEE:
 1157|  11.4k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 45, False: 11]
  ------------------
  336|     45|      return;
  337|       |
  338|     11|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    715|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 704, False: 11]
  ------------------
  340|    704|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 62, False: 642]
  ------------------
  341|    704|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 62, False: 0]
  ------------------
  342|     62|        P->getSecond().~ValueT();
  343|    704|      P->getFirst().~KeyT();
  344|    704|    }
  345|     11|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumBucketsEv:
  497|   228k|  unsigned getNumBuckets() const {
  498|   228k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   228k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumBucketsEv:
  791|   228k|  unsigned getNumBuckets() const {
  792|   228k|    return NumBuckets;
  793|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11getEmptyKeyEv:
  426|   114k|  static const KeyT getEmptyKey() {
  427|   114k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   114k|                  "Must pass the derived type to this template!");
  429|   114k|    return KeyInfoT::getEmptyKey();
  430|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15getTombstoneKeyEv:
  432|   114k|  static const KeyT getTombstoneKey() {
  433|   114k|    return KeyInfoT::getTombstoneKey();
  434|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  493|   114k|  BucketT *getBuckets() {
  494|   114k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE10getBucketsEv:
  787|   228k|  BucketT *getBuckets() const {
  788|   228k|    return Buckets;
  789|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getBucketsEndEv:
  501|   114k|  BucketT *getBucketsEnd() {
  502|   114k|    return getBuckets() + getNumBuckets();
  503|   114k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE8getFirstEv:
   47|  2.29k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE9getSecondEv:
   49|    124|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4findEPKS3_:
  154|   343k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   343k|    BucketT *TheBucket;
  156|   343k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 228k, False: 114k]
  ------------------
  157|   228k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   114k|    return end();
  159|   343k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPS9_:
  632|   343k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   343k|    const BucketT *ConstFoundBucket;
  634|   343k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   343k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   343k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   343k|    return Result;
  638|   343k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|   343k|                       const BucketT *&FoundBucket) const {
  583|   343k|    const BucketT *BucketsPtr = getBuckets();
  584|   343k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   343k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 343k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   343k|    const BucketT *FoundTombstone = nullptr;
  593|   343k|    const KeyT EmptyKey = getEmptyKey();
  594|   343k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   343k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   343k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   343k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   343k|    unsigned ProbeAmt = 1;
  601|   571k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   571k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   571k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   571k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 228k, False: 342k]
  |  |  ------------------
  ------------------
  605|   228k|        FoundBucket = ThisBucket;
  606|   228k|        return true;
  607|   228k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   342k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   342k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 227k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   114k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 114k]
  ------------------
  615|   114k|        return false;
  616|   114k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   227k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 227k]
  ------------------
  621|   227k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   227k|      BucketNo += ProbeAmt++;
  627|   227k|      BucketNo &= (NumBuckets-1);
  628|   227k|    }
  629|   343k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|   631k|  const BucketT *getBuckets() const {
  490|   631k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   631k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|   343k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   343k|    return KeyInfoT::getHashValue(Val);
  424|   343k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes8FunctionEjE8getFirstEv:
   48|  2.34M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|   687k|                        bool NoAdvance=false) {
  440|   687k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 687k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   687k|    return iterator(P, E, Epoch, NoAdvance);
  445|   687k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1139|   687k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   687k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   687k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 687k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEneERKNS0_IS3_jS5_S8_Lb1EEE:
 1179|   343k|  bool operator!=(const ConstIterator &RHS) const {
 1180|   343k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|   343k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|   343k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E3endEv:
   85|   458k|  inline iterator end() {
   86|   458k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   458k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb1EEC2ILb0EvEERKNS0_IS3_jS5_S8_XT_EEE:
 1157|   343k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1165|   228k|  pointer operator->() const {
 1166|   228k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   228k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 228k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   228k|    return Ptr;
 1170|   228k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4sizeEv:
  102|   114k|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|   517k|  unsigned getNumEntries() const {
  458|   517k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   517k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|   517k|  unsigned getNumEntries() const {
  772|   517k|    return NumEntries;
  773|   517k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_EixERKS4_:
  303|   114k|  ValueT &operator[](const KeyT &Key) {
  304|   114k|    return FindAndConstruct(Key).second;
  305|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16FindAndConstructERKS4_:
  295|   114k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   114k|    BucketT *TheBucket;
  297|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 114k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   114k|    return *InsertIntoBucket(TheBucket, Key);
  301|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|   287k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   287k|    const BucketT *ConstFoundBucket;
  634|   287k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   287k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   287k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   287k|    return Result;
  638|   287k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|   287k|                       const BucketT *&FoundBucket) const {
  583|   287k|    const BucketT *BucketsPtr = getBuckets();
  584|   287k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   287k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 287k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   287k|    const BucketT *FoundTombstone = nullptr;
  593|   287k|    const KeyT EmptyKey = getEmptyKey();
  594|   287k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   287k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   287k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   287k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   287k|    unsigned ProbeAmt = 1;
  601|   495k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   495k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   495k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   495k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 495k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   495k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   495k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 287k, False: 207k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   287k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 287k]
  ------------------
  615|   287k|        return false;
  616|   287k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   207k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 207k]
  ------------------
  621|   207k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   207k|      BucketNo += ProbeAmt++;
  627|   207k|      BucketNo &= (NumBuckets-1);
  628|   207k|    }
  629|   287k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|   287k|  static unsigned getHashValue(const KeyT &Val) {
  418|   287k|    return KeyInfoT::getHashValue(Val);
  419|   287k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|   114k|                                BucketT *TheBucket) {
  540|   114k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   114k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   114k|    unsigned NumBuckets = getNumBuckets();
  553|   114k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 104, False: 114k]
  |  |  ------------------
  ------------------
  554|    104|      this->grow(NumBuckets * 2);
  555|    104|      LookupBucketFor(Lookup, TheBucket);
  556|    104|      NumBuckets = getNumBuckets();
  557|   114k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  558|   114k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   114k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   114k|    const KeyT EmptyKey = getEmptyKey();
  570|   114k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 114k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   114k|    return TheBucket;
  574|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|    104|  void grow(unsigned AtLeast) {
  510|    104|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    104|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|    104|  void grow(unsigned AtLeast) {
  737|    104|    unsigned OldNumBuckets = NumBuckets;
  738|    104|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    104|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    104|    assert(Buckets);
  742|    104|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 48]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|     48|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     48|    operator delete(OldBuckets);
  751|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|     48|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     48|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     48|    const KeyT EmptyKey = getEmptyKey();
  374|     48|    const KeyT TombstoneKey = getTombstoneKey();
  375|   230k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 230k, False: 48]
  ------------------
  376|   230k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 172k, False: 57.7k]
  ------------------
  377|   230k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 172k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   172k|        BucketT *DestBucket;
  380|   172k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   172k|        (void)FoundVal; // silence warning.
  382|   172k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   172k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   172k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   172k|        B->getSecond().~ValueT();
  389|   172k|      }
  390|      0|      B->getFirst().~KeyT();
  391|   230k|    }
  392|     48|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|   114k|  unsigned getNumTombstones() const {
  474|   114k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|   114k|  unsigned getNumTombstones() const {
  780|   114k|    return NumTombstones;
  781|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|   287k|  void incrementNumEntries() {
  466|   287k|    setNumEntries(getNumEntries() + 1);
  467|   287k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4findEPKS3_:
  154|   114k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   114k|    BucketT *TheBucket;
  156|   114k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 114k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   114k|    return end();
  159|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPSG_:
  632|   114k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   114k|    const BucketT *ConstFoundBucket;
  634|   114k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   114k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   114k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   114k|    return Result;
  638|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIPKS3_EEbRKT_RPKSG_:
  582|   114k|                       const BucketT *&FoundBucket) const {
  583|   114k|    const BucketT *BucketsPtr = getBuckets();
  584|   114k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 114k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   114k|    const BucketT *FoundTombstone = nullptr;
  593|   114k|    const KeyT EmptyKey = getEmptyKey();
  594|   114k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   114k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   114k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   114k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   114k|    unsigned ProbeAmt = 1;
  601|   277k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   277k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   277k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   277k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 277k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   277k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   277k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 162k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   114k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 114k]
  ------------------
  615|   114k|        return false;
  616|   114k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   162k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 162k]
  ------------------
  621|   162k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   162k|      BucketNo += ProbeAmt++;
  627|   162k|      BucketNo &= (NumBuckets-1);
  628|   162k|    }
  629|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E10getBucketsEv:
  489|   517k|  const BucketT *getBuckets() const {
  490|   517k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   517k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueIPKS3_EEjRKT_:
  422|   114k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|   114k|    return KeyInfoT::getHashValue(Val);
  424|   114k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEEE8getFirstEv:
   48|  2.17M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12makeIteratorEPSG_SJ_RNS_14DebugEpochBaseEb:
  439|   229k|                        bool NoAdvance=false) {
  440|   229k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 229k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   229k|    return iterator(P, E, Epoch, NoAdvance);
  445|   229k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb0EEC2EPSF_SH_RKNS_14DebugEpochBaseEb:
 1139|   229k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   229k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   229k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 229k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E3endEv:
   85|   229k|  inline iterator end() {
   86|   229k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   229k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEC2ILb0EvEERKNS0_IS3_SA_SC_SF_XT_EEE:
 1157|   114k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb0EEeqERKNS0_IS3_SA_SC_SF_Lb1EEE:
 1172|   114k|  bool operator==(const ConstIterator &RHS) const {
 1173|   114k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   114k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_EixERKS4_:
  303|   229k|  ValueT &operator[](const KeyT &Key) {
  304|   229k|    return FindAndConstruct(Key).second;
  305|   229k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16FindAndConstructERKS4_:
  295|   229k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   229k|    BucketT *TheBucket;
  297|   229k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 114k, False: 114k]
  ------------------
  298|   114k|      return *TheBucket;
  299|       |
  300|   114k|    return *InsertIntoBucket(TheBucket, Key);
  301|   229k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPSG_:
  632|   402k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   402k|    const BucketT *ConstFoundBucket;
  634|   402k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   402k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   402k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   402k|    return Result;
  638|   402k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPKSG_:
  582|   402k|                       const BucketT *&FoundBucket) const {
  583|   402k|    const BucketT *BucketsPtr = getBuckets();
  584|   402k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   402k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 402k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   402k|    const BucketT *FoundTombstone = nullptr;
  593|   402k|    const KeyT EmptyKey = getEmptyKey();
  594|   402k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   402k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   402k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   402k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   402k|    unsigned ProbeAmt = 1;
  601|   659k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   659k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   659k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   659k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 544k]
  |  |  ------------------
  ------------------
  605|   114k|        FoundBucket = ThisBucket;
  606|   114k|        return true;
  607|   114k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   544k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   544k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 287k, False: 256k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   287k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 287k]
  ------------------
  615|   287k|        return false;
  616|   287k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   256k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 256k]
  ------------------
  621|   256k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   256k|      BucketNo += ProbeAmt++;
  627|   256k|      BucketNo &= (NumBuckets-1);
  628|   256k|    }
  629|   402k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueERKS4_:
  417|   402k|  static unsigned getHashValue(const KeyT &Val) {
  418|   402k|    return KeyInfoT::getHashValue(Val);
  419|   402k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16InsertIntoBucketIRKS4_JEEEPSG_SM_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E20InsertIntoBucketImplIS4_EEPSG_RKS4_RKT_SK_:
  539|   114k|                                BucketT *TheBucket) {
  540|   114k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   114k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   114k|    unsigned NumBuckets = getNumBuckets();
  553|   114k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 104, False: 114k]
  |  |  ------------------
  ------------------
  554|    104|      this->grow(NumBuckets * 2);
  555|    104|      LookupBucketFor(Lookup, TheBucket);
  556|    104|      NumBuckets = getNumBuckets();
  557|   114k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  558|   114k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   114k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   114k|    const KeyT EmptyKey = getEmptyKey();
  570|   114k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 114k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   114k|    return TheBucket;
  574|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E13getNumEntriesEv:
  457|   402k|  unsigned getNumEntries() const {
  458|   402k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   402k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE13getNumEntriesEv:
  771|   402k|  unsigned getNumEntries() const {
  772|   402k|    return NumEntries;
  773|   402k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4growEj:
  509|    104|  void grow(unsigned AtLeast) {
  510|    104|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    104|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4growEj:
  736|    104|  void grow(unsigned AtLeast) {
  737|    104|    unsigned OldNumBuckets = NumBuckets;
  738|    104|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    104|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    104|    assert(Buckets);
  742|    104|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 48]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|     48|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     48|    operator delete(OldBuckets);
  751|     48|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E18moveFromOldBucketsEPSG_SJ_:
  369|     48|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     48|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     48|    const KeyT EmptyKey = getEmptyKey();
  374|     48|    const KeyT TombstoneKey = getTombstoneKey();
  375|   230k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 230k, False: 48]
  ------------------
  376|   230k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 172k, False: 57.7k]
  ------------------
  377|   230k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 172k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   172k|        BucketT *DestBucket;
  380|   172k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   172k|        (void)FoundVal; // silence warning.
  382|   172k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   172k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   172k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   172k|        B->getSecond().~ValueT();
  389|   172k|      }
  390|      0|      B->getFirst().~KeyT();
  391|   230k|    }
  392|     48|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16getNumTombstonesEv:
  473|   114k|  unsigned getNumTombstones() const {
  474|   114k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS1_3hbc25BytecodeFunctionGeneratorENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE16getNumTombstonesEv:
  779|   114k|  unsigned getNumTombstones() const {
  780|   114k|    return NumTombstones;
  781|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E19incrementNumEntriesEv:
  465|   287k|  void incrementNumEntries() {
  466|   287k|    setNumEntries(getNumEntries() + 1);
  467|   287k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S8_EEEES5_S8_SA_SD_E5emptyEv:
   99|     56|  LLVM_NODISCARD bool empty() const {
  100|     56|    return getNumEntries() == 0;
  101|     56|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEaSEOSD_:
  707|     56|  DenseMap& operator=(DenseMap &&other) {
  708|     56|    this->destroyAll();
  709|     56|    operator delete(Buckets);
  710|     56|    init(0);
  711|     56|    swap(other);
  712|     56|    return *this;
  713|     56|  }
_ZN4llvh8DenseMapIPKN6hermes11InstructionENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEE4swapERSD_:
  692|     56|  void swap(DenseMap& RHS) {
  693|     56|    this->incrementEpoch();
  694|     56|    RHS.incrementEpoch();
  695|     56|    std::swap(Buckets, RHS.Buckets);
  696|     56|    std::swap(NumEntries, RHS.NumEntries);
  697|     56|    std::swap(NumTombstones, RHS.NumTombstones);
  698|     56|    std::swap(NumBuckets, RHS.NumBuckets);
  699|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes8FunctionENSt3__110unique_ptrINS2_3hbc25BytecodeFunctionGeneratorENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4sizeEv:
  102|    112|  unsigned size() const { return getNumEntries(); }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2Ej:
  837|    495|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|    495|    init(NumInitBuckets);
  839|    495|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEED2Ev:
  857|   168k|  ~SmallDenseMap() {
  858|   168k|    this->destroyAll();
  859|   168k|    deallocateBuckets();
  860|   168k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2ERKS8_:
  841|   167k|  SmallDenseMap(const SmallDenseMap &other) : BaseT() {
  842|   167k|    init(0);
  843|   167k|    copyFrom(other);
  844|   167k|  }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE8copyFromERKS8_:
  948|   167k|  void copyFrom(const SmallDenseMap& other) {
  949|   167k|    this->destroyAll();
  950|   167k|    deallocateBuckets();
  951|   167k|    Small = true;
  952|   167k|    if (other.getNumBuckets() > InlineBuckets) {
  ------------------
  |  Branch (952:9): [True: 0, False: 167k]
  ------------------
  953|      0|      Small = false;
  954|      0|      new (getLargeRep()) LargeRep(allocateBuckets(other.getNumBuckets()));
  955|      0|    }
  956|   167k|    this->BaseT::copyFrom(other);
  957|   167k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E8copyFromIS9_EEvRKNS0_IT_S2_S4_S6_S8_EE:
  396|   167k|      const DenseMapBase<OtherBaseT, KeyT, ValueT, KeyInfoT, BucketT> &other) {
  397|   167k|    assert(&other != this);
  398|      0|    assert(getNumBuckets() == other.getNumBuckets());
  399|       |
  400|      0|    setNumEntries(other.getNumEntries());
  401|   167k|    setNumTombstones(other.getNumTombstones());
  402|       |
  403|   167k|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value)
  ------------------
  |  Branch (403:9): [Folded - Ignored]
  |  Branch (403:35): [Folded - Ignored]
  ------------------
  404|   167k|      memcpy(reinterpret_cast<void *>(getBuckets()), other.getBuckets(),
  405|   167k|             getNumBuckets() * sizeof(BucketT));
  406|      0|    else
  407|      0|      for (size_t i = 0; i < getNumBuckets(); ++i) {
  ------------------
  |  Branch (407:26): [True: 0, False: 0]
  ------------------
  408|      0|        ::new (&getBuckets()[i].getFirst())
  409|      0|            KeyT(other.getBuckets()[i].getFirst());
  410|      0|        if (!KeyInfoT::isEqual(getBuckets()[i].getFirst(), getEmptyKey()) &&
  ------------------
  |  Branch (410:13): [True: 0, False: 0]
  ------------------
  411|      0|            !KeyInfoT::isEqual(getBuckets()[i].getFirst(), getTombstoneKey()))
  ------------------
  |  Branch (411:13): [True: 0, False: 0]
  ------------------
  412|      0|          ::new (&getBuckets()[i].getSecond())
  413|      0|              ValueT(other.getBuckets()[i].getSecond());
  414|      0|      }
  415|   167k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E13getNumEntriesEv:
  457|   167k|  unsigned getNumEntries() const {
  458|   167k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   167k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE13getNumEntriesEv:
 1042|   167k|  unsigned getNumEntries() const {
 1043|   167k|    return NumEntries;
 1044|   167k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E16getNumTombstonesEv:
  473|   167k|  unsigned getNumTombstones() const {
  474|   167k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   167k|  }
_ZNK4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEE16getNumTombstonesEv:
 1052|   167k|  unsigned getNumTombstones() const {
 1053|   167k|    return NumTombstones;
 1054|   167k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E10getBucketsEv:
  489|   854k|  const BucketT *getBuckets() const {
  490|   854k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   854k|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS1_EENS2_12DenseSetPairIS1_EEEC2EOS8_:
  846|    495|  SmallDenseMap(SmallDenseMap &&other) : BaseT() {
  847|    495|    init(0);
  848|    495|    swap(other);
  849|    495|  }
_ZN4llvh8DenseMapINS_9StringRefEPN6hermes12UniqueStringENS_12DenseMapInfoIS1_EENS_6detail12DenseMapPairIS1_S4_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEED2Ev:
  687|     99|  ~DenseMap() {
  688|     99|    this->destroyAll();
  689|     99|    operator delete(Buckets);
  690|     99|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E13getNumBucketsEv:
  497|  2.34k|  unsigned getNumBuckets() const {
  498|  2.34k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE13getNumBucketsEv:
  791|  2.34k|  unsigned getNumBuckets() const {
  792|  2.34k|    return NumBuckets;
  793|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE15allocateBucketsEj:
  795|  2.34k|  bool allocateBuckets(unsigned Num) {
  796|  2.34k|    NumBuckets = Num;
  797|  2.34k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 2.34k, False: 0]
  ------------------
  798|  2.34k|      Buckets = nullptr;
  799|  2.34k|      return false;
  800|  2.34k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E13getNumBucketsEv:
  497|    696|  unsigned getNumBuckets() const {
  498|    696|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|    696|  }
ConsecutiveStringStorage.cpp:_ZNK4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE13getNumBucketsEv:
  791|    696|  unsigned getNumBuckets() const {
  792|    696|    return NumBuckets;
  793|    696|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE15allocateBucketsEj:
  795|    696|  bool allocateBuckets(unsigned Num) {
  796|    696|    NumBuckets = Num;
  797|    696|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 696, False: 0]
  ------------------
  798|    696|      Buckets = nullptr;
  799|    696|      return false;
  800|    696|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|    696|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEED2Ev:
  687|    696|  ~DenseMap() {
  688|    696|    this->destroyAll();
  689|    696|    operator delete(Buckets);
  690|    696|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E10destroyAllEv:
  334|    696|  void destroyAll() {
  335|    696|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 696, False: 0]
  ------------------
  336|    696|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEED2Ev:
  687|  2.34k|  ~DenseMap() {
  688|  2.34k|    this->destroyAll();
  689|  2.34k|    operator delete(Buckets);
  690|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E10destroyAllEv:
  334|  2.34k|  void destroyAll() {
  335|  2.34k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 2.34k, False: 0]
  ------------------
  336|  2.34k|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2Ej:
  669|  1.04k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4initEj:
  726|  2.34k|  void init(unsigned InitNumEntries) {
  727|  2.34k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|  2.34k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 2.34k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|  2.34k|    } else {
  731|  2.34k|      NumEntries = 0;
  732|  2.34k|      NumTombstones = 0;
  733|  2.34k|    }
  734|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E31getMinBucketToReserveForEntriesEj:
  360|  2.34k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|  2.34k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 2.34k, False: 0]
  ------------------
  363|  2.34k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|  2.34k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2EOSD_:
  676|  1.30k|  DenseMap(DenseMap &&other) : BaseT() {
  677|  1.30k|    init(0);
  678|  1.30k|    swap(other);
  679|  1.30k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4swapERSD_:
  692|  1.30k|  void swap(DenseMap& RHS) {
  693|  1.30k|    this->incrementEpoch();
  694|  1.30k|    RHS.incrementEpoch();
  695|  1.30k|    std::swap(Buckets, RHS.Buckets);
  696|  1.30k|    std::swap(NumEntries, RHS.NumEntries);
  697|  1.30k|    std::swap(NumTombstones, RHS.NumTombstones);
  698|  1.30k|    std::swap(NumBuckets, RHS.NumBuckets);
  699|  1.30k|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2Ej:
  669|    273|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4initEj:
  726|    696|  void init(unsigned InitNumEntries) {
  727|    696|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|    696|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 696]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|    696|    } else {
  731|    696|      NumEntries = 0;
  732|    696|      NumTombstones = 0;
  733|    696|    }
  734|    696|  }
ConsecutiveStringStorage.cpp:_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS7_EENS8_12DenseSetPairIS7_EEEES7_S9_SB_SD_E31getMinBucketToReserveForEntriesEj:
  360|    696|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|    696|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 696, False: 0]
  ------------------
  363|    696|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|    696|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEEC2EOSD_:
  676|    423|  DenseMap(DenseMap &&other) : BaseT() {
  677|    423|    init(0);
  678|    423|    swap(other);
  679|    423|  }
ConsecutiveStringStorage.cpp:_ZN4llvh8DenseMapIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS6_EENS7_12DenseSetPairIS6_EEE4swapERSD_:
  692|    423|  void swap(DenseMap& RHS) {
  693|    423|    this->incrementEpoch();
  694|    423|    RHS.incrementEpoch();
  695|    423|    std::swap(Buckets, RHS.Buckets);
  696|    423|    std::swap(NumEntries, RHS.NumEntries);
  697|    423|    std::swap(NumTombstones, RHS.NumTombstones);
  698|    423|    std::swap(NumBuckets, RHS.NumBuckets);
  699|    423|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E11try_emplaceIJmEEENSt3__14pairINS_16DenseMapIteratorIS4_jS6_S9_Lb0EEEbEEOS4_DpOT_:
  214|   114k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|   114k|    BucketT *TheBucket;
  216|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 114k, False: 62]
  ------------------
  217|   114k|      return std::make_pair(
  218|   114k|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  219|   114k|               false); // Already in map.
  220|       |
  221|       |    // Otherwise, insert the new element.
  222|     62|    TheBucket =
  223|     62|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|     62|    return std::make_pair(
  225|     62|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|     62|             true);
  227|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|   114k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   114k|    const BucketT *ConstFoundBucket;
  634|   114k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   114k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   114k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   114k|    return Result;
  638|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|   114k|                       const BucketT *&FoundBucket) const {
  583|   114k|    const BucketT *BucketsPtr = getBuckets();
  584|   114k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 11, False: 114k]
  ------------------
  587|     11|      FoundBucket = nullptr;
  588|     11|      return false;
  589|     11|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   114k|    const BucketT *FoundTombstone = nullptr;
  593|   114k|    const KeyT EmptyKey = getEmptyKey();
  594|   114k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   114k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   114k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   114k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   114k|    unsigned ProbeAmt = 1;
  601|   114k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   114k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   114k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   114k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 62]
  |  |  ------------------
  ------------------
  605|   114k|        FoundBucket = ThisBucket;
  606|   114k|        return true;
  607|   114k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     62|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     62|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 62, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     62|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 62]
  ------------------
  615|     62|        return false;
  616|     62|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|   114k|  const BucketT *getBuckets() const {
  490|   114k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|   114k|  static unsigned getHashValue(const KeyT &Val) {
  418|   114k|    return KeyInfoT::getHashValue(Val);
  419|   114k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes12UniqueStringEjE8getFirstEv:
   48|   114k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|   114k|                        bool NoAdvance=false) {
  440|   114k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 114k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   114k|    return iterator(P, E, Epoch, NoAdvance);
  445|   114k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1139|   114k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   114k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   114k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 114k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIS4_JmEEEPS9_SD_OT_DpOT0_:
  519|     62|                            ValueArgs &&... Values) {
  520|     62|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     62|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     62|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     62|    return TheBucket;
  525|     62|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|     62|                                BucketT *TheBucket) {
  540|     62|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     62|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     62|    unsigned NumBuckets = getNumBuckets();
  553|     62|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     62|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 11, False: 51]
  |  |  ------------------
  ------------------
  554|     11|      this->grow(NumBuckets * 2);
  555|     11|      LookupBucketFor(Lookup, TheBucket);
  556|     11|      NumBuckets = getNumBuckets();
  557|     51|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     51|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 51]
  |  |  ------------------
  ------------------
  558|     51|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     62|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     62|    const KeyT EmptyKey = getEmptyKey();
  570|     62|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 62]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     62|    return TheBucket;
  574|     62|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|    124|  unsigned getNumEntries() const {
  458|    124|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    124|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|    124|  unsigned getNumEntries() const {
  772|    124|    return NumEntries;
  773|    124|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|     11|  void grow(unsigned AtLeast) {
  510|     11|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     11|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|     11|  void grow(unsigned AtLeast) {
  737|     11|    unsigned OldNumBuckets = NumBuckets;
  738|     11|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     11|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     11|    assert(Buckets);
  742|     11|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 11, False: 0]
  ------------------
  743|     11|      this->BaseT::initEmpty();
  744|     11|      return;
  745|     11|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE15allocateBucketsEj:
  795|     67|  bool allocateBuckets(unsigned Num) {
  796|     67|    NumBuckets = Num;
  797|     67|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 11]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|     11|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     11|    return true;
  804|     67|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E9initEmptyEv:
  347|     11|  void initEmpty() {
  348|     11|    setNumEntries(0);
  349|     11|    setNumTombstones(0);
  350|       |
  351|     11|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     11|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    715|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 704, False: 11]
  ------------------
  355|    704|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     11|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13setNumEntriesEj:
  461|     73|  void setNumEntries(unsigned Num) {
  462|     73|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     73|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13setNumEntriesEj:
  775|     73|  void setNumEntries(unsigned Num) {
  776|     73|    NumEntries = Num;
  777|     73|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16setNumTombstonesEj:
  477|     11|  void setNumTombstones(unsigned Num) {
  478|     11|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     11|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16setNumTombstonesEj:
  783|     11|  void setNumTombstones(unsigned Num) {
  784|     11|    NumTombstones = Num;
  785|     11|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|     51|  unsigned getNumTombstones() const {
  474|     51|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     51|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|     51|  unsigned getNumTombstones() const {
  780|     51|    return NumTombstones;
  781|     51|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|     62|  void incrementNumEntries() {
  466|     62|    setNumEntries(getNumEntries() + 1);
  467|     62|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1165|   114k|  pointer operator->() const {
 1166|   114k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   114k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 114k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   114k|    return Ptr;
 1170|   114k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  837|      2|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|      2|    init(NumInitBuckets);
  839|      2|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  959|      2|  void init(unsigned InitBuckets) {
  960|      2|    Small = true;
  961|      2|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 2]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|      2|    this->BaseT::initEmpty();
  966|      2|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E9initEmptyEv:
  347|      2|  void initEmpty() {
  348|      2|    setNumEntries(0);
  349|      2|    setNumTombstones(0);
  350|       |
  351|      2|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      2|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|     34|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 32, False: 2]
  ------------------
  355|     32|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      2|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13setNumEntriesEj:
  461|      8|  void setNumEntries(unsigned Num) {
  462|      8|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|      8|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13setNumEntriesEj:
 1046|      8|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|      8|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|      8|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16setNumTombstonesEj:
  477|      4|  void setNumTombstones(unsigned Num) {
  478|      4|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      4|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16setNumTombstonesEj:
 1056|      4|  void setNumTombstones(unsigned Num) {
 1057|      4|    NumTombstones = Num;
 1058|      4|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|     28|  unsigned getNumBuckets() const {
  498|     28|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|     28|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
 1093|     28|  unsigned getNumBuckets() const {
 1094|     28|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 28, False: 0]
  ------------------
 1095|     28|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11getEmptyKeyEv:
  426|     14|  static const KeyT getEmptyKey() {
  427|     14|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|     14|                  "Must pass the derived type to this template!");
  429|     14|    return KeyInfoT::getEmptyKey();
  430|     14|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  493|     16|  BucketT *getBuckets() {
  494|     16|    return static_cast<DerivedT *>(this)->getBuckets();
  495|     16|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE10getBucketsEv:
 1088|     16|  BucketT *getBuckets() {
 1089|     16|    return const_cast<BucketT *>(
 1090|     16|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|     16|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE10getBucketsEv:
 1084|     20|  const BucketT *getBuckets() const {
 1085|     20|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 20, False: 0]
  ------------------
 1086|     20|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16getInlineBucketsEv:
 1060|     20|  const BucketT *getInlineBuckets() const {
 1061|     20|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|     20|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getBucketsEndEv:
  501|     10|  BucketT *getBucketsEnd() {
  502|     10|    return getBuckets() + getNumBuckets();
  503|     10|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  857|      2|  ~SmallDenseMap() {
  858|      2|    this->destroyAll();
  859|      2|    deallocateBuckets();
  860|      2|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|      2|  void destroyAll() {
  335|      2|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 2]
  ------------------
  336|      0|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|     34|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 32, False: 2]
  ------------------
  340|     32|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 2, False: 30]
  ------------------
  341|     32|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 2, False: 0]
  ------------------
  342|      2|        P->getSecond().~ValueT();
  343|     32|      P->getFirst().~KeyT();
  344|     32|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15getTombstoneKeyEv:
  432|      8|  static const KeyT getTombstoneKey() {
  433|      8|    return KeyInfoT::getTombstoneKey();
  434|      8|  }
_ZN4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE17deallocateBucketsEv:
 1097|      2|  void deallocateBuckets() {
 1098|      2|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 2, False: 0]
  ------------------
 1099|      2|      return;
 1100|       |
 1101|      0|    operator delete(getLargeRep()->Buckets);
 1102|      0|    getLargeRep()->~LargeRep();
 1103|      0|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEED2Ev:
  687|      2|  ~DenseMap() {
  688|      2|    this->destroyAll();
  689|      2|    operator delete(Buckets);
  690|      2|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  837|   114k|  explicit SmallDenseMap(unsigned NumInitBuckets = 0) {
  838|   114k|    init(NumInitBuckets);
  839|   114k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  959|   114k|  void init(unsigned InitBuckets) {
  960|   114k|    Small = true;
  961|   114k|    if (InitBuckets > InlineBuckets) {
  ------------------
  |  Branch (961:9): [True: 0, False: 114k]
  ------------------
  962|      0|      Small = false;
  963|      0|      new (getLargeRep()) LargeRep(allocateBuckets(InitBuckets));
  964|      0|    }
  965|   114k|    this->BaseT::initEmpty();
  966|   114k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE11getLargeRepEv:
 1079|    105|  LargeRep *getLargeRep() {
 1080|    105|    return const_cast<LargeRep *>(
 1081|    105|      const_cast<const SmallDenseMap *>(this)->getLargeRep());
 1082|    105|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE11getLargeRepEv:
 1073|   815k|  const LargeRep *getLargeRep() const {
 1074|   815k|    assert(!Small);
 1075|       |    // Note, same rule about aliasing as with getInlineBuckets.
 1076|      0|    return reinterpret_cast<const LargeRep *>(storage.buffer);
 1077|   815k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
 1105|     35|  LargeRep allocateBuckets(unsigned Num) {
 1106|     35|    assert(Num > InlineBuckets && "Must allocate more buckets than are inline");
 1107|      0|    LargeRep Rep = {
 1108|     35|      static_cast<BucketT*>(operator new(sizeof(BucketT) * Num)), Num
 1109|     35|    };
 1110|     35|    return Rep;
 1111|     35|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  1.03M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 915k, False: 114k]
  ------------------
  355|   915k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|   291k|  void setNumEntries(unsigned Num) {
  462|   291k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   291k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
 1046|   291k|  void setNumEntries(unsigned Num) {
 1047|       |    // NumEntries is hardcoded to be 31 bits wide.
 1048|   291k|    assert(Num < (1U << 31) && "Cannot support more than 1<<31 entries");
 1049|      0|    NumEntries = Num;
 1050|   291k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
 1056|   114k|  void setNumTombstones(unsigned Num) {
 1057|   114k|    NumTombstones = Num;
 1058|   114k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|  1.37M|  unsigned getNumBuckets() const {
  498|  1.37M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.37M|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
 1093|  1.37M|  unsigned getNumBuckets() const {
 1094|  1.37M|    return Small ? InlineBuckets : getLargeRep()->NumBuckets;
  ------------------
  |  Branch (1094:12): [True: 963k, False: 407k]
  ------------------
 1095|  1.37M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|  1.02M|  static const KeyT getEmptyKey() {
  427|  1.02M|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  1.02M|                  "Must pass the derived type to this template!");
  429|  1.02M|    return KeyInfoT::getEmptyKey();
  430|  1.02M|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|   456k|  BucketT *getBuckets() {
  494|   456k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   456k|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
 1088|   456k|  BucketT *getBuckets() {
 1089|   456k|    return const_cast<BucketT *>(
 1090|   456k|      const_cast<const SmallDenseMap *>(this)->getBuckets());
 1091|   456k|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
 1084|  1.07M|  const BucketT *getBuckets() const {
 1085|  1.07M|    return Small ? getInlineBuckets() : getLargeRep()->Buckets;
  ------------------
  |  Branch (1085:12): [True: 672k, False: 407k]
  ------------------
 1086|  1.07M|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getInlineBucketsEv:
 1060|   672k|  const BucketT *getInlineBuckets() const {
 1061|   672k|    assert(Small);
 1062|       |    // Note that this cast does not violate aliasing rules as we assert that
 1063|       |    // the memory's dynamic type is the small, inline bucket buffer, and the
 1064|       |    // 'storage.buffer' static type is 'char *'.
 1065|      0|    return reinterpret_cast<const BucketT *>(storage.buffer);
 1066|   672k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|   228k|  BucketT *getBucketsEnd() {
  502|   228k|    return getBuckets() + getNumBuckets();
  503|   228k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes7LiteralEPNS2_11InstructionEE8getFirstEv:
   47|  3.28M|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  857|   114k|  ~SmallDenseMap() {
  858|   114k|    this->destroyAll();
  859|   114k|    deallocateBuckets();
  860|   114k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 114k]
  ------------------
  336|      0|      return;
  337|       |
  338|   114k|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  1.02M|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 915k, False: 114k]
  ------------------
  340|   915k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 177k, False: 738k]
  ------------------
  341|   915k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 177k, False: 0]
  ------------------
  342|   177k|        P->getSecond().~ValueT();
  343|   915k|      P->getFirst().~KeyT();
  344|   915k|    }
  345|   114k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|   737k|  static const KeyT getTombstoneKey() {
  433|   737k|    return KeyInfoT::getTombstoneKey();
  434|   737k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes7LiteralEPNS2_11InstructionEE9getSecondEv:
   49|   356k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE17deallocateBucketsEv:
 1097|   114k|  void deallocateBuckets() {
 1098|   114k|    if (Small)
  ------------------
  |  Branch (1098:9): [True: 114k, False: 34]
  ------------------
 1099|   114k|      return;
 1100|       |
 1101|     34|    operator delete(getLargeRep()->Buckets);
 1102|     34|    getLargeRep()->~LargeRep();
 1103|     34|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixERKS4_:
  303|   622k|  ValueT &operator[](const KeyT &Key) {
  304|   622k|    return FindAndConstruct(Key).second;
  305|   622k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructERKS4_:
  295|   622k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   622k|    BucketT *TheBucket;
  297|   622k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 445k, False: 177k]
  ------------------
  298|   445k|      return *TheBucket;
  299|       |
  300|   177k|    return *InsertIntoBucket(TheBucket, Key);
  301|   622k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|   622k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   622k|    const BucketT *ConstFoundBucket;
  634|   622k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   622k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   622k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   622k|    return Result;
  638|   622k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|   622k|                       const BucketT *&FoundBucket) const {
  583|   622k|    const BucketT *BucketsPtr = getBuckets();
  584|   622k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   622k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 622k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   622k|    const BucketT *FoundTombstone = nullptr;
  593|   622k|    const KeyT EmptyKey = getEmptyKey();
  594|   622k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   622k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   622k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   622k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   622k|    unsigned ProbeAmt = 1;
  601|   644k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   644k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   644k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   644k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 445k, False: 199k]
  |  |  ------------------
  ------------------
  605|   445k|        FoundBucket = ThisBucket;
  606|   445k|        return true;
  607|   445k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   199k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   199k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 177k, False: 21.3k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   177k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 177k]
  ------------------
  615|   177k|        return false;
  616|   177k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  21.3k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 21.3k]
  ------------------
  621|  21.3k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  21.3k|      BucketNo += ProbeAmt++;
  627|  21.3k|      BucketNo &= (NumBuckets-1);
  628|  21.3k|    }
  629|   622k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|   622k|  const BucketT *getBuckets() const {
  490|   622k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   622k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|   622k|  static unsigned getHashValue(const KeyT &Val) {
  418|   622k|    return KeyInfoT::getHashValue(Val);
  419|   622k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes7LiteralEPNS2_11InstructionEE8getFirstEv:
   48|   864k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16InsertIntoBucketIRKS4_JEEEPSB_SH_OT_DpOT0_:
  519|   177k|                            ValueArgs &&... Values) {
  520|   177k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   177k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   177k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   177k|    return TheBucket;
  525|   177k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|   177k|                                BucketT *TheBucket) {
  540|   177k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   177k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   177k|    unsigned NumBuckets = getNumBuckets();
  553|   177k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 35, False: 177k]
  |  |  ------------------
  ------------------
  554|     35|      this->grow(NumBuckets * 2);
  555|     35|      LookupBucketFor(Lookup, TheBucket);
  556|     35|      NumBuckets = getNumBuckets();
  557|   177k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   177k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 177k]
  |  |  ------------------
  ------------------
  558|   177k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   177k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   177k|    const KeyT EmptyKey = getEmptyKey();
  570|   177k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 177k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   177k|    return TheBucket;
  574|   177k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|   355k|  unsigned getNumEntries() const {
  458|   355k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   355k|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
 1042|   355k|  unsigned getNumEntries() const {
 1043|   355k|    return NumEntries;
 1044|   355k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|     35|  void grow(unsigned AtLeast) {
  510|     35|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     35|  }
_ZN4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  968|     35|  void grow(unsigned AtLeast) {
  969|     35|    if (AtLeast >= InlineBuckets)
  ------------------
  |  Branch (969:9): [True: 35, False: 0]
  ------------------
  970|     35|      AtLeast = std::max<unsigned>(64, NextPowerOf2(AtLeast-1));
  971|       |
  972|     35|    if (Small) {
  ------------------
  |  Branch (972:9): [True: 34, False: 1]
  ------------------
  973|     34|      if (AtLeast < InlineBuckets)
  ------------------
  |  Branch (973:11): [True: 0, False: 34]
  ------------------
  974|      0|        return; // Nothing to do.
  975|       |
  976|       |      // First move the inline buckets into a temporary storage.
  977|     34|      AlignedCharArrayUnion<BucketT[InlineBuckets]> TmpStorage;
  978|     34|      BucketT *TmpBegin = reinterpret_cast<BucketT *>(TmpStorage.buffer);
  979|     34|      BucketT *TmpEnd = TmpBegin;
  980|       |
  981|       |      // Loop over the buckets, moving non-empty, non-tombstones into the
  982|       |      // temporary storage. Have the loop move the TmpEnd forward as it goes.
  983|     34|      const KeyT EmptyKey = this->getEmptyKey();
  984|     34|      const KeyT TombstoneKey = this->getTombstoneKey();
  985|    306|      for (BucketT *P = getBuckets(), *E = P + InlineBuckets; P != E; ++P) {
  ------------------
  |  Branch (985:63): [True: 272, False: 34]
  ------------------
  986|    272|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (986:13): [True: 170, False: 102]
  ------------------
  987|    272|            !KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (987:13): [True: 170, False: 0]
  ------------------
  988|    170|          assert(size_t(TmpEnd - TmpBegin) < InlineBuckets &&
  989|    170|                 "Too many inline buckets!");
  990|      0|          ::new (&TmpEnd->getFirst()) KeyT(std::move(P->getFirst()));
  991|    170|          ::new (&TmpEnd->getSecond()) ValueT(std::move(P->getSecond()));
  992|    170|          ++TmpEnd;
  993|    170|          P->getSecond().~ValueT();
  994|    170|        }
  995|      0|        P->getFirst().~KeyT();
  996|    272|      }
  997|       |
  998|       |      // Now make this map use the large rep, and move all the entries back
  999|       |      // into it.
 1000|     34|      Small = false;
 1001|     34|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1002|     34|      this->moveFromOldBuckets(TmpBegin, TmpEnd);
 1003|     34|      return;
 1004|     34|    }
 1005|       |
 1006|      1|    LargeRep OldRep = std::move(*getLargeRep());
 1007|      1|    getLargeRep()->~LargeRep();
 1008|      1|    if (AtLeast <= InlineBuckets) {
  ------------------
  |  Branch (1008:9): [True: 0, False: 1]
  ------------------
 1009|      0|      Small = true;
 1010|      1|    } else {
 1011|      1|      new (getLargeRep()) LargeRep(allocateBuckets(AtLeast));
 1012|      1|    }
 1013|       |
 1014|      1|    this->moveFromOldBuckets(OldRep.Buckets, OldRep.Buckets+OldRep.NumBuckets);
 1015|       |
 1016|       |    // Free the old table.
 1017|      1|    operator delete(OldRep.Buckets);
 1018|      1|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E18moveFromOldBucketsEPSB_SE_:
  369|     35|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     35|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     35|    const KeyT EmptyKey = getEmptyKey();
  374|     35|    const KeyT TombstoneKey = getTombstoneKey();
  375|    269|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 234, False: 35]
  ------------------
  376|    234|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 217, False: 17]
  ------------------
  377|    234|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 217, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|    217|        BucketT *DestBucket;
  380|    217|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|    217|        (void)FoundVal; // silence warning.
  382|    217|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|    217|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|    217|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|    217|        B->getSecond().~ValueT();
  389|    217|      }
  390|      0|      B->getFirst().~KeyT();
  391|    234|    }
  392|     35|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16getNumTombstonesEv:
  473|   177k|  unsigned getNumTombstones() const {
  474|   177k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   177k|  }
_ZNK4llvh13SmallDenseMapIPN6hermes7LiteralEPNS1_11InstructionELj8ENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getNumTombstonesEv:
 1052|   177k|  unsigned getNumTombstones() const {
 1053|   177k|    return NumTombstones;
 1054|   177k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes7LiteralEPNS2_11InstructionELj8ENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|   177k|  void incrementNumEntries() {
  466|   177k|    setNumEntries(getNumEntries() + 1);
  467|   177k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E11try_emplaceIJRS6_EEENSt3__14pairINS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEEbEERKS4_DpOT_:
  233|      4|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|      4|    BucketT *TheBucket;
  235|      4|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 0, False: 4]
  ------------------
  236|      0|      return std::make_pair(
  237|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|      0|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|      4|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|      4|    return std::make_pair(
  243|      4|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|      4|             true);
  245|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|      4|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|      4|    const BucketT *ConstFoundBucket;
  634|      4|    bool Result = const_cast<const DenseMapBase *>(this)
  635|      4|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|      4|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|      4|    return Result;
  638|      4|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|      4|                       const BucketT *&FoundBucket) const {
  583|      4|    const BucketT *BucketsPtr = getBuckets();
  584|      4|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|      4|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 4]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      4|    const BucketT *FoundTombstone = nullptr;
  593|      4|    const KeyT EmptyKey = getEmptyKey();
  594|      4|    const KeyT TombstoneKey = getTombstoneKey();
  595|      4|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      4|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      4|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      4|    unsigned ProbeAmt = 1;
  601|      4|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      4|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      4|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|      4|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      4|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 4]
  ------------------
  615|      4|        return false;
  616|      4|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|      4|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10getBucketsEv:
  489|      4|  const BucketT *getBuckets() const {
  490|      4|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12getHashValueERKS4_:
  417|      4|  static unsigned getHashValue(const KeyT &Val) {
  418|      4|    return KeyInfoT::getHashValue(Val);
  419|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|      4|                        bool NoAdvance=false) {
  440|      4|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 4]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|      4|    return iterator(P, E, Epoch, NoAdvance);
  445|      4|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1139|      4|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|      4|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|      4|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 4, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16InsertIntoBucketIRKS4_JRS6_EEEPSA_SH_OT_DpOT0_:
  519|      4|                            ValueArgs &&... Values) {
  520|      4|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|      4|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|      4|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|      4|    return TheBucket;
  525|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|      4|                                BucketT *TheBucket) {
  540|      4|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|      4|    unsigned NewNumEntries = getNumEntries() + 1;
  552|      4|    unsigned NumBuckets = getNumBuckets();
  553|      4|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  554|      0|      this->grow(NumBuckets * 2);
  555|      0|      LookupBucketFor(Lookup, TheBucket);
  556|      0|      NumBuckets = getNumBuckets();
  557|      4|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  558|      4|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|      4|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|      4|    const KeyT EmptyKey = getEmptyKey();
  570|      4|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 4]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|      4|    return TheBucket;
  574|      4|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumEntriesEv:
  457|     12|  unsigned getNumEntries() const {
  458|     12|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     12|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumEntriesEv:
 1042|     12|  unsigned getNumEntries() const {
 1043|     12|    return NumEntries;
 1044|     12|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E16getNumTombstonesEv:
  473|      4|  unsigned getNumTombstones() const {
  474|      4|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|      4|  }
_ZNK4llvh13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE16getNumTombstonesEv:
 1052|      4|  unsigned getNumTombstones() const {
 1053|      4|    return NumTombstones;
 1054|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E19incrementNumEntriesEv:
  465|      4|  void incrementNumEntries() {
  466|      4|    setNumEntries(getNumEntries() + 1);
  467|      4|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E5clearEv:
  113|      2|  void clear() {
  114|      2|    incrementEpoch();
  115|      2|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 2]
  |  Branch (115:33): [True: 0, False: 0]
  ------------------
  116|       |
  117|       |    // If the capacity of the array is huge, and the # elements used is small,
  118|       |    // shrink the array.
  119|      2|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 2, False: 0]
  |  Branch (119:50): [True: 0, False: 2]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|      2|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value) {
  ------------------
  |  Branch (125:9): [Folded - Ignored]
  |  Branch (125:35): [Folded - Ignored]
  ------------------
  126|       |      // Use a simpler loop when these are trivial types.
  127|     34|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 32, False: 2]
  ------------------
  128|     32|        P->getFirst() = EmptyKey;
  129|      2|    } else {
  130|      0|      unsigned NumEntries = getNumEntries();
  131|      0|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (131:61): [True: 0, False: 0]
  ------------------
  132|      0|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey)) {
  ------------------
  |  Branch (132:13): [True: 0, False: 0]
  ------------------
  133|      0|          if (!KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (133:15): [True: 0, False: 0]
  ------------------
  134|      0|            P->getSecond().~ValueT();
  135|      0|            --NumEntries;
  136|      0|          }
  137|      0|          P->getFirst() = EmptyKey;
  138|      0|        }
  139|      0|      }
  140|      0|      assert(NumEntries == 0 && "Node count imbalance!");
  141|       |      // Suppress -Wunused-but-set-variable warning with new compilers.
  142|      0|      (void)NumEntries;
  143|      0|    }
  144|      0|    setNumEntries(0);
  145|      2|    setNumTombstones(0);
  146|      2|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.64k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 3.58k, False: 56]
  ------------------
  340|  3.58k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 2.07k, False: 1.51k]
  ------------------
  341|  3.58k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 2.07k, False: 0]
  ------------------
  342|  2.07k|        P->getSecond().~ValueT();
  343|  3.58k|      P->getFirst().~KeyT();
  344|  3.58k|    }
  345|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getNumBucketsEv:
  497|  4.53k|  unsigned getNumBuckets() const {
  498|  4.53k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  4.53k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13getNumBucketsEv:
  791|  4.53k|  unsigned getNumBuckets() const {
  792|  4.53k|    return NumBuckets;
  793|  4.53k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E11getEmptyKeyEv:
  426|  4.25k|  static const KeyT getEmptyKey() {
  427|  4.25k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  4.25k|                  "Must pass the derived type to this template!");
  429|  4.25k|    return KeyInfoT::getEmptyKey();
  430|  4.25k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15getTombstoneKeyEv:
  432|  2.12k|  static const KeyT getTombstoneKey() {
  433|  2.12k|    return KeyInfoT::getTombstoneKey();
  434|  2.12k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10getBucketsEv:
  493|    224|  BucketT *getBuckets() {
  494|    224|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    224|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE10getBucketsEv:
  787|  2.35k|  BucketT *getBuckets() const {
  788|  2.35k|    return Buckets;
  789|  2.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getBucketsEndEv:
  501|    112|  BucketT *getBucketsEnd() {
  502|    112|    return getBuckets() + getNumBuckets();
  503|    112|  }
_ZN4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE8getFirstEv:
   47|  16.9k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE9getSecondEv:
   49|  4.14k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  3.64k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 3.58k, False: 56]
  ------------------
  340|  3.58k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 336, False: 3.24k]
  ------------------
  341|  3.58k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 336, False: 0]
  ------------------
  342|    336|        P->getSecond().~ValueT();
  343|  3.58k|      P->getFirst().~KeyT();
  344|  3.58k|    }
  345|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getNumBucketsEv:
  497|  3.08k|  unsigned getNumBuckets() const {
  498|  3.08k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  3.08k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13getNumBucketsEv:
  791|  3.08k|  unsigned getNumBuckets() const {
  792|  3.08k|    return NumBuckets;
  793|  3.08k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E11getEmptyKeyEv:
  426|  2.80k|  static const KeyT getEmptyKey() {
  427|  2.80k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  2.80k|                  "Must pass the derived type to this template!");
  429|  2.80k|    return KeyInfoT::getEmptyKey();
  430|  2.80k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15getTombstoneKeyEv:
  432|  2.40k|  static const KeyT getTombstoneKey() {
  433|  2.40k|    return KeyInfoT::getTombstoneKey();
  434|  2.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10getBucketsEv:
  493|    224|  BucketT *getBuckets() {
  494|    224|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    224|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE10getBucketsEv:
  787|  2.63k|  BucketT *getBuckets() const {
  788|  2.63k|    return Buckets;
  789|  2.63k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getBucketsEndEv:
  501|    112|  BucketT *getBucketsEnd() {
  502|    112|    return getBuckets() + getNumBuckets();
  503|    112|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE8getFirstEv:
   47|  11.7k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE9getSecondEv:
   49|    672|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE15allocateBucketsEj:
  795|    112|  bool allocateBuckets(unsigned Num) {
  796|    112|    NumBuckets = Num;
  797|    112|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 56]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|     56|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     56|    return true;
  804|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E9initEmptyEv:
  347|     56|  void initEmpty() {
  348|     56|    setNumEntries(0);
  349|     56|    setNumTombstones(0);
  350|       |
  351|     56|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     56|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  3.64k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 3.58k, False: 56]
  ------------------
  355|  3.58k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13setNumEntriesEj:
  461|    392|  void setNumEntries(unsigned Num) {
  462|    392|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    392|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13setNumEntriesEj:
  775|    392|  void setNumEntries(unsigned Num) {
  776|    392|    NumEntries = Num;
  777|    392|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16setNumTombstonesEj:
  477|     56|  void setNumTombstones(unsigned Num) {
  478|     56|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE16setNumTombstonesEj:
  783|     56|  void setNumTombstones(unsigned Num) {
  784|     56|    NumTombstones = Num;
  785|     56|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE15allocateBucketsEj:
  795|    112|  bool allocateBuckets(unsigned Num) {
  796|    112|    NumBuckets = Num;
  797|    112|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 56]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|     56|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     56|    return true;
  804|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E9initEmptyEv:
  347|     56|  void initEmpty() {
  348|     56|    setNumEntries(0);
  349|     56|    setNumTombstones(0);
  350|       |
  351|     56|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     56|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  3.64k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 3.58k, False: 56]
  ------------------
  355|  3.58k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13setNumEntriesEj:
  461|  2.12k|  void setNumEntries(unsigned Num) {
  462|  2.12k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  2.12k|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13setNumEntriesEj:
  775|  2.12k|  void setNumEntries(unsigned Num) {
  776|  2.12k|    NumEntries = Num;
  777|  2.12k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16setNumTombstonesEj:
  477|     56|  void setNumTombstones(unsigned Num) {
  478|     56|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|     56|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE16setNumTombstonesEj:
  783|     56|  void setNumTombstones(unsigned Num) {
  784|     56|    NumTombstones = Num;
  785|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_EixEOS3_:
  315|  2.35k|  ValueT &operator[](KeyT &&Key) {
  316|  2.35k|    return FindAndConstruct(std::move(Key)).second;
  317|  2.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16FindAndConstructEOS3_:
  307|  2.35k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|  2.35k|    BucketT *TheBucket;
  309|  2.35k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 2.01k, False: 336]
  ------------------
  310|  2.01k|      return *TheBucket;
  311|       |
  312|    336|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|  2.35k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15LookupBucketForIS3_EEbRKT_RPS8_:
  632|  2.40k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  2.40k|    const BucketT *ConstFoundBucket;
  634|  2.40k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  2.40k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  2.40k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  2.40k|    return Result;
  638|  2.40k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E15LookupBucketForIS3_EEbRKT_RPKS8_:
  582|  2.40k|                       const BucketT *&FoundBucket) const {
  583|  2.40k|    const BucketT *BucketsPtr = getBuckets();
  584|  2.40k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  2.40k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 2.35k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  2.35k|    const BucketT *FoundTombstone = nullptr;
  593|  2.35k|    const KeyT EmptyKey = getEmptyKey();
  594|  2.35k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  2.35k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  2.35k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  2.35k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  2.35k|    unsigned ProbeAmt = 1;
  601|  2.35k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.35k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.35k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.35k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.01k, False: 340]
  |  |  ------------------
  ------------------
  605|  2.01k|        FoundBucket = ThisBucket;
  606|  2.01k|        return true;
  607|  2.01k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    340|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    340|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 336, False: 4]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    336|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 336]
  ------------------
  615|    336|        return false;
  616|    336|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      4|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 4]
  ------------------
  621|      4|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      4|      BucketNo += ProbeAmt++;
  627|      4|      BucketNo &= (NumBuckets-1);
  628|      4|    }
  629|  2.35k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E10getBucketsEv:
  489|  2.40k|  const BucketT *getBuckets() const {
  490|  2.40k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E12getHashValueERKS3_:
  417|  2.35k|  static unsigned getHashValue(const KeyT &Val) {
  418|  2.35k|    return KeyInfoT::getHashValue(Val);
  419|  2.35k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEiE8getFirstEv:
   48|  2.70k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16InsertIntoBucketIS3_JEEEPS8_SC_OT_DpOT0_:
  519|    336|                            ValueArgs &&... Values) {
  520|    336|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    336|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    336|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    336|    return TheBucket;
  525|    336|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E20InsertIntoBucketImplIS3_EEPS8_RKS3_RKT_SC_:
  539|    336|                                BucketT *TheBucket) {
  540|    336|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    336|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    336|    unsigned NumBuckets = getNumBuckets();
  553|    336|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    336|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56, False: 280]
  |  |  ------------------
  ------------------
  554|     56|      this->grow(NumBuckets * 2);
  555|     56|      LookupBucketFor(Lookup, TheBucket);
  556|     56|      NumBuckets = getNumBuckets();
  557|    280|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    280|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 280]
  |  |  ------------------
  ------------------
  558|    280|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    336|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    336|    const KeyT EmptyKey = getEmptyKey();
  570|    336|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 336]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    336|    return TheBucket;
  574|    336|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E13getNumEntriesEv:
  457|    672|  unsigned getNumEntries() const {
  458|    672|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    672|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE13getNumEntriesEv:
  771|    672|  unsigned getNumEntries() const {
  772|    672|    return NumEntries;
  773|    672|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E4growEj:
  509|     56|  void grow(unsigned AtLeast) {
  510|     56|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE4growEj:
  736|     56|  void grow(unsigned AtLeast) {
  737|     56|    unsigned OldNumBuckets = NumBuckets;
  738|     56|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     56|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     56|    assert(Buckets);
  742|     56|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 0]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E16getNumTombstonesEv:
  473|    280|  unsigned getNumTombstones() const {
  474|    280|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    280|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_iEEE16getNumTombstonesEv:
  779|    280|  unsigned getNumTombstones() const {
  780|    280|    return NumTombstones;
  781|    280|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEiNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_iEEEES3_iS5_S8_E19incrementNumEntriesEv:
  465|    336|  void incrementNumEntries() {
  466|    336|    setNumEntries(getNumEntries() + 1);
  467|    336|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_EixEOS6_:
  315|  2.07k|  ValueT &operator[](KeyT &&Key) {
  316|  2.07k|    return FindAndConstruct(std::move(Key)).second;
  317|  2.07k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16FindAndConstructEOS6_:
  307|  2.07k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|  2.07k|    BucketT *TheBucket;
  309|  2.07k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 2.07k]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|  2.07k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|  2.07k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15LookupBucketForIS6_EEbRKT_RPSD_:
  632|  2.12k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  2.12k|    const BucketT *ConstFoundBucket;
  634|  2.12k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  2.12k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  2.12k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  2.12k|    return Result;
  638|  2.12k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E15LookupBucketForIS6_EEbRKT_RPKSD_:
  582|  2.12k|                       const BucketT *&FoundBucket) const {
  583|  2.12k|    const BucketT *BucketsPtr = getBuckets();
  584|  2.12k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  2.12k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 2.07k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  2.07k|    const BucketT *FoundTombstone = nullptr;
  593|  2.07k|    const KeyT EmptyKey = getEmptyKey();
  594|  2.07k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  2.07k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  2.07k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  2.07k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  2.07k|    unsigned ProbeAmt = 1;
  601|  3.15k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  3.15k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  3.15k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  3.15k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 3.15k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  3.15k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  3.15k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.07k, False: 1.07k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  2.07k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 2.07k]
  ------------------
  615|  2.07k|        return false;
  616|  2.07k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  1.07k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.07k]
  ------------------
  621|  1.07k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  1.07k|      BucketNo += ProbeAmt++;
  627|  1.07k|      BucketNo &= (NumBuckets-1);
  628|  1.07k|    }
  629|  2.07k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E10getBucketsEv:
  489|  2.12k|  const BucketT *getBuckets() const {
  490|  2.12k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.12k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E12getHashValueERKS6_:
  417|  2.07k|  static unsigned getHashValue(const KeyT &Val) {
  418|  2.07k|    return KeyInfoT::getHashValue(Val);
  419|  2.07k|  }
_ZNK4llvh6detail12DenseMapPairINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumEE8getFirstEv:
   48|  7.38k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16InsertIntoBucketIS6_JEEEPSD_SH_OT_DpOT0_:
  519|  2.07k|                            ValueArgs &&... Values) {
  520|  2.07k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  2.07k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  2.07k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  2.07k|    return TheBucket;
  525|  2.07k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E20InsertIntoBucketImplIS6_EEPSD_RKS6_RKT_SH_:
  539|  2.07k|                                BucketT *TheBucket) {
  540|  2.07k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  2.07k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  2.07k|    unsigned NumBuckets = getNumBuckets();
  553|  2.07k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  2.07k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56, False: 2.01k]
  |  |  ------------------
  ------------------
  554|     56|      this->grow(NumBuckets * 2);
  555|     56|      LookupBucketFor(Lookup, TheBucket);
  556|     56|      NumBuckets = getNumBuckets();
  557|  2.01k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  2.01k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.01k]
  |  |  ------------------
  ------------------
  558|  2.01k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  2.07k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  2.07k|    const KeyT EmptyKey = getEmptyKey();
  570|  2.07k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 2.07k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  2.07k|    return TheBucket;
  574|  2.07k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E13getNumEntriesEv:
  457|  4.14k|  unsigned getNumEntries() const {
  458|  4.14k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  4.14k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE13getNumEntriesEv:
  771|  4.14k|  unsigned getNumEntries() const {
  772|  4.14k|    return NumEntries;
  773|  4.14k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E4growEj:
  509|     56|  void grow(unsigned AtLeast) {
  510|     56|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     56|  }
_ZN4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE4growEj:
  736|     56|  void grow(unsigned AtLeast) {
  737|     56|    unsigned OldNumBuckets = NumBuckets;
  738|     56|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     56|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     56|    assert(Buckets);
  742|     56|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 0]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E16getNumTombstonesEv:
  473|  2.01k|  unsigned getNumTombstones() const {
  474|  2.01k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  2.01k|  }
_ZNK4llvh8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS3_13BuiltinMethod4EnumENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEE16getNumTombstonesEv:
  779|  2.01k|  unsigned getNumTombstones() const {
  780|  2.01k|    return NumTombstones;
  781|  2.01k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINSt3__14pairIiN6hermes10IdentifierEEENS4_13BuiltinMethod4EnumENS_12DenseMapInfoIS6_EENS_6detail12DenseMapPairIS6_S8_EEEES6_S8_SA_SD_E19incrementNumEntriesEv:
  465|  2.07k|  void incrementNumEntries() {
  466|  2.07k|    setNumEntries(getNumEntries() + 1);
  467|  2.07k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 2]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|      2|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      2|    return true;
  804|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|      2|  void initEmpty() {
  348|      2|    setNumEntries(0);
  349|      2|    setNumTombstones(0);
  350|       |
  351|      2|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      2|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    130|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 128, False: 2]
  ------------------
  355|    128|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|     70|  void setNumEntries(unsigned Num) {
  462|     70|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|     70|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|     70|  void setNumEntries(unsigned Num) {
  776|     70|    NumEntries = Num;
  777|     70|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|      2|  void setNumTombstones(unsigned Num) {
  478|      2|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      2|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|      2|  void setNumTombstones(unsigned Num) {
  784|      2|    NumTombstones = Num;
  785|      2|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumBucketsEv:
  497|   883k|  unsigned getNumBuckets() const {
  498|   883k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   883k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumBucketsEv:
  791|   883k|  unsigned getNumBuckets() const {
  792|   883k|    return NumBuckets;
  793|   883k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E11getEmptyKeyEv:
  426|  39.5k|  static const KeyT getEmptyKey() {
  427|  39.5k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  39.5k|                  "Must pass the derived type to this template!");
  429|  39.5k|    return KeyInfoT::getEmptyKey();
  430|  39.5k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  493|   615k|  BucketT *getBuckets() {
  494|   615k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|   615k|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE10getBucketsEv:
  787|   769k|  BucketT *getBuckets() const {
  788|   769k|    return Buckets;
  789|   769k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getBucketsEndEv:
  501|   615k|  BucketT *getBucketsEnd() {
  502|   615k|    return getBuckets() + getNumBuckets();
  503|   615k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE8getFirstEv:
   47|    588|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 2]
  ------------------
  336|   114k|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    130|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 128, False: 2]
  ------------------
  340|    128|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 68, False: 60]
  ------------------
  341|    128|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 68, False: 0]
  ------------------
  342|     68|        P->getSecond().~ValueT();
  343|    128|      P->getFirst().~KeyT();
  344|    128|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15getTombstoneKeyEv:
  432|  39.5k|  static const KeyT getTombstoneKey() {
  433|  39.5k|    return KeyInfoT::getTombstoneKey();
  434|  39.5k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE9getSecondEv:
   49|    136|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixERKS4_:
  303|     68|  ValueT &operator[](const KeyT &Key) {
  304|     68|    return FindAndConstruct(Key).second;
  305|     68|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructERKS4_:
  295|     68|  value_type& FindAndConstruct(const KeyT &Key) {
  296|     68|    BucketT *TheBucket;
  297|     68|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 68]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|     68|    return *InsertIntoBucket(TheBucket, Key);
  301|     68|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|     70|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     70|    const BucketT *ConstFoundBucket;
  634|     70|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     70|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     70|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     70|    return Result;
  638|     70|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|     70|                       const BucketT *&FoundBucket) const {
  583|     70|    const BucketT *BucketsPtr = getBuckets();
  584|     70|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|     70|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 68]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|     68|    const BucketT *FoundTombstone = nullptr;
  593|     68|    const KeyT EmptyKey = getEmptyKey();
  594|     68|    const KeyT TombstoneKey = getTombstoneKey();
  595|     68|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|     68|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|     68|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|     68|    unsigned ProbeAmt = 1;
  601|     83|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|     83|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|     83|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|     83|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 83]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     83|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     83|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 68, False: 15]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|     68|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 68]
  ------------------
  615|     68|        return false;
  616|     68|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|     15|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 15]
  ------------------
  621|     15|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|     15|      BucketNo += ProbeAmt++;
  627|     15|      BucketNo &= (NumBuckets-1);
  628|     15|    }
  629|     68|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|   153k|  const BucketT *getBuckets() const {
  490|   153k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   153k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|     68|  static unsigned getHashValue(const KeyT &Val) {
  418|     68|    return KeyInfoT::getHashValue(Val);
  419|     68|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes5ValueEPNS2_7MovInstEE8getFirstEv:
   48|   218k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16InsertIntoBucketIRKS4_JEEEPSB_SH_OT_DpOT0_:
  519|     68|                            ValueArgs &&... Values) {
  520|     68|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     68|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     68|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     68|    return TheBucket;
  525|     68|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|     68|                                BucketT *TheBucket) {
  540|     68|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|     68|    unsigned NewNumEntries = getNumEntries() + 1;
  552|     68|    unsigned NumBuckets = getNumBuckets();
  553|     68|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|     68|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 66]
  |  |  ------------------
  ------------------
  554|      2|      this->grow(NumBuckets * 2);
  555|      2|      LookupBucketFor(Lookup, TheBucket);
  556|      2|      NumBuckets = getNumBuckets();
  557|     66|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|     66|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  558|     66|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|     68|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|     68|    const KeyT EmptyKey = getEmptyKey();
  570|     68|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 68]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|     68|    return TheBucket;
  574|     68|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|    136|  unsigned getNumEntries() const {
  458|    136|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    136|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|    136|  unsigned getNumEntries() const {
  772|    136|    return NumEntries;
  773|    136|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|      2|  void grow(unsigned AtLeast) {
  510|      2|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      2|  }
_ZN4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|      2|  void grow(unsigned AtLeast) {
  737|      2|    unsigned OldNumBuckets = NumBuckets;
  738|      2|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      2|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      2|    assert(Buckets);
  742|      2|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 2, False: 0]
  ------------------
  743|      2|      this->BaseT::initEmpty();
  744|      2|      return;
  745|      2|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16getNumTombstonesEv:
  473|     66|  unsigned getNumTombstones() const {
  474|     66|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|     66|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getNumTombstonesEv:
  779|     66|  unsigned getNumTombstones() const {
  780|     66|    return NumTombstones;
  781|     66|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|     68|  void incrementNumEntries() {
  466|     68|    setNumEntries(getNumEntries() + 1);
  467|     68|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4findEPKS3_:
  154|   153k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   153k|    BucketT *TheBucket;
  156|   153k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 0, False: 153k]
  ------------------
  157|      0|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   153k|    return end();
  159|   153k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPSB_:
  632|   153k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   153k|    const BucketT *ConstFoundBucket;
  634|   153k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   153k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   153k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   153k|    return Result;
  638|   153k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPKSB_:
  582|   153k|                       const BucketT *&FoundBucket) const {
  583|   153k|    const BucketT *BucketsPtr = getBuckets();
  584|   153k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   153k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 114k, False: 39.4k]
  ------------------
  587|   114k|      FoundBucket = nullptr;
  588|   114k|      return false;
  589|   114k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  39.4k|    const BucketT *FoundTombstone = nullptr;
  593|  39.4k|    const KeyT EmptyKey = getEmptyKey();
  594|  39.4k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  39.4k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  39.4k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  39.4k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  39.4k|    unsigned ProbeAmt = 1;
  601|  86.0k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  86.0k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  86.0k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  86.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 86.0k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  86.0k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  86.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 39.4k, False: 46.5k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  39.4k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 39.4k]
  ------------------
  615|  39.4k|        return false;
  616|  39.4k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  46.5k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 46.5k]
  ------------------
  621|  46.5k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  46.5k|      BucketNo += ProbeAmt++;
  627|  46.5k|      BucketNo &= (NumBuckets-1);
  628|  46.5k|    }
  629|  39.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueIPKS3_EEjRKT_:
  422|  39.4k|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  39.4k|    return KeyInfoT::getHashValue(Val);
  424|  39.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|   307k|                        bool NoAdvance=false) {
  440|   307k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 307k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   307k|    return iterator(P, E, Epoch, NoAdvance);
  445|   307k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1139|   307k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   307k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   307k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 307k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueEPNS2_7MovInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E3endEv:
   85|   307k|  inline iterator end() {
   86|   307k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   307k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb1EEC2ILb0EvEERKNS0_IS3_S5_S7_SA_XT_EEE:
 1157|   153k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes5ValueEPNS1_7MovInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEneERKNS0_IS3_S5_S7_SA_Lb1EEE:
 1179|   153k|  bool operator!=(const ConstIterator &RHS) const {
 1180|   153k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|   153k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|   153k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5countEPKS3_:
  149|  1.02M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  1.02M|    const BucketT *TheBucket;
  151|  1.02M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 1.02M, False: 0]
  ------------------
  152|  1.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIPKS3_EEbRKT_RPKSB_:
  582|  1.02M|                       const BucketT *&FoundBucket) const {
  583|  1.02M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.02M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.02M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 1.02M]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.02M|    const BucketT *FoundTombstone = nullptr;
  593|  1.02M|    const KeyT EmptyKey = getEmptyKey();
  594|  1.02M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.02M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.02M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.02M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.02M|    unsigned ProbeAmt = 1;
  601|  1.02M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  1.02M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  1.02M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  1.02M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.02M, False: 490]
  |  |  ------------------
  ------------------
  605|  1.02M|        FoundBucket = ThisBucket;
  606|  1.02M|        return true;
  607|  1.02M|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    490|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    490|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 490]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    490|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 490]
  ------------------
  621|    490|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    490|      BucketNo += ProbeAmt++;
  627|    490|      BucketNo &= (NumBuckets-1);
  628|    490|    }
  629|  1.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|  1.02M|  const BucketT *getBuckets() const {
  490|  1.02M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.02M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueIPKS3_EEjRKT_:
  422|  1.02M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  1.02M|    return KeyInfoT::getHashValue(Val);
  424|  1.02M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoEE8getFirstEv:
   48|  1.02M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixERKS4_:
  303|  1.30k|  ValueT &operator[](const KeyT &Key) {
  304|  1.30k|    return FindAndConstruct(Key).second;
  305|  1.30k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructERKS4_:
  295|  1.30k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  1.30k|    BucketT *TheBucket;
  297|  1.30k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 1.10k, False: 202]
  ------------------
  298|  1.10k|      return *TheBucket;
  299|       |
  300|    202|    return *InsertIntoBucket(TheBucket, Key);
  301|  1.30k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|  1.44k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.44k|    const BucketT *ConstFoundBucket;
  634|  1.44k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.44k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.44k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.44k|    return Result;
  638|  1.44k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|  1.44k|                       const BucketT *&FoundBucket) const {
  583|  1.44k|    const BucketT *BucketsPtr = getBuckets();
  584|  1.44k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.44k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 39, False: 1.40k]
  ------------------
  587|     39|      FoundBucket = nullptr;
  588|     39|      return false;
  589|     39|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.40k|    const BucketT *FoundTombstone = nullptr;
  593|  1.40k|    const KeyT EmptyKey = getEmptyKey();
  594|  1.40k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.40k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.40k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.40k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.40k|    unsigned ProbeAmt = 1;
  601|  2.24k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.24k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.24k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.24k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.10k, False: 1.13k]
  |  |  ------------------
  ------------------
  605|  1.10k|        FoundBucket = ThisBucket;
  606|  1.10k|        return true;
  607|  1.10k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  1.13k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.13k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 298, False: 841]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    298|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 298]
  ------------------
  615|    298|        return false;
  616|    298|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    841|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 841]
  ------------------
  621|    841|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    841|      BucketNo += ProbeAmt++;
  627|    841|      BucketNo &= (NumBuckets-1);
  628|    841|    }
  629|  1.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|  1.40k|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.40k|    return KeyInfoT::getHashValue(Val);
  419|  1.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16InsertIntoBucketIRKS4_JEEEPSB_SH_OT_DpOT0_:
  519|    202|                            ValueArgs &&... Values) {
  520|    202|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    202|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    202|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    202|    return TheBucket;
  525|    202|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|    202|                                BucketT *TheBucket) {
  540|    202|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    202|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    202|    unsigned NumBuckets = getNumBuckets();
  553|    202|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    202|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 41, False: 161]
  |  |  ------------------
  ------------------
  554|     41|      this->grow(NumBuckets * 2);
  555|     41|      LookupBucketFor(Lookup, TheBucket);
  556|     41|      NumBuckets = getNumBuckets();
  557|    161|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    161|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 161]
  |  |  ------------------
  ------------------
  558|    161|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    202|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    202|    const KeyT EmptyKey = getEmptyKey();
  570|    202|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 202]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    202|    return TheBucket;
  574|    202|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|    693|  unsigned getNumEntries() const {
  458|    693|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    693|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|    693|  unsigned getNumEntries() const {
  772|    693|    return NumEntries;
  773|    693|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|     41|  void grow(unsigned AtLeast) {
  510|     41|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     41|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|     41|  void grow(unsigned AtLeast) {
  737|     41|    unsigned OldNumBuckets = NumBuckets;
  738|     41|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     41|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     41|    assert(Buckets);
  742|     41|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 39, False: 2]
  ------------------
  743|     39|      this->BaseT::initEmpty();
  744|     39|      return;
  745|     39|    }
  746|       |
  747|      2|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      2|    operator delete(OldBuckets);
  751|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E18moveFromOldBucketsEPSB_SE_:
  369|      2|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|      2|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|      2|    const KeyT EmptyKey = getEmptyKey();
  374|      2|    const KeyT TombstoneKey = getTombstoneKey();
  375|    130|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 128, False: 2]
  ------------------
  376|    128|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 94, False: 34]
  ------------------
  377|    128|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 94, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|     94|        BucketT *DestBucket;
  380|     94|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|     94|        (void)FoundVal; // silence warning.
  382|     94|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|     94|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|     94|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|     94|        B->getSecond().~ValueT();
  389|     94|      }
  390|      0|      B->getFirst().~KeyT();
  391|    128|    }
  392|      2|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16getNumTombstonesEv:
  473|    161|  unsigned getNumTombstones() const {
  474|    161|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    161|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16getNumTombstonesEv:
  779|    161|  unsigned getNumTombstones() const {
  780|    161|    return NumTombstones;
  781|    161|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|    296|  void incrementNumEntries() {
  466|    296|    setNumEntries(getNumEntries() + 1);
  467|    296|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5beginEv:
   76|     78|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|     78|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 78]
  ------------------
   80|      0|      return end();
   81|     78|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 78]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|     78|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|     78|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5emptyEv:
   99|     78|  LLVM_NODISCARD bool empty() const {
  100|     78|    return getNumEntries() == 0;
  101|     78|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12makeIteratorEPSB_SE_RNS_14DebugEpochBaseEb:
  439|    156|                        bool NoAdvance=false) {
  440|    156|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 156]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|    156|    return iterator(P, E, Epoch, NoAdvance);
  445|    156|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEC2EPSA_SC_RKNS_14DebugEpochBaseEb:
 1139|    156|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    156|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    156|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 78, False: 78]
  ------------------
 1143|     78|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 78]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|     78|    AdvancePastEmptyBuckets();
 1148|     78|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|    482|  void AdvancePastEmptyBuckets() {
 1205|    482|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|    482|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|  5.32k|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 5.24k, False: 78]
  |  Branch (1209:27): [True: 4.84k, False: 404]
  ------------------
 1210|  5.24k|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 404]
  ------------------
 1211|  4.84k|      ++Ptr;
 1212|    482|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E3endEv:
   85|     78|  inline iterator end() {
   86|     78|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     78|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb1EEC2ILb0EvEERKNS0_IS3_S5_S7_SA_XT_EEE:
 1157|    482|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEneERKNS0_IS3_S5_S7_SA_Lb1EEE:
 1179|    482|  bool operator!=(const ConstIterator &RHS) const {
 1180|    482|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|    482|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|    482|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEppEv:
 1187|    404|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|    404|    assert(isHandleInSync() && "invalid iterator access!");
 1189|    404|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 404]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|    404|    ++Ptr;
 1195|    404|    AdvancePastEmptyBuckets();
 1196|    404|    return *this;
 1197|    404|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS1_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EELb0EEdeEv:
 1159|    404|  reference operator*() const {
 1160|    404|    assert(isHandleInSync() && "invalid iterator access!");
 1161|    404|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1161:9): [True: 0, False: 404]
  ------------------
 1162|      0|      return Ptr[-1];
 1163|    404|    return *Ptr;
 1164|    404|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5countEPKS3_:
  149|   547k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   547k|    const BucketT *TheBucket;
  151|   547k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 547k]
  ------------------
  152|   547k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|   547k|                       const BucketT *&FoundBucket) const {
  583|   547k|    const BucketT *BucketsPtr = getBuckets();
  584|   547k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   547k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 547k, False: 0]
  ------------------
  587|   547k|      FoundBucket = nullptr;
  588|   547k|      return false;
  589|   547k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|      0|    const BucketT *FoundTombstone = nullptr;
  593|      0|    const KeyT EmptyKey = getEmptyKey();
  594|      0|    const KeyT TombstoneKey = getTombstoneKey();
  595|      0|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|      0|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|      0|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|      0|    unsigned ProbeAmt = 1;
  601|      0|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|      0|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|      0|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10getBucketsEv:
  489|   547k|  const BucketT *getBuckets() const {
  490|   547k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   547k|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE10getBucketsEv:
  787|   547k|  BucketT *getBuckets() const {
  788|   547k|    return Buckets;
  789|   547k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getNumBucketsEv:
  497|   547k|  unsigned getNumBuckets() const {
  498|   547k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   547k|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE13getNumBucketsEv:
  791|   547k|  unsigned getNumBuckets() const {
  792|   547k|    return NumBuckets;
  793|   547k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getNumEntriesEv:
  457|     39|  unsigned getNumEntries() const {
  458|     39|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|     39|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE13getNumEntriesEv:
  771|     39|  unsigned getNumEntries() const {
  772|     39|    return NumEntries;
  773|     39|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE15allocateBucketsEj:
  795|     39|  bool allocateBuckets(unsigned Num) {
  796|     39|    NumBuckets = Num;
  797|     39|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 39, False: 0]
  ------------------
  798|     39|      Buckets = nullptr;
  799|     39|      return false;
  800|     39|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10getBucketsEv:
  493|    156|  BucketT *getBuckets() {
  494|    156|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    156|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E13getBucketsEndEv:
  501|    156|  BucketT *getBucketsEnd() {
  502|    156|    return getBuckets() + getNumBuckets();
  503|    156|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5beginEv:
   76|     39|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|     39|    if (empty())
  ------------------
  |  Branch (79:9): [True: 39, False: 0]
  ------------------
   80|     39|      return end();
   81|      0|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 0]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|      0|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E5emptyEv:
   99|     39|  LLVM_NODISCARD bool empty() const {
  100|     39|    return getNumEntries() == 0;
  101|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|     78|                        bool NoAdvance=false) {
  440|     78|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 78]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|     78|    return iterator(P, E, Epoch, NoAdvance);
  445|     78|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1139|     78|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|     78|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|     78|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 78, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E3endEv:
   85|     78|  inline iterator end() {
   86|     78|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     78|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb1EEC2ILb0EvEERKNS0_IS3_S3_S5_S8_XT_EEE:
 1157|     39|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EELb0EEneERKNS0_IS3_S3_S5_S8_Lb1EEE:
 1179|     39|  bool operator!=(const ConstIterator &RHS) const {
 1180|     39|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|     39|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS2_17RegisterAllocator17BlockLifetimeInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E5clearEv:
  113|     39|  void clear() {
  114|     39|    incrementEpoch();
  115|     39|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 39]
  |  Branch (115:33): [True: 0, False: 0]
  ------------------
  116|       |
  117|       |    // If the capacity of the array is huge, and the # elements used is small,
  118|       |    // shrink the array.
  119|     39|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 37, False: 2]
  |  Branch (119:50): [True: 0, False: 37]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|     39|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|     39|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value) {
  ------------------
  |  Branch (125:9): [Folded - Ignored]
  |  Branch (125:35): [Folded - Ignored]
  ------------------
  126|       |      // Use a simpler loop when these are trivial types.
  127|      0|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 0, False: 0]
  ------------------
  128|      0|        P->getFirst() = EmptyKey;
  129|     39|    } else {
  130|     39|      unsigned NumEntries = getNumEntries();
  131|  2.66k|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (131:61): [True: 2.62k, False: 39]
  ------------------
  132|  2.62k|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey)) {
  ------------------
  |  Branch (132:13): [True: 202, False: 2.42k]
  ------------------
  133|    202|          if (!KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (133:15): [True: 202, False: 0]
  ------------------
  134|    202|            P->getSecond().~ValueT();
  135|    202|            --NumEntries;
  136|    202|          }
  137|    202|          P->getFirst() = EmptyKey;
  138|    202|        }
  139|  2.62k|      }
  140|     39|      assert(NumEntries == 0 && "Node count imbalance!");
  141|       |      // Suppress -Wunused-but-set-variable warning with new compilers.
  142|      0|      (void)NumEntries;
  143|     39|    }
  144|      0|    setNumEntries(0);
  145|     39|    setNumTombstones(0);
  146|     39|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEEC2Ej:
  669|     39|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEE4initEj:
  726|     39|  void init(unsigned InitNumEntries) {
  727|     39|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     39|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 39]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     39|    } else {
  731|     39|      NumEntries = 0;
  732|     39|      NumTombstones = 0;
  733|     39|    }
  734|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E31getMinBucketToReserveForEntriesEj:
  360|     39|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     39|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 39, False: 0]
  ------------------
  363|     39|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     39|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionES3_NS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S3_EEED2Ev:
  687|     39|  ~DenseMap() {
  688|     39|    this->destroyAll();
  689|     39|    operator delete(Buckets);
  690|     39|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionES4_NS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S4_EEEES4_S4_S6_S9_E10destroyAllEv:
  334|     39|  void destroyAll() {
  335|     39|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 39, False: 0]
  ------------------
  336|     39|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_EixERKS4_:
  303|  5.74M|  ValueT &operator[](const KeyT &Key) {
  304|  5.74M|    return FindAndConstruct(Key).second;
  305|  5.74M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16FindAndConstructERKS4_:
  295|  5.74M|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  5.74M|    BucketT *TheBucket;
  297|  5.74M|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 4.05M, False: 1.68M]
  ------------------
  298|  4.05M|      return *TheBucket;
  299|       |
  300|  1.68M|    return *InsertIntoBucket(TheBucket, Key);
  301|  5.74M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPSA_:
  632|  7.21M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  7.21M|    const BucketT *ConstFoundBucket;
  634|  7.21M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  7.21M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  7.21M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  7.21M|    return Result;
  638|  7.21M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIS4_EEbRKT_RPKSA_:
  582|  7.21M|                       const BucketT *&FoundBucket) const {
  583|  7.21M|    const BucketT *BucketsPtr = getBuckets();
  584|  7.21M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  7.21M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 114k, False: 7.10M]
  ------------------
  587|   114k|      FoundBucket = nullptr;
  588|   114k|      return false;
  589|   114k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  7.10M|    const BucketT *FoundTombstone = nullptr;
  593|  7.10M|    const KeyT EmptyKey = getEmptyKey();
  594|  7.10M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  7.10M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  7.10M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  7.10M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  7.10M|    unsigned ProbeAmt = 1;
  601|  10.3M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  10.3M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  10.3M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  10.3M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.05M, False: 6.29M]
  |  |  ------------------
  ------------------
  605|  4.05M|        FoundBucket = ThisBucket;
  606|  4.05M|        return true;
  607|  4.05M|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  6.29M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  6.29M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.04M, False: 3.25M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  3.04M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 3.04M]
  ------------------
  615|  3.04M|        return false;
  616|  3.04M|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  3.25M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 3.25M]
  ------------------
  621|  3.25M|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  3.25M|      BucketNo += ProbeAmt++;
  627|  3.25M|      BucketNo &= (NumBuckets-1);
  628|  3.25M|    }
  629|  7.10M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E10getBucketsEv:
  489|  13.1M|  const BucketT *getBuckets() const {
  490|  13.1M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  13.1M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueERKS4_:
  417|  7.10M|  static unsigned getHashValue(const KeyT &Val) {
  418|  7.10M|    return KeyInfoT::getHashValue(Val);
  419|  7.10M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes5ValueENS2_8RegisterEE8getFirstEv:
   48|  35.0M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16InsertIntoBucketIRKS4_JEEEPSA_SG_OT_DpOT0_:
  519|  1.68M|                            ValueArgs &&... Values) {
  520|  1.68M|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  1.68M|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  1.68M|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  1.68M|    return TheBucket;
  525|  1.68M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E20InsertIntoBucketImplIS4_EEPSA_RKS4_RKT_SE_:
  539|  1.68M|                                BucketT *TheBucket) {
  540|  1.68M|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  1.68M|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  1.68M|    unsigned NumBuckets = getNumBuckets();
  553|  1.68M|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  1.68M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 114k, False: 1.57M]
  |  |  ------------------
  ------------------
  554|   114k|      this->grow(NumBuckets * 2);
  555|   114k|      LookupBucketFor(Lookup, TheBucket);
  556|   114k|      NumBuckets = getNumBuckets();
  557|  1.57M|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  1.57M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.57M]
  |  |  ------------------
  ------------------
  558|  1.57M|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  1.68M|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  1.68M|    const KeyT EmptyKey = getEmptyKey();
  570|  1.68M|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 1.68M]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  1.68M|    return TheBucket;
  574|  1.68M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E13getNumEntriesEv:
  457|  4.72M|  unsigned getNumEntries() const {
  458|  4.72M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  4.72M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE13getNumEntriesEv:
  771|  4.72M|  unsigned getNumEntries() const {
  772|  4.72M|    return NumEntries;
  773|  4.72M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E4growEj:
  509|   114k|  void grow(unsigned AtLeast) {
  510|   114k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   114k|  }
_ZN4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE4growEj:
  736|   114k|  void grow(unsigned AtLeast) {
  737|   114k|    unsigned OldNumBuckets = NumBuckets;
  738|   114k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   114k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   114k|    assert(Buckets);
  742|   114k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 114k, False: 348]
  ------------------
  743|   114k|      this->BaseT::initEmpty();
  744|   114k|      return;
  745|   114k|    }
  746|       |
  747|    348|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    348|    operator delete(OldBuckets);
  751|    348|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|    348|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    348|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    348|    const KeyT EmptyKey = getEmptyKey();
  374|    348|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.80M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.80M, False: 348]
  ------------------
  376|  1.80M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 1.35M, False: 451k]
  ------------------
  377|  1.80M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 1.35M, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  1.35M|        BucketT *DestBucket;
  380|  1.35M|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  1.35M|        (void)FoundVal; // silence warning.
  382|  1.35M|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  1.35M|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  1.35M|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  1.35M|        B->getSecond().~ValueT();
  389|  1.35M|      }
  390|      0|      B->getFirst().~KeyT();
  391|  1.80M|    }
  392|    348|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E16getNumTombstonesEv:
  473|  1.57M|  unsigned getNumTombstones() const {
  474|  1.57M|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  1.57M|  }
_ZNK4llvh8DenseMapIPN6hermes5ValueENS1_8RegisterENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EEE16getNumTombstonesEv:
  779|  1.57M|  unsigned getNumTombstones() const {
  780|  1.57M|    return NumTombstones;
  781|  1.57M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E19incrementNumEntriesEv:
  465|  3.04M|  void incrementNumEntries() {
  466|  3.04M|    setNumEntries(getNumEntries() + 1);
  467|  3.04M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5countEPKS3_:
  149|  5.89M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  5.89M|    const BucketT *TheBucket;
  151|  5.89M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 4.58M, False: 1.30M]
  ------------------
  152|  5.89M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E15LookupBucketForIPKS3_EEbRKT_RPKSA_:
  582|  5.89M|                       const BucketT *&FoundBucket) const {
  583|  5.89M|    const BucketT *BucketsPtr = getBuckets();
  584|  5.89M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  5.89M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 5.89M]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  5.89M|    const BucketT *FoundTombstone = nullptr;
  593|  5.89M|    const KeyT EmptyKey = getEmptyKey();
  594|  5.89M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  5.89M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  5.89M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  5.89M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  5.89M|    unsigned ProbeAmt = 1;
  601|  8.54M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  8.54M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  8.54M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  8.54M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.58M, False: 3.96M]
  |  |  ------------------
  ------------------
  605|  4.58M|        FoundBucket = ThisBucket;
  606|  4.58M|        return true;
  607|  4.58M|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  3.96M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  3.96M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.30M, False: 2.65M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  1.30M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.30M]
  ------------------
  615|  1.30M|        return false;
  616|  1.30M|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  2.65M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 2.65M]
  ------------------
  621|  2.65M|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  2.65M|      BucketNo += ProbeAmt++;
  627|  2.65M|      BucketNo &= (NumBuckets-1);
  628|  2.65M|    }
  629|  5.89M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes5ValueENS2_8RegisterENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12getHashValueIPKS3_EEjRKT_:
  422|  5.89M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  5.89M|    return KeyInfoT::getHashValue(Val);
  424|  5.89M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E5countEPKS3_:
  149|  1.02M|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|  1.02M|    const BucketT *TheBucket;
  151|  1.02M|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 1.02M, False: 0]
  ------------------
  152|  1.02M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPKS9_:
  582|  5.25M|                       const BucketT *&FoundBucket) const {
  583|  5.25M|    const BucketT *BucketsPtr = getBuckets();
  584|  5.25M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  5.25M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 39, False: 5.25M]
  ------------------
  587|     39|      FoundBucket = nullptr;
  588|     39|      return false;
  589|     39|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  5.25M|    const BucketT *FoundTombstone = nullptr;
  593|  5.25M|    const KeyT EmptyKey = getEmptyKey();
  594|  5.25M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  5.25M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  5.25M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  5.25M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  5.25M|    unsigned ProbeAmt = 1;
  601|  7.92M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  7.92M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  7.92M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  7.92M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.70M, False: 3.21M]
  |  |  ------------------
  ------------------
  605|  4.70M|        FoundBucket = ThisBucket;
  606|  4.70M|        return true;
  607|  4.70M|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  3.21M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  3.21M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 547k, False: 2.66M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   547k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 547k]
  ------------------
  615|   547k|        return false;
  616|   547k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  2.66M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 2.66M]
  ------------------
  621|  2.66M|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  2.66M|      BucketNo += ProbeAmt++;
  627|  2.66M|      BucketNo &= (NumBuckets-1);
  628|  2.66M|    }
  629|  5.25M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E10getBucketsEv:
  489|  6.59M|  const BucketT *getBuckets() const {
  490|  6.59M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  6.59M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueIPKS3_EEjRKT_:
  422|  5.25M|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|  5.25M|    return KeyInfoT::getHashValue(Val);
  424|  5.25M|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes11InstructionEjE8getFirstEv:
   48|  19.6M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4findEPKS3_:
  154|  4.23M|  iterator find(const_arg_type_t<KeyT> Val) {
  155|  4.23M|    BucketT *TheBucket;
  156|  4.23M|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 3.68M, False: 547k]
  ------------------
  157|  3.68M|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   547k|    return end();
  159|  4.23M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIPKS3_EEbRKT_RPS9_:
  632|  4.23M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  4.23M|    const BucketT *ConstFoundBucket;
  634|  4.23M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  4.23M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  4.23M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  4.23M|    return Result;
  638|  4.23M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12makeIteratorEPS9_SC_RNS_14DebugEpochBaseEb:
  439|  8.46M|                        bool NoAdvance=false) {
  440|  8.46M|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 8.46M]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  8.46M|    return iterator(P, E, Epoch, NoAdvance);
  445|  8.46M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEC2EPS8_SA_RKNS_14DebugEpochBaseEb:
 1139|  8.46M|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  8.46M|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  8.46M|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 8.46M, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E3endEv:
   85|  4.78M|  inline iterator end() {
   86|  4.78M|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|  4.78M|  }
_ZN4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb1EEC2ILb0EvEERKNS0_IS3_jS5_S8_XT_EEE:
 1157|  4.23M|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEneERKNS0_IS3_jS5_S8_Lb1EEE:
 1179|  4.23M|  bool operator!=(const ConstIterator &RHS) const {
 1180|  4.23M|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|  4.23M|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|  4.23M|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEELb0EEptEv:
 1165|  3.68M|  pointer operator->() const {
 1166|  3.68M|    assert(isHandleInSync() && "invalid iterator access!");
 1167|  3.68M|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 3.68M]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|  3.68M|    return Ptr;
 1170|  3.68M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_EixERKS4_:
  303|   547k|  ValueT &operator[](const KeyT &Key) {
  304|   547k|    return FindAndConstruct(Key).second;
  305|   547k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16FindAndConstructERKS4_:
  295|   547k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   547k|    BucketT *TheBucket;
  297|   547k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 547k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   547k|    return *InsertIntoBucket(TheBucket, Key);
  301|   547k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPS9_:
  632|  1.33M|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.33M|    const BucketT *ConstFoundBucket;
  634|  1.33M|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.33M|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.33M|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.33M|    return Result;
  638|  1.33M|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E15LookupBucketForIS4_EEbRKT_RPKS9_:
  582|  1.33M|                       const BucketT *&FoundBucket) const {
  583|  1.33M|    const BucketT *BucketsPtr = getBuckets();
  584|  1.33M|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.33M|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 39, False: 1.33M]
  ------------------
  587|     39|      FoundBucket = nullptr;
  588|     39|      return false;
  589|     39|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.33M|    const BucketT *FoundTombstone = nullptr;
  593|  1.33M|    const KeyT EmptyKey = getEmptyKey();
  594|  1.33M|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.33M|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.33M|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.33M|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.33M|    unsigned ProbeAmt = 1;
  601|  2.40M|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.40M|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.40M|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.40M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 2.40M]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  2.40M|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  2.40M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.33M, False: 1.06M]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  1.33M|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.33M]
  ------------------
  615|  1.33M|        return false;
  616|  1.33M|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  1.06M|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.06M]
  ------------------
  621|  1.06M|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  1.06M|      BucketNo += ProbeAmt++;
  627|  1.06M|      BucketNo &= (NumBuckets-1);
  628|  1.06M|    }
  629|  1.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E12getHashValueERKS4_:
  417|  1.33M|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.33M|    return KeyInfoT::getHashValue(Val);
  419|  1.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16InsertIntoBucketIRKS4_JEEEPS9_SF_OT_DpOT0_:
  519|   547k|                            ValueArgs &&... Values) {
  520|   547k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   547k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   547k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   547k|    return TheBucket;
  525|   547k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E20InsertIntoBucketImplIS4_EEPS9_RKS4_RKT_SD_:
  539|   547k|                                BucketT *TheBucket) {
  540|   547k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   547k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   547k|    unsigned NumBuckets = getNumBuckets();
  553|   547k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   547k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 324, False: 546k]
  |  |  ------------------
  ------------------
  554|    324|      this->grow(NumBuckets * 2);
  555|    324|      LookupBucketFor(Lookup, TheBucket);
  556|    324|      NumBuckets = getNumBuckets();
  557|   546k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   546k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 546k]
  |  |  ------------------
  ------------------
  558|   546k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   547k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   547k|    const KeyT EmptyKey = getEmptyKey();
  570|   547k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 547k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   547k|    return TheBucket;
  574|   547k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E13getNumEntriesEv:
  457|  1.88M|  unsigned getNumEntries() const {
  458|  1.88M|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  1.88M|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE13getNumEntriesEv:
  771|  1.88M|  unsigned getNumEntries() const {
  772|  1.88M|    return NumEntries;
  773|  1.88M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E4growEj:
  509|    324|  void grow(unsigned AtLeast) {
  510|    324|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    324|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE4growEj:
  736|    324|  void grow(unsigned AtLeast) {
  737|    324|    unsigned OldNumBuckets = NumBuckets;
  738|    324|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    324|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    324|    assert(Buckets);
  742|    324|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 39, False: 285]
  ------------------
  743|     39|      this->BaseT::initEmpty();
  744|     39|      return;
  745|     39|    }
  746|       |
  747|    285|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|    285|    operator delete(OldBuckets);
  751|    285|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|    285|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|    285|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|    285|    const KeyT EmptyKey = getEmptyKey();
  374|    285|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.05M|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.05M, False: 285]
  ------------------
  376|  1.05M|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 791k, False: 264k]
  ------------------
  377|  1.05M|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 791k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   791k|        BucketT *DestBucket;
  380|   791k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   791k|        (void)FoundVal; // silence warning.
  382|   791k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   791k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   791k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   791k|        B->getSecond().~ValueT();
  389|   791k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  1.05M|    }
  392|    285|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E16getNumTombstonesEv:
  473|   546k|  unsigned getNumTombstones() const {
  474|   546k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   546k|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEE16getNumTombstonesEv:
  779|   546k|  unsigned getNumTombstones() const {
  780|   546k|    return NumTombstones;
  781|   546k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionEjNS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_jEEEES4_jS6_S9_E19incrementNumEntriesEv:
  465|  1.33M|  void incrementNumEntries() {
  466|  1.33M|    setNumEntries(getNumEntries() + 1);
  467|  1.33M|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE15allocateBucketsEj:
  795|   228k|  bool allocateBuckets(unsigned Num) {
  796|   228k|    NumBuckets = Num;
  797|   228k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 114k]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|   114k|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|   114k|    return true;
  804|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E9initEmptyEv:
  347|   114k|  void initEmpty() {
  348|   114k|    setNumEntries(0);
  349|   114k|    setNumTombstones(0);
  350|       |
  351|   114k|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|   114k|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  7.42M|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 7.30M, False: 114k]
  ------------------
  355|  7.30M|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13setNumEntriesEj:
  461|   228k|  void setNumEntries(unsigned Num) {
  462|   228k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|   228k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13setNumEntriesEj:
  775|   228k|  void setNumEntries(unsigned Num) {
  776|   228k|    NumEntries = Num;
  777|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16setNumTombstonesEj:
  477|   114k|  void setNumTombstones(unsigned Num) {
  478|   114k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|   114k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE16setNumTombstonesEj:
  783|   114k|  void setNumTombstones(unsigned Num) {
  784|   114k|    NumTombstones = Num;
  785|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_EixEOS4_:
  315|   114k|  ValueT &operator[](KeyT &&Key) {
  316|   114k|    return FindAndConstruct(std::move(Key)).second;
  317|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16FindAndConstructEOS4_:
  307|   114k|  value_type& FindAndConstruct(KeyT &&Key) {
  308|   114k|    BucketT *TheBucket;
  309|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 114k]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|   114k|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPSB_:
  632|   228k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   228k|    const BucketT *ConstFoundBucket;
  634|   228k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   228k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   228k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   228k|    return Result;
  638|   228k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E15LookupBucketForIS4_EEbRKT_RPKSB_:
  582|   228k|                       const BucketT *&FoundBucket) const {
  583|   228k|    const BucketT *BucketsPtr = getBuckets();
  584|   228k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   228k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 114k, False: 114k]
  ------------------
  587|   114k|      FoundBucket = nullptr;
  588|   114k|      return false;
  589|   114k|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   114k|    const BucketT *FoundTombstone = nullptr;
  593|   114k|    const KeyT EmptyKey = getEmptyKey();
  594|   114k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   114k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   114k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   114k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   114k|    unsigned ProbeAmt = 1;
  601|   114k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   114k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   114k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   114k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   114k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   114k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   114k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 114k]
  ------------------
  615|   114k|        return false;
  616|   114k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E10getBucketsEv:
  489|   228k|  const BucketT *getBuckets() const {
  490|   228k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E12getHashValueERKS4_:
  417|   114k|  static unsigned getHashValue(const KeyT &Val) {
  418|   114k|    return KeyInfoT::getHashValue(Val);
  419|   114k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstEE8getFirstEv:
   48|   228k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E16InsertIntoBucketIS4_JEEEPSB_SF_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E20InsertIntoBucketImplIS4_EEPSB_RKS4_RKT_SF_:
  539|   114k|                                BucketT *TheBucket) {
  540|   114k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   114k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   114k|    unsigned NumBuckets = getNumBuckets();
  553|   114k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 114k, False: 0]
  |  |  ------------------
  ------------------
  554|   114k|      this->grow(NumBuckets * 2);
  555|   114k|      LookupBucketFor(Lookup, TheBucket);
  556|   114k|      NumBuckets = getNumBuckets();
  557|   114k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  558|      0|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   114k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   114k|    const KeyT EmptyKey = getEmptyKey();
  570|   114k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 114k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   114k|    return TheBucket;
  574|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E13getNumEntriesEv:
  457|   228k|  unsigned getNumEntries() const {
  458|   228k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   228k|  }
_ZNK4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE13getNumEntriesEv:
  771|   228k|  unsigned getNumEntries() const {
  772|   228k|    return NumEntries;
  773|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E4growEj:
  509|   114k|  void grow(unsigned AtLeast) {
  510|   114k|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|   114k|  }
_ZN4llvh8DenseMapIPN6hermes9ScopeDescEPNS1_17ScopeCreationInstENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEE4growEj:
  736|   114k|  void grow(unsigned AtLeast) {
  737|   114k|    unsigned OldNumBuckets = NumBuckets;
  738|   114k|    BucketT *OldBuckets = Buckets;
  739|       |
  740|   114k|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|   114k|    assert(Buckets);
  742|   114k|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 114k, False: 0]
  ------------------
  743|   114k|      this->BaseT::initEmpty();
  744|   114k|      return;
  745|   114k|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9ScopeDescEPNS2_17ScopeCreationInstENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEEES4_S6_S8_SB_E19incrementNumEntriesEv:
  465|   114k|  void incrementNumEntries() {
  466|   114k|    setNumEntries(getNumEntries() + 1);
  467|   114k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 0]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|      0|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      0|    return true;
  804|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E13getNumBucketsEv:
  497|   114k|  unsigned getNumBuckets() const {
  498|   114k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   114k|  }
_ZNK4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEE13getNumBucketsEv:
  791|   114k|  unsigned getNumBuckets() const {
  792|   114k|    return NumBuckets;
  793|   114k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EELb1EEC2EPKSF_SI_RKNS_14DebugEpochBaseEb:
 1139|    636|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    636|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    636|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 636, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS3_EENS4_12DenseSetPairIS3_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes11InstructionENS_6detail13DenseSetEmptyENS_12DenseMapInfoIS4_EENS5_12DenseSetPairIS4_EEEES4_S6_S8_SA_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 0]
  ------------------
  336|   114k|      return;
  337|       |
  338|      0|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|      0|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 0, False: 0]
  ------------------
  340|      0|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 0, False: 0]
  ------------------
  341|      0|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 0]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|      0|      P->getFirst().~KeyT();
  344|      0|    }
  345|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E5beginEv:
   76|      2|  inline iterator begin() {
   77|       |    // When the map is empty, avoid the overhead of advancing/retreating past
   78|       |    // empty buckets.
   79|      2|    if (empty())
  ------------------
  |  Branch (79:9): [True: 0, False: 2]
  ------------------
   80|      0|      return end();
   81|      2|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (81:9): [True: 0, False: 2]
  ------------------
   82|      0|      return makeIterator(getBucketsEnd() - 1, getBuckets(), *this);
   83|      2|    return makeIterator(getBuckets(), getBucketsEnd(), *this);
   84|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E12makeIteratorEPSA_SD_RNS_14DebugEpochBaseEb:
  439|      4|                        bool NoAdvance=false) {
  440|      4|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 4]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|      4|    return iterator(P, E, Epoch, NoAdvance);
  445|      4|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEC2EPS9_SB_RKNS_14DebugEpochBaseEb:
 1139|      4|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|      4|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|      4|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 2, False: 2]
  ------------------
 1143|      2|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 2]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      2|    AdvancePastEmptyBuckets();
 1148|      2|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EE23AdvancePastEmptyBucketsEv:
 1204|     14|  void AdvancePastEmptyBuckets() {
 1205|     14|    assert(Ptr <= End);
 1206|      0|    const KeyT Empty = KeyInfoT::getEmptyKey();
 1207|     14|    const KeyT Tombstone = KeyInfoT::getTombstoneKey();
 1208|       |
 1209|    130|    while (Ptr != End && (KeyInfoT::isEqual(Ptr->getFirst(), Empty) ||
  ------------------
  |  Branch (1209:12): [True: 128, False: 2]
  |  Branch (1209:27): [True: 116, False: 12]
  ------------------
 1210|    128|                          KeyInfoT::isEqual(Ptr->getFirst(), Tombstone)))
  ------------------
  |  Branch (1210:27): [True: 0, False: 12]
  ------------------
 1211|    116|      ++Ptr;
 1212|     14|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes9CatchInstENS2_17CatchCoverageInfoENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S5_EEEES4_S5_S7_SA_E3endEv:
   85|      2|  inline iterator end() {
   86|      2|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|      2|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb1EEC2ILb0EvEERKNS0_IS3_S4_S6_S9_XT_EEE:
 1157|     14|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEneERKNS0_IS3_S4_S6_S9_Lb1EEE:
 1179|     14|  bool operator!=(const ConstIterator &RHS) const {
 1180|     14|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|     14|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|     14|  }
_ZN4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEppEv:
 1187|     12|  inline DenseMapIterator& operator++() {  // Preincrement
 1188|     12|    assert(isHandleInSync() && "invalid iterator access!");
 1189|     12|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1189:9): [True: 0, False: 12]
  ------------------
 1190|      0|      --Ptr;
 1191|      0|      RetreatPastEmptyBuckets();
 1192|      0|      return *this;
 1193|      0|    }
 1194|     12|    ++Ptr;
 1195|     12|    AdvancePastEmptyBuckets();
 1196|     12|    return *this;
 1197|     12|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes9CatchInstENS1_17CatchCoverageInfoENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S4_EELb0EEdeEv:
 1159|     12|  reference operator*() const {
 1160|     12|    assert(isHandleInSync() && "invalid iterator access!");
 1161|     12|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1161:9): [True: 0, False: 12]
  ------------------
 1162|      0|      return Ptr[-1];
 1163|     12|    return *Ptr;
 1164|     12|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4findEPKS3_:
  154|     24|  iterator find(const_arg_type_t<KeyT> Val) {
  155|     24|    BucketT *TheBucket;
  156|     24|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 24, False: 0]
  ------------------
  157|     24|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|      0|    return end();
  159|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPSC_:
  632|     24|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|     24|    const BucketT *ConstFoundBucket;
  634|     24|    bool Result = const_cast<const DenseMapBase *>(this)
  635|     24|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|     24|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|     24|    return Result;
  638|     24|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIPKS3_EEbRKT_RPKSC_:
  582|     24|                       const BucketT *&FoundBucket) const {
  583|     24|    const BucketT *BucketsPtr = getBuckets();
  584|     24|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|     24|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 24]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|     24|    const BucketT *FoundTombstone = nullptr;
  593|     24|    const KeyT EmptyKey = getEmptyKey();
  594|     24|    const KeyT TombstoneKey = getTombstoneKey();
  595|     24|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|     24|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|     24|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|     24|    unsigned ProbeAmt = 1;
  601|     39|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|     39|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|     39|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|     39|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24, False: 15]
  |  |  ------------------
  ------------------
  605|     24|        FoundBucket = ThisBucket;
  606|     24|        return true;
  607|     24|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|     15|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|     15|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 15]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|      0|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 0]
  ------------------
  615|      0|        return false;
  616|      0|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|     15|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 15]
  ------------------
  621|     15|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|     15|      BucketNo += ProbeAmt++;
  627|     15|      BucketNo &= (NumBuckets-1);
  628|     15|    }
  629|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueIPKS3_EEjRKT_:
  422|     24|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|     24|    return KeyInfoT::getHashValue(Val);
  424|     24|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|     48|                        bool NoAdvance=false) {
  440|     48|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 48]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|     48|    return iterator(P, E, Epoch, NoAdvance);
  445|     48|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1139|     48|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|     48|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|     48|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 48, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E3endEv:
   85|     24|  inline iterator end() {
   86|     24|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|     24|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb1EEC2ILb0EvEERKNS0_IS3_S6_S8_SB_XT_EEE:
 1157|     24|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEneERKNS0_IS3_S6_S8_SB_Lb1EEE:
 1179|     24|  bool operator!=(const ConstIterator &RHS) const {
 1180|     24|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|     24|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|     24|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENSt3__14pairIjjEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEptEv:
 1165|     24|  pointer operator->() const {
 1166|     24|    assert(isHandleInSync() && "invalid iterator access!");
 1167|     24|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 24]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|     24|    return Ptr;
 1170|     24|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4sizeEv:
  102|     56|  unsigned size() const { return getNumEntries(); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getNumEntriesEv:
  457|  95.7k|  unsigned getNumEntries() const {
  458|  95.7k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  95.7k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13getNumEntriesEv:
  771|  95.7k|  unsigned getNumEntries() const {
  772|  95.7k|    return NumEntries;
  773|  95.7k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10destroyAllEv:
  334|     56|  void destroyAll() {
  335|     56|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 56]
  ------------------
  336|      0|      return;
  337|       |
  338|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|  7.22k|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 7.16k, False: 56]
  ------------------
  340|  7.16k|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 3.43k, False: 3.73k]
  ------------------
  341|  7.16k|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 3.43k]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|  7.16k|      P->getFirst().~KeyT();
  344|  7.16k|    }
  345|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getNumBucketsEv:
  497|  1.36M|  unsigned getNumBuckets() const {
  498|  1.36M|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  1.36M|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13getNumBucketsEv:
  791|  1.36M|  unsigned getNumBuckets() const {
  792|  1.36M|    return NumBuckets;
  793|  1.36M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E11getEmptyKeyEv:
  426|   565k|  static const KeyT getEmptyKey() {
  427|   565k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   565k|                  "Must pass the derived type to this template!");
  429|   565k|    return KeyInfoT::getEmptyKey();
  430|   565k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15getTombstoneKeyEv:
  432|   565k|  static const KeyT getTombstoneKey() {
  433|   565k|    return KeyInfoT::getTombstoneKey();
  434|   565k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10getBucketsEv:
  493|    336|  BucketT *getBuckets() {
  494|    336|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    336|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE10getBucketsEv:
  787|  1.33M|  BucketT *getBuckets() const {
  788|  1.33M|    return Buckets;
  789|  1.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getBucketsEndEv:
  501|    168|  BucketT *getBucketsEnd() {
  502|    168|    return getBuckets() + getNumBuckets();
  503|    168|  }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE8getFirstEv:
   47|   139k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE9getSecondEv:
   49|  69.9k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE4initEj:
  726|     56|  void init(unsigned InitNumEntries) {
  727|     56|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|     56|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 56]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|     56|    } else {
  731|     56|      NumEntries = 0;
  732|     56|      NumTombstones = 0;
  733|     56|    }
  734|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E31getMinBucketToReserveForEntriesEj:
  360|     56|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|     56|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 56, False: 0]
  ------------------
  363|     56|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE15allocateBucketsEj:
  795|    168|  bool allocateBuckets(unsigned Num) {
  796|    168|    NumBuckets = Num;
  797|    168|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 56, False: 112]
  ------------------
  798|     56|      Buckets = nullptr;
  799|     56|      return false;
  800|     56|    }
  801|       |
  802|    112|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|    112|    return true;
  804|    168|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E9initEmptyEv:
  347|    112|  void initEmpty() {
  348|    112|    setNumEntries(0);
  349|    112|    setNumTombstones(0);
  350|       |
  351|    112|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|    112|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|  10.8k|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 10.7k, False: 112]
  ------------------
  355|  10.7k|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|    112|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13setNumEntriesEj:
  461|  64.7k|  void setNumEntries(unsigned Num) {
  462|  64.7k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  64.7k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE13setNumEntriesEj:
  775|  64.7k|  void setNumEntries(unsigned Num) {
  776|  64.7k|    NumEntries = Num;
  777|  64.7k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16setNumTombstonesEj:
  477|  58.6k|  void setNumTombstones(unsigned Num) {
  478|  58.6k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  58.6k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE16setNumTombstonesEj:
  783|  58.6k|  void setNumTombstones(unsigned Num) {
  784|  58.6k|    NumTombstones = Num;
  785|  58.6k|  }
_ZN4llvh16DenseMapIteratorIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEELb0EEC2EPS7_S9_RKNS_14DebugEpochBaseEb:
 1139|   114k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   114k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   114k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 114k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEEC2Ej:
  669|     56|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4findERKS3_:
  160|   265k|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|   265k|    const BucketT *TheBucket;
  162|   265k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 262k, False: 3.62k]
  ------------------
  163|   262k|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|  3.62k|    return end();
  165|   265k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15LookupBucketForIS3_EEbRKT_RPKSD_:
  582|   534k|                       const BucketT *&FoundBucket) const {
  583|   534k|    const BucketT *BucketsPtr = getBuckets();
  584|   534k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   534k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 112, False: 534k]
  ------------------
  587|    112|      FoundBucket = nullptr;
  588|    112|      return false;
  589|    112|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   534k|    const BucketT *FoundTombstone = nullptr;
  593|   534k|    const KeyT EmptyKey = getEmptyKey();
  594|   534k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   534k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   534k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   534k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   534k|    unsigned ProbeAmt = 1;
  601|   621k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   621k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   621k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   621k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 497k, False: 124k]
  |  |  ------------------
  ------------------
  605|   497k|        FoundBucket = ThisBucket;
  606|   497k|        return true;
  607|   497k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   124k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   124k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 37.2k, False: 87.2k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  37.2k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 27.6k, False: 9.66k]
  ------------------
  615|  37.2k|        return false;
  616|  37.2k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  87.2k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 29.1k, False: 58.1k]
  ------------------
  621|  87.2k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 27.6k, False: 1.54k]
  ------------------
  622|  27.6k|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  87.2k|      BucketNo += ProbeAmt++;
  627|  87.2k|      BucketNo &= (NumBuckets-1);
  628|  87.2k|    }
  629|   534k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E10getBucketsEv:
  489|  1.33M|  const BucketT *getBuckets() const {
  490|  1.33M|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  1.33M|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E12getHashValueERKS3_:
  417|   534k|  static unsigned getHashValue(const KeyT &Val) {
  418|   534k|    return KeyInfoT::getHashValue(Val);
  419|   534k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEEE8getFirstEv:
   48|   833k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E17makeConstIteratorEPKSD_SH_RKNS_14DebugEpochBaseEb:
  449|   531k|                                   const bool NoAdvance=false) const {
  450|   531k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 531k]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|   531k|    return const_iterator(P, E, Epoch, NoAdvance);
  455|   531k|  }
_ZN4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEC2EPKSC_SF_RKNS_14DebugEpochBaseEb:
 1139|   531k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   531k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   531k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 531k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E13getBucketsEndEv:
  505|   800k|  const BucketT *getBucketsEnd() const {
  506|   800k|    return getBuckets() + getNumBuckets();
  507|   800k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEeqERKSD_:
 1172|   265k|  bool operator==(const ConstIterator &RHS) const {
 1173|   265k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|   265k|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|   265k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E3endEv:
   95|   269k|  inline const_iterator end() const {
   96|   269k|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|   269k|  }
_ZNK4llvh16DenseMapIteratorIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EELb1EEptEv:
 1165|   262k|  pointer operator->() const {
 1166|   262k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   262k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 262k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   262k|    return Ptr;
 1170|   262k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_EixERKS3_:
  303|   235k|  ValueT &operator[](const KeyT &Key) {
  304|   235k|    return FindAndConstruct(Key).second;
  305|   235k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16FindAndConstructERKS3_:
  295|   235k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   235k|    BucketT *TheBucket;
  297|   235k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 204k, False: 31.0k]
  ------------------
  298|   204k|      return *TheBucket;
  299|       |
  300|  31.0k|    return *InsertIntoBucket(TheBucket, Key);
  301|   235k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E15LookupBucketForIS3_EEbRKT_RPSD_:
  632|   268k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   268k|    const BucketT *ConstFoundBucket;
  634|   268k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   268k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   268k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   268k|    return Result;
  638|   268k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16InsertIntoBucketIRKS3_JEEEPSD_SJ_OT_DpOT0_:
  519|  31.0k|                            ValueArgs &&... Values) {
  520|  31.0k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  31.0k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  31.0k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  31.0k|    return TheBucket;
  525|  31.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E20InsertIntoBucketImplIS3_EEPSD_RKS3_RKT_SH_:
  539|  31.0k|                                BucketT *TheBucket) {
  540|  31.0k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  31.0k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  31.0k|    unsigned NumBuckets = getNumBuckets();
  553|  31.0k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  31.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 112, False: 30.8k]
  |  |  ------------------
  ------------------
  554|    112|      this->grow(NumBuckets * 2);
  555|    112|      LookupBucketFor(Lookup, TheBucket);
  556|    112|      NumBuckets = getNumBuckets();
  557|  30.8k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  30.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 30.8k]
  |  |  ------------------
  ------------------
  558|  30.8k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  31.0k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  31.0k|    const KeyT EmptyKey = getEmptyKey();
  570|  31.0k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 27.5k, False: 3.43k]
  ------------------
  571|  27.5k|      decrementNumTombstones();
  572|       |
  573|  31.0k|    return TheBucket;
  574|  31.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E4growEj:
  509|    112|  void grow(unsigned AtLeast) {
  510|    112|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    112|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE4growEj:
  736|    112|  void grow(unsigned AtLeast) {
  737|    112|    unsigned OldNumBuckets = NumBuckets;
  738|    112|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    112|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    112|    assert(Buckets);
  742|    112|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 56]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|     56|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     56|    operator delete(OldBuckets);
  751|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E18moveFromOldBucketsEPSD_SG_:
  369|     56|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     56|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     56|    const KeyT EmptyKey = getEmptyKey();
  374|     56|    const KeyT TombstoneKey = getTombstoneKey();
  375|  3.64k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 3.58k, False: 56]
  ------------------
  376|  3.58k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 2.63k, False: 952]
  ------------------
  377|  3.58k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 2.63k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  2.63k|        BucketT *DestBucket;
  380|  2.63k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  2.63k|        (void)FoundVal; // silence warning.
  382|  2.63k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  2.63k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  2.63k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  2.63k|        B->getSecond().~ValueT();
  389|  2.63k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  3.58k|    }
  392|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E16getNumTombstonesEv:
  473|  89.4k|  unsigned getNumTombstones() const {
  474|  89.4k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  89.4k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_19ScopedHashTableNodeIS2_PNS1_5ValueEEENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S7_EEE16getNumTombstonesEv:
  779|  89.4k|  unsigned getNumTombstones() const {
  780|  89.4k|    return NumTombstones;
  781|  89.4k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E19incrementNumEntriesEv:
  465|  33.6k|  void incrementNumEntries() {
  466|  33.6k|    setNumEntries(getNumEntries() + 1);
  467|  33.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E22decrementNumTombstonesEv:
  485|  27.5k|  void decrementNumTombstones() {
  486|  27.5k|    setNumTombstones(getNumTombstones() - 1);
  487|  27.5k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E5countERKS3_:
  149|      2|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|      2|    const BucketT *TheBucket;
  151|      2|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 2]
  ------------------
  152|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E5eraseERKS3_:
  276|  31.0k|  bool erase(const KeyT &Val) {
  277|  31.0k|    BucketT *TheBucket;
  278|  31.0k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 31.0k]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|  31.0k|    TheBucket->getSecond().~ValueT();
  282|  31.0k|    TheBucket->getFirst() = getTombstoneKey();
  283|  31.0k|    decrementNumEntries();
  284|  31.0k|    incrementNumTombstones();
  285|  31.0k|    return true;
  286|  31.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E19decrementNumEntriesEv:
  469|  31.0k|  void decrementNumEntries() {
  470|  31.0k|    setNumEntries(getNumEntries() - 1);
  471|  31.0k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_19ScopedHashTableNodeIS3_PNS2_5ValueEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S8_EEEES3_S8_SA_SD_E22incrementNumTombstonesEv:
  481|  31.0k|  void incrementNumTombstones() {
  482|  31.0k|    setNumTombstones(getNumTombstones() + 1);
  483|  31.0k|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEED2Ev:
  687|    112|  ~DenseMap() {
  688|    112|    this->destroyAll();
  689|    112|    operator delete(Buckets);
  690|    112|  }
_ZN4llvh8DenseMapIPN6hermes8FunctionEPNS1_6Module9CJSModuleENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh8DenseMapIjNSt3__16vectorIPN6hermes8FunctionENS1_9allocatorIS5_EEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS8_EEED2Ev:
  687|     56|  ~DenseMap() {
  688|     56|    this->destroyAll();
  689|     56|    operator delete(Buckets);
  690|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E5clearEv:
  113|     56|  void clear() {
  114|     56|    incrementEpoch();
  115|     56|    if (getNumEntries() == 0 && getNumTombstones() == 0) return;
  ------------------
  |  Branch (115:9): [True: 0, False: 56]
  |  Branch (115:33): [True: 0, False: 0]
  ------------------
  116|       |
  117|       |    // If the capacity of the array is huge, and the # elements used is small,
  118|       |    // shrink the array.
  119|     56|    if (getNumEntries() * 4 < getNumBuckets() && getNumBuckets() > 64) {
  ------------------
  |  Branch (119:9): [True: 0, False: 56]
  |  Branch (119:50): [True: 0, False: 0]
  ------------------
  120|      0|      shrink_and_clear();
  121|      0|      return;
  122|      0|    }
  123|       |
  124|     56|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  125|     56|    if (isPodLike<KeyT>::value && isPodLike<ValueT>::value) {
  ------------------
  |  Branch (125:9): [Folded - Ignored]
  |  Branch (125:35): [Folded - Ignored]
  ------------------
  126|       |      // Use a simpler loop when these are trivial types.
  127|  7.22k|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P)
  ------------------
  |  Branch (127:61): [True: 7.16k, False: 56]
  ------------------
  128|  7.16k|        P->getFirst() = EmptyKey;
  129|     56|    } else {
  130|      0|      unsigned NumEntries = getNumEntries();
  131|      0|      for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (131:61): [True: 0, False: 0]
  ------------------
  132|      0|        if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey)) {
  ------------------
  |  Branch (132:13): [True: 0, False: 0]
  ------------------
  133|      0|          if (!KeyInfoT::isEqual(P->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (133:15): [True: 0, False: 0]
  ------------------
  134|      0|            P->getSecond().~ValueT();
  135|      0|            --NumEntries;
  136|      0|          }
  137|      0|          P->getFirst() = EmptyKey;
  138|      0|        }
  139|      0|      }
  140|      0|      assert(NumEntries == 0 && "Node count imbalance!");
  141|       |      // Suppress -Wunused-but-set-variable warning with new compilers.
  142|      0|      (void)NumEntries;
  143|      0|    }
  144|      0|    setNumEntries(0);
  145|     56|    setNumTombstones(0);
  146|     56|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E13getNumEntriesEv:
  457|  9.55k|  unsigned getNumEntries() const {
  458|  9.55k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  9.55k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE13getNumEntriesEv:
  771|  9.55k|  unsigned getNumEntries() const {
  772|  9.55k|    return NumEntries;
  773|  9.55k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16getNumTombstonesEv:
  473|  3.29k|  unsigned getNumTombstones() const {
  474|  3.29k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|  3.29k|  }
_ZNK4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE16getNumTombstonesEv:
  779|  3.29k|  unsigned getNumTombstones() const {
  780|  3.29k|    return NumTombstones;
  781|  3.29k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15LookupBucketForIS3_EEbRKT_RPSA_:
  632|  6.14k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  6.14k|    const BucketT *ConstFoundBucket;
  634|  6.14k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  6.14k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  6.14k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  6.14k|    return Result;
  638|  6.14k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E15LookupBucketForIS3_EEbRKT_RPKSA_:
  582|  6.14k|                       const BucketT *&FoundBucket) const {
  583|  6.14k|    const BucketT *BucketsPtr = getBuckets();
  584|  6.14k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  6.14k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 56, False: 6.09k]
  ------------------
  587|     56|      FoundBucket = nullptr;
  588|     56|      return false;
  589|     56|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  6.09k|    const BucketT *FoundTombstone = nullptr;
  593|  6.09k|    const KeyT EmptyKey = getEmptyKey();
  594|  6.09k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  6.09k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  6.09k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  6.09k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  6.09k|    unsigned ProbeAmt = 1;
  601|  7.66k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  7.66k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  7.66k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  7.66k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 7.66k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  7.66k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  7.66k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 6.09k, False: 1.57k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  6.09k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 6.09k]
  ------------------
  615|  6.09k|        return false;
  616|  6.09k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  1.57k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.57k]
  ------------------
  621|  1.57k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  1.57k|      BucketNo += ProbeAmt++;
  627|  1.57k|      BucketNo &= (NumBuckets-1);
  628|  1.57k|    }
  629|  6.09k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E10getBucketsEv:
  489|  6.14k|  const BucketT *getBuckets() const {
  490|  6.14k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  6.14k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E12getHashValueERKS3_:
  417|  6.09k|  static unsigned getHashValue(const KeyT &Val) {
  418|  6.09k|    return KeyInfoT::getHashValue(Val);
  419|  6.09k|  }
_ZNK4llvh6detail12DenseMapPairIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyEE8getFirstEv:
   48|  16.8k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_EixERKS3_:
  303|  3.40k|  ValueT &operator[](const KeyT &Key) {
  304|  3.40k|    return FindAndConstruct(Key).second;
  305|  3.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16FindAndConstructERKS3_:
  295|  3.40k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  3.40k|    BucketT *TheBucket;
  297|  3.40k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 3.40k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|  3.40k|    return *InsertIntoBucket(TheBucket, Key);
  301|  3.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E16InsertIntoBucketIRKS3_JEEEPSA_SG_OT_DpOT0_:
  519|  3.40k|                            ValueArgs &&... Values) {
  520|  3.40k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  3.40k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  3.40k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  3.40k|    return TheBucket;
  525|  3.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E20InsertIntoBucketImplIS3_EEPSA_RKS3_RKT_SE_:
  539|  3.40k|                                BucketT *TheBucket) {
  540|  3.40k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  3.40k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  3.40k|    unsigned NumBuckets = getNumBuckets();
  553|  3.40k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  3.40k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 112, False: 3.29k]
  |  |  ------------------
  ------------------
  554|    112|      this->grow(NumBuckets * 2);
  555|    112|      LookupBucketFor(Lookup, TheBucket);
  556|    112|      NumBuckets = getNumBuckets();
  557|  3.29k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  3.29k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.29k]
  |  |  ------------------
  ------------------
  558|  3.29k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  3.40k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  3.40k|    const KeyT EmptyKey = getEmptyKey();
  570|  3.40k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 3.40k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|  3.40k|    return TheBucket;
  574|  3.40k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E4growEj:
  509|    112|  void grow(unsigned AtLeast) {
  510|    112|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|    112|  }
_ZN4llvh8DenseMapIN6hermes10IdentifierEPNS1_20GlobalObjectPropertyENS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_S4_EEE4growEj:
  736|    112|  void grow(unsigned AtLeast) {
  737|    112|    unsigned OldNumBuckets = NumBuckets;
  738|    112|    BucketT *OldBuckets = Buckets;
  739|       |
  740|    112|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|    112|    assert(Buckets);
  742|    112|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 56]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|     56|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     56|    operator delete(OldBuckets);
  751|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E18moveFromOldBucketsEPSA_SD_:
  369|     56|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     56|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     56|    const KeyT EmptyKey = getEmptyKey();
  374|     56|    const KeyT TombstoneKey = getTombstoneKey();
  375|  3.64k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 3.58k, False: 56]
  ------------------
  376|  3.58k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 2.63k, False: 952]
  ------------------
  377|  3.58k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 2.63k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  2.63k|        BucketT *DestBucket;
  380|  2.63k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  2.63k|        (void)FoundVal; // silence warning.
  382|  2.63k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  2.63k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  2.63k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  2.63k|        B->getSecond().~ValueT();
  389|  2.63k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  3.58k|    }
  392|     56|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEPNS2_20GlobalObjectPropertyENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S5_EEEES3_S5_S7_SA_E19incrementNumEntriesEv:
  465|  6.03k|  void incrementNumEntries() {
  466|  6.03k|    setNumEntries(getNumEntries() + 1);
  467|  6.03k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E11try_emplaceIJiEEENSt3__14pairINS_16DenseMapIteratorIS3_jS5_S8_Lb0EEEbEERKS3_DpOT_:
  233|   114k|  std::pair<iterator, bool> try_emplace(const KeyT &Key, Ts &&... Args) {
  234|   114k|    BucketT *TheBucket;
  235|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (235:9): [True: 114k, False: 66]
  ------------------
  236|   114k|      return std::make_pair(
  237|   114k|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  238|   114k|               false); // Already in map.
  239|       |
  240|       |    // Otherwise, insert the new element.
  241|     66|    TheBucket = InsertIntoBucket(TheBucket, Key, std::forward<Ts>(Args)...);
  242|     66|    return std::make_pair(
  243|     66|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  244|     66|             true);
  245|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIN6hermes10IdentifierEjNS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_jEEEES3_jS5_S8_E16InsertIntoBucketIRKS3_JiEEEPS8_SE_OT_DpOT0_:
  519|     66|                            ValueArgs &&... Values) {
  520|     66|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|     66|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|     66|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|     66|    return TheBucket;
  525|     66|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEEC2Ej:
  669|      2|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEEC2Ej:
  669|      2|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE4initEj:
  726|      2|  void init(unsigned InitNumEntries) {
  727|      2|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|      2|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 2]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|      2|    } else {
  731|      2|      NumEntries = 0;
  732|      2|      NumTombstones = 0;
  733|      2|    }
  734|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E31getMinBucketToReserveForEntriesEj:
  360|      2|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|      2|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 2, False: 0]
  ------------------
  363|      2|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|      2|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE15allocateBucketsEj:
  795|      6|  bool allocateBuckets(unsigned Num) {
  796|      6|    NumBuckets = Num;
  797|      6|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 2, False: 4]
  ------------------
  798|      2|      Buckets = nullptr;
  799|      2|      return false;
  800|      2|    }
  801|       |
  802|      4|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|      4|    return true;
  804|      6|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E9initEmptyEv:
  347|      4|  void initEmpty() {
  348|      4|    setNumEntries(0);
  349|      4|    setNumTombstones(0);
  350|       |
  351|      4|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|      4|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    388|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 384, False: 4]
  ------------------
  355|    384|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|      4|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13setNumEntriesEj:
  461|    258|  void setNumEntries(unsigned Num) {
  462|    258|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|    258|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13setNumEntriesEj:
  775|    258|  void setNumEntries(unsigned Num) {
  776|    258|    NumEntries = Num;
  777|    258|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16setNumTombstonesEj:
  477|      4|  void setNumTombstones(unsigned Num) {
  478|      4|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|      4|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE16setNumTombstonesEj:
  783|      4|  void setNumTombstones(unsigned Num) {
  784|      4|    NumTombstones = Num;
  785|      4|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getNumBucketsEv:
  497|  3.31k|  unsigned getNumBuckets() const {
  498|  3.31k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|  3.31k|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13getNumBucketsEv:
  791|  3.31k|  unsigned getNumBuckets() const {
  792|  3.31k|    return NumBuckets;
  793|  3.31k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E11getEmptyKeyEv:
  426|  2.18k|  static const KeyT getEmptyKey() {
  427|  2.18k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|  2.18k|                  "Must pass the derived type to this template!");
  429|  2.18k|    return KeyInfoT::getEmptyKey();
  430|  2.18k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10getBucketsEv:
  493|    650|  BucketT *getBuckets() {
  494|    650|    return static_cast<DerivedT *>(this)->getBuckets();
  495|    650|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE10getBucketsEv:
  787|  3.14k|  BucketT *getBuckets() const {
  788|  3.14k|    return Buckets;
  789|  3.14k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getBucketsEndEv:
  501|    644|  BucketT *getBucketsEnd() {
  502|    644|    return getBuckets() + getNumBuckets();
  503|    644|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE8getFirstEv:
   47|  2.00k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E5countEPKS3_:
  149|    162|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|    162|    const BucketT *TheBucket;
  151|    162|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 160, False: 2]
  ------------------
  152|    162|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIPKS3_EEbRKT_RPKSF_:
  582|    480|                       const BucketT *&FoundBucket) const {
  583|    480|    const BucketT *BucketsPtr = getBuckets();
  584|    480|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    480|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 478]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    478|    const BucketT *FoundTombstone = nullptr;
  593|    478|    const KeyT EmptyKey = getEmptyKey();
  594|    478|    const KeyT TombstoneKey = getTombstoneKey();
  595|    478|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    478|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    478|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    478|    unsigned ProbeAmt = 1;
  601|    845|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    845|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    845|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    845|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 320, False: 525]
  |  |  ------------------
  ------------------
  605|    320|        FoundBucket = ThisBucket;
  606|    320|        return true;
  607|    320|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    525|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    525|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 158, False: 367]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    158|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 158]
  ------------------
  615|    158|        return false;
  616|    158|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    367|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 367]
  ------------------
  621|    367|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    367|      BucketNo += ProbeAmt++;
  627|    367|      BucketNo &= (NumBuckets-1);
  628|    367|    }
  629|    478|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10getBucketsEv:
  489|  2.49k|  const BucketT *getBuckets() const {
  490|  2.49k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  2.49k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15getTombstoneKeyEv:
  432|  2.01k|  static const KeyT getTombstoneKey() {
  433|  2.01k|    return KeyInfoT::getTombstoneKey();
  434|  2.01k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12getHashValueIPKS3_EEjRKT_:
  422|    478|  static unsigned getHashValue(const LookupKeyT &Val) {
  423|    478|    return KeyInfoT::getHashValue(Val);
  424|    478|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE8getFirstEv:
   48|  6.77k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_EixERKS4_:
  303|  1.28k|  ValueT &operator[](const KeyT &Key) {
  304|  1.28k|    return FindAndConstruct(Key).second;
  305|  1.28k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16FindAndConstructERKS4_:
  295|  1.28k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|  1.28k|    BucketT *TheBucket;
  297|  1.28k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 1.12k, False: 160]
  ------------------
  298|  1.12k|      return *TheBucket;
  299|       |
  300|    160|    return *InsertIntoBucket(TheBucket, Key);
  301|  1.28k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIS4_EEbRKT_RPSF_:
  632|  1.53k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  1.53k|    const BucketT *ConstFoundBucket;
  634|  1.53k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  1.53k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  1.53k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  1.53k|    return Result;
  638|  1.53k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIS4_EEbRKT_RPKSF_:
  582|  1.53k|                       const BucketT *&FoundBucket) const {
  583|  1.53k|    const BucketT *BucketsPtr = getBuckets();
  584|  1.53k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  1.53k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 1.53k]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  1.53k|    const BucketT *FoundTombstone = nullptr;
  593|  1.53k|    const KeyT EmptyKey = getEmptyKey();
  594|  1.53k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  1.53k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  1.53k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  1.53k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  1.53k|    unsigned ProbeAmt = 1;
  601|  2.61k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  2.61k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  2.61k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  2.61k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.28k, False: 1.33k]
  |  |  ------------------
  ------------------
  605|  1.28k|        FoundBucket = ThisBucket;
  606|  1.28k|        return true;
  607|  1.28k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  1.33k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  1.33k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 256, False: 1.08k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    256|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 256]
  ------------------
  615|    256|        return false;
  616|    256|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  1.08k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 1.08k]
  ------------------
  621|  1.08k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  1.08k|      BucketNo += ProbeAmt++;
  627|  1.08k|      BucketNo &= (NumBuckets-1);
  628|  1.08k|    }
  629|  1.53k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12getHashValueERKS4_:
  417|  1.53k|  static unsigned getHashValue(const KeyT &Val) {
  418|  1.53k|    return KeyInfoT::getHashValue(Val);
  419|  1.53k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16InsertIntoBucketIRKS4_JEEEPSF_SL_OT_DpOT0_:
  519|    160|                            ValueArgs &&... Values) {
  520|    160|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    160|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    160|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    160|    return TheBucket;
  525|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E20InsertIntoBucketImplIS4_EEPSF_RKS4_RKT_SJ_:
  539|    160|                                BucketT *TheBucket) {
  540|    160|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    160|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    160|    unsigned NumBuckets = getNumBuckets();
  553|    160|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 156]
  |  |  ------------------
  ------------------
  554|      4|      this->grow(NumBuckets * 2);
  555|      4|      LookupBucketFor(Lookup, TheBucket);
  556|      4|      NumBuckets = getNumBuckets();
  557|    156|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    156|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 156]
  |  |  ------------------
  ------------------
  558|    156|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    160|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    160|    const KeyT EmptyKey = getEmptyKey();
  570|    160|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 160]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    160|    return TheBucket;
  574|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getNumEntriesEv:
  457|    414|  unsigned getNumEntries() const {
  458|    414|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|    414|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE13getNumEntriesEv:
  771|    414|  unsigned getNumEntries() const {
  772|    414|    return NumEntries;
  773|    414|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4growEj:
  509|      4|  void grow(unsigned AtLeast) {
  510|      4|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      4|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE4growEj:
  736|      4|  void grow(unsigned AtLeast) {
  737|      4|    unsigned OldNumBuckets = NumBuckets;
  738|      4|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      4|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      4|    assert(Buckets);
  742|      4|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 2, False: 2]
  ------------------
  743|      2|      this->BaseT::initEmpty();
  744|      2|      return;
  745|      2|    }
  746|       |
  747|      2|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      2|    operator delete(OldBuckets);
  751|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E18moveFromOldBucketsEPSF_SI_:
  369|      2|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|      2|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|      2|    const KeyT EmptyKey = getEmptyKey();
  374|      2|    const KeyT TombstoneKey = getTombstoneKey();
  375|    130|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 128, False: 2]
  ------------------
  376|    128|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 94, False: 34]
  ------------------
  377|    128|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 94, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|     94|        BucketT *DestBucket;
  380|     94|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|     94|        (void)FoundVal; // silence warning.
  382|     94|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|     94|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|     94|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|     94|        B->getSecond().~ValueT();
  389|     94|      }
  390|      0|      B->getFirst().~KeyT();
  391|    128|    }
  392|      2|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16getNumTombstonesEv:
  473|    156|  unsigned getNumTombstones() const {
  474|    156|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    156|  }
_ZNK4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEE16getNumTombstonesEv:
  779|    156|  unsigned getNumTombstones() const {
  780|    156|    return NumTombstones;
  781|    156|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E19incrementNumEntriesEv:
  465|    254|  void incrementNumEntries() {
  466|    254|    setNumEntries(getNumEntries() + 1);
  467|    254|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecEE9getSecondEv:
   49|    602|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4findEPKS3_:
  154|    160|  iterator find(const_arg_type_t<KeyT> Val) {
  155|    160|    BucketT *TheBucket;
  156|    160|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 2, False: 158]
  ------------------
  157|      2|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|    158|    return end();
  159|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E15LookupBucketForIPKS3_EEbRKT_RPSF_:
  632|    160|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    160|    const BucketT *ConstFoundBucket;
  634|    160|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    160|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    160|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    160|    return Result;
  638|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E12makeIteratorEPSF_SI_RNS_14DebugEpochBaseEb:
  439|    320|                        bool NoAdvance=false) {
  440|    320|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 320]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|    320|    return iterator(P, E, Epoch, NoAdvance);
  445|    320|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEC2EPSE_SG_RKNS_14DebugEpochBaseEb:
 1139|    320|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    320|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    320|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 320, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEneERKNS0_IS3_S9_SB_SE_Lb1EEE:
 1179|    160|  bool operator!=(const ConstIterator &RHS) const {
 1180|    160|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|    160|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E3endEv:
   85|    318|  inline iterator end() {
   86|    318|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|    318|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEC2ILb0EvEERKNS0_IS3_S9_SB_SE_XT_EEE:
 1157|    160|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb0EEptEv:
 1165|      2|  pointer operator->() const {
 1166|      2|    assert(isHandleInSync() && "invalid iterator access!");
 1167|      2|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 2]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|      2|    return Ptr;
 1170|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_EixEOS4_:
  315|    160|  ValueT &operator[](KeyT &&Key) {
  316|    160|    return FindAndConstruct(std::move(Key)).second;
  317|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E16FindAndConstructEOS4_:
  307|    160|  value_type& FindAndConstruct(KeyT &&Key) {
  308|    160|    BucketT *TheBucket;
  309|    160|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 160, False: 0]
  ------------------
  310|    160|      return *TheBucket;
  311|       |
  312|      0|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|    160|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E4findEPKS3_:
  160|    158|  const_iterator find(const_arg_type_t<KeyT> Val) const {
  161|    158|    const BucketT *TheBucket;
  162|    158|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (162:9): [True: 158, False: 0]
  ------------------
  163|    158|      return makeConstIterator(TheBucket, getBucketsEnd(), *this, true);
  164|      0|    return end();
  165|    158|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E17makeConstIteratorEPKSF_SJ_RKNS_14DebugEpochBaseEb:
  449|    316|                                   const bool NoAdvance=false) const {
  450|    316|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 316]
  ------------------
  451|      0|      const BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (451:26): [True: 0, False: 0]
  ------------------
  452|      0|      return const_iterator(B, E, Epoch, NoAdvance);
  453|      0|    }
  454|    316|    return const_iterator(P, E, Epoch, NoAdvance);
  455|    316|  }
_ZN4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEC2EPKSE_SH_RKNS_14DebugEpochBaseEb:
 1139|    316|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|    316|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|    316|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 316, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E13getBucketsEndEv:
  505|    474|  const BucketT *getBucketsEnd() const {
  506|    474|    return getBuckets() + getNumBuckets();
  507|    474|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEeqERKSF_:
 1172|    158|  bool operator==(const ConstIterator &RHS) const {
 1173|    158|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1174|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1175|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1176|    158|           "comparing incomparable iterators!");
 1177|      0|    return Ptr == RHS.Ptr;
 1178|    158|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E3endEv:
   95|    158|  inline const_iterator end() const {
   96|    158|    return makeConstIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   97|    158|  }
_ZNK4llvh16DenseMapIteratorIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EELb1EEptEv:
 1165|    158|  pointer operator->() const {
 1166|    158|    assert(isHandleInSync() && "invalid iterator access!");
 1167|    158|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 158]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|    158|    return Ptr;
 1170|    158|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPSG_:
  632|    418|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|    418|    const BucketT *ConstFoundBucket;
  634|    418|    bool Result = const_cast<const DenseMapBase *>(this)
  635|    418|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|    418|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|    418|    return Result;
  638|    418|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E15LookupBucketForIS4_EEbRKT_RPKSG_:
  582|    418|                       const BucketT *&FoundBucket) const {
  583|    418|    const BucketT *BucketsPtr = getBuckets();
  584|    418|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|    418|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 2, False: 416]
  ------------------
  587|      2|      FoundBucket = nullptr;
  588|      2|      return false;
  589|      2|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|    416|    const BucketT *FoundTombstone = nullptr;
  593|    416|    const KeyT EmptyKey = getEmptyKey();
  594|    416|    const KeyT TombstoneKey = getTombstoneKey();
  595|    416|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|    416|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|    416|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|    416|    unsigned ProbeAmt = 1;
  601|    769|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|    769|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|    769|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|    769|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 160, False: 609]
  |  |  ------------------
  ------------------
  605|    160|        FoundBucket = ThisBucket;
  606|    160|        return true;
  607|    160|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|    609|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|    609|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 256, False: 353]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|    256|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 256]
  ------------------
  615|    256|        return false;
  616|    256|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|    353|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 353]
  ------------------
  621|    353|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|    353|      BucketNo += ProbeAmt++;
  627|    353|      BucketNo &= (NumBuckets-1);
  628|    353|    }
  629|    416|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E12getHashValueERKS4_:
  417|    416|  static unsigned getHashValue(const KeyT &Val) {
  418|    416|    return KeyInfoT::getHashValue(Val);
  419|    416|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E20InsertIntoBucketImplIS4_EEPSG_RKS4_RKT_SK_:
  539|    160|                                BucketT *TheBucket) {
  540|    160|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    160|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    160|    unsigned NumBuckets = getNumBuckets();
  553|    160|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    160|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 156]
  |  |  ------------------
  ------------------
  554|      4|      this->grow(NumBuckets * 2);
  555|      4|      LookupBucketFor(Lookup, TheBucket);
  556|      4|      NumBuckets = getNumBuckets();
  557|    156|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    156|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 156]
  |  |  ------------------
  ------------------
  558|    156|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    160|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    160|    const KeyT EmptyKey = getEmptyKey();
  570|    160|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 160]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    160|    return TheBucket;
  574|    160|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E4growEj:
  509|      4|  void grow(unsigned AtLeast) {
  510|      4|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|      4|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS2_EENS4_14default_deleteIS7_EEEENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_SA_EEE4growEj:
  736|      4|  void grow(unsigned AtLeast) {
  737|      4|    unsigned OldNumBuckets = NumBuckets;
  738|      4|    BucketT *OldBuckets = Buckets;
  739|       |
  740|      4|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|      4|    assert(Buckets);
  742|      4|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 2, False: 2]
  ------------------
  743|      2|      this->BaseT::initEmpty();
  744|      2|      return;
  745|      2|    }
  746|       |
  747|      2|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      2|    operator delete(OldBuckets);
  751|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E18moveFromOldBucketsEPSG_SJ_:
  369|      2|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|      2|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|      2|    const KeyT EmptyKey = getEmptyKey();
  374|      2|    const KeyT TombstoneKey = getTombstoneKey();
  375|    130|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 128, False: 2]
  ------------------
  376|    128|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 94, False: 34]
  ------------------
  377|    128|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 94, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|     94|        BucketT *DestBucket;
  380|     94|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|     94|        (void)FoundVal; // silence warning.
  382|     94|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|     94|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|     94|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|     94|        B->getSecond().~ValueT();
  389|     94|      }
  390|      0|      B->getFirst().~KeyT();
  391|    128|    }
  392|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E19incrementNumEntriesEv:
  465|    254|  void incrementNumEntries() {
  466|    254|    setNumEntries(getNumEntries() + 1);
  467|    254|  }
_ZN4llvh8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS2_Lb0EEEE7InfoRecENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S9_EEED2Ev:
  687|      2|  ~DenseMap() {
  688|      2|    this->destroyAll();
  689|      2|    operator delete(Buckets);
  690|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENS_14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIS3_Lb0EEEE7InfoRecENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SA_EEEES4_SA_SC_SF_E10destroyAllEv:
  334|      2|  void destroyAll() {
  335|      2|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 0, False: 2]
  ------------------
  336|      0|      return;
  337|       |
  338|      2|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    258|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 256, False: 2]
  ------------------
  340|    256|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 160, False: 96]
  ------------------
  341|    256|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 160, False: 0]
  ------------------
  342|    160|        P->getSecond().~ValueT();
  343|    256|      P->getFirst().~KeyT();
  344|    256|    }
  345|      2|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_EixERKS4_:
  303|    320|  ValueT &operator[](const KeyT &Key) {
  304|    320|    return FindAndConstruct(Key).second;
  305|    320|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16FindAndConstructERKS4_:
  295|    320|  value_type& FindAndConstruct(const KeyT &Key) {
  296|    320|    BucketT *TheBucket;
  297|    320|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 160, False: 160]
  ------------------
  298|    160|      return *TheBucket;
  299|       |
  300|    160|    return *InsertIntoBucket(TheBucket, Key);
  301|    320|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes10BasicBlockENSt3__110unique_ptrINS_15DomTreeNodeBaseIS3_EENS5_14default_deleteIS8_EEEENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_SB_EEEES4_SB_SD_SG_E16InsertIntoBucketIRKS4_JEEEPSG_SM_OT_DpOT0_:
  519|    160|                            ValueArgs &&... Values) {
  520|    160|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    160|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    160|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    160|    return TheBucket;
  525|    160|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E5countERKS2_:
  149|   686k|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|   686k|    const BucketT *TheBucket;
  151|   686k|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 0, False: 686k]
  ------------------
  152|   686k|  }
_ZNK4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E15LookupBucketForIS2_EEbRKT_RPKS8_:
  582|   686k|                       const BucketT *&FoundBucket) const {
  583|   686k|    const BucketT *BucketsPtr = getBuckets();
  584|   686k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   686k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 0, False: 686k]
  ------------------
  587|      0|      FoundBucket = nullptr;
  588|      0|      return false;
  589|      0|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   686k|    const BucketT *FoundTombstone = nullptr;
  593|   686k|    const KeyT EmptyKey = getEmptyKey();
  594|   686k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   686k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   686k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   686k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   686k|    unsigned ProbeAmt = 1;
  601|   686k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   686k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   686k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   686k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 686k]
  |  |  ------------------
  ------------------
  605|      0|        FoundBucket = ThisBucket;
  606|      0|        return true;
  607|      0|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   686k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   686k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 686k, False: 0]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   686k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 686k]
  ------------------
  615|   686k|        return false;
  616|   686k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|      0|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 0]
  ------------------
  621|      0|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|      0|      BucketNo += ProbeAmt++;
  627|      0|      BucketNo &= (NumBuckets-1);
  628|      0|    }
  629|   686k|  }
_ZN4llvh12DenseMapBaseINS_13SmallDenseMapINS_9StringRefENS_6detail13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS3_12DenseSetPairIS2_EEEES2_S4_S6_S8_E12getHashValueERKS2_:
  417|   686k|  static unsigned getHashValue(const KeyT &Val) {
  418|   686k|    return KeyInfoT::getHashValue(Val);
  419|   686k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E4findES5_:
  154|   228k|  iterator find(const_arg_type_t<KeyT> Val) {
  155|   228k|    BucketT *TheBucket;
  156|   228k|    if (LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (156:9): [True: 114k, False: 114k]
  ------------------
  157|   114k|      return makeIterator(TheBucket, getBucketsEnd(), *this, true);
  158|   114k|    return end();
  159|   228k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15LookupBucketForIS5_EEbRKT_RPSC_:
  632|   514k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|   514k|    const BucketT *ConstFoundBucket;
  634|   514k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|   514k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|   514k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|   514k|    return Result;
  638|   514k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E15LookupBucketForIS5_EEbRKT_RPKSC_:
  582|   514k|                       const BucketT *&FoundBucket) const {
  583|   514k|    const BucketT *BucketsPtr = getBuckets();
  584|   514k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|   514k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 168, False: 514k]
  ------------------
  587|    168|      FoundBucket = nullptr;
  588|    168|      return false;
  589|    168|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|   514k|    const BucketT *FoundTombstone = nullptr;
  593|   514k|    const KeyT EmptyKey = getEmptyKey();
  594|   514k|    const KeyT TombstoneKey = getTombstoneKey();
  595|   514k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|   514k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|   514k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|   514k|    unsigned ProbeAmt = 1;
  601|   955k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   955k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   955k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   955k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 840k]
  |  |  ------------------
  ------------------
  605|   114k|        FoundBucket = ThisBucket;
  606|   114k|        return true;
  607|   114k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|   840k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|   840k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 400k, False: 440k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|   400k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 400k]
  ------------------
  615|   400k|        return false;
  616|   400k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|   440k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 440k]
  ------------------
  621|   440k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|   440k|      BucketNo += ProbeAmt++;
  627|   440k|      BucketNo &= (NumBuckets-1);
  628|   440k|    }
  629|   514k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E10getBucketsEv:
  489|   514k|  const BucketT *getBuckets() const {
  490|   514k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|   514k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E12getHashValueERKS5_:
  417|   514k|  static unsigned getHashValue(const KeyT &Val) {
  418|   514k|    return KeyInfoT::getHashValue(Val);
  419|   514k|  }
_ZNK4llvh6detail12DenseMapPairIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataEE8getFirstEv:
   48|  2.23M|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|   456k|                        bool NoAdvance=false) {
  440|   456k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 456k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|   456k|    return iterator(P, E, Epoch, NoAdvance);
  445|   456k|  }
_ZN4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1139|   456k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|   456k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|   456k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 456k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E3endEv:
   85|   342k|  inline iterator end() {
   86|   342k|    return makeIterator(getBucketsEnd(), getBucketsEnd(), *this, true);
   87|   342k|  }
_ZN4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb1EEC2ILb0EvEERKNS0_IS4_S6_S8_SB_XT_EEE:
 1157|   228k|      : DebugEpochBase::HandleBase(I), Ptr(I.Ptr), End(I.End) {}
_ZNK4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEneERKNS0_IS4_S6_S8_SB_Lb1EEE:
 1179|   228k|  bool operator!=(const ConstIterator &RHS) const {
 1180|   228k|    assert((!Ptr || isHandleInSync()) && "handle not in sync!");
 1181|      0|    assert((!RHS.Ptr || RHS.isHandleInSync()) && "handle not in sync!");
 1182|      0|    assert(getEpochAddress() == RHS.getEpochAddress() &&
 1183|   228k|           "comparing incomparable iterators!");
 1184|      0|    return Ptr != RHS.Ptr;
 1185|   228k|  }
_ZNK4llvh16DenseMapIteratorIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EELb0EEptEv:
 1165|   114k|  pointer operator->() const {
 1166|   114k|    assert(isHandleInSync() && "invalid iterator access!");
 1167|   114k|    if (shouldReverseIterate<KeyT>())
  ------------------
  |  Branch (1167:9): [True: 0, False: 114k]
  ------------------
 1168|      0|      return &(Ptr[-1]);
 1169|   114k|    return Ptr;
 1170|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_EixERKS5_:
  303|   114k|  ValueT &operator[](const KeyT &Key) {
  304|   114k|    return FindAndConstruct(Key).second;
  305|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16FindAndConstructERKS5_:
  295|   114k|  value_type& FindAndConstruct(const KeyT &Key) {
  296|   114k|    BucketT *TheBucket;
  297|   114k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 0, False: 114k]
  ------------------
  298|      0|      return *TheBucket;
  299|       |
  300|   114k|    return *InsertIntoBucket(TheBucket, Key);
  301|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16InsertIntoBucketIRKS5_JEEEPSC_SI_OT_DpOT0_:
  519|   114k|                            ValueArgs &&... Values) {
  520|   114k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|   114k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|   114k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|   114k|    return TheBucket;
  525|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E20InsertIntoBucketImplIS5_EEPSC_RKS5_RKT_SG_:
  539|   114k|                                BucketT *TheBucket) {
  540|   114k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|   114k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|   114k|    unsigned NumBuckets = getNumBuckets();
  553|   114k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 98, False: 114k]
  |  |  ------------------
  ------------------
  554|     98|      this->grow(NumBuckets * 2);
  555|     98|      LookupBucketFor(Lookup, TheBucket);
  556|     98|      NumBuckets = getNumBuckets();
  557|   114k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  558|   114k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|   114k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|   114k|    const KeyT EmptyKey = getEmptyKey();
  570|   114k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 114k]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|   114k|    return TheBucket;
  574|   114k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E13getNumEntriesEv:
  457|   400k|  unsigned getNumEntries() const {
  458|   400k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   400k|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE13getNumEntriesEv:
  771|   400k|  unsigned getNumEntries() const {
  772|   400k|    return NumEntries;
  773|   400k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E4growEj:
  509|     98|  void grow(unsigned AtLeast) {
  510|     98|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     98|  }
_ZN4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE4growEj:
  736|     98|  void grow(unsigned AtLeast) {
  737|     98|    unsigned OldNumBuckets = NumBuckets;
  738|     98|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     98|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     98|    assert(Buckets);
  742|     98|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 56, False: 42]
  ------------------
  743|     56|      this->BaseT::initEmpty();
  744|     56|      return;
  745|     56|    }
  746|       |
  747|     42|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|     42|    operator delete(OldBuckets);
  751|     42|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E18moveFromOldBucketsEPSC_SF_:
  369|     42|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|     42|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|     42|    const KeyT EmptyKey = getEmptyKey();
  374|     42|    const KeyT TombstoneKey = getTombstoneKey();
  375|   229k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 229k, False: 42]
  ------------------
  376|   229k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 171k, False: 57.3k]
  ------------------
  377|   229k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 171k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|   171k|        BucketT *DestBucket;
  380|   171k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|   171k|        (void)FoundVal; // silence warning.
  382|   171k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|   171k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|   171k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|   171k|        B->getSecond().~ValueT();
  389|   171k|      }
  390|      0|      B->getFirst().~KeyT();
  391|   229k|    }
  392|     42|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E16getNumTombstonesEv:
  473|   114k|  unsigned getNumTombstones() const {
  474|   114k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   114k|  }
_ZNK4llvh8DenseMapIPKN6hermes9ScopeDescENS1_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S6_EEE16getNumTombstonesEv:
  779|   114k|  unsigned getNumTombstones() const {
  780|   114k|    return NumTombstones;
  781|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPKN6hermes9ScopeDescENS2_21FunctionScopeAnalysis9ScopeDataENS_12DenseMapInfoIS5_EENS_6detail12DenseMapPairIS5_S7_EEEES5_S7_S9_SC_E19incrementNumEntriesEv:
  465|   286k|  void incrementNumEntries() {
  466|   286k|    setNumEntries(getNumEntries() + 1);
  467|   286k|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEEC2Ej:
  669|     99|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E5countERKS2_:
  149|    768|  size_type count(const_arg_type_t<KeyT> Val) const {
  150|    768|    const BucketT *TheBucket;
  151|    768|    return LookupBucketFor(Val, TheBucket) ? 1 : 0;
  ------------------
  |  Branch (151:12): [True: 768, False: 0]
  ------------------
  152|    768|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15LookupBucketForIS2_EEbRKT_RPKS9_:
  582|  3.37k|                       const BucketT *&FoundBucket) const {
  583|  3.37k|    const BucketT *BucketsPtr = getBuckets();
  584|  3.37k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  3.37k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 3, False: 3.37k]
  ------------------
  587|      3|      FoundBucket = nullptr;
  588|      3|      return false;
  589|      3|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  3.37k|    const BucketT *FoundTombstone = nullptr;
  593|  3.37k|    const KeyT EmptyKey = getEmptyKey();
  594|  3.37k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  3.37k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  3.37k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  3.37k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  3.37k|    unsigned ProbeAmt = 1;
  601|  6.04k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|  6.04k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|  6.04k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|  6.04k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.53k, False: 4.51k]
  |  |  ------------------
  ------------------
  605|  1.53k|        FoundBucket = ThisBucket;
  606|  1.53k|        return true;
  607|  1.53k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  4.51k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  4.51k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.83k, False: 2.67k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  1.83k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 0, False: 1.83k]
  ------------------
  615|  1.83k|        return false;
  616|  1.83k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  2.67k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 0, False: 2.67k]
  ------------------
  621|  2.67k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 0, False: 0]
  ------------------
  622|      0|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  2.67k|      BucketNo += ProbeAmt++;
  627|  2.67k|      BucketNo &= (NumBuckets-1);
  628|  2.67k|    }
  629|  3.37k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E10getBucketsEv:
  489|  3.37k|  const BucketT *getBuckets() const {
  490|  3.37k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  3.37k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E12getHashValueERKS2_:
  417|  3.37k|  static unsigned getHashValue(const KeyT &Val) {
  418|  3.37k|    return KeyInfoT::getHashValue(Val);
  419|  3.37k|  }
_ZNK4llvh6detail12DenseMapPairINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoEE8getFirstEv:
   48|  13.2k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_EixERKS2_:
  303|    768|  ValueT &operator[](const KeyT &Key) {
  304|    768|    return FindAndConstruct(Key).second;
  305|    768|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16FindAndConstructERKS2_:
  295|    768|  value_type& FindAndConstruct(const KeyT &Key) {
  296|    768|    BucketT *TheBucket;
  297|    768|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (297:9): [True: 768, False: 0]
  ------------------
  298|    768|      return *TheBucket;
  299|       |
  300|      0|    return *InsertIntoBucket(TheBucket, Key);
  301|    768|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E15LookupBucketForIS2_EEbRKT_RPS9_:
  632|  2.60k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  2.60k|    const BucketT *ConstFoundBucket;
  634|  2.60k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  2.60k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  2.60k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  2.60k|    return Result;
  638|  2.60k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E20InsertIntoBucketImplIS2_EEPS9_RKS2_RKT_SD_:
  539|    779|                                BucketT *TheBucket) {
  540|    779|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|    779|    unsigned NewNumEntries = getNumEntries() + 1;
  552|    779|    unsigned NumBuckets = getNumBuckets();
  553|    779|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|    779|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 10, False: 769]
  |  |  ------------------
  ------------------
  554|     10|      this->grow(NumBuckets * 2);
  555|     10|      LookupBucketFor(Lookup, TheBucket);
  556|     10|      NumBuckets = getNumBuckets();
  557|    769|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|    769|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 769]
  |  |  ------------------
  ------------------
  558|    769|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|    779|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|    779|    const KeyT EmptyKey = getEmptyKey();
  570|    779|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 0, False: 779]
  ------------------
  571|      0|      decrementNumTombstones();
  572|       |
  573|    779|    return TheBucket;
  574|    779|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E13getNumEntriesEv:
  457|  2.60k|  unsigned getNumEntries() const {
  458|  2.60k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|  2.60k|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE13getNumEntriesEv:
  771|  2.60k|  unsigned getNumEntries() const {
  772|  2.60k|    return NumEntries;
  773|  2.60k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E4growEj:
  509|     10|  void grow(unsigned AtLeast) {
  510|     10|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     10|  }
_ZN4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE4growEj:
  736|     10|  void grow(unsigned AtLeast) {
  737|     10|    unsigned OldNumBuckets = NumBuckets;
  738|     10|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     10|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     10|    assert(Buckets);
  742|     10|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 3, False: 7]
  ------------------
  743|      3|      this->BaseT::initEmpty();
  744|      3|      return;
  745|      3|    }
  746|       |
  747|      7|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      7|    operator delete(OldBuckets);
  751|      7|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E18moveFromOldBucketsEPS9_SC_:
  369|      7|  void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd) {
  370|      7|    initEmpty();
  371|       |
  372|       |    // Insert all the old elements.
  373|      7|    const KeyT EmptyKey = getEmptyKey();
  374|      7|    const KeyT TombstoneKey = getTombstoneKey();
  375|  1.41k|    for (BucketT *B = OldBucketsBegin, *E = OldBucketsEnd; B != E; ++B) {
  ------------------
  |  Branch (375:60): [True: 1.40k, False: 7]
  ------------------
  376|  1.40k|      if (!KeyInfoT::isEqual(B->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (376:11): [True: 1.04k, False: 359]
  ------------------
  377|  1.40k|          !KeyInfoT::isEqual(B->getFirst(), TombstoneKey)) {
  ------------------
  |  Branch (377:11): [True: 1.04k, False: 0]
  ------------------
  378|       |        // Insert the key/value into the new table.
  379|  1.04k|        BucketT *DestBucket;
  380|  1.04k|        bool FoundVal = LookupBucketFor(B->getFirst(), DestBucket);
  381|  1.04k|        (void)FoundVal; // silence warning.
  382|  1.04k|        assert(!FoundVal && "Key already in new map?");
  383|      0|        DestBucket->getFirst() = std::move(B->getFirst());
  384|  1.04k|        ::new (&DestBucket->getSecond()) ValueT(std::move(B->getSecond()));
  385|  1.04k|        incrementNumEntries();
  386|       |
  387|       |        // Free the value.
  388|  1.04k|        B->getSecond().~ValueT();
  389|  1.04k|      }
  390|      0|      B->getFirst().~KeyT();
  391|  1.40k|    }
  392|      7|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16getNumTombstonesEv:
  473|    769|  unsigned getNumTombstones() const {
  474|    769|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|    769|  }
_ZNK4llvh8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS3_9SMLocInfoENS_6detail12DenseMapPairIS1_S4_EEE16getNumTombstonesEv:
  779|    769|  unsigned getNumTombstones() const {
  780|    769|    return NumTombstones;
  781|    769|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E19incrementNumEntriesEv:
  465|  1.82k|  void incrementNumEntries() {
  466|  1.82k|    setNumEntries(getNumEntries() + 1);
  467|  1.82k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_EixEOS2_:
  315|    779|  ValueT &operator[](KeyT &&Key) {
  316|    779|    return FindAndConstruct(std::move(Key)).second;
  317|    779|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16FindAndConstructEOS2_:
  307|    779|  value_type& FindAndConstruct(KeyT &&Key) {
  308|    779|    BucketT *TheBucket;
  309|    779|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (309:9): [True: 0, False: 779]
  ------------------
  310|      0|      return *TheBucket;
  311|       |
  312|    779|    return *InsertIntoBucket(TheBucket, std::move(Key));
  313|    779|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapINS_5SMLocEN6hermes6parser21PreParsedFunctionInfoENS4_9SMLocInfoENS_6detail12DenseMapPairIS2_S5_EEEES2_S5_S6_S9_E16InsertIntoBucketIS2_JEEEPS9_SD_OT_DpOT0_:
  519|    779|                            ValueArgs &&... Values) {
  520|    779|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|    779|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|    779|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|    779|    return TheBucket;
  525|    779|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E6insertEONSt3__14pairIS4_S7_EE:
  206|  42.8k|  std::pair<iterator, bool> insert(std::pair<KeyT, ValueT> &&KV) {
  207|  42.8k|    return try_emplace(std::move(KV.first), std::move(KV.second));
  208|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11try_emplaceIJS7_EEENSt3__14pairINS_16DenseMapIteratorIS4_S7_S9_SC_Lb0EEEbEEOS4_DpOT_:
  214|  42.8k|  std::pair<iterator, bool> try_emplace(KeyT &&Key, Ts &&... Args) {
  215|  42.8k|    BucketT *TheBucket;
  216|  42.8k|    if (LookupBucketFor(Key, TheBucket))
  ------------------
  |  Branch (216:9): [True: 0, False: 42.8k]
  ------------------
  217|      0|      return std::make_pair(
  218|      0|               makeIterator(TheBucket, getBucketsEnd(), *this, true),
  219|      0|               false); // Already in map.
  220|       |
  221|       |    // Otherwise, insert the new element.
  222|  42.8k|    TheBucket =
  223|  42.8k|        InsertIntoBucket(TheBucket, std::move(Key), std::forward<Ts>(Args)...);
  224|  42.8k|    return std::make_pair(
  225|  42.8k|             makeIterator(TheBucket, getBucketsEnd(), *this, true),
  226|  42.8k|             true);
  227|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPSC_:
  632|  85.6k|  bool LookupBucketFor(const LookupKeyT &Val, BucketT *&FoundBucket) {
  633|  85.6k|    const BucketT *ConstFoundBucket;
  634|  85.6k|    bool Result = const_cast<const DenseMapBase *>(this)
  635|  85.6k|      ->LookupBucketFor(Val, ConstFoundBucket);
  636|  85.6k|    FoundBucket = const_cast<BucketT *>(ConstFoundBucket);
  637|  85.6k|    return Result;
  638|  85.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15LookupBucketForIS4_EEbRKT_RPKSC_:
  582|  85.6k|                       const BucketT *&FoundBucket) const {
  583|  85.6k|    const BucketT *BucketsPtr = getBuckets();
  584|  85.6k|    const unsigned NumBuckets = getNumBuckets();
  585|       |
  586|  85.6k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (586:9): [True: 10, False: 85.6k]
  ------------------
  587|     10|      FoundBucket = nullptr;
  588|     10|      return false;
  589|     10|    }
  590|       |
  591|       |    // FoundTombstone - Keep track of whether we find a tombstone while probing.
  592|  85.6k|    const BucketT *FoundTombstone = nullptr;
  593|  85.6k|    const KeyT EmptyKey = getEmptyKey();
  594|  85.6k|    const KeyT TombstoneKey = getTombstoneKey();
  595|  85.6k|    assert(!KeyInfoT::isEqual(Val, EmptyKey) &&
  596|  85.6k|           !KeyInfoT::isEqual(Val, TombstoneKey) &&
  597|  85.6k|           "Empty/Tombstone value shouldn't be inserted into map!");
  598|       |
  599|      0|    unsigned BucketNo = getHashValue(Val) & (NumBuckets-1);
  600|  85.6k|    unsigned ProbeAmt = 1;
  601|   131k|    while (true) {
  ------------------
  |  Branch (601:12): [Folded - Ignored]
  ------------------
  602|   131k|      const BucketT *ThisBucket = BucketsPtr + BucketNo;
  603|       |      // Found Val's bucket?  If so, return it.
  604|   131k|      if (LLVM_LIKELY(KeyInfoT::isEqual(Val, ThisBucket->getFirst()))) {
  ------------------
  |  |  188|   131k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 42.8k, False: 89.0k]
  |  |  ------------------
  ------------------
  605|  42.8k|        FoundBucket = ThisBucket;
  606|  42.8k|        return true;
  607|  42.8k|      }
  608|       |
  609|       |      // If we found an empty bucket, the key doesn't exist in the set.
  610|       |      // Insert it and return the default value.
  611|  89.0k|      if (LLVM_LIKELY(KeyInfoT::isEqual(ThisBucket->getFirst(), EmptyKey))) {
  ------------------
  |  |  188|  89.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 42.8k, False: 46.2k]
  |  |  ------------------
  ------------------
  612|       |        // If we've already seen a tombstone while probing, fill it in instead
  613|       |        // of the empty bucket we eventually probed to.
  614|  42.8k|        FoundBucket = FoundTombstone ? FoundTombstone : ThisBucket;
  ------------------
  |  Branch (614:23): [True: 42.7k, False: 50]
  ------------------
  615|  42.8k|        return false;
  616|  42.8k|      }
  617|       |
  618|       |      // If this is a tombstone, remember it.  If Val ends up not in the map, we
  619|       |      // prefer to return it than something that would require more probing.
  620|  46.2k|      if (KeyInfoT::isEqual(ThisBucket->getFirst(), TombstoneKey) &&
  ------------------
  |  Branch (620:11): [True: 46.2k, False: 46]
  ------------------
  621|  46.2k|          !FoundTombstone)
  ------------------
  |  Branch (621:11): [True: 42.7k, False: 3.42k]
  ------------------
  622|  42.7k|        FoundTombstone = ThisBucket;  // Remember the first tombstone found.
  623|       |
  624|       |      // Otherwise, it's a hash collision or a tombstone, continue quadratic
  625|       |      // probing.
  626|  46.2k|      BucketNo += ProbeAmt++;
  627|  46.2k|      BucketNo &= (NumBuckets-1);
  628|  46.2k|    }
  629|  85.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  489|  85.6k|  const BucketT *getBuckets() const {
  490|  85.6k|    return static_cast<const DerivedT *>(this)->getBuckets();
  491|  85.6k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE10getBucketsEv:
  787|   128k|  BucketT *getBuckets() const {
  788|   128k|    return Buckets;
  789|   128k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumBucketsEv:
  497|   286k|  unsigned getNumBuckets() const {
  498|   286k|    return static_cast<const DerivedT *>(this)->getNumBuckets();
  499|   286k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumBucketsEv:
  791|   286k|  unsigned getNumBuckets() const {
  792|   286k|    return NumBuckets;
  793|   286k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E11getEmptyKeyEv:
  426|   128k|  static const KeyT getEmptyKey() {
  427|   128k|    static_assert(std::is_base_of<DenseMapBase, DerivedT>::value,
  428|   128k|                  "Must pass the derived type to this template!");
  429|   128k|    return KeyInfoT::getEmptyKey();
  430|   128k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E15getTombstoneKeyEv:
  432|   128k|  static const KeyT getTombstoneKey() {
  433|   128k|    return KeyInfoT::getTombstoneKey();
  434|   128k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12getHashValueERKS4_:
  417|  85.6k|  static unsigned getHashValue(const KeyT &Val) {
  418|  85.6k|    return KeyInfoT::getHashValue(Val);
  419|  85.6k|  }
_ZNK4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE8getFirstEv:
   48|   267k|  const KeyT &getFirst() const { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E12makeIteratorEPSC_SF_RNS_14DebugEpochBaseEb:
  439|  42.8k|                        bool NoAdvance=false) {
  440|  42.8k|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 42.8k]
  ------------------
  441|      0|      BucketT *B = P == getBucketsEnd() ? getBuckets() : P + 1;
  ------------------
  |  Branch (441:20): [True: 0, False: 0]
  ------------------
  442|      0|      return iterator(B, E, Epoch, NoAdvance);
  443|      0|    }
  444|  42.8k|    return iterator(P, E, Epoch, NoAdvance);
  445|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10getBucketsEv:
  493|  42.8k|  BucketT *getBuckets() {
  494|  42.8k|    return static_cast<DerivedT *>(this)->getBuckets();
  495|  42.8k|  }
_ZN4llvh16DenseMapIteratorIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EELb0EEC2EPSB_SD_RKNS_14DebugEpochBaseEb:
 1139|  42.8k|      : DebugEpochBase::HandleBase(&Epoch), Ptr(Pos), End(E) {
 1140|  42.8k|    assert(isHandleInSync() && "invalid construction!");
 1141|       |
 1142|  42.8k|    if (NoAdvance) return;
  ------------------
  |  Branch (1142:9): [True: 42.8k, False: 0]
  ------------------
 1143|      0|    if (shouldReverseIterate<KeyT>()) {
  ------------------
  |  Branch (1143:9): [True: 0, False: 0]
  ------------------
 1144|      0|      RetreatPastEmptyBuckets();
 1145|      0|      return;
 1146|      0|    }
 1147|      0|    AdvancePastEmptyBuckets();
 1148|      0|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE8getFirstEv:
   47|   130k|  KeyT &getFirst() { return std::pair<KeyT, ValueT>::first; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getBucketsEndEv:
  501|  42.8k|  BucketT *getBucketsEnd() {
  502|  42.8k|    return getBuckets() + getNumBuckets();
  503|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16InsertIntoBucketIS4_JS7_EEEPSC_SG_OT_DpOT0_:
  519|  42.8k|                            ValueArgs &&... Values) {
  520|  42.8k|    TheBucket = InsertIntoBucketImpl(Key, Key, TheBucket);
  521|       |
  522|  42.8k|    TheBucket->getFirst() = std::forward<KeyArg>(Key);
  523|  42.8k|    ::new (&TheBucket->getSecond()) ValueT(std::forward<ValueArgs>(Values)...);
  524|  42.8k|    return TheBucket;
  525|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E20InsertIntoBucketImplIS4_EEPSC_RKS4_RKT_SG_:
  539|  42.8k|                                BucketT *TheBucket) {
  540|  42.8k|    incrementEpoch();
  541|       |
  542|       |    // If the load of the hash table is more than 3/4, or if fewer than 1/8 of
  543|       |    // the buckets are empty (meaning that many are filled with tombstones),
  544|       |    // grow the table.
  545|       |    //
  546|       |    // The later case is tricky.  For example, if we had one empty bucket with
  547|       |    // tons of tombstones, failing lookups (e.g. for insertion) would have to
  548|       |    // probe almost the entire table until it found the empty bucket.  If the
  549|       |    // table completely filled with tombstones, no lookup would ever succeed,
  550|       |    // causing infinite loops in lookup.
  551|  42.8k|    unsigned NewNumEntries = getNumEntries() + 1;
  552|  42.8k|    unsigned NumBuckets = getNumBuckets();
  553|  42.8k|    if (LLVM_UNLIKELY(NewNumEntries * 4 >= NumBuckets * 3)) {
  ------------------
  |  |  189|  42.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 10, False: 42.8k]
  |  |  ------------------
  ------------------
  554|     10|      this->grow(NumBuckets * 2);
  555|     10|      LookupBucketFor(Lookup, TheBucket);
  556|     10|      NumBuckets = getNumBuckets();
  557|  42.8k|    } else if (LLVM_UNLIKELY(NumBuckets-(NewNumEntries+getNumTombstones()) <=
  ------------------
  |  |  189|  42.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 42.8k]
  |  |  ------------------
  ------------------
  558|  42.8k|                             NumBuckets/8)) {
  559|      0|      this->grow(NumBuckets);
  560|      0|      LookupBucketFor(Lookup, TheBucket);
  561|      0|    }
  562|  42.8k|    assert(TheBucket);
  563|       |
  564|       |    // Only update the state after we've grown our bucket space appropriately
  565|       |    // so that when growing buckets we have self-consistent entry count.
  566|      0|    incrementNumEntries();
  567|       |
  568|       |    // If we are writing over a tombstone, remember this.
  569|  42.8k|    const KeyT EmptyKey = getEmptyKey();
  570|  42.8k|    if (!KeyInfoT::isEqual(TheBucket->getFirst(), EmptyKey))
  ------------------
  |  Branch (570:9): [True: 42.7k, False: 50]
  ------------------
  571|  42.7k|      decrementNumTombstones();
  572|       |
  573|  42.8k|    return TheBucket;
  574|  42.8k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13getNumEntriesEv:
  457|   128k|  unsigned getNumEntries() const {
  458|   128k|    return static_cast<const DerivedT *>(this)->getNumEntries();
  459|   128k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13getNumEntriesEv:
  771|   128k|  unsigned getNumEntries() const {
  772|   128k|    return NumEntries;
  773|   128k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E4growEj:
  509|     10|  void grow(unsigned AtLeast) {
  510|     10|    static_cast<DerivedT *>(this)->grow(AtLeast);
  511|     10|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4growEj:
  736|     10|  void grow(unsigned AtLeast) {
  737|     10|    unsigned OldNumBuckets = NumBuckets;
  738|     10|    BucketT *OldBuckets = Buckets;
  739|       |
  740|     10|    allocateBuckets(std::max<unsigned>(64, static_cast<unsigned>(NextPowerOf2(AtLeast-1))));
  741|     10|    assert(Buckets);
  742|     10|    if (!OldBuckets) {
  ------------------
  |  Branch (742:9): [True: 10, False: 0]
  ------------------
  743|     10|      this->BaseT::initEmpty();
  744|     10|      return;
  745|     10|    }
  746|       |
  747|      0|    this->moveFromOldBuckets(OldBuckets, OldBuckets+OldNumBuckets);
  748|       |
  749|       |    // Free the old table.
  750|      0|    operator delete(OldBuckets);
  751|      0|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE15allocateBucketsEj:
  795|   114k|  bool allocateBuckets(unsigned Num) {
  796|   114k|    NumBuckets = Num;
  797|   114k|    if (NumBuckets == 0) {
  ------------------
  |  Branch (797:9): [True: 114k, False: 10]
  ------------------
  798|   114k|      Buckets = nullptr;
  799|   114k|      return false;
  800|   114k|    }
  801|       |
  802|     10|    Buckets = static_cast<BucketT*>(operator new(sizeof(BucketT) * NumBuckets));
  803|     10|    return true;
  804|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E9initEmptyEv:
  347|     10|  void initEmpty() {
  348|     10|    setNumEntries(0);
  349|     10|    setNumTombstones(0);
  350|       |
  351|     10|    assert((getNumBuckets() & (getNumBuckets()-1)) == 0 &&
  352|     10|           "# initial buckets must be a power of two!");
  353|      0|    const KeyT EmptyKey = getEmptyKey();
  354|    650|    for (BucketT *B = getBuckets(), *E = getBucketsEnd(); B != E; ++B)
  ------------------
  |  Branch (354:59): [True: 640, False: 10]
  ------------------
  355|    640|      ::new (&B->getFirst()) KeyT(EmptyKey);
  356|     10|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E13setNumEntriesEj:
  461|  85.6k|  void setNumEntries(unsigned Num) {
  462|  85.6k|    static_cast<DerivedT *>(this)->setNumEntries(Num);
  463|  85.6k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE13setNumEntriesEj:
  775|  85.6k|  void setNumEntries(unsigned Num) {
  776|  85.6k|    NumEntries = Num;
  777|  85.6k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16setNumTombstonesEj:
  477|  85.6k|  void setNumTombstones(unsigned Num) {
  478|  85.6k|    static_cast<DerivedT *>(this)->setNumTombstones(Num);
  479|  85.6k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16setNumTombstonesEj:
  783|  85.6k|  void setNumTombstones(unsigned Num) {
  784|  85.6k|    NumTombstones = Num;
  785|  85.6k|  }
_ZNK4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E16getNumTombstonesEv:
  473|   128k|  unsigned getNumTombstones() const {
  474|   128k|    return static_cast<const DerivedT *>(this)->getNumTombstones();
  475|   128k|  }
_ZNK4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE16getNumTombstonesEv:
  779|   128k|  unsigned getNumTombstones() const {
  780|   128k|    return NumTombstones;
  781|   128k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19incrementNumEntriesEv:
  465|  42.8k|  void incrementNumEntries() {
  466|  42.8k|    setNumEntries(getNumEntries() + 1);
  467|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E22decrementNumTombstonesEv:
  485|  42.7k|  void decrementNumTombstones() {
  486|  42.7k|    setNumTombstones(getNumTombstones() - 1);
  487|  42.7k|  }
_ZN4llvh6detail12DenseMapPairIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelEE9getSecondEv:
   49|  85.6k|  ValueT &getSecond() { return std::pair<KeyT, ValueT>::second; }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E5eraseERKS4_:
  276|  42.8k|  bool erase(const KeyT &Val) {
  277|  42.8k|    BucketT *TheBucket;
  278|  42.8k|    if (!LookupBucketFor(Val, TheBucket))
  ------------------
  |  Branch (278:9): [True: 0, False: 42.8k]
  ------------------
  279|      0|      return false; // not in map.
  280|       |
  281|  42.8k|    TheBucket->getSecond().~ValueT();
  282|  42.8k|    TheBucket->getFirst() = getTombstoneKey();
  283|  42.8k|    decrementNumEntries();
  284|  42.8k|    incrementNumTombstones();
  285|  42.8k|    return true;
  286|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E19decrementNumEntriesEv:
  469|  42.8k|  void decrementNumEntries() {
  470|  42.8k|    setNumEntries(getNumEntries() - 1);
  471|  42.8k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E22incrementNumTombstonesEv:
  481|  42.8k|  void incrementNumTombstones() {
  482|  42.8k|    setNumTombstones(getNumTombstones() + 1);
  483|  42.8k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEEC2Ej:
  669|   114k|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEE4initEj:
  726|   114k|  void init(unsigned InitNumEntries) {
  727|   114k|    auto InitBuckets = BaseT::getMinBucketToReserveForEntries(InitNumEntries);
  728|   114k|    if (allocateBuckets(InitBuckets)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 114k]
  ------------------
  729|      0|      this->BaseT::initEmpty();
  730|   114k|    } else {
  731|   114k|      NumEntries = 0;
  732|   114k|      NumTombstones = 0;
  733|   114k|    }
  734|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E31getMinBucketToReserveForEntriesEj:
  360|   114k|  unsigned getMinBucketToReserveForEntries(unsigned NumEntries) {
  361|       |    // Ensure that "NumEntries * 4 < NumBuckets * 3"
  362|   114k|    if (NumEntries == 0)
  ------------------
  |  Branch (362:9): [True: 114k, False: 0]
  ------------------
  363|   114k|      return 0;
  364|       |    // +1 is required because of the strict equality.
  365|       |    // For example if NumEntries is 48, we need to return 401.
  366|      0|    return NextPowerOf2(NumEntries * 4 / 3 + 1);
  367|   114k|  }
_ZN4llvh8DenseMapIPN6hermes12UniqueStringENS1_3sem15FunctionContext5LabelENS_12DenseMapInfoIS3_EENS_6detail12DenseMapPairIS3_S6_EEED2Ev:
  687|   114k|  ~DenseMap() {
  688|   114k|    this->destroyAll();
  689|   114k|    operator delete(Buckets);
  690|   114k|  }
_ZN4llvh12DenseMapBaseINS_8DenseMapIPN6hermes12UniqueStringENS2_3sem15FunctionContext5LabelENS_12DenseMapInfoIS4_EENS_6detail12DenseMapPairIS4_S7_EEEES4_S7_S9_SC_E10destroyAllEv:
  334|   114k|  void destroyAll() {
  335|   114k|    if (getNumBuckets() == 0) // Nothing to do.
  ------------------
  |  Branch (335:9): [True: 114k, False: 10]
  ------------------
  336|   114k|      return;
  337|       |
  338|     10|    const KeyT EmptyKey = getEmptyKey(), TombstoneKey = getTombstoneKey();
  339|    650|    for (BucketT *P = getBuckets(), *E = getBucketsEnd(); P != E; ++P) {
  ------------------
  |  Branch (339:59): [True: 640, False: 10]
  ------------------
  340|    640|      if (!KeyInfoT::isEqual(P->getFirst(), EmptyKey) &&
  ------------------
  |  Branch (340:11): [True: 50, False: 590]
  ------------------
  341|    640|          !KeyInfoT::isEqual(P->getFirst(), TombstoneKey))
  ------------------
  |  Branch (341:11): [True: 0, False: 50]
  ------------------
  342|      0|        P->getSecond().~ValueT();
  343|    640|      P->getFirst().~KeyT();
  344|    640|    }
  345|     10|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEEC2EOS8_:
  676|  34.3k|  DenseMap(DenseMap &&other) : BaseT() {
  677|  34.3k|    init(0);
  678|  34.3k|    swap(other);
  679|  34.3k|  }
_ZN4llvh8DenseMapINS_8ArrayRefIDsEEjNS_12DenseMapInfoIS2_EENS_6detail12DenseMapPairIS2_jEEE4swapERS8_:
  692|  34.3k|  void swap(DenseMap& RHS) {
  693|  34.3k|    this->incrementEpoch();
  694|  34.3k|    RHS.incrementEpoch();
  695|  34.3k|    std::swap(Buckets, RHS.Buckets);
  696|  34.3k|    std::swap(NumEntries, RHS.NumEntries);
  697|  34.3k|    std::swap(NumTombstones, RHS.NumTombstones);
  698|  34.3k|    std::swap(NumBuckets, RHS.NumBuckets);
  699|  34.3k|  }
_ZN4llvh8DenseMapIjNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_12DenseMapInfoIjEENS_6detail12DenseMapPairIjS7_EEEC2Ej:
  669|    198|  explicit DenseMap(unsigned InitialReserve = 0) { init(InitialReserve); }

_ZN4llvh12DenseMapInfoIjE11getEmptyKeyEv:
   89|  1.07M|  static inline unsigned getEmptyKey() { return ~0U; }
_ZN4llvh12DenseMapInfoIjE15getTombstoneKeyEv:
   90|   580k|  static inline unsigned getTombstoneKey() { return ~0U - 1; }
_ZN4llvh12DenseMapInfoIjE7isEqualERKjS3_:
   93|  10.6M|  static bool isEqual(const unsigned& LHS, const unsigned& RHS) {
   94|  10.6M|    return LHS == RHS;
   95|  10.6M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE11getEmptyKeyEv:
  217|  56.6M|  static inline StringRef getEmptyKey() {
  218|  56.6M|    return StringRef(reinterpret_cast<const char *>(~static_cast<uintptr_t>(0)),
  219|  56.6M|                     0);
  220|  56.6M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE15getTombstoneKeyEv:
  222|  38.6M|  static inline StringRef getTombstoneKey() {
  223|  38.6M|    return StringRef(reinterpret_cast<const char *>(~static_cast<uintptr_t>(1)),
  224|  38.6M|                     0);
  225|  38.6M|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE7isEqualES1_S1_:
  234|  31.0M|  static bool isEqual(StringRef LHS, StringRef RHS) {
  235|  31.0M|    if (RHS.data() == getEmptyKey().data())
  ------------------
  |  Branch (235:9): [True: 13.5M, False: 17.4M]
  ------------------
  236|  13.5M|      return LHS.data() == getEmptyKey().data();
  237|  17.4M|    if (RHS.data() == getTombstoneKey().data())
  ------------------
  |  Branch (237:9): [True: 9.49M, False: 7.97M]
  ------------------
  238|  9.49M|      return LHS.data() == getTombstoneKey().data();
  239|  7.97M|    return LHS == RHS;
  240|  17.4M|  }
_ZN4llvh12DenseMapInfoIjE12getHashValueERKj:
   91|   137k|  static unsigned getHashValue(const unsigned& Val) { return Val * 37U; }
_ZN4llvh12DenseMapInfoIiE11getEmptyKeyEv:
  137|  4.25k|  static inline int getEmptyKey() { return 0x7fffffff; }
_ZN4llvh12DenseMapInfoIiE15getTombstoneKeyEv:
  138|  2.12k|  static inline int getTombstoneKey() { return -0x7fffffff - 1; }
_ZN4llvh12DenseMapInfoIiE12getHashValueERKi:
  139|  2.07k|  static unsigned getHashValue(const int& Val) { return (unsigned)(Val * 37U); }
_ZN4llvh12DenseMapInfoIiE7isEqualERKiS3_:
  141|  19.2k|  static bool isEqual(const int& LHS, const int& RHS) {
  142|  19.2k|    return LHS == RHS;
  143|  19.2k|  }
_ZN4llvh12DenseMapInfoINS_9StringRefEE12getHashValueES1_:
  227|  5.67M|  static unsigned getHashValue(StringRef Val) {
  228|  5.67M|    assert(Val.data() != getEmptyKey().data() && "Cannot hash the empty key!");
  229|      0|    assert(Val.data() != getTombstoneKey().data() &&
  230|  5.67M|           "Cannot hash the tombstone key!");
  231|      0|    return (unsigned)(hash_value(Val));
  232|  5.67M|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE11getEmptyKeyEv:
  185|  11.5k|  static inline Pair getEmptyKey() {
  186|  11.5k|    return std::make_pair(FirstInfo::getEmptyKey(),
  187|  11.5k|                          SecondInfo::getEmptyKey());
  188|  11.5k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE15getTombstoneKeyEv:
  190|  11.4k|  static inline Pair getTombstoneKey() {
  191|  11.4k|    return std::make_pair(FirstInfo::getTombstoneKey(),
  192|  11.4k|                          SecondInfo::getTombstoneKey());
  193|  11.4k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE7isEqualERKS4_S7_:
  209|  35.0k|  static bool isEqual(const Pair &LHS, const Pair &RHS) {
  210|  35.0k|    return FirstInfo::isEqual(LHS.first, RHS.first) &&
  ------------------
  |  Branch (210:12): [True: 11.9k, False: 23.0k]
  ------------------
  211|  35.0k|           SecondInfo::isEqual(LHS.second, RHS.second);
  ------------------
  |  Branch (211:12): [True: 11.9k, False: 0]
  ------------------
  212|  35.0k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairINS_9StringRefES3_EEE12getHashValueERKS4_:
  195|  11.4k|  static unsigned getHashValue(const Pair& PairVal) {
  196|  11.4k|    uint64_t key = (uint64_t)FirstInfo::getHashValue(PairVal.first) << 32
  197|  11.4k|          | (uint64_t)SecondInfo::getHashValue(PairVal.second);
  198|  11.4k|    key += ~(key << 32);
  199|  11.4k|    key ^= (key >> 22);
  200|  11.4k|    key += ~(key << 13);
  201|  11.4k|    key ^= (key >> 8);
  202|  11.4k|    key += (key << 3);
  203|  11.4k|    key ^= (key >> 15);
  204|  11.4k|    key += ~(key << 27);
  205|  11.4k|    key ^= (key >> 31);
  206|  11.4k|    return (unsigned)key;
  207|  11.4k|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE11getEmptyKeyEv:
   45|   940k|  static inline T* getEmptyKey() {
   46|   940k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   940k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   940k|    return reinterpret_cast<T*>(Val);
   49|   940k|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE15getTombstoneKeyEv:
   51|   933k|  static inline T* getTombstoneKey() {
   52|   933k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   933k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   933k|    return reinterpret_cast<T*>(Val);
   55|   933k|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE12getHashValueEPKS2_:
   57|   859k|  static unsigned getHashValue(const T *PtrVal) {
   58|   859k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   859k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   859k|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE11getEmptyKeyEv:
   45|  1.37M|  static inline T* getEmptyKey() {
   46|  1.37M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.37M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.37M|    return reinterpret_cast<T*>(Val);
   49|  1.37M|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE15getTombstoneKeyEv:
   51|  1.14M|  static inline T* getTombstoneKey() {
   52|  1.14M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  1.14M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  1.14M|    return reinterpret_cast<T*>(Val);
   55|  1.14M|  }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE7isEqualEPKS2_S6_:
   62|  8.55M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes8FunctionEE12getHashValueEPKS2_:
   57|  1.14M|  static unsigned getHashValue(const T *PtrVal) {
   58|  1.14M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  1.14M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  1.14M|  }
_ZN4llvh12DenseMapInfoIPvE12getHashValueEPKv:
   57|   393k|  static unsigned getHashValue(const T *PtrVal) {
   58|   393k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   393k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   393k|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE11getEmptyKeyEv:
   45|    693|  static inline T* getEmptyKey() {
   46|    693|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|    693|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|    693|    return reinterpret_cast<T*>(Val);
   49|    693|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE15getTombstoneKeyEv:
   51|    594|  static inline T* getTombstoneKey() {
   52|    594|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|    594|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|    594|    return reinterpret_cast<T*>(Val);
   55|    594|  }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE7isEqualEPKS3_S7_:
   62|  13.6k|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes2vm7RuntimeEE12getHashValueEPKS3_:
   57|    198|  static unsigned getHashValue(const T *PtrVal) {
   58|    198|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|    198|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|    198|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE11getEmptyKeyEv:
   45|   191k|  static inline T* getEmptyKey() {
   46|   191k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   191k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   191k|    return reinterpret_cast<T*>(Val);
   49|   191k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE15getTombstoneKeyEv:
   51|   157k|  static inline T* getTombstoneKey() {
   52|   157k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   157k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   157k|    return reinterpret_cast<T*>(Val);
   55|   157k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE7isEqualES4_S4_:
   62|  1.20M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes11InstructionEE12getHashValueES4_:
   57|   157k|  static unsigned getHashValue(const T *PtrVal) {
   58|   157k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   157k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   157k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE11getEmptyKeyEv:
   45|   629k|  static inline T* getEmptyKey() {
   46|   629k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   629k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   629k|    return reinterpret_cast<T*>(Val);
   49|   629k|  }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE11getEmptyKeyEv:
   45|  2.39M|  static inline T* getEmptyKey() {
   46|  2.39M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  2.39M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  2.39M|    return reinterpret_cast<T*>(Val);
   49|  2.39M|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE11getEmptyKeyEv:
   45|  7.14M|  static inline T* getEmptyKey() {
   46|  7.14M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  7.14M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  7.14M|    return reinterpret_cast<T*>(Val);
   49|  7.14M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE11getEmptyKeyEv:
   45|  14.9M|  static inline T* getEmptyKey() {
   46|  14.9M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  14.9M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  14.9M|    return reinterpret_cast<T*>(Val);
   49|  14.9M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE15getTombstoneKeyEv:
   51|  13.1M|  static inline T* getTombstoneKey() {
   52|  13.1M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  13.1M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  13.1M|    return reinterpret_cast<T*>(Val);
   55|  13.1M|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE7isEqualEPKS2_S6_:
   62|  77.0M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE15getTombstoneKeyEv:
   51|  6.59M|  static inline T* getTombstoneKey() {
   52|  6.59M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  6.59M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  6.59M|    return reinterpret_cast<T*>(Val);
   55|  6.59M|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE7isEqualEPKS2_S6_:
   62|  36.8M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE15getTombstoneKeyEv:
   51|  1.97M|  static inline T* getTombstoneKey() {
   52|  1.97M|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|  1.97M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|  1.97M|    return reinterpret_cast<T*>(Val);
   55|  1.97M|  }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE7isEqualEPKS2_S6_:
   62|  16.1M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE11getEmptyKeyEv:
   45|  1.23M|  static inline T* getEmptyKey() {
   46|  1.23M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.23M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.23M|    return reinterpret_cast<T*>(Val);
   49|  1.23M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE11getEmptyKeyEv:
   45|    114|  static inline T* getEmptyKey() {
   46|    114|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|    114|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|    114|    return reinterpret_cast<T*>(Val);
   49|    114|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE15getTombstoneKeyEv:
   51|    100|  static inline T* getTombstoneKey() {
   52|    100|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|    100|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|    100|    return reinterpret_cast<T*>(Val);
   55|    100|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE7isEqualEPKS2_S6_:
   62|    556|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE15getTombstoneKeyEv:
   51|   738k|  static inline T* getTombstoneKey() {
   52|   738k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   738k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   738k|    return reinterpret_cast<T*>(Val);
   55|   738k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE7isEqualES4_S4_:
   62|  12.1M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE11getEmptyKeyEv:
   45|   456k|  static inline T* getEmptyKey() {
   46|   456k|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|   456k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|   456k|    return reinterpret_cast<T*>(Val);
   49|   456k|  }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE15getTombstoneKeyEv:
   51|   228k|  static inline T* getTombstoneKey() {
   52|   228k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   228k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   228k|    return reinterpret_cast<T*>(Val);
   55|   228k|  }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE7isEqualEPKS2_S6_:
   62|  7.99M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE15getTombstoneKeyEv:
   51|   514k|  static inline T* getTombstoneKey() {
   52|   514k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   514k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   514k|    return reinterpret_cast<T*>(Val);
   55|   514k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE7isEqualES4_S4_:
   62|  4.12M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes10BasicBlockEE12getHashValueEPKS2_:
   57|  1.81M|  static unsigned getHashValue(const T *PtrVal) {
   58|  1.81M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  1.81M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  1.81M|  }
_ZN4llvh12DenseMapInfoIPKN6hermes10BasicBlockEE12getHashValueES4_:
   57|   510k|  static unsigned getHashValue(const T *PtrVal) {
   58|   510k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   510k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   510k|  }
_ZN4llvh12DenseMapInfoIPN6hermes9CatchInstEE12getHashValueEPKS2_:
   57|     84|  static unsigned getHashValue(const T *PtrVal) {
   58|     84|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|     84|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|     84|  }
_ZN4llvh12DenseMapInfoIPN6hermes12UniqueStringEE7isEqualEPKS2_S6_:
   62|   825k|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes7LiteralEE11getEmptyKeyEv:
   45|  1.02M|  static inline T* getEmptyKey() {
   46|  1.02M|    uintptr_t Val = static_cast<uintptr_t>(-1);
   47|  1.02M|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   48|  1.02M|    return reinterpret_cast<T*>(Val);
   49|  1.02M|  }
_ZN4llvh12DenseMapInfoIPN6hermes7LiteralEE15getTombstoneKeyEv:
   51|   737k|  static inline T* getTombstoneKey() {
   52|   737k|    uintptr_t Val = static_cast<uintptr_t>(-2);
   53|   737k|    Val <<= PointerLikeTypeTraits<T*>::NumLowBitsAvailable;
   54|   737k|    return reinterpret_cast<T*>(Val);
   55|   737k|  }
_ZN4llvh12DenseMapInfoIPN6hermes7LiteralEE7isEqualEPKS2_S6_:
   62|  3.38M|  static bool isEqual(const T *LHS, const T *RHS) { return LHS == RHS; }
_ZN4llvh12DenseMapInfoIPN6hermes7LiteralEE12getHashValueEPKS2_:
   57|   622k|  static unsigned getHashValue(const T *PtrVal) {
   58|   622k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   622k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   622k|  }
_ZN4llvh12DenseMapInfoIPN6hermes11InstructionEE12getHashValueEPKS2_:
   57|  6.59M|  static unsigned getHashValue(const T *PtrVal) {
   58|  6.59M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  6.59M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  6.59M|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE11getEmptyKeyEv:
  185|  4.25k|  static inline Pair getEmptyKey() {
  186|  4.25k|    return std::make_pair(FirstInfo::getEmptyKey(),
  187|  4.25k|                          SecondInfo::getEmptyKey());
  188|  4.25k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE15getTombstoneKeyEv:
  190|  2.12k|  static inline Pair getTombstoneKey() {
  191|  2.12k|    return std::make_pair(FirstInfo::getTombstoneKey(),
  192|  2.12k|                          SecondInfo::getTombstoneKey());
  193|  2.12k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE7isEqualERKS5_S8_:
  209|  19.2k|  static bool isEqual(const Pair &LHS, const Pair &RHS) {
  210|  19.2k|    return FirstInfo::isEqual(LHS.first, RHS.first) &&
  ------------------
  |  Branch (210:12): [True: 5.98k, False: 13.2k]
  ------------------
  211|  19.2k|           SecondInfo::isEqual(LHS.second, RHS.second);
  ------------------
  |  Branch (211:12): [True: 5.65k, False: 331]
  ------------------
  212|  19.2k|  }
_ZN4llvh12DenseMapInfoINSt3__14pairIiN6hermes10IdentifierEEEE12getHashValueERKS5_:
  195|  2.07k|  static unsigned getHashValue(const Pair& PairVal) {
  196|  2.07k|    uint64_t key = (uint64_t)FirstInfo::getHashValue(PairVal.first) << 32
  197|  2.07k|          | (uint64_t)SecondInfo::getHashValue(PairVal.second);
  198|  2.07k|    key += ~(key << 32);
  199|  2.07k|    key ^= (key >> 22);
  200|  2.07k|    key += ~(key << 13);
  201|  2.07k|    key ^= (key >> 8);
  202|  2.07k|    key += (key << 3);
  203|  2.07k|    key ^= (key >> 15);
  204|  2.07k|    key += ~(key << 27);
  205|  2.07k|    key ^= (key >> 31);
  206|  2.07k|    return (unsigned)key;
  207|  2.07k|  }
_ZN4llvh12DenseMapInfoIPN6hermes5ValueEE12getHashValueEPKS2_:
   57|  13.0M|  static unsigned getHashValue(const T *PtrVal) {
   58|  13.0M|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|  13.0M|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|  13.0M|  }
_ZN4llvh12DenseMapInfoIPN6hermes9ScopeDescEE12getHashValueEPKS2_:
   57|   114k|  static unsigned getHashValue(const T *PtrVal) {
   58|   114k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   114k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   114k|  }
_ZN4llvh12DenseMapInfoIPKN6hermes9ScopeDescEE12getHashValueES4_:
   57|   514k|  static unsigned getHashValue(const T *PtrVal) {
   58|   514k|    return (unsigned((uintptr_t)PtrVal) >> 4) ^
   59|   514k|           (unsigned((uintptr_t)PtrVal) >> 9);
   60|   514k|  }

_ZN4llvh6detail12DenseSetPairINS_9StringRefEE8getFirstEv:
   38|  3.37M|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetImplIN6hermes2vm8SymbolIDENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|     99|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|     99|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5beginEv:
  159|  1.18k|  iterator begin() { return Iterator(TheMap.begin()); }
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|  2.37k|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E3endEv:
  160|  1.18k|  iterator end() { return Iterator(TheMap.end()); }
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E13ConstIteratorC2ERKNSD_8IteratorE:
  144|  1.18k|    ConstIterator(const Iterator &B) : I(B.I) {}
_ZNK4llvh6detail12DenseSetImplIPN6hermes2vm6DomainENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorneERKNSD_13ConstIteratorE:
  128|  1.18k|    bool operator!=(const ConstIterator& X) const { return I != X.I; }
_ZN4llvh6detail12DenseSetImplIPN6hermes2vm13JSWeakMapImplILNS3_8CellKindE51EEENS_8DenseMapIS7_NS0_13DenseSetEmptyENS_12DenseMapInfoIS7_EENS0_12DenseSetPairIS7_EEEESB_EC2Ej:
   67|    141|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes8FunctionENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|     56|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|   228k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE8getFirstEv:
   38|  28.8M|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE9getSecondEv:
   40|   683k|  DenseSetEmpty &getSecond() { return *this; }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_EC2Ej:
   67|   114k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E6insertERKS5_:
  187|   153k|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|   153k|    detail::DenseSetEmpty Empty;
  189|   153k|    return TheMap.try_emplace(V, Empty);
  190|   153k|  }
_ZNK4llvh6detail12DenseSetPairIPKN6hermes10BasicBlockEE8getFirstEv:
   39|  1.26M|  const KeyT &getFirst() const { return key; }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|   153k|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZNK4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_13SmallDenseMapIS5_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5countES5_:
   91|  39.5k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|  39.5k|    return TheMap.count(V);
   93|  39.5k|  }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E6insertERKS5_:
  187|   114k|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|   114k|    detail::DenseSetEmpty Empty;
  189|   114k|    return TheMap.try_emplace(V, Empty);
  190|   114k|  }
_ZN4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E8IteratorC2ERKNS_16DenseMapIteratorIS5_S7_S9_SB_Lb0EEE:
  118|   114k|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZNK4llvh6detail12DenseSetImplIPKN6hermes10BasicBlockENS_8DenseMapIS5_NS0_13DenseSetEmptyENS_12DenseMapInfoIS5_EENS0_12DenseSetPairIS5_EEEES9_E5countES5_:
   91|   153k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|   153k|    return TheMap.count(V);
   93|   153k|  }
_ZN4llvh6detail12DenseSetImplINS_9StringRefENS_13SmallDenseMapIS2_NS0_13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS0_12DenseSetPairIS2_EEEES6_EC2Ej:
   67|    495|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZNK4llvh6detail12DenseSetPairINS_9StringRefEE8getFirstEv:
   39|  1.37M|  const KeyT &getFirst() const { return key; }
ConsecutiveStringStorage.cpp:_ZN4llvh6detail12DenseSetImplIPKN12_GLOBAL__N_112StringPackerIhE11StringEntryENS_8DenseMapIS7_NS0_13DenseSetEmptyENS_12DenseMapInfoIS7_EENS0_12DenseSetPairIS7_EEEESB_EC2Ej:
   67|  1.04k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
ConsecutiveStringStorage.cpp:_ZN4llvh6detail12DenseSetImplIPKN12_GLOBAL__N_112StringPackerIDsE11StringEntryENS_8DenseMapIS7_NS0_13DenseSetEmptyENS_12DenseMapInfoIS7_EENS0_12DenseSetPairIS7_EEEESB_EC2Ej:
   67|    273|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|      2|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZN4llvh6detail12DenseSetPairIPN6hermes11InstructionEE8getFirstEv:
   38|    138|  KeyT &getFirst() { return key; }
_ZN4llvh6detail12DenseSetPairIPN6hermes11InstructionEE9getSecondEv:
   40|      6|  DenseSetEmpty &getSecond() { return *this; }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E6insertERKS4_:
  187|      4|  std::pair<iterator, bool> insert(const ValueT &V) {
  188|      4|    detail::DenseSetEmpty Empty;
  189|      4|    return TheMap.try_emplace(V, Empty);
  190|      4|  }
_ZNK4llvh6detail12DenseSetPairIPN6hermes11InstructionEE8getFirstEv:
   39|      8|  const KeyT &getFirst() const { return key; }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E8IteratorC2ERKNS_16DenseMapIteratorIS4_S6_S8_SA_Lb0EEE:
  118|      4|    Iterator(const typename MapTy::iterator &i) : I(i) {}
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_13SmallDenseMapIS4_NS0_13DenseSetEmptyELj16ENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_E5clearEv:
   86|      2|  void clear() {
   87|      2|    TheMap.clear();
   88|      2|  }
_ZN4llvh6detail12DenseSetImplIPN6hermes11InstructionENS_8DenseMapIS4_NS0_13DenseSetEmptyENS_12DenseMapInfoIS4_EENS0_12DenseSetPairIS4_EEEES8_EC2Ej:
   67|   114k|  explicit DenseSetImpl(unsigned InitialReserve = 0) : TheMap(InitialReserve) {}
_ZNK4llvh6detail12DenseSetImplINS_9StringRefENS_13SmallDenseMapIS2_NS0_13DenseSetEmptyELj4ENS_12DenseMapInfoIS2_EENS0_12DenseSetPairIS2_EEEES6_E5countERKS2_:
   91|   686k|  size_type count(const_arg_type_t<ValueT> V) const {
   92|   686k|    return TheMap.count(V);
   93|   686k|  }

_ZN4llvh14DebugEpochBase14incrementEpochEv:
   84|  4.34M|  void incrementEpoch() {}
_ZN4llvh14DebugEpochBase10HandleBaseC2EPKS0_:
   89|  22.1M|    explicit HandleBase(const DebugEpochBase *) {}
_ZNK4llvh14DebugEpochBase10HandleBase14isHandleInSyncEv:
   90|  51.7M|    bool isHandleInSync() const { return true; }
_ZNK4llvh14DebugEpochBase10HandleBase15getEpochAddressEv:
   91|  21.4M|    const void *getEpochAddress() const { return nullptr; }

_ZNK4llvh14FoldingSetBase4Node15getNextInBucketEv:
  145|  1.71M|    void *getNextInBucket() const { return NextInFoldingSetBucket; }
_ZN4llvh14FoldingSetBase4Node15SetNextInBucketEPv:
  146|   903k|    void SetNextInBucket(void *N) { NextInFoldingSetBucket = N; }
_ZN4llvh14FoldingSetBase8capacityEv:
  165|   563k|  unsigned capacity() {
  166|       |    // We allow a load factor of up to 2.0,
  167|       |    // so that means our capacity is NumBuckets * 2
  168|   563k|    return NumBuckets * 2;
  169|   563k|  }
_ZN4llvh19FoldingSetNodeIDRefC2EPKjm:
  284|  5.40M|  FoldingSetNodeIDRef(const unsigned *D, size_t S) : Data(D), Size(S) {}
_ZN4llvh16FoldingSetNodeID5clearEv:
  334|   929k|  inline void clear() { Bits.clear(); }
_ZNK4llvh22FoldingSetIteratorImplneERKS0_:
  632|   224k|  bool operator!=(const FoldingSetIteratorImpl &RHS) const {
  633|   224k|    return NodePtr != RHS.NodePtr;
  634|   224k|  }
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralNumberEE7ProfileERS2_RNS_16FoldingSetNodeIDE:
  225|  1.82M|  static void Profile(T &X, FoldingSetNodeID &ID) {
  226|  1.82M|    X.Profile(ID);
  227|  1.82M|  }
_ZNK4llvh10FoldingSetIN6hermes13LiteralNumberEE10NodeEqualsEPNS_14FoldingSetBase4NodeERKNS_16FoldingSetNodeIDEjRS7_:
  488|  1.48M|                  FoldingSetNodeID &TempID) const override {
  489|  1.48M|    T *TN = static_cast<T *>(N);
  490|  1.48M|    return FoldingSetTrait<T>::Equals(*TN, ID, IDHash, TempID);
  491|  1.48M|  }
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralNumberEE6EqualsERS2_RKNS_16FoldingSetNodeIDEjRS5_:
  369|  1.48M|                                  FoldingSetNodeID &TempID) {
  370|  1.48M|  FoldingSetTrait<T>::Profile(X, TempID);
  371|  1.48M|  return TempID == ID;
  372|  1.48M|}
_ZNK4llvh10FoldingSetIN6hermes13LiteralNumberEE15ComputeNodeHashEPNS_14FoldingSetBase4NodeERNS_16FoldingSetNodeIDE:
  495|   339k|  unsigned ComputeNodeHash(Node *N, FoldingSetNodeID &TempID) const override {
  496|   339k|    T *TN = static_cast<T *>(N);
  497|   339k|    return FoldingSetTrait<T>::ComputeHash(*TN, TempID);
  498|   339k|  }
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralNumberEE11ComputeHashERS2_RNS_16FoldingSetNodeIDE:
  375|   339k|DefaultFoldingSetTrait<T>::ComputeHash(T &X, FoldingSetNodeID &TempID) {
  376|   339k|  FoldingSetTrait<T>::Profile(X, TempID);
  377|   339k|  return TempID.ComputeHash();
  378|   339k|}
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralStringEE7ProfileERS2_RNS_16FoldingSetNodeIDE:
  225|   328k|  static void Profile(T &X, FoldingSetNodeID &ID) {
  226|   328k|    X.Profile(ID);
  227|   328k|  }
_ZNK4llvh10FoldingSetIN6hermes13LiteralStringEE10NodeEqualsEPNS_14FoldingSetBase4NodeERKNS_16FoldingSetNodeIDEjRS7_:
  488|   327k|                  FoldingSetNodeID &TempID) const override {
  489|   327k|    T *TN = static_cast<T *>(N);
  490|   327k|    return FoldingSetTrait<T>::Equals(*TN, ID, IDHash, TempID);
  491|   327k|  }
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralStringEE6EqualsERS2_RKNS_16FoldingSetNodeIDEjRS5_:
  369|   327k|                                  FoldingSetNodeID &TempID) {
  370|   327k|  FoldingSetTrait<T>::Profile(X, TempID);
  371|   327k|  return TempID == ID;
  372|   327k|}
_ZNK4llvh10FoldingSetIN6hermes13LiteralStringEE15ComputeNodeHashEPNS_14FoldingSetBase4NodeERNS_16FoldingSetNodeIDE:
  495|    387|  unsigned ComputeNodeHash(Node *N, FoldingSetNodeID &TempID) const override {
  496|    387|    T *TN = static_cast<T *>(N);
  497|    387|    return FoldingSetTrait<T>::ComputeHash(*TN, TempID);
  498|    387|  }
_ZN4llvh22DefaultFoldingSetTraitIN6hermes13LiteralStringEE11ComputeHashERS2_RNS_16FoldingSetNodeIDE:
  375|    387|DefaultFoldingSetTrait<T>::ComputeHash(T &X, FoldingSetNodeID &TempID) {
  376|    387|  FoldingSetTrait<T>::Profile(X, TempID);
  377|    387|  return TempID.ComputeHash();
  378|    387|}
_ZN4llvh10FoldingSetIN6hermes13LiteralNumberEEC2Ej:
  501|     56|  explicit FoldingSet(unsigned Log2InitSize = 6) : Super(Log2InitSize) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralNumberEEC2Ej:
  404|     56|      : FoldingSetBase(Log2InitSize) {}
_ZN4llvh10FoldingSetIN6hermes13LiteralBigIntEEC2Ej:
  501|     56|  explicit FoldingSet(unsigned Log2InitSize = 6) : Super(Log2InitSize) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralBigIntEEC2Ej:
  404|     56|      : FoldingSetBase(Log2InitSize) {}
_ZN4llvh10FoldingSetIN6hermes13LiteralStringEEC2Ej:
  501|     56|  explicit FoldingSet(unsigned Log2InitSize = 6) : Super(Log2InitSize) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralStringEEC2Ej:
  404|     56|      : FoldingSetBase(Log2InitSize) {}
_ZN4llvh16FoldingSetNodeIDC2Ev:
  312|  2.88M|  FoldingSetNodeID() = default;
_ZN4llvh14FoldingSetBase4NodeC2Ev:
  142|   224k|    Node() = default;
_ZN4llvh14FoldingSetImplIN6hermes13LiteralNumberEE5beginEv:
  413|     56|  iterator begin() { return iterator(Buckets); }
_ZN4llvh18FoldingSetIteratorIN6hermes13LiteralNumberEEC2EPPv:
  639|    112|  explicit FoldingSetIterator(void **Bucket) : FoldingSetIteratorImpl(Bucket) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralNumberEE3endEv:
  414|     56|  iterator end() { return iterator(Buckets+NumBuckets); }
_ZN4llvh18FoldingSetIteratorIN6hermes13LiteralNumberEEppEv:
  649|   220k|  inline FoldingSetIterator &operator++() {          // Preincrement
  650|   220k|    advance();
  651|   220k|    return *this;
  652|   220k|  }
_ZNK4llvh18FoldingSetIteratorIN6hermes13LiteralNumberEEdeEv:
  641|   220k|  T &operator*() const {
  642|   220k|    return *static_cast<T*>(NodePtr);
  643|   220k|  }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralBigIntEE5beginEv:
  413|     56|  iterator begin() { return iterator(Buckets); }
_ZN4llvh18FoldingSetIteratorIN6hermes13LiteralBigIntEEC2EPPv:
  639|    112|  explicit FoldingSetIterator(void **Bucket) : FoldingSetIteratorImpl(Bucket) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralBigIntEE3endEv:
  414|     56|  iterator end() { return iterator(Buckets+NumBuckets); }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralStringEE5beginEv:
  413|     56|  iterator begin() { return iterator(Buckets); }
_ZN4llvh18FoldingSetIteratorIN6hermes13LiteralStringEEC2EPPv:
  639|    112|  explicit FoldingSetIterator(void **Bucket) : FoldingSetIteratorImpl(Bucket) {}
_ZN4llvh14FoldingSetImplIN6hermes13LiteralStringEE3endEv:
  414|     56|  iterator end() { return iterator(Buckets+NumBuckets); }
_ZN4llvh18FoldingSetIteratorIN6hermes13LiteralStringEEppEv:
  649|  4.10k|  inline FoldingSetIterator &operator++() {          // Preincrement
  650|  4.10k|    advance();
  651|  4.10k|    return *this;
  652|  4.10k|  }
_ZNK4llvh18FoldingSetIteratorIN6hermes13LiteralStringEEdeEv:
  641|  4.10k|  T &operator*() const {
  642|  4.10k|    return *static_cast<T*>(NodePtr);
  643|  4.10k|  }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralNumberEE19FindNodeOrInsertPosERKNS_16FoldingSetNodeIDERPv:
  445|  1.12M|  T *FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos) {
  446|  1.12M|    return static_cast<T *>(FoldingSetBase::FindNodeOrInsertPos(ID, InsertPos));
  447|  1.12M|  }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralNumberEE10InsertNodeEPS2_Pv:
  452|   220k|  void InsertNode(T *N, void *InsertPos) {
  453|   220k|    FoldingSetBase::InsertNode(N, InsertPos);
  454|   220k|  }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralStringEE19FindNodeOrInsertPosERKNS_16FoldingSetNodeIDERPv:
  445|   322k|  T *FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos) {
  446|   322k|    return static_cast<T *>(FoldingSetBase::FindNodeOrInsertPos(ID, InsertPos));
  447|   322k|  }
_ZN4llvh14FoldingSetImplIN6hermes13LiteralStringEE10InsertNodeEPS2_Pv:
  452|  4.10k|  void InsertNode(T *N, void *InsertPos) {
  453|  4.10k|    FoldingSetBase::InsertNode(N, InsertPos);
  454|  4.10k|  }

_ZN4llvh8childrenIPN6hermes10BasicBlockEEENS_14iterator_rangeINS_11GraphTraitsIT_E17ChildIteratorTypeEEERKNS7_7NodeRefE:
  122|    160|children(const typename GraphTraits<GraphType>::NodeRef &G) {
  123|    160|  return make_range(GraphTraits<GraphType>::child_begin(G),
  124|    160|                    GraphTraits<GraphType>::child_end(G));
  125|    160|}

_ZN4llvh9hash_codeC2Em:
   86|  7.45M|  hash_code(size_t value) : value(value) {}
_ZNK4llvh9hash_codecvmEv:
   89|  7.45M|  /*explicit*/ operator size_t() const { return value; }
_ZN4llvh7hashing6detail10hash_state6createEPKcm:
  271|  39.6k|  static hash_state create(const char *s, uint64_t seed) {
  272|  39.6k|    hash_state state = {
  273|  39.6k|      0, seed, hash_16_bytes(seed, k1), rotate(seed ^ k1, 49),
  274|  39.6k|      seed * k1, shift_mix(seed), 0 };
  275|  39.6k|    state.h6 = hash_16_bytes(state.h4, state.h5);
  276|  39.6k|    state.mix(s);
  277|  39.6k|    return state;
  278|  39.6k|  }
_ZN4llvh7hashing6detail10hash_state12mix_32_bytesEPKcRmS5_:
  282|  2.64M|  static void mix_32_bytes(const char *s, uint64_t &a, uint64_t &b) {
  283|  2.64M|    a += fetch64(s);
  284|  2.64M|    uint64_t c = fetch64(s + 24);
  285|  2.64M|    b = rotate(b + a + c, 21);
  286|  2.64M|    uint64_t d = a;
  287|  2.64M|    a += fetch64(s + 8) + fetch64(s + 16);
  288|  2.64M|    b += rotate(a, 44) + d;
  289|  2.64M|    a += c;
  290|  2.64M|  }
_ZN4llvh7hashing6detail10hash_state3mixEPKc:
  295|  1.32M|  void mix(const char *s) {
  296|  1.32M|    h0 = rotate(h0 + h1 + h3 + fetch64(s + 8), 37) * k1;
  297|  1.32M|    h1 = rotate(h1 + h4 + fetch64(s + 48), 42) * k1;
  298|  1.32M|    h0 ^= h6;
  299|  1.32M|    h1 += h3 + fetch64(s + 40);
  300|  1.32M|    h2 = rotate(h2 + h5, 33) * k1;
  301|  1.32M|    h3 = h4 * k1;
  302|  1.32M|    h4 = h0 + h5;
  303|  1.32M|    mix_32_bytes(s, h3, h4);
  304|  1.32M|    h5 = h2 + h6;
  305|  1.32M|    h6 = h1 + fetch64(s + 16);
  306|  1.32M|    mix_32_bytes(s + 32, h5, h6);
  307|  1.32M|    std::swap(h2, h0);
  308|  1.32M|  }
_ZN4llvh7hashing6detail10hash_state8finalizeEm:
  312|  39.6k|  uint64_t finalize(size_t length) {
  313|  39.6k|    return hash_16_bytes(hash_16_bytes(h3, h5) + shift_mix(h1) * k1 + h2,
  314|  39.6k|                         hash_16_bytes(h4, h6) + shift_mix(length) * k1 + h0);
  315|  39.6k|  }
_ZN4llvh7hashing6detail7fetch64EPKc:
  150|  18.1M|inline uint64_t fetch64(const char *p) {
  151|  18.1M|  uint64_t result;
  152|  18.1M|  memcpy(&result, p, sizeof(result));
  153|  18.1M|  if (sys::IsBigEndianHost)
  ------------------
  |  Branch (153:7): [Folded - Ignored]
  ------------------
  154|      0|    sys::swapByteOrder(result);
  155|  18.1M|  return result;
  156|  18.1M|}
_ZN4llvh7hashing6detail7fetch32EPKc:
  158|  4.89M|inline uint32_t fetch32(const char *p) {
  159|  4.89M|  uint32_t result;
  160|  4.89M|  memcpy(&result, p, sizeof(result));
  161|  4.89M|  if (sys::IsBigEndianHost)
  ------------------
  |  Branch (161:7): [Folded - Ignored]
  ------------------
  162|      0|    sys::swapByteOrder(result);
  163|  4.89M|  return result;
  164|  4.89M|}
_ZN4llvh7hashing6detail6rotateEmm:
  175|  10.4M|inline uint64_t rotate(uint64_t val, size_t shift) {
  176|       |  // Avoid shifting by 64: doing so yields an undefined result.
  177|  10.4M|  return shift == 0 ? val : ((val >> shift) | (val << (64 - shift)));
  ------------------
  |  Branch (177:10): [True: 0, False: 10.4M]
  ------------------
  178|  10.4M|}
_ZN4llvh7hashing6detail9shift_mixEm:
  180|  3.22M|inline uint64_t shift_mix(uint64_t val) {
  181|  3.22M|  return val ^ (val >> 47);
  182|  3.22M|}
_ZN4llvh7hashing6detail13hash_16_bytesEmm:
  184|  3.75M|inline uint64_t hash_16_bytes(uint64_t low, uint64_t high) {
  185|       |  // Murmur-inspired hashing.
  186|  3.75M|  const uint64_t kMul = 0x9ddfea08eb382d69ULL;
  187|  3.75M|  uint64_t a = (low ^ high) * kMul;
  188|  3.75M|  a ^= (a >> 47);
  189|  3.75M|  uint64_t b = (high ^ a) * kMul;
  190|  3.75M|  b ^= (b >> 47);
  191|  3.75M|  b *= kMul;
  192|  3.75M|  return b;
  193|  3.75M|}
_ZN4llvh7hashing6detail15hash_1to3_bytesEPKcmm:
  195|  3.10M|inline uint64_t hash_1to3_bytes(const char *s, size_t len, uint64_t seed) {
  196|  3.10M|  uint8_t a = s[0];
  197|  3.10M|  uint8_t b = s[len >> 1];
  198|  3.10M|  uint8_t c = s[len - 1];
  199|  3.10M|  uint32_t y = static_cast<uint32_t>(a) + (static_cast<uint32_t>(b) << 8);
  200|  3.10M|  uint32_t z = len + (static_cast<uint32_t>(c) << 2);
  201|  3.10M|  return shift_mix(y * k2 ^ z * k3 ^ seed) * k2;
  202|  3.10M|}
_ZN4llvh7hashing6detail15hash_4to8_bytesEPKcmm:
  204|  2.44M|inline uint64_t hash_4to8_bytes(const char *s, size_t len, uint64_t seed) {
  205|  2.44M|  uint64_t a = fetch32(s);
  206|  2.44M|  return hash_16_bytes(len + (a << 3), seed ^ fetch32(s + len - 4));
  207|  2.44M|}
_ZN4llvh7hashing6detail16hash_9to16_bytesEPKcmm:
  209|  1.08M|inline uint64_t hash_9to16_bytes(const char *s, size_t len, uint64_t seed) {
  210|  1.08M|  uint64_t a = fetch64(s);
  211|  1.08M|  uint64_t b = fetch64(s + len - 8);
  212|  1.08M|  return hash_16_bytes(seed ^ a, rotate(b + len, len)) ^ b;
  213|  1.08M|}
_ZN4llvh7hashing6detail17hash_17to32_bytesEPKcmm:
  215|  16.5k|inline uint64_t hash_17to32_bytes(const char *s, size_t len, uint64_t seed) {
  216|  16.5k|  uint64_t a = fetch64(s) * k1;
  217|  16.5k|  uint64_t b = fetch64(s + 8);
  218|  16.5k|  uint64_t c = fetch64(s + len - 8) * k2;
  219|  16.5k|  uint64_t d = fetch64(s + len - 16) * k0;
  220|  16.5k|  return hash_16_bytes(rotate(a - b, 43) + rotate(c ^ seed, 30) + d,
  221|  16.5k|                       a + rotate(b ^ k3, 20) - c + len + seed);
  222|  16.5k|}
_ZN4llvh7hashing6detail17hash_33to64_bytesEPKcmm:
  224|  2.65k|inline uint64_t hash_33to64_bytes(const char *s, size_t len, uint64_t seed) {
  225|  2.65k|  uint64_t z = fetch64(s + 24);
  226|  2.65k|  uint64_t a = fetch64(s) + (len + fetch64(s + len - 16)) * k0;
  227|  2.65k|  uint64_t b = rotate(a + z, 52);
  228|  2.65k|  uint64_t c = rotate(a, 37);
  229|  2.65k|  a += fetch64(s + 8);
  230|  2.65k|  c += rotate(a, 7);
  231|  2.65k|  a += fetch64(s + 16);
  232|  2.65k|  uint64_t vf = a + z;
  233|  2.65k|  uint64_t vs = b + rotate(a, 31) + c;
  234|  2.65k|  a = fetch64(s + 16) + fetch64(s + len - 32);
  235|  2.65k|  z = fetch64(s + len - 8);
  236|  2.65k|  b = rotate(a + z, 52);
  237|  2.65k|  c = rotate(a, 37);
  238|  2.65k|  a += fetch64(s + len - 24);
  239|  2.65k|  c += rotate(a, 7);
  240|  2.65k|  a += fetch64(s + len - 16);
  241|  2.65k|  uint64_t wf = a + z;
  242|  2.65k|  uint64_t ws = b + rotate(a, 31) + c;
  243|  2.65k|  uint64_t r = shift_mix((vf + ws) * k2 + (wf + vs) * k0);
  244|  2.65k|  return shift_mix((seed ^ (r * k0)) + vs) * k2;
  245|  2.65k|}
_ZN4llvh7hashing6detail10hash_shortEPKcmm:
  247|  7.41M|inline uint64_t hash_short(const char *s, size_t length, uint64_t seed) {
  248|  7.41M|  if (length >= 4 && length <= 8)
  ------------------
  |  Branch (248:7): [True: 3.55M, False: 3.86M]
  |  Branch (248:22): [True: 2.44M, False: 1.10M]
  ------------------
  249|  2.44M|    return hash_4to8_bytes(s, length, seed);
  250|  4.96M|  if (length > 8 && length <= 16)
  ------------------
  |  Branch (250:7): [True: 1.10M, False: 3.86M]
  |  Branch (250:21): [True: 1.08M, False: 19.2k]
  ------------------
  251|  1.08M|    return hash_9to16_bytes(s, length, seed);
  252|  3.88M|  if (length > 16 && length <= 32)
  ------------------
  |  Branch (252:7): [True: 19.2k, False: 3.86M]
  |  Branch (252:22): [True: 16.5k, False: 2.65k]
  ------------------
  253|  16.5k|    return hash_17to32_bytes(s, length, seed);
  254|  3.86M|  if (length > 32)
  ------------------
  |  Branch (254:7): [True: 2.65k, False: 3.86M]
  ------------------
  255|  2.65k|    return hash_33to64_bytes(s, length, seed);
  256|  3.86M|  if (length != 0)
  ------------------
  |  Branch (256:7): [True: 3.10M, False: 761k]
  ------------------
  257|  3.10M|    return hash_1to3_bytes(s, length, seed);
  258|       |
  259|   761k|  return k2 ^ seed;
  260|  3.86M|}
_ZN4llvh7hashing6detail18get_execution_seedEv:
  326|  7.45M|inline uint64_t get_execution_seed() {
  327|       |  // FIXME: This needs to be a per-execution seed. This is just a placeholder
  328|       |  // implementation. Switching to a per-execution seed is likely to flush out
  329|       |  // instability bugs and so will happen as its own commit.
  330|       |  //
  331|       |  // However, if there is a fixed seed override set the first time this is
  332|       |  // called, return that instead of the per-execution seed.
  333|  7.45M|  const uint64_t seed_prime = 0xff51afd7ed558ccdULL;
  334|  7.45M|  static uint64_t seed = fixed_seed_override ? fixed_seed_override : seed_prime;
  ------------------
  |  Branch (334:26): [True: 0, False: 7.45M]
  ------------------
  335|  7.45M|  return seed;
  336|  7.45M|}
_ZN4llvh18hash_combine_rangeINSt3__111__wrap_iterIPKPN6hermes13LiteralStringEEEEENS_9hash_codeET_SA_:
  484|    283|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|    283|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|    283|}
_ZN4llvh7hashing6detail23hash_combine_range_implINSt3__111__wrap_iterIPKPN6hermes13LiteralStringEEEEENS_9hash_codeET_SC_:
  408|    283|hash_code hash_combine_range_impl(InputIteratorT first, InputIteratorT last) {
  409|    283|  const uint64_t seed = get_execution_seed();
  410|    283|  char buffer[64], *buffer_ptr = buffer;
  411|    283|  char *const buffer_end = std::end(buffer);
  412|    601|  while (first != last && store_and_advance(buffer_ptr, buffer_end,
  ------------------
  |  Branch (412:10): [True: 323, False: 278]
  |  Branch (412:10): [True: 318, False: 283]
  |  Branch (412:27): [True: 318, False: 5]
  ------------------
  413|    323|                                            get_hashable_data(*first)))
  414|    318|    ++first;
  415|    283|  if (first == last)
  ------------------
  |  Branch (415:7): [True: 278, False: 5]
  ------------------
  416|    278|    return hash_short(buffer, buffer_ptr - buffer, seed);
  417|      5|  assert(buffer_ptr == buffer_end);
  418|       |
  419|      0|  hash_state state = state.create(buffer, seed);
  420|      5|  size_t length = 64;
  421|  8.39k|  while (first != last) {
  ------------------
  |  Branch (421:10): [True: 8.38k, False: 5]
  ------------------
  422|       |    // Fill up the buffer. We don't clear it, which re-mixes the last round
  423|       |    // when only a partial 64-byte chunk is left.
  424|  8.38k|    buffer_ptr = buffer;
  425|  75.4k|    while (first != last && store_and_advance(buffer_ptr, buffer_end,
  ------------------
  |  Branch (425:12): [True: 75.4k, False: 5]
  |  Branch (425:12): [True: 67.0k, False: 8.38k]
  |  Branch (425:29): [True: 67.0k, False: 8.38k]
  ------------------
  426|  75.4k|                                              get_hashable_data(*first)))
  427|  67.0k|      ++first;
  428|       |
  429|       |    // Rotate the buffer if we did a partial fill in order to simulate doing
  430|       |    // a mix of the last 64-bytes. That is how the algorithm works when we
  431|       |    // have a contiguous byte sequence, and we want to emulate that here.
  432|  8.38k|    std::rotate(buffer, buffer_ptr, buffer_end);
  433|       |
  434|       |    // Mix this chunk into the current state.
  435|  8.38k|    state.mix(buffer);
  436|  8.38k|    length += buffer_ptr - buffer;
  437|  8.38k|  };
  438|       |
  439|      5|  return state.finalize(length);
  440|    283|}
_ZN4llvh7hashing6detail17get_hashable_dataIPN6hermes13LiteralStringEEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueES8_E4typeERKS8_:
  370|  75.7k|get_hashable_data(const T &value) {
  371|  75.7k|  return value;
  372|  75.7k|}
_ZN4llvh7hashing6detail17store_and_advanceIPN6hermes13LiteralStringEEEbRPcS6_RKT_m:
  392|  75.7k|                       size_t offset = 0) {
  393|  75.7k|  size_t store_size = sizeof(value) - offset;
  394|  75.7k|  if (buffer_ptr + store_size > buffer_end)
  ------------------
  |  Branch (394:7): [True: 8.38k, False: 67.3k]
  ------------------
  395|  8.38k|    return false;
  396|  67.3k|  const char *value_data = reinterpret_cast<const char *>(&value);
  397|  67.3k|  memcpy(buffer_ptr, value_data + offset, store_size);
  398|  67.3k|  buffer_ptr += store_size;
  399|  67.3k|  return true;
  400|  75.7k|}
_ZN4llvh18hash_combine_rangeIPKjEENS_9hash_codeET_S4_:
  484|  1.78M|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|  1.78M|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|  1.78M|}
_ZN4llvh7hashing6detail23hash_combine_range_implIKjEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueENS_9hash_codeEE4typeEPS6_SA_:
  452|  1.78M|hash_combine_range_impl(ValueT *first, ValueT *last) {
  453|  1.78M|  const uint64_t seed = get_execution_seed();
  454|  1.78M|  const char *s_begin = reinterpret_cast<const char *>(first);
  455|  1.78M|  const char *s_end = reinterpret_cast<const char *>(last);
  456|  1.78M|  const size_t length = std::distance(s_begin, s_end);
  457|  1.78M|  if (length <= 64)
  ------------------
  |  Branch (457:7): [True: 1.78M, False: 0]
  ------------------
  458|  1.78M|    return hash_short(s_begin, length, seed);
  459|       |
  460|      0|  const char *s_aligned_end = s_begin + (length & ~63);
  461|      0|  hash_state state = state.create(s_begin, seed);
  462|      0|  s_begin += 64;
  463|      0|  while (s_begin != s_aligned_end) {
  ------------------
  |  Branch (463:10): [True: 0, False: 0]
  ------------------
  464|      0|    state.mix(s_begin);
  465|      0|    s_begin += 64;
  466|      0|  }
  467|      0|  if (length & 63)
  ------------------
  |  Branch (467:7): [True: 0, False: 0]
  ------------------
  468|      0|    state.mix(s_end - 64);
  469|       |
  470|      0|  return state.finalize(length);
  471|  1.78M|}
_ZN4llvh18hash_combine_rangeIPKcEENS_9hash_codeET_S4_:
  484|  5.67M|hash_code hash_combine_range(InputIteratorT first, InputIteratorT last) {
  485|  5.67M|  return ::llvh::hashing::detail::hash_combine_range_impl(first, last);
  486|  5.67M|}
_ZN4llvh7hashing6detail23hash_combine_range_implIKcEENSt3__19enable_ifIXsr16is_hashable_dataIT_EE5valueENS_9hash_codeEE4typeEPS6_SA_:
  452|  5.67M|hash_combine_range_impl(ValueT *first, ValueT *last) {
  453|  5.67M|  const uint64_t seed = get_execution_seed();
  454|  5.67M|  const char *s_begin = reinterpret_cast<const char *>(first);
  455|  5.67M|  const char *s_end = reinterpret_cast<const char *>(last);
  456|  5.67M|  const size_t length = std::distance(s_begin, s_end);
  457|  5.67M|  if (length <= 64)
  ------------------
  |  Branch (457:7): [True: 5.63M, False: 39.5k]
  ------------------
  458|  5.63M|    return hash_short(s_begin, length, seed);
  459|       |
  460|  39.5k|  const char *s_aligned_end = s_begin + (length & ~63);
  461|  39.5k|  hash_state state = state.create(s_begin, seed);
  462|  39.5k|  s_begin += 64;
  463|  1.27M|  while (s_begin != s_aligned_end) {
  ------------------
  |  Branch (463:10): [True: 1.23M, False: 39.5k]
  ------------------
  464|  1.23M|    state.mix(s_begin);
  465|  1.23M|    s_begin += 64;
  466|  1.23M|  }
  467|  39.5k|  if (length & 63)
  ------------------
  |  Branch (467:7): [True: 39.4k, False: 167]
  ------------------
  468|  39.4k|    state.mix(s_end - 64);
  469|       |
  470|  39.5k|  return state.finalize(length);
  471|  5.67M|}

_ZNK4llvh9MapVectorImN6hermes2vm8Debugger10BreakpointENS_8DenseMapImjNS_12DenseMapInfoImEENS_6detail12DenseMapPairImjEEEENSt3__16vectorINSC_4pairImS4_EENSC_9allocatorISF_EEEEE4sizeEv:
   66|    928|  size_type size() const { return Vector.size(); }

_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EED2Ev:
   92|    198|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EE5resetEv:
   94|    198|  void reset() {
   95|    198|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 198]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|    198|  }
_ZNK4llvh8OptionalIjE8hasValueEv:
  183|  5.04k|  bool hasValue() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIjE8getValueEv:
  180|   150k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIjE10getPointerEv:
  175|   150k|  T *getPointer() {
  176|   150k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   150k|  }
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEE8hasValueEv:
  183|  5.28M|  bool hasValue() const { return Storage.hasVal; }
_ZNKR4llvh8OptionalIPKN6hermes4inst4InstEEdeEv:
  186|  5.28M|  const T &operator*() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEE10getPointerEv:
  171|  5.28M|  const T *getPointer() const {
  172|  5.28M|    assert(Storage.hasVal);
  173|      0|    return reinterpret_cast<const T *>(Storage.storage.buffer);
  174|  5.28M|  }
_ZN4llvh8OptionalIbEC2Ev:
  137|     99|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIbLb1EEC2Ev:
  117|    138|  OptionalStorage() = default;
_ZNK4llvh8OptionalIPKcEcvbEv:
  182|  5.56k|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIhE8hasValueEv:
  183|    459|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIiE8hasValueEv:
  183|   220k|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIhEcvbEv:
  182|    248|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIhE8getValueEv:
  180|    248|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIhE10getPointerEv:
  175|    248|  T *getPointer() {
  176|    248|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    248|  }
_ZNK4llvh8OptionalIiEcvbEv:
  182|  1.17M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIiE8getValueEv:
  180|   475k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIiE10getPointerEv:
  175|   475k|  T *getPointer() {
  176|   475k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   475k|  }
_ZNK4llvh8OptionalIjEcvbEv:
  182|  1.03M|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEEaSERKS5_:
  163|   289k|  Optional &operator=(const T &y) {
  164|   289k|    Storage = y;
  165|   289k|    return *this;
  166|   289k|  }
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EEaSERKS6_:
  120|   289k|  OptionalStorage &operator=(const T &y) {
  121|   289k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|   289k|    hasVal = true;
  123|   289k|    return *this;
  124|   289k|  }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEE5resetEv:
  169|   289k|  void reset() { Storage.reset(); }
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EE5resetEv:
  126|   289k|  void reset() { hasVal = false; }
_ZN4llvheqIPKN6hermes4inst4InstEEEbRKT_RKNS_8OptionalIS6_EE:
  300|  2.55k|template <typename T> bool operator==(const T &X, const Optional<T> &Y) {
  301|  2.55k|  return Y && X == *Y;
  ------------------
  |  Branch (301:10): [True: 2.55k, False: 0]
  |  Branch (301:15): [True: 2.55k, False: 0]
  ------------------
  302|  2.55k|}
_ZNK4llvh8OptionalIPKN6hermes4inst4InstEEcvbEv:
  182|  2.55k|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEcvbEv:
  182|   724k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEdeEv:
  187|   495k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEE10getPointerEv:
  175|   495k|  T *getPointer() {
  176|   495k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   495k|  }
_ZN4llvh8OptionalIjEC2ENS_8NoneTypeE:
  138|   882k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIjLb1EEC2Ev:
  117|   882k|  OptionalStorage() = default;
_ZN4llvh8OptionalIjEC2EOj:
  143|   155k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIjLb1EEC2ERKj:
  119|   155k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEC2EOS8_:
  143|   302k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EEC2EOS9_:
   43|   302k|  OptionalStorage(T &&y) : hasVal(true) {
   44|   302k|    new (storage.buffer) T(std::forward<T>(y));
   45|   302k|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EE5resetEv:
   94|   302k|  void reset() {
   95|   302k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 302k, False: 0]
  ------------------
   96|   302k|      (*getPointer()).~T();
   97|   302k|      hasVal = false;
   98|   302k|    }
   99|   302k|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EE10getPointerEv:
  101|   302k|  T *getPointer() {
  102|   302k|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|   302k|  }
_ZNK4llvh8OptionalIN6hermes2vm8SymbolIDEEcvbEv:
  182|   205k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm8SymbolIDEEdeEv:
  187|   205k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm8SymbolIDEE10getPointerEv:
  175|   205k|  T *getPointer() {
  176|   205k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   205k|  }
_ZN4llvh8OptionalIN6hermes2vm8SymbolIDEEC2EOS3_:
  143|   205k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm8SymbolIDELb1EEC2ERKS4_:
  119|   205k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EE5resetEv:
   94|   459k|  void reset() {
   95|   459k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 459k, False: 0]
  ------------------
   96|   459k|      (*getPointer()).~T();
   97|   459k|      hasVal = false;
   98|   459k|    }
   99|   459k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EE10getPointerEv:
  101|   459k|  T *getPointer() {
  102|   459k|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|   459k|  }
_ZNK4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEEcvbEv:
  182|    877|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEEdeEv:
  187|    645|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEE10getPointerEv:
  175|    645|  T *getPointer() {
  176|    645|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    645|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_11HiddenClassEEELb0EED2Ev:
   92|  1.10k|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_11HiddenClassEEELb0EE5resetEv:
   94|  1.10k|  void reset() {
   95|  1.10k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 645, False: 464]
  ------------------
   96|    645|      (*getPointer()).~T();
   97|    645|      hasVal = false;
   98|    645|    }
   99|  1.10k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_11HiddenClassEEELb0EE10getPointerEv:
  101|    645|  T *getPointer() {
  102|    645|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|    645|  }
_ZNK4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEcvbEv:
  182|   905k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEEdeEv:
  187|   603k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm6HandleINS4_11HiddenClassEEEjEEE10getPointerEv:
  175|   603k|  T *getPointer() {
  176|   603k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   603k|  }
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm6HandleINS5_11HiddenClassEEEjEELb0EED2Ev:
   92|   302k|  ~OptionalStorage() { reset(); }
_ZNK4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEcvbEv:
  182|  3.70k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEdeEv:
  187|  2.94k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEE10getPointerEv:
  175|  2.94k|  T *getPointer() {
  176|  2.94k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  2.94k|  }
_ZN4llvh8OptionalINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS4_13PropertyFlagsEEEEC2EOS8_:
  143|    756|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIN6hermes2vm8JSObject20PropertyUpdateStatusENS5_13PropertyFlagsEEELb1EEC2ERKS9_:
  119|    756|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEC2EOS3_:
  143|  11.4k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex11SyntaxFlagsELb1EEC2ERKS4_:
  119|  11.4k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEEaSEOS8_:
  150|   808k|  Optional &operator=(Optional &&O) = default;
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EEaSEOS9_:
   61|   808k|  OptionalStorage &operator=(OptionalStorage &&O) {
   62|   808k|    if (!O.hasVal)
  ------------------
  |  Branch (62:9): [True: 0, False: 808k]
  ------------------
   63|      0|      reset();
   64|   808k|    else {
   65|   808k|      *this = std::move(*O.getPointer());
   66|   808k|    }
   67|   808k|    return *this;
   68|   808k|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EE5resetEv:
   94|  1.61M|  void reset() {
   95|  1.61M|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 1.61M, False: 0]
  ------------------
   96|  1.61M|      (*getPointer()).~T();
   97|  1.61M|      hasVal = false;
   98|  1.61M|    }
   99|  1.61M|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EE10getPointerEv:
  101|  3.63M|  T *getPointer() {
  102|  3.63M|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|  3.63M|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EEaSEOS8_:
   52|   808k|  OptionalStorage &operator=(T &&y) {
   53|   808k|    if (hasVal)
  ------------------
  |  Branch (53:9): [True: 808k, False: 0]
  ------------------
   54|   808k|      *getPointer() = std::move(y);
   55|      0|    else {
   56|      0|      new (storage.buffer) T(std::move(y));
   57|      0|      hasVal = true;
   58|      0|    }
   59|   808k|    return *this;
   60|   808k|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EED2Ev:
   92|  1.61M|  ~OptionalStorage() { reset(); }
_ZN4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEEC2EOS8_:
  144|   404k|  Optional(Optional &&O) = default;
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EEC2EOS9_:
   46|   404k|  OptionalStorage(OptionalStorage &&O) : hasVal(O.hasVal) {
   47|   404k|    if (O.hasVal) {
  ------------------
  |  Branch (47:9): [True: 404k, False: 0]
  ------------------
   48|   404k|      new (storage.buffer) T(std::move(*O.getPointer()));
   49|   404k|    }
   50|   404k|  }
_ZNK4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEcvbEv:
  182|  11.4k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5regex11SyntaxFlagsEE10getPointerEv:
  175|  11.4k|  T *getPointer() {
  176|  11.4k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  11.4k|  }
_ZNR4llvh8OptionalIN6hermes5regex11SyntaxFlagsEEdeEv:
  187|  11.4k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEEC2EOS7_:
  143|  1.21M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallVectorIN6hermes8OptValueINS3_2vm16RegExpMatchRangeEEELj4EEELb0EEC2EOS8_:
   43|  1.21M|  OptionalStorage(T &&y) : hasVal(true) {
   44|  1.21M|    new (storage.buffer) T(std::forward<T>(y));
   45|  1.21M|  }
_ZNK4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEEcvbEv:
  182|  1.21M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEEdeEv:
  187|  1.21M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINS_11SmallVectorIN6hermes8OptValueINS2_2vm16RegExpMatchRangeEEELj4EEEE10getPointerEv:
  175|  1.21M|  T *getPointer() {
  176|  1.21M|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.21M|  }
_ZN4llvh8OptionalIN6hermes2vm13StringBuilderEEC2EOS3_:
  143|   459k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EEC2EOS4_:
   43|   459k|  OptionalStorage(T &&y) : hasVal(true) {
   44|   459k|    new (storage.buffer) T(std::forward<T>(y));
   45|   459k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm13StringBuilderELb0EED2Ev:
   92|   459k|  ~OptionalStorage() { reset(); }
_ZNK4llvh8OptionalIN6hermes2vm13StringBuilderEEcvbEv:
  182|  1.81M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes2vm13StringBuilderEEdeEv:
  187|  1.35M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes2vm13StringBuilderEE10getPointerEv:
  175|  1.35M|  T *getPointer() {
  176|  1.35M|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  1.35M|  }
_ZN4llvh8OptionalIPKN6hermes4inst4InstEEC2EOS5_:
  143|     99|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPKN6hermes4inst4InstELb1EEC2ERKS6_:
  119|     99|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEEC2ENS_8NoneTypeE:
  138|    464|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_11HiddenClassEEELb0EEC2Ev:
   36|    464|  OptionalStorage() = default;
_ZN4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEEC2EOS5_:
  143|    645|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm6HandleINS3_11HiddenClassEEELb0EEC2EOS6_:
   43|    645|  OptionalStorage(T &&y) : hasVal(true) {
   44|    645|    new (storage.buffer) T(std::forward<T>(y));
   45|    645|  }
_ZNK4llvh8OptionalIN6hermes2vm6HandleINS2_11HiddenClassEEEE8hasValueEv:
  183|    232|  bool hasValue() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes2vm17MockedEnvironmentEEC2Ev:
  137|     99|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm17MockedEnvironmentELb0EEC2Ev:
   36|     99|  OptionalStorage() = default;
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm17MockedEnvironmentELb0EED2Ev:
   92|     99|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes2vm17MockedEnvironmentELb0EE5resetEv:
   94|     99|  void reset() {
   95|     99|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 99]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|     99|  }
_ZN4llvh8OptionalINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEEEC2EOS7_:
  143|   228k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__14pairIPN6hermes2vm23NamedPropertyDescriptorEbEELb1EEC2ERKS8_:
  119|   228k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIiEC2EOi:
  143|  1.16M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIiLb1EEC2ERKi:
  119|  1.16M|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalINS_9StringRefEEcvbEv:
  182|   229k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIhEC2ENS_8NoneTypeE:
  138|    211|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIhLb1EEC2Ev:
  117|    211|  OptionalStorage() = default;
_ZN4llvh8OptionalIhEC2EOh:
  143|    496|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIhLb1EEC2ERKh:
  119|    496|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIiEC2ENS_8NoneTypeE:
  138|   114k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIiLb1EEC2Ev:
  117|   114k|  OptionalStorage() = default;
_ZN4llvh8OptionalINSt3__16threadEEC2Ev:
  137|    198|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageINSt3__16threadELb0EEC2Ev:
   36|    198|  OptionalStorage() = default;
_ZNK4llvh8OptionalINSt3__16threadEEcvbEv:
  182|    198|  explicit operator bool() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIbE8hasValueEv:
  183|     99|  bool hasValue() const { return Storage.hasVal; }
_ZNK4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEcvbEv:
  182|    427|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE8getValueEv:
  180|    440|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE10getPointerEv:
  175|    505|  T *getPointer() {
  176|    505|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    505|  }
_ZNR4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEdeEv:
  187|     65|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIbEcvbEv:
  182|  6.14k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EED2Ev:
   92|     14|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EE5resetEv:
   94|     14|  void reset() {
   95|     14|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 14, False: 0]
  ------------------
   96|     14|      (*getPointer()).~T();
   97|     14|      hasVal = false;
   98|     14|    }
   99|     14|  }
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EE10getPointerEv:
  101|     14|  T *getPointer() {
  102|     14|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|     14|  }
_ZNK4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEcvbEv:
  182|     14|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEdeEv:
  187|     12|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEE10getPointerEv:
  175|     12|  T *getPointer() {
  176|     12|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|     12|  }
_ZN4llvh8OptionalINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEEEC2EOS5_:
  143|     14|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageINS_11SmallPtrSetIPN6hermes10BasicBlockELj4EEELb0EEC2EOS6_:
   43|     14|  OptionalStorage(T &&y) : hasVal(true) {
   44|     14|    new (storage.buffer) T(std::forward<T>(y));
   45|     14|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree4NodeEEcvbEv:
  182|  28.5M|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree4NodeEEdeEv:
  187|  5.37M|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEE10getPointerEv:
  175|  31.5M|  T *getPointer() {
  176|  31.5M|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  31.5M|  }
_ZNR4llvh8OptionalIPN6hermes6ESTree4NodeEE8getValueEv:
  180|  26.1M|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes5irgen15FunctionContextEEC2Ev:
  137|     56|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EEC2Ev:
   36|     56|  OptionalStorage() = default;
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EED2Ev:
   92|     56|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen15FunctionContextELb0EE5resetEv:
   94|     56|  void reset() {
   95|     56|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 0, False: 56]
  ------------------
   96|      0|      (*getPointer()).~T();
   97|      0|      hasVal = false;
   98|      0|    }
   99|     56|  }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEC2Ev:
  137|     12|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EEC2Ev:
  117|     12|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes5irgen15FunctionContextEE8hasValueEv:
  183|     56|  bool hasValue() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEptEv:
  185|     18|  T *operator->() { return getPointer(); }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEE10getPointerEv:
  175|     18|  T *getPointer() {
  176|     18|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|     18|  }
_ZNK4llvh8OptionalIN6hermes5irgen10LReferenceEEcvbEv:
  182|     24|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEE5resetEv:
  169|      6|  void reset() { Storage.reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EE5resetEv:
  126|      6|  void reset() { hasVal = false; }
_ZN4llvh8OptionalIN6hermes5irgen10LReferenceEEaSEOS3_:
  146|      6|  Optional &operator=(T &&y) {
  147|      6|    Storage = std::move(y);
  148|      6|    return *this;
  149|      6|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5irgen10LReferenceELb1EEaSERKS4_:
  120|      6|  OptionalStorage &operator=(const T &y) {
  121|      6|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|      6|    hasVal = true;
  123|      6|    return *this;
  124|      6|  }
_ZN4llvh8OptionalINS_9StringRefEEC2ENS_8NoneTypeE:
  138|   229k|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageINS_9StringRefELb1EEC2Ev:
  117|   229k|  OptionalStorage() = default;
_ZNR4llvh8OptionalIiEdeEv:
  187|    112|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvheqIiEEbRKNS_8OptionalIT_EERKS2_:
  296|     56|template <typename T> bool operator==(const Optional<T> &X, const T &Y) {
  297|     56|  return X && *X == Y;
  ------------------
  |  Branch (297:10): [True: 56, False: 0]
  |  Branch (297:15): [True: 56, False: 0]
  ------------------
  298|     56|}
_ZNKR4llvh8OptionalIiEdeEv:
  186|     56|  const T &operator*() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIiE10getPointerEv:
  171|     56|  const T *getPointer() const {
  172|     56|    assert(Storage.hasVal);
  173|      0|    return reinterpret_cast<const T *>(Storage.storage.buffer);
  174|     56|  }
_ZN4llvh8OptionalImEC2EOm:
  143|    688|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageImLb1EEC2ERKm:
  119|    688|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalImEC2ENS_8NoneTypeE:
  138|      7|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageImLb1EEC2Ev:
  117|      7|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2ENS_8NoneTypeE:
  138|     54|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree11ProgramNodeELb1EEC2Ev:
  117|     54|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEC2ENS_8NoneTypeE:
  138|      2|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree23FunctionDeclarationNodeELb1EEC2Ev:
  117|      2|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEC2ENS_8NoneTypeE:
  138|      2|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree16FunctionLikeNodeELb1EEC2Ev:
  117|      2|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2ENS_8NoneTypeE:
  138|  2.58M|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEC2Ev:
  117|  2.58M|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEC2ENS_8NoneTypeE:
  138|     33|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18BlockStatementNodeELb1EEC2Ev:
  117|     33|  OptionalStorage() = default;
_ZN4llvh8OptionalIPKcEC2ENS_8NoneTypeE:
  138|    438|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPKcLb1EEC2Ev:
  117|    438|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEC2ENS_8NoneTypeE:
  138|      8|  constexpr Optional(NoneType) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree19ArrayExpressionNodeELb1EEC2Ev:
  117|      8|  OptionalStorage() = default;
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2ERKS4_:
  140|    229|  Optional(const T &y) : Storage(y) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree11ProgramNodeELb1EEC2ERKS5_:
  119|    472|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIbEC2ENS_8NoneTypeE:
  138|     39|  constexpr Optional(NoneType) {}
_ZN4llvh8OptionalIbEC2EOb:
  143|  6.05k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIbLb1EEC2ERKb:
  119|  6.05k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEEC2EOS4_:
  143|    243|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZNK4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEcvbEv:
  182|  4.91k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEdeEv:
  187|  4.91k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEE10getPointerEv:
  175|  4.91k|  T *getPointer() {
  176|  4.91k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  4.91k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEC2EOS4_:
  143|  4.91k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree23FunctionDeclarationNodeELb1EEC2ERKS5_:
  119|  4.91k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEcvbEv:
  182|  14.4k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEdeEv:
  187|  9.52k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEE10getPointerEv:
  175|  9.52k|  T *getPointer() {
  176|  9.52k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  9.52k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEcvbEv:
  182|  10.7k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEE8getValueEv:
  180|  6.48k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEE10getPointerEv:
  175|  8.03k|  T *getPointer() {
  176|  8.03k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  8.03k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree16FunctionLikeNodeEEC2EOS4_:
  143|  4.91k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree16FunctionLikeNodeELb1EEC2ERKS5_:
  119|  4.91k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2EOS4_:
  143|  17.9M|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEC2ERKS5_:
  119|  28.5M|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEEcvbEv:
  182|  3.06k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEE8getValueEv:
  180|  3.06k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEE10getPointerEv:
  175|  3.06k|  T *getPointer() {
  176|  3.06k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  3.06k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEEcvbEv:
  182|   263k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEE8getValueEv:
  180|   263k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEE10getPointerEv:
  175|   263k|  T *getPointer() {
  176|   263k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   263k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree18WhileStatementNodeEEcvbEv:
  182|      3|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree18WhileStatementNodeEE8getValueEv:
  180|      3|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree18WhileStatementNodeEE10getPointerEv:
  175|      3|  T *getPointer() {
  176|      3|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|      3|  }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEC2ERKS4_:
  140|  10.5M|  Optional(const T &y) : Storage(y) {}
_ZNK4llvh8OptionalIPN6hermes6ESTree21ContinueStatementNodeEEcvbEv:
  182|      7|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree21ContinueStatementNodeEE8getValueEv:
  180|      7|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree21ContinueStatementNodeEE10getPointerEv:
  175|      7|  T *getPointer() {
  176|      7|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|      7|  }
_ZN4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEC2EOS4_:
  143|  6.48k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18BlockStatementNodeELb1EEC2ERKS5_:
  119|  6.48k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNR4llvh8OptionalIPN6hermes6ESTree18BlockStatementNodeEEdeEv:
  187|  1.55k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEcvbEv:
  182|  4.91k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEEdeEv:
  187|  4.91k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree23FunctionDeclarationNodeEE10getPointerEv:
  175|  4.91k|  T *getPointer() {
  176|  4.91k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  4.91k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree14IdentifierNodeEEC2EOS4_:
  143|  9.52k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree14IdentifierNodeELb1EEC2ERKS5_:
  119|  9.52k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree23VariableDeclarationNodeEEC2EOS4_:
  143|  3.06k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree23VariableDeclarationNodeELb1EEC2ERKS5_:
  119|  3.06k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEEcvbEv:
  182|  3.06k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEE8getValueEv:
  180|  3.06k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEE10getPointerEv:
  175|  3.06k|  T *getPointer() {
  176|  3.06k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  3.06k|  }
_ZN4llvh8OptionalIPKcEC2EOS2_:
  143|  5.12k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPKcLb1EEC2ERKS3_:
  119|  5.12k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree22VariableDeclaratorNodeEEC2EOS4_:
  143|  3.06k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree22VariableDeclaratorNodeELb1EEC2ERKS5_:
  119|  3.06k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree18EmptyStatementNodeEEC2EOS4_:
  143|   263k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18EmptyStatementNodeELb1EEC2ERKS5_:
  119|   263k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree18WhileStatementNodeEEC2EOS4_:
  143|      3|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree18WhileStatementNodeELb1EEC2ERKS5_:
  119|      3|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree21ContinueStatementNodeEEC2EOS4_:
  143|      7|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree21ContinueStatementNodeELb1EEC2ERKS5_:
  119|      7|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEcvbEv:
  182|  67.1k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEE8getValueEv:
  180|  67.1k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEE10getPointerEv:
  175|  67.1k|  T *getPointer() {
  176|  67.1k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  67.1k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEEcvbEv:
  182|  10.2k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEE8getValueEv:
  180|  10.2k|  T &getValue() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEE10getPointerEv:
  175|  10.2k|  T *getPointer() {
  176|  10.2k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  10.2k|  }
_ZN4llvh8OptionalIPN6hermes6ESTree19ArrayExpressionNodeEEC2EOS4_:
  143|  67.1k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree19ArrayExpressionNodeELb1EEC2ERKS5_:
  119|  67.1k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree20ObjectExpressionNodeEEC2EOS4_:
  143|  10.2k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree20ObjectExpressionNodeELb1EEC2ERKS5_:
  119|  10.2k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZN4llvh8OptionalIPN6hermes6ESTree4NodeEEaSEOS4_:
  146|  9.19k|  Optional &operator=(T &&y) {
  147|  9.19k|    Storage = std::move(y);
  148|  9.19k|    return *this;
  149|  9.19k|  }
_ZN4llvh15optional_detail15OptionalStorageIPN6hermes6ESTree4NodeELb1EEaSERKS5_:
  120|  9.19k|  OptionalStorage &operator=(const T &y) {
  121|  9.19k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  9.19k|    hasVal = true;
  123|  9.19k|    return *this;
  124|  9.19k|  }
_ZNK4llvh8OptionalIPN6hermes6ESTree11ProgramNodeEE8hasValueEv:
  183|     99|  bool hasValue() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEEC2Ev:
  137|  1.32M|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes6parser9TokenKindELb1EEC2Ev:
  117|  1.32M|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes6parser9TokenKindEEcvbEv:
  182|  59.5M|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEEaSEOS3_:
  146|  12.1k|  Optional &operator=(T &&y) {
  147|  12.1k|    Storage = std::move(y);
  148|  12.1k|    return *this;
  149|  12.1k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes6parser9TokenKindELb1EEaSERKS4_:
  120|  12.1k|  OptionalStorage &operator=(const T &y) {
  121|  12.1k|    *reinterpret_cast<T *>(storage.buffer) = y;
  122|  12.1k|    hasVal = true;
  123|  12.1k|    return *this;
  124|  12.1k|  }
_ZNR4llvh8OptionalIN6hermes6parser9TokenKindEEdeEv:
  187|  12.1k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes6parser9TokenKindEE10getPointerEv:
  175|  12.1k|  T *getPointer() {
  176|  12.1k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  12.1k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EED2Ev:
   92|  11.4k|  ~OptionalStorage() { reset(); }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EE5resetEv:
   94|  11.4k|  void reset() {
   95|  11.4k|    if (hasVal) {
  ------------------
  |  Branch (95:9): [True: 11.4k, False: 0]
  ------------------
   96|  11.4k|      (*getPointer()).~T();
   97|  11.4k|      hasVal = false;
   98|  11.4k|    }
   99|  11.4k|  }
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EE10getPointerEv:
  101|  11.4k|  T *getPointer() {
  102|  11.4k|    assert(hasVal);
  103|      0|    return reinterpret_cast<T *>(storage.buffer);
  104|  11.4k|  }
_ZNK4llvh8OptionalIN6hermes14CompiledRegExpEEcvbEv:
  182|  11.4k|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes14CompiledRegExpEEdeEv:
  187|  11.4k|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes14CompiledRegExpEE10getPointerEv:
  175|  11.4k|  T *getPointer() {
  176|  11.4k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|  11.4k|  }
_ZN4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEC2EOSA_:
  143|    302|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex6ParserINS3_5RegexINS3_16UTF16RegexTraitsEEEPKDsE9ClassAtomELb1EEC2ERKSB_:
  119|    302|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEcvbEv:
  182|    302|  explicit operator bool() const { return Storage.hasVal; }
_ZNR4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEEdeEv:
  187|    302|  T &operator*() LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZN4llvh8OptionalIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE9ClassAtomEE10getPointerEv:
  175|    302|  T *getPointer() {
  176|    302|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|    302|  }
_ZN4llvh8OptionalIN6hermes5regex14CharacterClassEEC2Ev:
  137|    302|  constexpr Optional() {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes5regex14CharacterClassELb1EEC2Ev:
  117|    302|  OptionalStorage() = default;
_ZNK4llvh8OptionalIN6hermes5regex14CharacterClassEEcvbEv:
  182|    302|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes14CompiledRegExpEEC2EOS2_:
  143|  11.4k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes14CompiledRegExpELb0EEC2EOS3_:
   43|  11.4k|  OptionalStorage(T &&y) : hasVal(true) {
   44|  11.4k|    new (storage.buffer) T(std::forward<T>(y));
   45|  11.4k|  }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEC2EOS3_:
  143|  35.2k|  Optional(T &&y) : Storage(std::forward<T>(y)) {}
_ZN4llvh15optional_detail15OptionalStorageIN6hermes18SourceErrorManager9LineCoordELb1EEC2ERKS4_:
  119|  35.2k|  OptionalStorage(const T &y) : hasVal(true) { new (storage.buffer) T(y); }
_ZNK4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEcvbEv:
  182|  35.2k|  explicit operator bool() const { return Storage.hasVal; }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEEptEv:
  185|   141k|  T *operator->() { return getPointer(); }
_ZN4llvh8OptionalIN6hermes18SourceErrorManager9LineCoordEE10getPointerEv:
  175|   141k|  T *getPointer() {
  176|   141k|    assert(Storage.hasVal);
  177|      0|    return reinterpret_cast<T *>(Storage.storage.buffer);
  178|   141k|  }
_ZNKR4llvh8OptionalImE10getValueOrIjEEmOT_:
  190|    695|  constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION {
  191|    695|    return hasValue() ? getValue() : std::forward<U>(value);
  ------------------
  |  Branch (191:12): [True: 688, False: 7]
  ------------------
  192|    695|  }
_ZNK4llvh8OptionalImE8hasValueEv:
  183|    695|  bool hasValue() const { return Storage.hasVal; }
_ZNKR4llvh8OptionalImE8getValueEv:
  179|    688|  const T &getValue() const LLVM_LVALUE_FUNCTION { return *getPointer(); }
_ZNK4llvh8OptionalImE10getPointerEv:
  171|    688|  const T *getPointer() const {
  172|    688|    assert(Storage.hasVal);
  173|      0|    return reinterpret_cast<const T *>(Storage.storage.buffer);
  174|    688|  }

_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEENS_18PointerIntPairInfoIS1_Lj1ESL_EEEC2Ev:
   48|    198|  constexpr PointerIntPair() = default;
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEENS_18PointerIntPairInfoIS1_Lj1ESL_EEE15initWithPointerES1_:
   68|    396|  void initWithPointer(PointerTy PtrVal) {
   69|    396|    Value = Info::updatePointer(0, PtrVal);
   70|    396|  }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEEE13updatePointerElS1_:
  159|    495|  static intptr_t updatePointer(intptr_t OrigValue, PointerT Ptr) {
  160|    495|    intptr_t PtrWord =
  161|    495|        reinterpret_cast<intptr_t>(PtrTraits::getAsVoidPointer(Ptr));
  162|    495|    assert((PtrWord & ~PointerBitMask) == 0 &&
  163|    495|           "Pointer is not sufficiently aligned");
  164|       |    // Preserve all low bits, just update the pointer.
  165|      0|    return PtrWord | (OrigValue & ~PointerBitMask);
  166|    495|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIhNS3_9allocatorIhEEEEPNS4_ItNS5_ItEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEEC2Ev:
   48|   282k|  constexpr PointerIntPair() = default;
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIhNS3_9allocatorIhEEEEPNS4_ItNS5_ItEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE18getFromOpaqueValueES1_:
   94|   141k|  static PointerIntPair getFromOpaqueValue(void *V) {
   95|   141k|    PointerIntPair P;
   96|   141k|    P.setFromOpaqueValue(V);
   97|   141k|    return P;
   98|   141k|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIhNS3_9allocatorIhEEEEPNS4_ItNS5_ItEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE18setFromOpaqueValueES1_:
   90|   141k|  void setFromOpaqueValue(void *Val) {
   91|   141k|    Value = reinterpret_cast<intptr_t>(Val);
   92|   141k|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEENS_18PointerIntPairInfoIS1_Lj1ESL_EEE10getPointerEv:
   56|   422k|  PointerTy getPointer() const { return Info::getPointer(Value); }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEEE10getPointerEl:
  150|   422k|  static PointerT getPointer(intptr_t Value) {
  151|   422k|    return PtrTraits::getFromVoidPointer(
  152|   422k|        reinterpret_cast<void *>(Value & PointerBitMask));
  153|   422k|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIhNS3_9allocatorIhEEEEPNS4_ItNS5_ItEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE10getPointerEv:
   56|   141k|  PointerTy getPointer() const { return Info::getPointer(Value); }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsIPNSt3__16vectorIhNS3_9allocatorIhEEEEPNS4_ItNS5_ItEEEEEEE10getPointerEl:
  150|   141k|  static PointerT getPointer(intptr_t Value) {
  151|   141k|    return PtrTraits::getFromVoidPointer(
  152|   141k|        reinterpret_cast<void *>(Value & PointerBitMask));
  153|   141k|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEENS_18PointerIntPairInfoIS1_Lj1ESL_EEE6getIntEv:
   58|   422k|  IntType getInt() const { return (IntType)Info::getInt(Value); }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEEE6getIntEl:
  155|   422k|  static intptr_t getInt(intptr_t Value) {
  156|   422k|    return (Value >> IntShift) & IntMask;
  157|   422k|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEEC2Ev:
   48|   562k|  constexpr PointerIntPair() = default;
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE18getFromOpaqueValueES1_:
   94|   281k|  static PointerIntPair getFromOpaqueValue(void *V) {
   95|   281k|    PointerIntPair P;
   96|   281k|    P.setFromOpaqueValue(V);
   97|   281k|    return P;
   98|   281k|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE18setFromOpaqueValueES1_:
   90|   281k|  void setFromOpaqueValue(void *Val) {
   91|   281k|    Value = reinterpret_cast<intptr_t>(Val);
   92|   281k|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE6getIntEv:
   58|   281k|  IntType getInt() const { return (IntType)Info::getInt(Value); }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEEE6getIntEl:
  155|   281k|  static intptr_t getInt(intptr_t Value) {
  156|   281k|    return (Value >> IntShift) & IntMask;
  157|   281k|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE10getPointerEv:
   56|   140k|  PointerTy getPointer() const { return Info::getPointer(Value); }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEEE10getPointerEl:
  150|   140k|  static PointerT getPointer(intptr_t Value) {
  151|   140k|    return PtrTraits::getFromVoidPointer(
  152|   140k|        reinterpret_cast<void *>(Value & PointerBitMask));
  153|   140k|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEEC2ES1_:
   54|     99|  explicit PointerIntPair(PointerTy PtrVal) { initWithPointer(PtrVal); }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE15initWithPointerES1_:
   68|     99|  void initWithPointer(PointerTy PtrVal) {
   69|     99|    Value = Info::updatePointer(0, PtrVal);
   70|     99|  }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEEE13updatePointerElS1_:
  159|     99|  static intptr_t updatePointer(intptr_t OrigValue, PointerT Ptr) {
  160|     99|    intptr_t PtrWord =
  161|     99|        reinterpret_cast<intptr_t>(PtrTraits::getAsVoidPointer(Ptr));
  162|     99|    assert((PtrWord & ~PointerBitMask) == 0 &&
  163|     99|           "Pointer is not sufficiently aligned");
  164|       |    // Preserve all low bits, just update the pointer.
  165|      0|    return PtrWord | (OrigValue & ~PointerBitMask);
  166|     99|  }
_ZN4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEENS_18PointerIntPairInfoIS1_Lj1ESL_EEE16setPointerAndIntES1_b:
   72|     99|  void setPointerAndInt(PointerTy PtrVal, IntType IntVal) {
   73|     99|    Value = Info::updateInt(Info::updatePointer(0, PtrVal),
   74|     99|                            static_cast<intptr_t>(IntVal));
   75|     99|  }
_ZN4llvh18PointerIntPairInfoIPvLj1ENS_22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS4_9allocatorIhEEEEPNS5_ItNS6_ItEEEEEENS3_IPNS5_IjNS6_IjEEEEPNS5_ImNS6_ImEEEEEEEEE9updateIntEll:
  168|     99|  static intptr_t updateInt(intptr_t OrigValue, intptr_t Int) {
  169|     99|    intptr_t IntWord = static_cast<intptr_t>(Int);
  170|     99|    assert((IntWord & ~IntMask) == 0 && "Integer too large for field");
  171|       |
  172|       |    // Preserve all bits other than the ones we are updating.
  173|      0|    return (OrigValue & ~ShiftedIntMask) | IntWord << IntShift;
  174|     99|  }
_ZNK4llvh14PointerIntPairIPvLj1EbNS_22PointerUnionUIntTraitsIPNSt3__16vectorIjNS3_9allocatorIjEEEEPNS4_ImNS5_ImEEEEEENS_18PointerIntPairInfoIS1_Lj1ESC_EEE14getOpaqueValueEv:
   88|     99|  void *getOpaqueValue() const { return reinterpret_cast<void *>(Value); }

_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEC2Ev:
  368|    198|  PointerUnion4() = default;
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEC2Ev:
  104|    198|  PointerUnion() = default;
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSEDn:
  411|    396|  const PointerUnion4 &operator=(std::nullptr_t) {
  412|    396|    Val = nullptr;
  413|    396|    return *this;
  414|    396|  }
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEaSEDn:
  166|    396|  const PointerUnion &operator=(std::nullptr_t) {
  167|    396|    Val.initWithPointer(nullptr);
  168|    396|    return *this;
  169|    396|  }
_ZN4llvh22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEENS1_IPNS3_IjNS4_IjEEEEPNS3_ImNS4_ImEEEEEEE16getAsVoidPointerEPv:
   61|    495|  static inline void *getAsVoidPointer(void *P) { return P; }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE6isNullEv:
  376|   141k|  bool isNull() const { return Val.isNull(); }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE6isNullEv:
  114|   141k|  bool isNull() const {
  115|       |    // Convert from the void* to one of the pointer types, to make sure that
  116|       |    // we recursively strip off low bits if we have a nested PointerUnion.
  117|   141k|    return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
  118|   141k|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEEE18getFromVoidPointerEPv:
  216|   141k|  static inline PointerUnion<PT1, PT2> getFromVoidPointer(void *P) {
  217|   141k|    return PointerUnion<PT1, PT2>::getFromOpaqueValue(P);
  218|   141k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE18getFromOpaqueValueEPv:
  186|   141k|  static inline PointerUnion getFromOpaqueValue(void *VP) {
  187|   141k|    PointerUnion V;
  188|   141k|    V.Val = ValTy::getFromOpaqueValue(VP);
  189|   141k|    return V;
  190|   141k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEC2Ev:
  104|   141k|  PointerUnion() = default;
_ZN4llvh22PointerUnionUIntTraitsINS_12PointerUnionIPNSt3__16vectorIhNS2_9allocatorIhEEEEPNS3_ItNS4_ItEEEEEENS1_IPNS3_IjNS4_IjEEEEPNS3_ImNS4_ImEEEEEEE18getFromVoidPointerEPv:
   62|   422k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEcvbEv:
  120|   141k|  explicit operator bool() const { return !isNull(); }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE6isNullEv:
  114|   141k|  bool isNull() const {
  115|       |    // Convert from the void* to one of the pointer types, to make sure that
  116|       |    // we recursively strip off low bits if we have a nested PointerUnion.
  117|   141k|    return !PointerLikeTypeTraits<PT1>::getFromVoidPointer(Val.getPointer());
  118|   141k|  }
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEE18getFromVoidPointerEPv:
   62|   141k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isIS6_EEiv:
  380|     99|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|     99|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|     99|        PT1, T, InnerUnion1,
  384|     99|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|     99|                                         InnerUnion2>>::Return;
  386|     99|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 0, False: 99]
  |  Branch (386:37): [True: 0, False: 0]
  ------------------
  387|     99|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE2isISA_EEiv:
  123|    198|  template <typename T> int is() const {
  124|    198|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|    198|        PT1, T, IsPT1,
  126|    198|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|    198|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|    198|    int TyNo = Ty::Num;
  129|    198|    return static_cast<int>(Val.getInt()) == TyNo;
  130|    198|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isIS9_EEiv:
  380|     99|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|     99|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|     99|        PT1, T, InnerUnion1,
  384|     99|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|     99|                                         InnerUnion2>>::Return;
  386|     99|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 0, False: 99]
  |  Branch (386:37): [True: 0, False: 0]
  ------------------
  387|     99|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE2isISC_EEiv:
  380|   140k|  template <typename T> int is() const {
  381|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  382|   140k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  383|   140k|        PT1, T, InnerUnion1,
  384|   140k|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  385|   140k|                                         InnerUnion2>>::Return;
  386|   140k|    return Val.template is<Ty>() && Val.template get<Ty>().template is<T>();
  ------------------
  |  Branch (386:12): [True: 140k, False: 0]
  |  Branch (386:37): [True: 140k, False: 0]
  ------------------
  387|   140k|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE2isISH_EEiv:
  123|   422k|  template <typename T> int is() const {
  124|   422k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|   422k|        PT1, T, IsPT1,
  126|   422k|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|   422k|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|   422k|    int TyNo = Ty::Num;
  129|   422k|    return static_cast<int>(Val.getInt()) == TyNo;
  130|   422k|  }
_ZNK4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEE3getISH_EET_v:
  135|   281k|  template <typename T> T get() const {
  136|   281k|    assert(is<T>() && "Invalid accessor called");
  137|      0|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|   281k|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIjNS2_9allocatorIjEEEEPNS3_ImNS4_ImEEEEEEE18getFromVoidPointerEPv:
  216|   281k|  static inline PointerUnion<PT1, PT2> getFromVoidPointer(void *P) {
  217|   281k|    return PointerUnion<PT1, PT2>::getFromOpaqueValue(P);
  218|   281k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE18getFromOpaqueValueEPv:
  186|   281k|  static inline PointerUnion getFromOpaqueValue(void *VP) {
  187|   281k|    PointerUnion V;
  188|   281k|    V.Val = ValTy::getFromOpaqueValue(VP);
  189|   281k|    return V;
  190|   281k|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEEC2Ev:
  104|   281k|  PointerUnion() = default;
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE2isIS6_EEiv:
  123|   281k|  template <typename T> int is() const {
  124|   281k|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  125|   281k|        PT1, T, IsPT1,
  126|   281k|        ::llvh::PointerUnionTypeSelector<PT2, T, IsPT2,
  127|   281k|                                         UNION_DOESNT_CONTAIN_TYPE<T>>>::Return;
  128|   281k|    int TyNo = Ty::Num;
  129|   281k|    return static_cast<int>(Val.getInt()) == TyNo;
  130|   281k|  }
_ZNK4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEE3getISC_EET_v:
  392|   140k|  template <typename T> T get() const {
  393|   140k|    assert(is<T>() && "Invalid accessor called");
  394|       |    // If T is PT1/PT2 choose InnerUnion1 otherwise choose InnerUnion2.
  395|      0|    using Ty = typename ::llvh::PointerUnionTypeSelector<
  396|   140k|        PT1, T, InnerUnion1,
  397|   140k|        ::llvh::PointerUnionTypeSelector<PT2, T, InnerUnion1,
  398|   140k|                                         InnerUnion2>>::Return;
  399|   140k|    return Val.template get<Ty>().template get<T>();
  400|   140k|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE3getIS6_EET_v:
  135|   140k|  template <typename T> T get() const {
  136|   140k|    assert(is<T>() && "Invalid accessor called");
  137|      0|    return PointerLikeTypeTraits<T>::getFromVoidPointer(Val.getPointer());
  138|   140k|  }
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE18getFromVoidPointerEPv:
   62|   140k|  static inline void *getFromVoidPointer(void *P) { return P; }
_ZN4llvh13PointerUnion4IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEaSERKSC_:
  426|     99|  const PointerUnion4 &operator=(const PT3 &RHS) {
  427|     99|    Val = InnerUnion2(RHS);
  428|     99|    return *this;
  429|     99|  }
_ZN4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEEC2ES6_:
  107|     99|            PointerLikeTypeTraits<PT1>::getAsVoidPointer(V))) {}
_ZN4llvh22PointerUnionUIntTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE16getAsVoidPointerEPv:
   61|     99|  static inline void *getAsVoidPointer(void *P) { return P; }
_ZN4llvh12PointerUnionINS0_IPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_ItNS3_ItEEEEEENS0_IPNS2_IjNS3_IjEEEEPNS2_ImNS3_ImEEEEEEEaSERKSH_:
  178|     99|  const PointerUnion &operator=(const PT2 &RHS) {
  179|     99|    Val.setPointerAndInt(
  180|     99|        const_cast<void *>(PointerLikeTypeTraits<PT2>::getAsVoidPointer(RHS)),
  181|     99|        1);
  182|     99|    return *this;
  183|     99|  }
_ZN4llvh21PointerLikeTypeTraitsINS_12PointerUnionIPNSt3__16vectorIjNS2_9allocatorIjEEEEPNS3_ImNS4_ImEEEEEEE16getAsVoidPointerERKSB_:
  212|     99|  static inline void *getAsVoidPointer(const PointerUnion<PT1, PT2> &P) {
  213|     99|    return P.getOpaqueValue();
  214|     99|  }
_ZNK4llvh12PointerUnionIPNSt3__16vectorIjNS1_9allocatorIjEEEEPNS2_ImNS3_ImEEEEE14getOpaqueValueEv:
  185|     99|  void *getOpaqueValue() const { return Val.getOpaqueValue(); }

_ZN4llvh11find_if_notIRKNS_8ArrayRefIjEEPFbjEEEDTcl9adl_beginfp_EEOT_T0_:
 1075|  11.2k|auto find_if_not(R &&Range, UnaryPredicate P) -> decltype(adl_begin(Range)) {
 1076|  11.2k|  return std::find_if_not(adl_begin(Range), adl_end(Range), P);
 1077|  11.2k|}
_ZN4llvh9adl_beginIRKNS_8ArrayRefIjEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS5_:
  182|  22.4k|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|  22.4k|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|  22.4k|}
_ZN4llvh10adl_detail9adl_beginIRKNS_8ArrayRefIjEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS6_:
  158|  22.4k|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|  22.4k|  return begin(std::forward<ContainerTy>(container));
  160|  22.4k|}
_ZN4llvh7adl_endIRKNS_8ArrayRefIjEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS5_:
  188|  22.4k|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|  22.4k|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|  22.4k|}
_ZN4llvh10adl_detail7adl_endIRKNS_8ArrayRefIjEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS6_:
  166|  22.4k|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|  22.4k|  return end(std::forward<ContainerTy>(container));
  168|  22.4k|}
_ZN4llvh7find_ifIRKNS_8ArrayRefIjEEPFbjEEEDTcl9adl_beginfp_EEOT_T0_:
 1070|  11.2k|auto find_if(R &&Range, UnaryPredicate P) -> decltype(adl_begin(Range)) {
 1071|  11.2k|  return std::find_if(adl_begin(Range), adl_end(Range), P);
 1072|  11.2k|}
_ZN4llvh4findIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEES6_EEDTcl9adl_beginfp_EEOT_RKT0_:
 1063|    153|auto find(R &&Range, const T &Val) -> decltype(adl_begin(Range)) {
 1064|    153|  return std::find(adl_begin(Range), adl_end(Range), Val);
 1065|    153|}
_ZN4llvh9adl_beginIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOSB_:
  182|    153|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|    153|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|    153|}
_ZN4llvh10adl_detail9adl_beginIRNSt3__16vectorIPN6hermes2vm8JSObjectENS2_9allocatorIS7_EEEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOSC_:
  158|    153|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|    153|  return begin(std::forward<ContainerTy>(container));
  160|    153|}
_ZN4llvh7adl_endIRNSt3__16vectorIPN6hermes2vm8JSObjectENS1_9allocatorIS6_EEEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOSB_:
  188|    153|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|    153|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|    153|}
_ZN4llvh10adl_detail7adl_endIRNSt3__16vectorIPN6hermes2vm8JSObjectENS2_9allocatorIS7_EEEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOSC_:
  166|    153|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|    153|  return end(std::forward<ContainerTy>(container));
  168|    153|}
_ZN4llvh7reverseINS_14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS3_10BasicBlockEEEEEEEDTcl10make_rangeclsr4llvhE21make_reverse_iteratorclsr3stdE3endfp_EEclsr4llvhE21make_reverse_iteratorclsr3stdE5beginfp_EEEEOT_PNSt3__19enable_ifIXntsr10has_rbeginIS9_EE5valueEvE4typeE:
  271|    160|                           llvh::make_reverse_iterator(std::begin(C)))) {
  272|    160|  return make_range(llvh::make_reverse_iterator(std::end(C)),
  273|    160|                    llvh::make_reverse_iterator(std::begin(C)));
  274|    160|}
_ZN4llvh21make_reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEENSt3__116reverse_iteratorIT_EES8_:
  259|    320|std::reverse_iterator<IteratorTy> make_reverse_iterator(IteratorTy It) {
  260|    320|  return std::reverse_iterator<IteratorTy>(It);
  261|    320|}
_ZN4llvh11make_uniqueINS_15DomTreeNodeBaseIN6hermes10BasicBlockEEEJRPS3_RPS4_EEENSt3__19enable_ifIXntsr3std8is_arrayIT_EE5valueENS9_10unique_ptrISB_NS9_14default_deleteISB_EEEEE4typeEDpOT0_:
 1205|    158|make_unique(Args &&... args) {
 1206|    158|  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 1207|    158|}
_ZN4llvh11make_uniqueINS_15DomTreeNodeBaseIN6hermes10BasicBlockEEEJRPS3_DnEEENSt3__19enable_ifIXntsr3std8is_arrayIT_EE5valueENS7_10unique_ptrIS9_NS7_14default_deleteIS9_EEEEE4typeEDpOT0_:
 1205|      2|make_unique(Args &&... args) {
 1206|      2|  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
 1207|      2|}
_ZN4llvh14array_lengthofIcLm128EEEmRAT0__T_:
  900|    695|constexpr inline size_t array_lengthof(T (&)[N]) {
  901|    695|  return N;
  902|    695|}
_ZN4llvh4sortIRNS_11SmallVectorINS_7SMFixItELj4EEEEEvOT_:
  980|    248|template <typename Container> inline void sort(Container &&C) {
  981|    248|  llvh::sort(adl_begin(C), adl_end(C));
  982|    248|}
_ZN4llvh4sortIPNS_7SMFixItEEEvT_S3_:
  972|    248|inline void sort(IteratorTy Start, IteratorTy End) {
  973|       |#ifdef EXPENSIVE_CHECKS
  974|       |  std::mt19937 Generator(std::random_device{}());
  975|       |  std::shuffle(Start, End, Generator);
  976|       |#endif
  977|    248|  std::sort(Start, End);
  978|    248|}
_ZN4llvh9adl_beginIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS5_:
  182|    248|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|    248|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|    248|}
_ZN4llvh10adl_detail9adl_beginIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS6_:
  158|    248|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|    248|  return begin(std::forward<ContainerTy>(container));
  160|    248|}
_ZN4llvh7adl_endIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS5_:
  188|    248|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|    248|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|    248|}
_ZN4llvh10adl_detail7adl_endIRNS_11SmallVectorINS_7SMFixItELj4EEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS6_:
  166|    248|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|    248|  return end(std::forward<ContainerTy>(container));
  168|    248|}
CommandLine.cpp:_ZN4llvh8count_ifIRNS_11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEEZN12_GLOBAL__N_117CommandLineParser16registerCategoryES4_EUlPKS3_E_EENSt3__115iterator_traitsIDTcl9adl_beginfp_EEE15difference_typeEOT_T0_:
 1117|      4|    typename std::iterator_traits<decltype(adl_begin(Range))>::difference_type {
 1118|      4|  return std::count_if(adl_begin(Range), adl_end(Range), P);
 1119|      4|}
_ZN4llvh9adl_beginIRNS_11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS7_:
  182|      4|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|      4|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|      4|}
_ZN4llvh10adl_detail9adl_beginIRNS_11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS8_:
  158|      4|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|      4|  return begin(std::forward<ContainerTy>(container));
  160|      4|}
_ZN4llvh7adl_endIRNS_11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS7_:
  188|      4|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|      4|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|      4|}
_ZN4llvh10adl_detail7adl_endIRNS_11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS8_:
  166|      4|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|      4|  return end(std::forward<ContainerTy>(container));
  168|      4|}
CommandLine.cpp:_ZN4llvh8count_ifIRNS_11SmallPtrSetIPNS_2cl10SubCommandELj4EEEZN12_GLOBAL__N_117CommandLineParser18registerSubCommandES4_EUlPKS3_E_EENSt3__115iterator_traitsIDTcl9adl_beginfp_EEE15difference_typeEOT_T0_:
 1117|      4|    typename std::iterator_traits<decltype(adl_begin(Range))>::difference_type {
 1118|      4|  return std::count_if(adl_begin(Range), adl_end(Range), P);
 1119|      4|}
_ZN4llvh9adl_beginIRNS_11SmallPtrSetIPNS_2cl10SubCommandELj4EEEEEDTclsr10adl_detailE9adl_beginclsr3stdE7forwardIT_Efp_EEEOS7_:
  182|      4|    -> decltype(adl_detail::adl_begin(std::forward<ContainerTy>(container))) {
  183|      4|  return adl_detail::adl_begin(std::forward<ContainerTy>(container));
  184|      4|}
_ZN4llvh10adl_detail9adl_beginIRNS_11SmallPtrSetIPNS_2cl10SubCommandELj4EEEEEDTcl5beginclsr3stdE7forwardIT_Efp_EEEOS8_:
  158|      4|    -> decltype(begin(std::forward<ContainerTy>(container))) {
  159|      4|  return begin(std::forward<ContainerTy>(container));
  160|      4|}
_ZN4llvh7adl_endIRNS_11SmallPtrSetIPNS_2cl10SubCommandELj4EEEEEDTclsr10adl_detailE7adl_endclsr3stdE7forwardIT_Efp_EEEOS7_:
  188|      4|    -> decltype(adl_detail::adl_end(std::forward<ContainerTy>(container))) {
  189|      4|  return adl_detail::adl_end(std::forward<ContainerTy>(container));
  190|      4|}
_ZN4llvh10adl_detail7adl_endIRNS_11SmallPtrSetIPNS_2cl10SubCommandELj4EEEEEDTcl3endclsr3stdE7forwardIT_Efp_EEEOS8_:
  166|      4|    -> decltype(end(std::forward<ContainerTy>(container))) {
  167|      4|  return end(std::forward<ContainerTy>(container));
  168|      4|}

Array.cpp:_ZN4llvh15make_scope_exitIZN6hermes2vm18arrayPrototypeJoinEPvRNS2_7RuntimeENS2_10NativeArgsEE3$_1EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|    153|make_scope_exit(Callable &&F) {
   60|    153|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|    153|      std::forward<Callable>(F));
   62|    153|}
Array.cpp:_ZN4llvh6detail10scope_exitIZN6hermes2vm18arrayPrototypeJoinEPvRNS3_7RuntimeENS3_10NativeArgsEE3$_1EC2IS8_EEOT_:
   32|    153|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
Array.cpp:_ZN4llvh6detail10scope_exitIZN6hermes2vm18arrayPrototypeJoinEPvRNS3_7RuntimeENS3_10NativeArgsEE3$_1ED2Ev:
   44|    153|  ~scope_exit() {
   45|    153|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 153, False: 0]
  ------------------
   46|    153|      ExitFunction();
   47|    153|  }
JSLexer.cpp:_ZN4llvh15make_scope_exitIZN6hermes6parser7JSLexer10lookahead1ENS1_8OptValueINS2_9TokenKindEEEE3$_1EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|     18|make_scope_exit(Callable &&F) {
   60|     18|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|     18|      std::forward<Callable>(F));
   62|     18|}
JSLexer.cpp:_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ENS2_8OptValueINS3_9TokenKindEEEE3$_1EC2IS8_EEOT_:
   32|     18|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
JSLexer.cpp:_ZN4llvh6detail10scope_exitIZN6hermes6parser7JSLexer10lookahead1ENS2_8OptValueINS3_9TokenKindEEEE3$_1ED2Ev:
   44|     18|  ~scope_exit() {
   45|     18|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 18, False: 0]
  ------------------
   46|     18|      ExitFunction();
   47|     18|  }
SemanticValidator.cpp:_ZN4llvh15make_scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS1_6ESTree20LabeledStatementNodeEE3$_0EENS_6detail10scope_exitINSt3__15decayIT_E4typeEEEOSC_:
   59|  42.8k|make_scope_exit(Callable &&F) {
   60|  42.8k|  return detail::scope_exit<typename std::decay<Callable>::type>(
   61|  42.8k|      std::forward<Callable>(F));
   62|  42.8k|}
SemanticValidator.cpp:_ZN4llvh6detail10scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS2_6ESTree20LabeledStatementNodeEE3$_0EC2IS8_EEOT_:
   32|  42.8k|  explicit scope_exit(Fp &&F) : ExitFunction(std::forward<Fp>(F)) {}
SemanticValidator.cpp:_ZN4llvh6detail10scope_exitIZN6hermes3sem17SemanticValidator5visitEPNS2_6ESTree20LabeledStatementNodeEE3$_0ED2Ev:
   44|  42.8k|  ~scope_exit() {
   45|  42.8k|    if (Engaged)
  ------------------
  |  Branch (45:9): [True: 42.8k, False: 0]
  ------------------
   46|  42.8k|      ExitFunction();
   47|  42.8k|  }

_ZN4llvh14SmallSetVectorIPN6hermes11InstructionELj16EEC2Ev:
  301|      2|  SmallSetVector() = default;
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEEC2Ev:
   56|      2|  SetVector() = default;
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE6insertIPKS3_EEvT_SE_:
  151|      4|  void insert(It Start, It End) {
  152|      8|    for (; Start != End; ++Start)
  ------------------
  |  Branch (152:12): [True: 4, False: 4]
  ------------------
  153|      4|      if (set_.insert(*Start).second)
  ------------------
  |  Branch (153:11): [True: 4, False: 0]
  ------------------
  154|      4|        vector_.push_back(*Start);
  155|      4|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE5beginEv:
   83|      4|  iterator begin() {
   84|      4|    return vector_.begin();
   85|      4|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE3endEv:
   93|      4|  iterator end() {
   94|      4|    return vector_.end();
   95|      4|  }
_ZN4llvh9SetVectorIPN6hermes11InstructionENS_11SmallVectorIS3_Lj16EEENS_13SmallDenseSetIS3_Lj16ENS_12DenseMapInfoIS3_EEEEE5clearEv:
  216|      2|  void clear() {
  217|      2|    set_.clear();
  218|      2|    vector_.clear();
  219|      2|  }

_ZN4llvh14SmallBitVectorD2Ev:
  169|    198|  ~SmallBitVector() {
  170|    198|    if (!isSmall())
  ------------------
  |  Branch (170:9): [True: 0, False: 198]
  ------------------
  171|      0|      delete getPointer();
  172|    198|  }
_ZNK4llvh14SmallBitVector7isSmallEv:
   95|  3.79k|  bool isSmall() const {
   96|  3.79k|    return X & uintptr_t(1);
   97|  3.79k|  }
_ZN4llvh14SmallBitVector9referenceC2ERS0_j:
   72|     99|    reference(SmallBitVector &b, unsigned Idx) : TheVector(b), BitPos(Idx) {}
_ZN4llvh14SmallBitVector9referenceaSEb:
   81|     99|    reference& operator=(bool t) {
   82|     99|      if (t)
  ------------------
  |  Branch (82:11): [True: 0, False: 99]
  ------------------
   83|      0|        TheVector.set(BitPos);
   84|     99|      else
   85|     99|        TheVector.reset(BitPos);
   86|     99|      return *this;
   87|     99|    }
_ZN4llvh14SmallBitVector13switchToSmallEmm:
  104|    198|  void switchToSmall(uintptr_t NewSmallBits, size_t NewSize) {
  105|    198|    X = 1;
  106|    198|    setSmallSize(NewSize);
  107|    198|    setSmallBits(NewSmallBits);
  108|    198|  }
_ZNK4llvh14SmallBitVector15getSmallRawBitsEv:
  117|  2.25k|  uintptr_t getSmallRawBits() const {
  118|  2.25k|    assert(isSmall());
  119|      0|    return X >> 1;
  120|  2.25k|  }
_ZN4llvh14SmallBitVector15setSmallRawBitsEm:
  122|    495|  void setSmallRawBits(uintptr_t NewRawBits) {
  123|    495|    assert(isSmall());
  124|      0|    X = (NewRawBits << 1) | uintptr_t(1);
  125|    495|  }
_ZNK4llvh14SmallBitVector12getSmallSizeEv:
  128|  1.63k|  size_t getSmallSize() const { return getSmallRawBits() >> SmallNumDataBits; }
_ZN4llvh14SmallBitVector12setSmallSizeEm:
  130|    198|  void setSmallSize(size_t Size) {
  131|    198|    setSmallRawBits(getSmallBits() | (Size << SmallNumDataBits));
  132|    198|  }
_ZNK4llvh14SmallBitVector12getSmallBitsEv:
  135|    621|  uintptr_t getSmallBits() const {
  136|    621|    return getSmallRawBits() & ~(~uintptr_t(0) << getSmallSize());
  137|    621|  }
_ZN4llvh14SmallBitVector12setSmallBitsEm:
  139|    297|  void setSmallBits(uintptr_t NewBits) {
  140|    297|    setSmallRawBits((NewBits & ~(~uintptr_t(0) << getSmallSize())) |
  141|    297|                    (getSmallSize() << SmallNumDataBits));
  142|    297|  }
_ZN4llvh14SmallBitVectorC2Ejb:
  150|    198|  explicit SmallBitVector(unsigned s, bool t = false) {
  151|    198|    if (s <= SmallNumDataBits)
  ------------------
  |  Branch (151:9): [True: 198, False: 0]
  ------------------
  152|    198|      switchToSmall(t ? ~uintptr_t(0) : 0, s);
  ------------------
  |  Branch (152:21): [True: 99, False: 99]
  ------------------
  153|      0|    else
  154|      0|      switchToLarge(new BitVector(s, t));
  155|    198|  }
_ZNK4llvh14SmallBitVector4sizeEv:
  195|    423|  size_t size() const {
  196|    423|    return isSmall() ? getSmallSize() : getPointer()->size();
  ------------------
  |  Branch (196:12): [True: 423, False: 0]
  ------------------
  197|    423|  }
_ZN4llvh14SmallBitVector5resetEj:
  407|     99|  SmallBitVector &reset(unsigned Idx) {
  408|     99|    if (isSmall())
  ------------------
  |  Branch (408:9): [True: 99, False: 0]
  ------------------
  409|     99|      setSmallBits(getSmallBits() & ~(uintptr_t(1) << Idx));
  410|      0|    else
  411|      0|      getPointer()->reset(Idx);
  412|     99|    return *this;
  413|     99|  }
_ZN4llvh14SmallBitVectorixEj:
  452|     99|  reference operator[](unsigned Idx) {
  453|     99|    assert(Idx < size() && "Out-of-bounds Bit access.");
  454|      0|    return reference(*this, Idx);
  455|     99|  }
_ZNK4llvh14SmallBitVectorixEj:
  457|    324|  bool operator[](unsigned Idx) const {
  458|    324|    assert(Idx < size() && "Out-of-bounds Bit access.");
  459|    324|    if (isSmall())
  ------------------
  |  Branch (459:9): [True: 324, False: 0]
  ------------------
  460|    324|      return ((getSmallBits() >> Idx) & 1) != 0;
  461|      0|    return getPointer()->operator[](Idx);
  462|    324|  }
_ZNK4llvh14SmallBitVector4testEj:
  464|    324|  bool test(unsigned Idx) const {
  465|    324|    return (*this)[Idx];
  466|    324|  }

_ZN4llvh19SmallPtrSetImplBaseC2EPPKvj:
   77|   456k|        CurArraySize(SmallSize), NumNonEmpty(0), NumTombstones(0) {
   78|   456k|    assert(SmallSize && (SmallSize & (SmallSize-1)) == 0 &&
   79|   456k|           "Initial size must be a power of two!");
   80|   456k|  }
_ZN4llvh19SmallPtrSetImplBaseD2Ev:
   82|   456k|  ~SmallPtrSetImplBase() {
   83|   456k|    if (!isSmall())
  ------------------
  |  Branch (83:9): [True: 16, False: 456k]
  ------------------
   84|     16|      free(CurArray);
   85|   456k|  }
_ZNK4llvh19SmallPtrSetImplBase5emptyEv:
   92|     30|  LLVM_NODISCARD bool empty() const { return size() == 0; }
_ZNK4llvh19SmallPtrSetImplBase4sizeEv:
   93|   157k|  size_type size() const { return NumNonEmpty - NumTombstones; }
_ZN4llvh19SmallPtrSetImplBase18getTombstoneMarkerEv:
  111|  1.04M|  static void *getTombstoneMarker() { return reinterpret_cast<void*>(-2); }
_ZN4llvh19SmallPtrSetImplBase14getEmptyMarkerEv:
  113|  1.28M|  static void *getEmptyMarker() {
  114|       |    // Note that -1 is chosen to make clear() efficiently implementable with
  115|       |    // memset and because it's not a valid pointer value.
  116|  1.28M|    return reinterpret_cast<void*>(-1);
  117|  1.28M|  }
_ZNK4llvh19SmallPtrSetImplBase10EndPointerEv:
  119|   390k|  const void **EndPointer() const {
  120|   390k|    return isSmall() ? CurArray + NumNonEmpty : CurArray + CurArraySize;
  ------------------
  |  Branch (120:12): [True: 114k, False: 275k]
  ------------------
  121|   390k|  }
_ZN4llvh19SmallPtrSetImplBase10insert_impEPKv:
  126|   272k|  std::pair<const void *const *, bool> insert_imp(const void *Ptr) {
  127|   272k|    if (isSmall()) {
  ------------------
  |  Branch (127:9): [True: 114k, False: 157k]
  ------------------
  128|       |      // Check to see if it is already in the set.
  129|   114k|      const void **LastTombstone = nullptr;
  130|   114k|      for (const void **APtr = SmallArray, **E = SmallArray + NumNonEmpty;
  131|   117k|           APtr != E; ++APtr) {
  ------------------
  |  Branch (131:12): [True: 3.20k, False: 114k]
  ------------------
  132|  3.20k|        const void *Value = *APtr;
  133|  3.20k|        if (Value == Ptr)
  ------------------
  |  Branch (133:13): [True: 33, False: 3.17k]
  ------------------
  134|     33|          return std::make_pair(APtr, false);
  135|  3.17k|        if (Value == getTombstoneMarker())
  ------------------
  |  Branch (135:13): [True: 0, False: 3.17k]
  ------------------
  136|      0|          LastTombstone = APtr;
  137|  3.17k|      }
  138|       |
  139|       |      // Did we find any tombstone marker?
  140|   114k|      if (LastTombstone != nullptr) {
  ------------------
  |  Branch (140:11): [True: 0, False: 114k]
  ------------------
  141|      0|        *LastTombstone = Ptr;
  142|      0|        --NumTombstones;
  143|      0|        incrementEpoch();
  144|      0|        return std::make_pair(LastTombstone, true);
  145|      0|      }
  146|       |
  147|       |      // Nope, there isn't.  If we stay small, just 'pushback' now.
  148|   114k|      if (NumNonEmpty < CurArraySize) {
  ------------------
  |  Branch (148:11): [True: 114k, False: 16]
  ------------------
  149|   114k|        SmallArray[NumNonEmpty++] = Ptr;
  150|   114k|        incrementEpoch();
  151|   114k|        return std::make_pair(SmallArray + (NumNonEmpty - 1), true);
  152|   114k|      }
  153|       |      // Otherwise, hit the big set case, which will call grow.
  154|   114k|    }
  155|   157k|    return insert_imp_big(Ptr);
  156|   272k|  }
_ZNK4llvh19SmallPtrSetImplBase8find_impEPKv:
  177|  39.3k|  const void *const * find_imp(const void * Ptr) const {
  178|  39.3k|    if (isSmall()) {
  ------------------
  |  Branch (178:9): [True: 64, False: 39.2k]
  ------------------
  179|       |      // Linear search for the item.
  180|     64|      for (const void *const *APtr = SmallArray,
  181|  1.05k|                      *const *E = SmallArray + NumNonEmpty; APtr != E; ++APtr)
  ------------------
  |  Branch (181:61): [True: 1.05k, False: 0]
  ------------------
  182|  1.05k|        if (*APtr == Ptr)
  ------------------
  |  Branch (182:13): [True: 64, False: 992]
  ------------------
  183|     64|          return APtr;
  184|      0|      return EndPointer();
  185|     64|    }
  186|       |
  187|       |    // Big set case.
  188|  39.2k|    auto *Bucket = FindBucketFor(Ptr);
  189|  39.2k|    if (*Bucket == Ptr)
  ------------------
  |  Branch (189:9): [True: 39.2k, False: 24]
  ------------------
  190|  39.2k|      return Bucket;
  191|     24|    return EndPointer();
  192|  39.2k|  }
_ZNK4llvh19SmallPtrSetImplBase7isSmallEv:
  195|  1.15M|  bool isSmall() const { return CurArray == SmallArray; }
_ZN4llvh23SmallPtrSetIteratorImplC2EPKPKvS4_:
  229|   351k|    : Bucket(BP), End(E) {
  230|   351k|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (230:9): [True: 0, False: 351k]
  ------------------
  231|      0|      RetreatIfNotValid();
  232|      0|      return;
  233|      0|    }
  234|   351k|    AdvanceIfNotValid();
  235|   351k|  }
_ZNK4llvh23SmallPtrSetIteratorImplneERKS0_:
  240|  39.4k|  bool operator!=(const SmallPtrSetIteratorImpl &RHS) const {
  241|  39.4k|    return Bucket != RHS.Bucket;
  242|  39.4k|  }
_ZN4llvh23SmallPtrSetIteratorImpl17AdvanceIfNotValidEv:
  248|   351k|  void AdvanceIfNotValid() {
  249|   351k|    assert(Bucket <= End);
  250|   351k|    while (Bucket != End &&
  ------------------
  |  Branch (250:12): [True: 311k, False: 39.4k]
  ------------------
  251|   351k|           (*Bucket == SmallPtrSetImplBase::getEmptyMarker() ||
  ------------------
  |  Branch (251:13): [True: 0, False: 311k]
  ------------------
  252|   311k|            *Bucket == SmallPtrSetImplBase::getTombstoneMarker()))
  ------------------
  |  Branch (252:13): [True: 0, False: 311k]
  ------------------
  253|      0|      ++Bucket;
  254|   351k|  }
_ZNK4llvh15SmallPtrSetImplIPNS_2cl10SubCommandEE5beginEv:
  397|     28|  iterator begin() const {
  398|     28|    if (shouldReverseIterate())
  ------------------
  |  Branch (398:9): [True: 0, False: 28]
  ------------------
  399|      0|      return makeIterator(EndPointer() - 1);
  400|     28|    return makeIterator(CurArray);
  401|     28|  }
_ZNK4llvh15SmallPtrSetImplIPNS_2cl10SubCommandEE12makeIteratorEPKPKv:
  406|     72|  iterator makeIterator(const void *const *P) const {
  407|     72|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 72]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|     72|    return iterator(P, EndPointer(), *this);
  410|     72|  }
_ZNK4llvh15SmallPtrSetImplIPNS_2cl10SubCommandEE3endEv:
  402|     28|  iterator end() const { return makeIterator(EndPointer()); }
_ZN4llvh19SmallPtrSetIteratorIPNS_2cl10SubCommandEEppEv:
  294|     38|  inline SmallPtrSetIterator& operator++() {          // Preincrement
  295|     38|    assert(isHandleInSync() && "invalid iterator access!");
  296|     38|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (296:9): [True: 0, False: 38]
  ------------------
  297|      0|      --Bucket;
  298|      0|      RetreatIfNotValid();
  299|      0|      return *this;
  300|      0|    }
  301|     38|    ++Bucket;
  302|     38|    AdvanceIfNotValid();
  303|     38|    return *this;
  304|     38|  }
_ZNK4llvh19SmallPtrSetIteratorIPNS_2cl10SubCommandEEdeEv:
  284|     38|  const PtrTy operator*() const {
  285|     38|    assert(isHandleInSync() && "invalid iterator access!");
  286|     38|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (286:9): [True: 0, False: 38]
  ------------------
  287|      0|      assert(Bucket > End);
  288|      0|      return PtrTraits::getFromVoidPointer(const_cast<void *>(Bucket[-1]));
  289|      0|    }
  290|     38|    assert(Bucket < End);
  291|      0|    return PtrTraits::getFromVoidPointer(const_cast<void*>(*Bucket));
  292|     38|  }
_ZN4llvh15SmallPtrSetImplIPNS_2cl10SubCommandEE6insertES3_:
  371|     16|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|     16|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|     16|    return std::make_pair(makeIterator(p.first), p.second);
  374|     16|  }
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj4EEC2Ev:
  432|     14|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEEC2EPPKvj:
  357|   342k|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE6insertES3_:
  371|   158k|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|   158k|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|   158k|    return std::make_pair(makeIterator(p.first), p.second);
  374|   158k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE12makeIteratorEPKPKv:
  406|   236k|  iterator makeIterator(const void *const *P) const {
  407|   236k|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 236k]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|   236k|    return iterator(P, EndPointer(), *this);
  410|   236k|  }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|   236k|      : SmallPtrSetIteratorImpl(BP, E), DebugEpochBase::HandleBase(&Epoch) {}
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE5countEPKS2_:
  382|  39.3k|  size_type count(ConstPtrType Ptr) const { return find(Ptr) != end() ? 1 : 0; }
  ------------------
  |  Branch (382:52): [True: 39.3k, False: 24]
  ------------------
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE4findEPKS2_:
  383|  39.3k|  iterator find(ConstPtrType Ptr) const {
  384|  39.3k|    return makeIterator(find_imp(ConstPtrTraits::getAsVoidPointer(Ptr)));
  385|  39.3k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE5beginEv:
  397|     12|  iterator begin() const {
  398|     12|    if (shouldReverseIterate())
  ------------------
  |  Branch (398:9): [True: 0, False: 12]
  ------------------
  399|      0|      return makeIterator(EndPointer() - 1);
  400|     12|    return makeIterator(CurArray);
  401|     12|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEE3endEv:
  402|  39.3k|  iterator end() const { return makeIterator(EndPointer()); }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEppEv:
  294|     12|  inline SmallPtrSetIterator& operator++() {          // Preincrement
  295|     12|    assert(isHandleInSync() && "invalid iterator access!");
  296|     12|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (296:9): [True: 0, False: 12]
  ------------------
  297|      0|      --Bucket;
  298|      0|      RetreatIfNotValid();
  299|      0|      return *this;
  300|      0|    }
  301|     12|    ++Bucket;
  302|     12|    AdvanceIfNotValid();
  303|     12|    return *this;
  304|     12|  }
_ZNK4llvh19SmallPtrSetIteratorIPN6hermes10BasicBlockEEdeEv:
  284|     12|  const PtrTy operator*() const {
  285|     12|    assert(isHandleInSync() && "invalid iterator access!");
  286|     12|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (286:9): [True: 0, False: 12]
  ------------------
  287|      0|      assert(Bucket > End);
  288|      0|      return PtrTraits::getFromVoidPointer(const_cast<void *>(Bucket[-1]));
  289|      0|    }
  290|     12|    assert(Bucket < End);
  291|      0|    return PtrTraits::getFromVoidPointer(const_cast<void*>(*Bucket));
  292|     12|  }
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj4EEC2EOS4_:
  435|     14|      : BaseT(SmallStorage, SmallSizePowTwo, std::move(that)) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes10BasicBlockEEC2EPPKvjOS4_:
  355|     14|      : SmallPtrSetImplBase(SmallStorage, SmallSize, std::move(that)) {}
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj32EEC2Ev:
  432|      2|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh11SmallPtrSetIPN6hermes10BasicBlockELj16EEC2Ev:
  432|   342k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh11SmallPtrSetIPN6hermes12UniqueStringELj8EEC2Ev:
  432|   114k|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEEC2EPPKvj:
  357|   114k|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}
_ZN4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEE6insertES3_:
  371|   114k|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|   114k|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|   114k|    return std::make_pair(makeIterator(p.first), p.second);
  374|   114k|  }
_ZNK4llvh15SmallPtrSetImplIPN6hermes12UniqueStringEE12makeIteratorEPKPKv:
  406|   114k|  iterator makeIterator(const void *const *P) const {
  407|   114k|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 114k]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|   114k|    return iterator(P, EndPointer(), *this);
  410|   114k|  }
_ZN4llvh19SmallPtrSetIteratorIPN6hermes12UniqueStringEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|   114k|      : SmallPtrSetIteratorImpl(BP, E), DebugEpochBase::HandleBase(&Epoch) {}
_ZN4llvh11SmallPtrSetIPNS_2cl10SubCommandELj4EEC2Ev:
  432|     32|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPNS_2cl10SubCommandEEC2EPPKvj:
  357|     32|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}
_ZN4llvh19SmallPtrSetIteratorIPNS_2cl10SubCommandEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|     72|      : SmallPtrSetIteratorImpl(BP, E), DebugEpochBase::HandleBase(&Epoch) {}
_ZNK4llvh19SmallPtrSetIteratorIPNS_2cl14OptionCategoryEEdeEv:
  284|      2|  const PtrTy operator*() const {
  285|      2|    assert(isHandleInSync() && "invalid iterator access!");
  286|      2|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (286:9): [True: 0, False: 2]
  ------------------
  287|      0|      assert(Bucket > End);
  288|      0|      return PtrTraits::getFromVoidPointer(const_cast<void *>(Bucket[-1]));
  289|      0|    }
  290|      2|    assert(Bucket < End);
  291|      0|    return PtrTraits::getFromVoidPointer(const_cast<void*>(*Bucket));
  292|      2|  }
_ZN4llvh19SmallPtrSetIteratorIPNS_2cl14OptionCategoryEEppEv:
  294|      2|  inline SmallPtrSetIterator& operator++() {          // Preincrement
  295|      2|    assert(isHandleInSync() && "invalid iterator access!");
  296|      2|    if (shouldReverseIterate()) {
  ------------------
  |  Branch (296:9): [True: 0, False: 2]
  ------------------
  297|      0|      --Bucket;
  298|      0|      RetreatIfNotValid();
  299|      0|      return *this;
  300|      0|    }
  301|      2|    ++Bucket;
  302|      2|    AdvanceIfNotValid();
  303|      2|    return *this;
  304|      2|  }
_ZNK4llvh15SmallPtrSetImplIPNS_2cl14OptionCategoryEE5beginEv:
  397|      4|  iterator begin() const {
  398|      4|    if (shouldReverseIterate())
  ------------------
  |  Branch (398:9): [True: 0, False: 4]
  ------------------
  399|      0|      return makeIterator(EndPointer() - 1);
  400|      4|    return makeIterator(CurArray);
  401|      4|  }
_ZNK4llvh15SmallPtrSetImplIPNS_2cl14OptionCategoryEE12makeIteratorEPKPKv:
  406|     12|  iterator makeIterator(const void *const *P) const {
  407|     12|    if (shouldReverseIterate())
  ------------------
  |  Branch (407:9): [True: 0, False: 12]
  ------------------
  408|      0|      return iterator(P == EndPointer() ? CurArray : P + 1, CurArray, *this);
  ------------------
  |  Branch (408:23): [True: 0, False: 0]
  ------------------
  409|     12|    return iterator(P, EndPointer(), *this);
  410|     12|  }
_ZN4llvh19SmallPtrSetIteratorIPNS_2cl14OptionCategoryEEC2EPKPKvS8_RKNS_14DebugEpochBaseE:
  280|     12|      : SmallPtrSetIteratorImpl(BP, E), DebugEpochBase::HandleBase(&Epoch) {}
_ZNK4llvh15SmallPtrSetImplIPNS_2cl14OptionCategoryEE3endEv:
  402|      4|  iterator end() const { return makeIterator(EndPointer()); }
_ZN4llvh15SmallPtrSetImplIPNS_2cl14OptionCategoryEE6insertES3_:
  371|      4|  std::pair<iterator, bool> insert(PtrType Ptr) {
  372|      4|    auto p = insert_imp(PtrTraits::getAsVoidPointer(Ptr));
  373|      4|    return std::make_pair(makeIterator(p.first), p.second);
  374|      4|  }
_ZN4llvh11SmallPtrSetIPNS_2cl14OptionCategoryELj16EEC2Ev:
  432|      2|  SmallPtrSet() : BaseT(SmallStorage, SmallSizePowTwo) {}
_ZN4llvh15SmallPtrSetImplIPNS_2cl14OptionCategoryEEC2EPPKvj:
  357|      2|      : SmallPtrSetImplBase(SmallStorage, SmallSize) {}

_ZN4llvh11SmallStringILj256EE6appendIPKcEEvT_S5_:
   75|  1.79k|  void append(in_iter S, in_iter E) {
   76|  1.79k|    SmallVectorImpl<char>::append(S, E);
   77|  1.79k|  }
_ZN4llvh11SmallStringILj32EEC2Ev:
   29|   127k|  SmallString() = default;
_ZNK4llvh11SmallStringILj32EEcvNS_9StringRefEEv:
  277|   114k|  operator StringRef() const { return str(); }
_ZNK4llvh11SmallStringILj32EE3strEv:
  267|   114k|  StringRef str() const { return StringRef(this->begin(), this->size()); }
_ZN4llvh11SmallStringILj256EEC2Ev:
   29|  6.89k|  SmallString() = default;
_ZN4llvh11SmallStringILj32EEC2ENS_9StringRefE:
   32|  4.25k|  SmallString(StringRef S) : SmallVector<char, InternalLen>(S.begin(), S.end()) {}
_ZN4llvh11SmallStringILj32EE6appendENS_9StringRefE:
   84|   459k|  void append(StringRef RHS) {
   85|   459k|    SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
   86|   459k|  }
_ZN4llvh11SmallStringILj5EEC2Ev:
   29|    234|  SmallString() = default;
_ZN4llvh11SmallStringILj16EEC2Ev:
   29|    137|  SmallString() = default;
_ZN4llvh11SmallStringILj4EEC2Ev:
   29|      7|  SmallString() = default;
_ZN4llvh11SmallStringILj24EEC2ENS_9StringRefE:
   32|     11|  SmallString(StringRef S) : SmallVector<char, InternalLen>(S.begin(), S.end()) {}
_ZN4llvh11SmallStringILj256EE6appendENS_9StringRefE:
   84|     24|  void append(StringRef RHS) {
   85|     24|    SmallVectorImpl<char>::append(RHS.begin(), RHS.end());
   86|     24|  }
_ZNK4llvh11SmallStringILj256EE3strEv:
  267|  1.88M|  StringRef str() const { return StringRef(this->begin(), this->size()); }
_ZNK4llvh11SmallStringILj256EEcvNS_9StringRefEEv:
  277|     49|  operator StringRef() const { return str(); }
_ZN4llvh11SmallStringILj32EE6appendIPKcEEvT_S5_:
   75|  12.3k|  void append(in_iter S, in_iter E) {
   76|  12.3k|    SmallVectorImpl<char>::append(S, E);
   77|  12.3k|  }

_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EED2Ev:
  861|    168|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    168|    this->destroy_range(this->begin(), this->end());
  864|    168|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE13destroy_rangeEPS3_S5_:
  282|    280|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE5beginEv:
  135|   115k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE3endEv:
  139|   114k|  iterator end() { return begin() + size(); }
_ZNK4llvh15SmallVectorBase4sizeEv:
   59|  1.34G|  size_t size() const { return Size; }
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEED2Ev:
  349|    168|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    168|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 168]
  ------------------
  353|      0|      free(this->begin());
  354|    168|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE7isSmallEv:
  110|    280|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE10getFirstElEv:
   93|    448|  void *getFirstEl() const {
   94|    448|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    448|        reinterpret_cast<const char *>(this) +
   96|    448|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    448|  }
_ZN4llvh11SmallVectorIPN6hermes2vm17PinnedHermesValueELj4EEC2ESt16initializer_listIS4_E:
  885|   720k|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|   720k|    this->assign(IL);
  887|   720k|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEEC2Ej:
  344|   720k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EEC2Em:
  279|   720k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvEC2Em:
  102|   720k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE10getFirstElEv:
   93|  1.44M|  void *getFirstEl() const {
   94|  1.44M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.44M|        reinterpret_cast<const char *>(this) +
   96|  1.44M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.44M|  }
_ZN4llvh15SmallVectorBaseC2EPvm:
   52|  30.7M|      : BeginX(FirstEl), Capacity(Capacity) {}
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6assignESt16initializer_listIS4_E:
  450|   720k|  void assign(std::initializer_list<T> IL) {
  451|   720k|    clear();
  452|   720k|    append(IL);
  453|   720k|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE5clearEv:
  356|   720k|  void clear() {
  357|   720k|    this->destroy_range(this->begin(), this->end());
  358|   720k|    this->Size = 0;
  359|   720k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE13destroy_rangeEPS4_S6_:
  282|  1.44M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE5beginEv:
  135|  10.1M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE3endEv:
  139|  2.88M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6appendESt16initializer_listIS4_E:
  426|   720k|  void append(std::initializer_list<T> IL) {
  427|   720k|    append(IL.begin(), IL.end());
  428|   720k|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEE6appendIPKS4_vEEvT_S9_:
  404|   720k|  void append(in_iter in_start, in_iter in_end) {
  405|   720k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   720k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 720k]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   720k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   720k|    this->set_size(this->size() + NumInputs);
  413|   720k|  }
_ZNK4llvh15SmallVectorBase8capacityEv:
   60|   136M|  size_t capacity() const { return Capacity; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE4growEm:
  317|    198|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE8grow_podEmm:
  104|    198|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    198|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    198|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE18uninitialized_copyIKS4_S4_EEvPT_S9_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSC_12remove_constIS8_E4typeESA_EE5valueEvE4typeE:
  306|   720k|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|   720k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 720k, False: 0]
  ------------------
  312|   720k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|   720k|  }
_ZN4llvh15SmallVectorBase8set_sizeEm:
   73|  71.5M|  void set_size(size_t Size) {
   74|  71.5M|    assert(Size <= capacity());
   75|      0|    this->Size = Size;
   76|  71.5M|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm17PinnedHermesValueEED2Ev:
  349|   720k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   720k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 99, False: 720k]
  ------------------
  353|     99|      free(this->begin());
  354|   720k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE7isSmallEv:
  110|   720k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEC2Ev:
  859|     99|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINS_7SMFixItEEC2Ej:
  344|    347|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EEC2Em:
  194|    347|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvEC2Em:
  102|    347|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE10getFirstElEv:
   93|    694|  void *getFirstEl() const {
   94|    694|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    694|        reinterpret_cast<const char *>(this) +
   96|    694|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    694|  }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EED2Ev:
  861|    347|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    347|    this->destroy_range(this->begin(), this->end());
  864|    347|  }
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EE13destroy_rangeEPS1_S3_:
  196|    390|  static void destroy_range(T *S, T *E) {
  197|    390|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 390]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|    390|  }
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE5beginEv:
  135|  1.52k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE3endEv:
  139|    886|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINS_7SMFixItEED2Ev:
  349|    347|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    347|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 347]
  ------------------
  353|      0|      free(this->begin());
  354|    347|  }
_ZNK4llvh25SmallVectorTemplateCommonINS_7SMFixItEvE7isSmallEv:
  110|    347|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh15SmallVectorBase5emptyEv:
   62|  39.9M|  LLVM_NODISCARD bool empty() const { return !Size; }
_ZN4llvh11SmallVectorIDsLj32EED2Ev:
  861|   138k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   138k|    this->destroy_range(this->begin(), this->end());
  864|   138k|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE13destroy_rangeEPDsS2_:
  282|   161k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIDsvE5beginEv:
  135|  3.37M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIDsvE3endEv:
  139|  3.14M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIDsED2Ev:
  349|   161k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   161k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 209, False: 161k]
  ------------------
  353|    209|      free(this->begin());
  354|   161k|  }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE7isSmallEv:
  110|   161k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE10getFirstElEv:
   93|   324k|  void *getFirstEl() const {
   94|   324k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   324k|        reinterpret_cast<const char *>(this) +
   96|   324k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   324k|  }
_ZN4llvh11SmallVectorIDsLj32EEC2Ev:
  859|   138k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIDsEC2Ej:
  344|   161k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EEC2Em:
  279|   161k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIDsvEC2Em:
  102|   161k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIcvE4dataEv:
  157|  4.49k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIcvE5beginEv:
  137|  2.00M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIcvE4dataEv:
  155|  18.4k|  pointer data() { return pointer(begin()); }
_ZN4llvh25SmallVectorTemplateCommonIcvE5beginEv:
  135|  39.0M|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIcvE10getFirstElEv:
   93|  7.46M|  void *getFirstEl() const {
   94|  7.46M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.46M|        reinterpret_cast<const char *>(this) +
   96|  7.46M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.46M|  }
_ZNK4llvh25SmallVectorTemplateCommonIcvE7isSmallEv:
  110|  3.73M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE13destroy_rangeEPcS2_:
  282|  5.62M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIcvE3endEv:
  139|  29.1M|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE10getFirstElEv:
   93|  2.16k|  void *getFirstEl() const {
   94|  2.16k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  2.16k|        reinterpret_cast<const char *>(this) +
   96|  2.16k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  2.16k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE7isSmallEv:
  110|  1.09k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE5beginEv:
  135|  2.22k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE13destroy_rangeEPS6_S8_:
  196|  1.09k|  static void destroy_range(T *S, T *E) {
  197|  1.10k|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 12, False: 1.09k]
  ------------------
  198|     12|      --E;
  199|     12|      E->~T();
  200|     12|    }
  201|  1.09k|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvE3endEv:
  139|  1.11k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE9push_backEOS6_:
  231|     12|  void push_back(T &&Elt) {
  232|     12|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     12|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 12, False: 0]
  |  |  ------------------
  ------------------
  233|     12|      this->grow();
  234|     12|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|     12|    this->set_size(this->size() + 1);
  236|     12|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE4growEm:
  246|     12|void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
  247|       |  // Always grow, even from zero.
  248|     12|  constexpr size_t MinGrowth = 2;
  249|     12|  size_t NewCapacity = size_t(NextPowerOf2(this->capacity() + MinGrowth));
  250|     12|  NewCapacity = static_cast<unsigned>(std::max(NewCapacity, MinSize));
  251|       |  // Ensure that NewCapacity did not overflow an unsigned int,
  252|       |  // and that the capacity in bytes will not overflow a size_t.
  253|     12|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (253:7): [True: 0, False: 12]
  ------------------
  254|     12|      NewCapacity < MinSize ||
  ------------------
  |  Branch (254:7): [True: 0, False: 12]
  ------------------
  255|     12|      NewCapacity > size_t(-1) / sizeof(T))
  ------------------
  |  Branch (255:7): [True: 0, False: 12]
  ------------------
  256|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
  257|     12|  T *NewElts = static_cast<T*>(llvh::safe_malloc(NewCapacity*sizeof(T)));
  258|       |
  259|       |  // Move the elements over.
  260|     12|  this->uninitialized_move(this->begin(), this->end(), NewElts);
  261|       |
  262|       |  // Destroy the original elements.
  263|     12|  destroy_range(this->begin(), this->end());
  264|       |
  265|       |  // If this wasn't grown from the inline copy, deallocate the old space.
  266|     12|  if (!this->isSmall())
  ------------------
  |  Branch (266:7): [True: 0, False: 12]
  ------------------
  267|      0|    free(this->begin());
  268|       |
  269|     12|  this->BeginX = NewElts;
  270|     12|  this->Capacity = NewCapacity;
  271|     12|}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EE18uninitialized_moveIPS6_S9_EEvT_SA_T0_:
  206|     12|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  207|     12|    std::uninitialized_copy(std::make_move_iterator(I),
  208|     12|                            std::make_move_iterator(E), Dest);
  209|     12|  }
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEEaSEOS4_:
  775|    112|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|    112|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 112]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|    112|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 112]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|    112|  size_t RHSSize = RHS.size();
  793|    112|  size_t CurSize = this->size();
  794|    112|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 112]
  ------------------
  795|       |    // Assign common elements.
  796|      0|    iterator NewEnd = this->begin();
  797|      0|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 0]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      0|    this->destroy_range(NewEnd, this->end());
  802|      0|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      0|    RHS.clear();
  806|       |
  807|      0|    return *this;
  808|      0|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|    112|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 112]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|    112|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 112]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|    112|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|    112|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|    112|  this->set_size(RHSSize);
  831|       |
  832|    112|  RHS.clear();
  833|    112|  return *this;
  834|    112|}
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEE5clearEv:
  356|    112|  void clear() {
  357|    112|    this->destroy_range(this->begin(), this->end());
  358|    112|    this->Size = 0;
  359|    112|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE18uninitialized_moveIPS3_S6_EEvT_S7_T0_:
  287|    112|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|    112|    uninitialized_copy(I, E, Dest);
  290|    112|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE18uninitialized_copyIS3_S3_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|    112|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|    112|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 112, False: 0]
  ------------------
  312|    112|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    112|  }
_ZN4llvh15SmallVectorImplIcE5clearEv:
  356|  1.89M|  void clear() {
  357|  1.89M|    this->destroy_range(this->begin(), this->end());
  358|  1.89M|    this->Size = 0;
  359|  1.89M|  }
_ZN4llvh15SmallVectorImplIcE6appendIPKcvEEvT_S5_:
  404|  4.67M|  void append(in_iter in_start, in_iter in_end) {
  405|  4.67M|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  4.67M|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 138, False: 4.67M]
  ------------------
  408|    138|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  4.67M|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  4.67M|    this->set_size(this->size() + NumInputs);
  413|  4.67M|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE4growEm:
  317|    638|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIcvE8grow_podEmm:
  104|    638|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    638|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    638|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE18uninitialized_copyIKccEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|  4.67M|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  4.67M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 4.56M, False: 112k]
  ------------------
  312|  4.56M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  4.67M|  }
_ZN4llvh15SmallVectorImplIcE6appendIPcvEEvT_S4_:
  404|  43.0k|  void append(in_iter in_start, in_iter in_end) {
  405|  43.0k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  43.0k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 4, False: 43.0k]
  ------------------
  408|      4|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  43.0k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  43.0k|    this->set_size(this->size() + NumInputs);
  413|  43.0k|  }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE18uninitialized_copyIccEEvPT_S4_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS7_12remove_constIS3_E4typeES5_EE5valueEvE4typeE:
  306|  43.0k|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  43.0k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 43.0k, False: 0]
  ------------------
  312|  43.0k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  43.0k|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE10getFirstElEv:
   93|  12.8M|  void *getFirstEl() const {
   94|  12.8M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  12.8M|        reinterpret_cast<const char *>(this) +
   96|  12.8M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  12.8M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE7isSmallEv:
  110|  7.32M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIjvE5beginEv:
  135|  37.9M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIjE6appendIPKjvEEvT_S5_:
  404|  1.76M|  void append(in_iter in_start, in_iter in_end) {
  405|  1.76M|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|  1.76M|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 110, False: 1.76M]
  ------------------
  408|    110|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|  1.76M|    this->uninitialized_copy(in_start, in_end, this->end());
  412|  1.76M|    this->set_size(this->size() + NumInputs);
  413|  1.76M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE4growEm:
  317|    439|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIjvE8grow_podEmm:
  104|    439|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    439|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    439|  }
_ZN4llvh25SmallVectorTemplateCommonIjvE3endEv:
  139|  23.1M|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_copyIKjjEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|  1.76M|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  1.76M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1.76M, False: 0]
  ------------------
  312|  1.76M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  1.76M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE13destroy_rangeEPjS2_:
  282|  9.13M|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIjE5clearEv:
  356|  3.57M|  void clear() {
  357|  3.57M|    this->destroy_range(this->begin(), this->end());
  358|  3.57M|    this->Size = 0;
  359|  3.57M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE5beginEv:
  137|  10.5M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIjvE3endEv:
  141|  1.76M|  const_iterator end() const { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE10getFirstElEv:
   93|   686k|  void *getFirstEl() const {
   94|   686k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   686k|        reinterpret_cast<const char *>(this) +
   96|   686k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   686k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE7isSmallEv:
  110|   343k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5beginEv:
  135|  1.64M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE13destroy_rangeEPS3_S5_:
  282|   343k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE3endEv:
  139|   879k|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE10getFirstElEv:
   93|  7.52k|  void *getFirstEl() const {
   94|  7.52k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.52k|        reinterpret_cast<const char *>(this) +
   96|  7.52k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.52k|  }
_ZNK4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE7isSmallEv:
  110|  4.15k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE5beginEv:
  135|  11.2k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE10getFirstElEv:
   93|    198|  void *getFirstEl() const {
   94|    198|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    198|        reinterpret_cast<const char *>(this) +
   96|    198|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    198|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE7isSmallEv:
  110|     99|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE5beginEv:
  135|    823|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEE6resizeEm:
  361|     99|  void resize(size_type N) {
  362|     99|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 0, False: 99]
  ------------------
  363|      0|      this->destroy_range(this->begin()+N, this->end());
  364|      0|      this->set_size(N);
  365|     99|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 99, False: 0]
  ------------------
  366|     99|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 0, False: 99]
  ------------------
  367|      0|        this->grow(N);
  368|    396|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 297, False: 99]
  ------------------
  369|    297|        new (&*I) T();
  370|     99|      this->set_size(N);
  371|     99|    }
  372|     99|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELb0EE13destroy_rangeEPS8_SA_:
  196|     99|  static void destroy_range(T *S, T *E) {
  197|    396|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 297, False: 99]
  ------------------
  198|    297|      --E;
  199|    297|      E->~T();
  200|    297|    }
  201|     99|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvE3endEv:
  139|    198|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvEixEm:
  160|    427|  reference operator[](size_type idx) {
  161|    427|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|    427|  }
_ZN4llvh23SmallVectorTemplateBaseINS_11SmallStringILj24EEELb0EE13destroy_rangeEPS2_S4_:
  196|  4.92k|  static void destroy_range(T *S, T *E) {
  197|  4.94k|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 22, False: 4.92k]
  ------------------
  198|     22|      --E;
  199|     22|      E->~T();
  200|     22|    }
  201|  4.92k|  }
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvE3endEv:
  139|  5.61k|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE10getFirstElEv:
   93|  7.99M|  void *getFirstEl() const {
   94|  7.99M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.99M|        reinterpret_cast<const char *>(this) +
   96|  7.99M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.99M|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE7isSmallEv:
  110|  3.95M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE13destroy_rangeEPS3_S5_:
  282|  3.95M|  static void destroy_range(T *, T *) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE5beginEv:
  137|   895k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE3endEv:
  141|   447k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE5beginEv:
  135|  23.6M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE3endEv:
  139|  13.5M|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE10getFirstElEv:
   93|   229k|  void *getFirstEl() const {
   94|   229k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   229k|        reinterpret_cast<const char *>(this) +
   96|   229k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   229k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE5beginEv:
  135|   574k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE10getFirstElEv:
   93|   229k|  void *getFirstEl() const {
   94|   229k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   229k|        reinterpret_cast<const char *>(this) +
   96|   229k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   229k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE5beginEv:
  135|   573k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE3endEv:
  139|   344k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8VariableELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE3endEv:
  139|   344k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEE12emplace_backIJRS3_EEEvDpOT_:
  662|   114k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   114k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 60, False: 114k]
  |  |  ------------------
  ------------------
  664|     60|      this->grow();
  665|   114k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   114k|    this->set_size(this->size() + 1);
  667|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EE4growEm:
  317|     60|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvE8grow_podEmm:
  104|     60|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     60|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     60|  }
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEE12emplace_backIJRS3_EEEvDpOT_:
  662|   114k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   114k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|   114k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   114k|    this->set_size(this->size() + 1);
  667|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE10getFirstElEv:
   93|  5.03M|  void *getFirstEl() const {
   94|  5.03M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  5.03M|        reinterpret_cast<const char *>(this) +
   96|  5.03M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  5.03M|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE7isSmallEv:
  110|  2.27M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE5beginEv:
  135|   684M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE13destroy_rangeEPS6_S8_:
  282|  2.27M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE3endEv:
  139|  6.81M|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE5beginEv:
  135|   801k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE3endEv:
  139|   458k|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPNS_2cl6OptionEvE10getFirstElEv:
   93|      8|  void *getFirstEl() const {
   94|      8|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|      8|        reinterpret_cast<const char *>(this) +
   96|      8|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|      8|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvEixEm:
  165|  3.63k|  const_reference operator[](size_type idx) const {
  166|  3.63k|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|  3.63k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE5beginEv:
  137|  5.39k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvEixEm:
  165|  11.9k|  const_reference operator[](size_type idx) const {
  166|  11.9k|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|  11.9k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvE5beginEv:
  137|  11.9k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE5beginEv:
  135|  1.28M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE3endEv:
  139|   992k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE9push_backERKS3_:
  320|  6.50M|  void push_back(const T &Elt) {
  321|  6.50M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  6.50M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 79.1k, False: 6.42M]
  |  |  ------------------
  ------------------
  322|  79.1k|      this->grow();
  323|  6.50M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  6.50M|    this->set_size(this->size() + 1);
  325|  6.50M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE4growEm:
  317|  79.1k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE8grow_podEmm:
  104|  79.1k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  79.1k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  79.1k|  }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEaSEOS4_:
  909|     56|  const SmallVector &operator=(SmallVector &&RHS) {
  910|     56|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|     56|    return *this;
  912|     56|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvEixEm:
  160|  5.07M|  reference operator[](size_type idx) {
  161|  5.07M|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|  5.07M|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE10getFirstElEv:
   93|  7.28M|  void *getFirstEl() const {
   94|  7.28M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.28M|        reinterpret_cast<const char *>(this) +
   96|  7.28M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.28M|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE7isSmallEv:
  110|  4.44M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE5beginEv:
  135|  14.9M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE9push_backERKDs:
  320|  2.84M|  void push_back(const T &Elt) {
  321|  2.84M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.84M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 333, False: 2.84M]
  |  |  ------------------
  ------------------
  322|    333|      this->grow();
  323|  2.84M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.84M|    this->set_size(this->size() + 1);
  325|  2.84M|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE4growEm:
  317|    547|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIDsvE8grow_podEmm:
  104|    547|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    547|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    547|  }
_ZN4llvh11SmallVectorIDsLj32EEC2IPKhvEET_S5_:
  875|     99|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|     99|    this->append(S, E);
  877|     99|  }
_ZN4llvh15SmallVectorImplIDsE6appendIPKhvEEvT_S5_:
  404|    171|  void append(in_iter in_start, in_iter in_end) {
  405|    171|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    171|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 5, False: 166]
  ------------------
  408|      5|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    171|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    171|    this->set_size(this->size() + NumInputs);
  413|    171|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIPKhPDsEEvT_S6_T0_:
  295|    171|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|    171|    std::uninitialized_copy(I, E, Dest);
  298|    171|  }
_ZN4llvh15SmallVectorImplIDsE6appendIN6hermes2vm10StringView14const_iteratorEvEEvT_S7_:
  404|     99|  void append(in_iter in_start, in_iter in_end) {
  405|     99|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|     99|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 99]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|     99|    this->uninitialized_copy(in_start, in_end, this->end());
  412|     99|    this->set_size(this->size() + NumInputs);
  413|     99|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIN6hermes2vm10StringView14const_iteratorEPDsEEvT_S8_T0_:
  295|     99|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|     99|    std::uninitialized_copy(I, E, Dest);
  298|     99|  }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE4dataEv:
  157|  94.4k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE5beginEv:
  137|  94.9k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE5beginEv:
  135|  2.12k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE3endEv:
  139|  1.22k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEE6insertEPS2_RKS2_:
  518|      5|  iterator insert(iterator I, const T &Elt) {
  519|      5|    if (I == this->end()) {  // Important special case for empty vector.
  ------------------
  |  Branch (519:9): [True: 2, False: 3]
  ------------------
  520|      2|      this->push_back(Elt);
  521|      2|      return this->end()-1;
  522|      2|    }
  523|       |
  524|      3|    assert(I >= this->begin() && "Insertion iterator is out of bounds.");
  525|      0|    assert(I <= this->end() && "Inserting past the end of the vector.");
  526|       |
  527|      3|    if (this->size() >= this->capacity()) {
  ------------------
  |  Branch (527:9): [True: 1, False: 2]
  ------------------
  528|      1|      size_t EltNo = I-this->begin();
  529|      1|      this->grow();
  530|      1|      I = this->begin()+EltNo;
  531|      1|    }
  532|      3|    ::new ((void*) this->end()) T(std::move(this->back()));
  533|       |    // Push everything else over.
  534|      3|    std::move_backward(I, this->end()-1, this->end());
  535|      3|    this->set_size(this->size() + 1);
  536|       |
  537|       |    // If we just moved the element we're inserting, be sure to update
  538|       |    // the reference.
  539|      3|    const T *EltPtr = &Elt;
  540|      3|    if (I <= EltPtr && EltPtr < this->end())
  ------------------
  |  Branch (540:9): [True: 3, False: 0]
  |  Branch (540:24): [True: 0, False: 3]
  ------------------
  541|      0|      ++EltPtr;
  542|       |
  543|      3|    *I = *EltPtr;
  544|      3|    return I;
  545|      5|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE9push_backERKS2_:
  320|      2|  void push_back(const T &Elt) {
  321|      2|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|      2|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|      2|    this->set_size(this->size() + 1);
  325|      2|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE4growEm:
  317|      1|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE8grow_podEmm:
  104|      1|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      1|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      1|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE10getFirstElEv:
   93|      5|  void *getFirstEl() const {
   94|      5|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|      5|        reinterpret_cast<const char *>(this) +
   96|      5|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|      5|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE4backEv:
  179|      3|  reference back() {
  180|      3|    assert(!empty());
  181|      0|    return end()[-1];
  182|      3|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEE5eraseEPKS2_S5_:
  470|    297|  iterator erase(const_iterator CS, const_iterator CE) {
  471|       |    // Just cast away constness because this is a non-const member function.
  472|    297|    iterator S = const_cast<iterator>(CS);
  473|    297|    iterator E = const_cast<iterator>(CE);
  474|       |
  475|    297|    assert(S >= this->begin() && "Range to erase is out of bounds.");
  476|      0|    assert(S <= E && "Trying to erase invalid range.");
  477|      0|    assert(E <= this->end() && "Trying to erase past the end.");
  478|       |
  479|      0|    iterator N = S;
  480|       |    // Shift all elts down.
  481|    297|    iterator I = std::move(E, this->end(), S);
  482|       |    // Drop the last elts.
  483|    297|    this->destroy_range(I, this->end());
  484|    297|    this->set_size(I - this->begin());
  485|    297|    return(N);
  486|    297|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE13destroy_rangeEPS2_S4_:
  282|    299|  static void destroy_range(T *, T *) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE4dataEv:
  157|      4|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE5beginEv:
  137|      6|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE3endEv:
  141|      1|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE9push_backERKc:
  320|  18.8M|  void push_back(const T &Elt) {
  321|  18.8M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  18.8M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 453, False: 18.8M]
  |  |  ------------------
  ------------------
  322|    453|      this->grow();
  323|  18.8M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  18.8M|    this->set_size(this->size() + 1);
  325|  18.8M|  }
_ZN4llvh15SmallVectorImplIcEaSEOS1_:
  775|     11|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|     11|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 11]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|     11|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 11]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|     11|  size_t RHSSize = RHS.size();
  793|     11|  size_t CurSize = this->size();
  794|     11|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 11]
  ------------------
  795|       |    // Assign common elements.
  796|      0|    iterator NewEnd = this->begin();
  797|      0|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 0]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      0|    this->destroy_range(NewEnd, this->end());
  802|      0|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      0|    RHS.clear();
  806|       |
  807|      0|    return *this;
  808|      0|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|     11|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 11]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|     11|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 11]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|     11|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|     11|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|     11|  this->set_size(RHSSize);
  831|       |
  832|     11|  RHS.clear();
  833|     11|  return *this;
  834|     11|}
_ZN4llvh23SmallVectorTemplateBaseIcLb1EE18uninitialized_moveIPcS3_EEvT_S4_T0_:
  287|     11|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|     11|    uninitialized_copy(I, E, Dest);
  290|     11|  }
_ZNK4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE10getFirstElEv:
   93|  46.5k|  void *getFirstEl() const {
   94|  46.5k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  46.5k|        reinterpret_cast<const char *>(this) +
   96|  46.5k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  46.5k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE7isSmallEv:
  110|  23.1k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE13destroy_rangeEPSA_SC_:
  282|  23.1k|  static void destroy_range(T *, T *) {}
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE4growEm:
  317|    234|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE8grow_podEmm:
  104|    234|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    234|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    234|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEE7reserveEm:
  386|    234|  void reserve(size_type N) {
  387|    234|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 234, False: 0]
  ------------------
  388|    234|      this->grow(N);
  389|    234|  }
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EE9push_backERKSA_:
  320|    510|  void push_back(const T &Elt) {
  321|    510|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    510|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 510]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|    510|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    510|    this->set_size(this->size() + 1);
  325|    510|  }
_ZN4llvh15SmallVectorImplIjEaSEOS1_:
  775|  1.76M|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|  1.76M|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 1.76M]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|  1.76M|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 26, False: 1.76M]
  ------------------
  781|     26|    this->destroy_range(this->begin(), this->end());
  782|     26|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 26]
  ------------------
  783|     26|    this->BeginX = RHS.BeginX;
  784|     26|    this->Size = RHS.Size;
  785|     26|    this->Capacity = RHS.Capacity;
  786|     26|    RHS.resetToSmall();
  787|     26|    return *this;
  788|     26|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|  1.76M|  size_t RHSSize = RHS.size();
  793|  1.76M|  size_t CurSize = this->size();
  794|  1.76M|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 1.76M]
  ------------------
  795|       |    // Assign common elements.
  796|      0|    iterator NewEnd = this->begin();
  797|      0|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 0]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      0|    this->destroy_range(NewEnd, this->end());
  802|      0|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      0|    RHS.clear();
  806|       |
  807|      0|    return *this;
  808|      0|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|  1.76M|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 1.76M]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|  1.76M|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 1.76M]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|  1.76M|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|  1.76M|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|  1.76M|  this->set_size(RHSSize);
  831|       |
  832|  1.76M|  RHS.clear();
  833|  1.76M|  return *this;
  834|  1.76M|}
_ZN4llvh25SmallVectorTemplateCommonIjvE12resetToSmallEv:
  113|     26|  void resetToSmall() {
  114|     26|    BeginX = getFirstEl();
  115|     26|    Size = Capacity = 0; // FIXME: Setting Capacity to 0 is suspect.
  116|     26|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_moveIPjS3_EEvT_S4_T0_:
  287|  1.76M|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|  1.76M|    uninitialized_copy(I, E, Dest);
  290|  1.76M|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE18uninitialized_copyIjjEEvPT_S4_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS7_12remove_constIS3_E4typeES5_EE5valueEvE4typeE:
  306|  1.76M|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  1.76M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1.76M, False: 0]
  ------------------
  312|  1.76M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  1.76M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE5frontEv:
  174|  1.64M|  const_reference front() const {
  175|  1.64M|    assert(!empty());
  176|      0|    return begin()[0];
  177|  1.64M|  }
_ZNK4llvh25SmallVectorTemplateCommonIjvE4dataEv:
  157|  5.41M|  const_pointer data() const { return const_pointer(begin()); }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE5beginEv:
  135|  93.4k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvE3endEv:
  139|  46.8k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj2EEC2Ev:
  859|  3.34M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEEC2Ej:
  344|  3.95M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EEC2Em:
  279|  3.95M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvEC2Em:
  102|  3.95M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes9ScopeDescELj8EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ScopeDescELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ScopeDescEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes8VariableELj8EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8VariableELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIjED2Ev:
  349|  5.55M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  5.55M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 61, False: 5.55M]
  ------------------
  353|     61|      free(this->begin());
  354|  5.55M|  }
_ZN4llvh15SmallVectorImplIjEC2Ej:
  344|  5.55M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIjLb1EEC2Em:
  279|  5.55M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIjvEC2Em:
  102|  5.55M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes2vm17PinnedHermesValueELj4EED2Ev:
  861|   720k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   720k|    this->destroy_range(this->begin(), this->end());
  864|   720k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm17PinnedHermesValueELb1EE9push_backERKS4_:
  320|  2.08k|  void push_back(const T &Elt) {
  321|  2.08k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.08k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 198, False: 1.88k]
  |  |  ------------------
  ------------------
  322|    198|      this->grow();
  323|  2.08k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.08k|    this->set_size(this->size() + 1);
  325|  2.08k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm17PinnedHermesValueEvE4backEv:
  179|  2.08k|  reference back() {
  180|  2.08k|    assert(!empty());
  181|      0|    return end()[-1];
  182|  2.08k|  }
_ZN4llvh11SmallVectorIDsLj16EEC2Ev:
  859|  11.4k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj16EED2Ev:
  861|  11.4k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  11.4k|    this->destroy_range(this->begin(), this->end());
  864|  11.4k|  }
_ZN4llvh11SmallVectorINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELj4EEC2Ev:
  859|  9.45k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEEC2Ej:
  344|  9.45k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EEC2Em:
  279|  9.45k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvEC2Em:
  102|  9.45k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE10getFirstElEv:
   93|  22.2k|  void *getFirstEl() const {
   94|  22.2k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  22.2k|        reinterpret_cast<const char *>(this) +
   96|  22.2k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  22.2k|  }
_ZN4llvh11SmallVectorINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELj4EED2Ev:
  861|  9.45k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  9.45k|    this->destroy_range(this->begin(), this->end());
  864|  9.45k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EE13destroy_rangeEPS7_S9_:
  282|  9.45k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE5beginEv:
  135|  79.1k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE3endEv:
  139|  56.8k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEED2Ev:
  349|  9.45k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  9.45k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 3.33k, False: 6.12k]
  ------------------
  353|  3.33k|      free(this->begin());
  354|  9.45k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE7isSmallEv:
  110|  9.45k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEE7reserveEm:
  386|  9.45k|  void reserve(size_type N) {
  387|  9.45k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 3.33k, False: 6.12k]
  ------------------
  388|  3.33k|      this->grow(N);
  389|  9.45k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEELb1EE4growEm:
  317|  3.33k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE8grow_podEmm:
  104|  3.33k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|  3.33k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|  3.33k|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEE12emplace_backIJRKNS4_10GCSymbolIDERS6_EEEvDpOT_:
  662|  37.9k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  37.9k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  37.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 37.9k]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|  37.9k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  37.9k|    this->set_size(this->size() + 1);
  667|  37.9k|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE6rbeginEv:
  144|  9.45k|  reverse_iterator rbegin()            { return reverse_iterator(end()); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIN6hermes2vm8SymbolIDENS4_13PropertyFlagsEEEvE4rendEv:
  146|  9.45k|  reverse_iterator rend()              { return reverse_iterator(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIDsvE3endEv:
  141|    234|  const_iterator end() const { return begin() + size(); }
_ZN4llvh15SmallVectorImplIDsE6appendIPKDsvEEvT_S5_:
  404|    178|  void append(in_iter in_start, in_iter in_end) {
  405|    178|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    178|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 34, False: 144]
  ------------------
  408|     34|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    178|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    178|    this->set_size(this->size() + NumInputs);
  413|    178|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIKDsDsEEvPT_S5_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS8_12remove_constIS4_E4typeES6_EE5valueEvE4typeE:
  306|    178|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|    178|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 178, False: 0]
  ------------------
  312|    178|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    178|  }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE8pop_backEv:
  327|  1.09M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh23SmallVectorTemplateBaseIjLb1EE9push_backERKj:
  320|  8.28M|  void push_back(const T &Elt) {
  321|  8.28M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  8.28M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 329, False: 8.28M]
  |  |  ------------------
  ------------------
  322|    329|      this->grow();
  323|  8.28M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  8.28M|    this->set_size(this->size() + 1);
  325|  8.28M|  }
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EEaSEOS6_:
  909|   808k|  const SmallVector &operator=(SmallVector &&RHS) {
  910|   808k|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|   808k|    return *this;
  912|   808k|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEEaSEOS6_:
  775|  1.61M|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|  1.61M|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 1.61M]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|  1.61M|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 1.61M]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|  1.61M|  size_t RHSSize = RHS.size();
  793|  1.61M|  size_t CurSize = this->size();
  794|  1.61M|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 8, False: 1.61M]
  ------------------
  795|       |    // Assign common elements.
  796|      8|    iterator NewEnd = this->begin();
  797|      8|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 8]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      8|    this->destroy_range(NewEnd, this->end());
  802|      8|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      8|    RHS.clear();
  806|       |
  807|      8|    return *this;
  808|      8|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|  1.61M|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 1.61M]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|  1.61M|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 1.61M]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|  1.61M|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|  1.61M|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|  1.61M|  this->set_size(RHSSize);
  831|       |
  832|  1.61M|  RHS.clear();
  833|  1.61M|  return *this;
  834|  1.61M|}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE13destroy_rangeEPS5_S7_:
  282|  4.85M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE3endEv:
  139|  6.87M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEE5clearEv:
  356|  1.61M|  void clear() {
  357|  1.61M|    this->destroy_range(this->begin(), this->end());
  358|  1.61M|    this->Size = 0;
  359|  1.61M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE18uninitialized_moveIPS5_S8_EEvT_S9_T0_:
  287|  1.61M|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|  1.61M|    uninitialized_copy(I, E, Dest);
  290|  1.61M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE18uninitialized_copyIS5_S5_EEvPT_S9_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSC_12remove_constIS8_E4typeESA_EE5valueEvE4typeE:
  306|  1.61M|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  1.61M|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1.61M, False: 0]
  ------------------
  312|  1.61M|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  1.61M|  }
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EEC2EOS6_:
  899|  1.61M|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  1.61M|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 808k, False: 808k]
  ------------------
  901|   808k|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  1.61M|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEEC2Ej:
  344|  2.83M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EEC2Em:
  279|  2.83M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvEC2Em:
  102|  2.83M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EEC2Ev:
  859|  1.21M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj6EEC2Ev:
  859|  11.4k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj6EED2Ev:
  861|  11.4k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  11.4k|    this->destroy_range(this->begin(), this->end());
  864|  11.4k|  }
_ZN4llvh11SmallVectorIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELj1EEC2Ev:
  859|  23.1k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEEC2Ej:
  344|  23.1k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELb1EEC2Em:
  279|  23.1k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEvEC2Em:
  102|  23.1k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIjLj5EEC2Ev:
  859|  23.1k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIjLj5EEC2EOS1_:
  899|  1.76M|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  1.76M|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 1.76M, False: 0]
  ------------------
  901|  1.76M|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  1.76M|  }
_ZN4llvh11SmallVectorIjLj5EED2Ev:
  861|  2.67M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.67M|    this->destroy_range(this->begin(), this->end());
  864|  2.67M|  }
_ZN4llvh11SmallVectorIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEELj1EED2Ev:
  861|  23.1k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  23.1k|    this->destroy_range(this->begin(), this->end());
  864|  23.1k|  }
_ZN4llvh15SmallVectorImplIPNSt3__16vectorIPN6hermes5regex4NodeENS1_9allocatorIS6_EEEEED2Ev:
  349|  23.1k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  23.1k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 234, False: 22.9k]
  ------------------
  353|    234|      free(this->begin());
  354|  23.1k|  }
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EED2Ev:
  861|  2.83M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.83M|    this->destroy_range(this->begin(), this->end());
  864|  2.83M|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEED2Ev:
  349|  2.83M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  2.83M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 2.83M]
  ------------------
  353|      0|      free(this->begin());
  354|  2.83M|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEE7reserveEm:
  386|   404k|  void reserve(size_type N) {
  387|   404k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 0, False: 404k]
  ------------------
  388|      0|      this->grow(N);
  389|   404k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE9push_backERKS5_:
  320|   404k|  void push_back(const T &Elt) {
  321|   404k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   404k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   404k|    this->set_size(this->size() + 1);
  325|   404k|  }
_ZN4llvh11SmallVectorIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELj4EEaSERKS6_:
  894|   404k|  const SmallVector &operator=(const SmallVector &RHS) {
  895|   404k|    SmallVectorImpl<T>::operator=(RHS);
  896|   404k|    return *this;
  897|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEEaSERKS6_:
  727|   404k|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|   404k|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 404k]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|   404k|  size_t RHSSize = RHS.size();
  734|   404k|  size_t CurSize = this->size();
  735|   404k|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 404k, False: 4]
  ------------------
  736|       |    // Assign common elements.
  737|   404k|    iterator NewEnd;
  738|   404k|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 404k, False: 0]
  ------------------
  739|   404k|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|      0|    else
  741|      0|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|   404k|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|   404k|    this->set_size(RHSSize);
  748|   404k|    return *this;
  749|   404k|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|      4|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 4]
  ------------------
  755|       |    // Destroy current elements.
  756|      0|    this->destroy_range(this->begin(), this->end());
  757|      0|    this->set_size(0);
  758|      0|    CurSize = 0;
  759|      0|    this->grow(RHSSize);
  760|      4|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 4]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|      4|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|      4|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|      4|  this->set_size(RHSSize);
  771|      4|  return *this;
  772|   404k|}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE5beginEv:
  137|  2.42M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEELb1EE18uninitialized_copyIKS5_S5_EEvPT_SA_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSD_12remove_constIS9_E4typeESB_EE5valueEvE4typeE:
  306|      4|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|      4|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 4, False: 0]
  ------------------
  312|      4|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|      4|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE3endEv:
  141|   404k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh15SmallVectorImplIDsE7reserveEm:
  386|    657|  void reserve(size_type N) {
  387|    657|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 159, False: 498]
  ------------------
  388|    159|      this->grow(N);
  389|    657|  }
_ZN4llvh11SmallVectorIcLj32EEC2EmRKc:
  867|    244|    : SmallVectorImpl<T>(N) {
  868|    244|    this->assign(Size, Value);
  869|    244|  }
_ZN4llvh15SmallVectorImplIcEC2Ej:
  344|  3.73M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIcLb1EEC2Em:
  279|  3.73M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIcvEC2Em:
  102|  3.73M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIcE6assignEmRKc:
  433|    244|  void assign(size_type NumElts, const T &Elt) {
  434|    244|    clear();
  435|    244|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 9, False: 235]
  ------------------
  436|      9|      this->grow(NumElts);
  437|    244|    this->set_size(NumElts);
  438|    244|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|    244|  }
_ZN4llvh25SmallVectorTemplateCommonIcvEixEm:
  160|  4.18M|  reference operator[](size_type idx) {
  161|  4.18M|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|  4.18M|  }
_ZN4llvh11SmallVectorIcLj32EED2Ev:
  861|   136k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   136k|    this->destroy_range(this->begin(), this->end());
  864|   136k|  }
_ZN4llvh15SmallVectorImplIcED2Ev:
  349|  3.73M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  3.73M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 219, False: 3.73M]
  ------------------
  353|    219|      free(this->begin());
  354|  3.73M|  }
_ZN4llvh11SmallVectorIcLj32EEC2Ev:
  859|   132k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh25SmallVectorTemplateCommonIcvE4backEv:
  179|  12.3k|  reference back() {
  180|  12.3k|    assert(!empty());
  181|      0|    return end()[-1];
  182|  12.3k|  }
_ZN4llvh11SmallVectorIDsLj64EEC2Ev:
  859|     24|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIDsLj64EED2Ev:
  861|     24|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     24|    this->destroy_range(this->begin(), this->end());
  864|     24|  }
_ZN4llvh11SmallVectorIcLj256EEC2Ev:
  859|  6.90k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj256EED2Ev:
  861|  6.90k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  6.90k|    this->destroy_range(this->begin(), this->end());
  864|  6.90k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE10getFirstElEv:
   93|   459k|  void *getFirstEl() const {
   94|   459k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   459k|        reinterpret_cast<const char *>(this) +
   96|   459k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   459k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE7isSmallEv:
  110|   229k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE5beginEv:
  135|  1.25M|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE10getFirstElEv:
   93|   230k|  void *getFirstEl() const {
   94|   230k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   230k|        reinterpret_cast<const char *>(this) +
   96|   230k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   230k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE5beginEv:
  135|   689k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE10getFirstElEv:
   93|   229k|  void *getFirstEl() const {
   94|   229k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   229k|        reinterpret_cast<const char *>(this) +
   96|   229k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   229k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE5beginEv:
  135|   458k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3sem12FunctionInfo7VarDeclELb1EE13destroy_rangeEPS4_S6_:
  282|   229k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvE3endEv:
  139|   687k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE13destroy_rangeEPS4_S6_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE3endEv:
  139|   346k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree21ImportDeclarationNodeELb1EE13destroy_rangeEPS4_S6_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvE3endEv:
  139|   229k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPvLj0EEC2Ev:
  859|     99|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPvEC2Ej:
  344|     99|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EEC2Em:
  279|     99|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPvvEC2Em:
  102|     99|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPvvE10getFirstElEv:
   93|    399|  void *getFirstEl() const {
   94|    399|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    399|        reinterpret_cast<const char *>(this) +
   96|    399|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    399|  }
_ZN4llvh11SmallVectorIPvLj0EED2Ev:
  861|     99|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     99|    this->destroy_range(this->begin(), this->end());
  864|     99|  }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE13destroy_rangeEPS1_S3_:
  282|     99|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPvvE5beginEv:
  135|    599|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPvvE3endEv:
  139|    401|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPvED2Ev:
  349|     99|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|     99|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 99, False: 0]
  ------------------
  353|     99|      free(this->begin());
  354|     99|  }
_ZNK4llvh25SmallVectorTemplateCommonIPvvE7isSmallEv:
  110|     99|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE9push_backERKS1_:
  320|    302|  void push_back(const T &Elt) {
  321|    302|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    302|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 201, False: 101]
  |  |  ------------------
  ------------------
  322|    201|      this->grow();
  323|    302|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    302|    this->set_size(this->size() + 1);
  325|    302|  }
_ZN4llvh23SmallVectorTemplateBaseIPvLb1EE4growEm:
  317|    201|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPvvE8grow_podEmm:
  104|    201|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    201|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    201|  }
_ZN4llvh15SmallVectorImplIDsE6appendIPKcvEEvT_S5_:
  404|   138k|  void append(in_iter in_start, in_iter in_end) {
  405|   138k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   138k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 16, False: 138k]
  ------------------
  408|     16|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   138k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   138k|    this->set_size(this->size() + NumInputs);
  413|   138k|  }
_ZN4llvh23SmallVectorTemplateBaseIDsLb1EE18uninitialized_copyIPKcPDsEEvT_S6_T0_:
  295|   138k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|   138k|    std::uninitialized_copy(I, E, Dest);
  298|   138k|  }
_ZN4llvh25SmallVectorTemplateCommonIDsvE4dataEv:
  155|  67.1k|  pointer data() { return pointer(begin()); }
_ZN4llvh11SmallVectorIcLj32EEC2IPKcvEET_S5_:
  875|  4.25k|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|  4.25k|    this->append(S, E);
  877|  4.25k|  }
_ZN4llvh15SmallVectorImplIcE7reserveEm:
  386|  12.3k|  void reserve(size_type N) {
  387|  12.3k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 34, False: 12.2k]
  ------------------
  388|     34|      this->grow(N);
  389|  12.3k|  }
_ZN4llvh11SmallVectorIcLj5EEC2Ev:
  859|    234|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj5EED2Ev:
  861|    234|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    234|    this->destroy_range(this->begin(), this->end());
  864|    234|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8OptValueINS1_2vm16RegExpMatchRangeEEEvE5frontEv:
  174|   808k|  const_reference front() const {
  175|   808k|    assert(!empty());
  176|      0|    return begin()[0];
  177|   808k|  }
_ZN4llvh11SmallVectorIPN6hermes2vm6GCCellELj0EEC2Ev:
  859|  6.52k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEEC2Ej:
  344|  6.52k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm6GCCellELb1EEC2Em:
  279|  6.52k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvEC2Em:
  102|  6.52k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvE10getFirstElEv:
   93|  19.4k|  void *getFirstEl() const {
   94|  19.4k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  19.4k|        reinterpret_cast<const char *>(this) +
   96|  19.4k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  19.4k|  }
_ZN4llvh11SmallVectorIPN6hermes2vm6GCCellELj0EED2Ev:
  861|  6.52k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  6.52k|    this->destroy_range(this->begin(), this->end());
  864|  6.52k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm6GCCellELb1EE13destroy_rangeEPS4_S6_:
  282|  6.52k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvE5beginEv:
  135|  26.5k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvE3endEv:
  139|  13.3k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEED2Ev:
  349|  6.52k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  6.52k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 16, False: 6.50k]
  ------------------
  353|     16|      free(this->begin());
  354|  6.52k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvE7isSmallEv:
  110|  12.8k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZSt4swapIPN6hermes2vm6GCCellELj0EEvRN4llvh11SmallVectorIT_XT0_EEES8_:
  944|  6.37k|  swap(llvh::SmallVector<T, N> &LHS, llvh::SmallVector<T, N> &RHS) {
  945|  6.37k|    LHS.swap(RHS);
  946|  6.37k|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEE4swapERS5_:
  688|  6.37k|void SmallVectorImpl<T>::swap(SmallVectorImpl<T> &RHS) {
  689|  6.37k|  if (this == &RHS) return;
  ------------------
  |  Branch (689:7): [True: 0, False: 6.37k]
  ------------------
  690|       |
  691|       |  // We can only avoid copying elements if neither vector is small.
  692|  6.37k|  if (!this->isSmall() && !RHS.isSmall()) {
  ------------------
  |  Branch (692:7): [True: 0, False: 6.37k]
  |  Branch (692:27): [True: 0, False: 0]
  ------------------
  693|      0|    std::swap(this->BeginX, RHS.BeginX);
  694|      0|    std::swap(this->Size, RHS.Size);
  695|      0|    std::swap(this->Capacity, RHS.Capacity);
  696|      0|    return;
  697|      0|  }
  698|  6.37k|  if (RHS.size() > this->capacity())
  ------------------
  |  Branch (698:7): [True: 8, False: 6.36k]
  ------------------
  699|      8|    this->grow(RHS.size());
  700|  6.37k|  if (this->size() > RHS.capacity())
  ------------------
  |  Branch (700:7): [True: 0, False: 6.37k]
  ------------------
  701|      0|    RHS.grow(this->size());
  702|       |
  703|       |  // Swap the shared elements.
  704|  6.37k|  size_t NumShared = this->size();
  705|  6.37k|  if (NumShared > RHS.size()) NumShared = RHS.size();
  ------------------
  |  Branch (705:7): [True: 0, False: 6.37k]
  ------------------
  706|  6.37k|  for (size_type i = 0; i != NumShared; ++i)
  ------------------
  |  Branch (706:25): [True: 0, False: 6.37k]
  ------------------
  707|      0|    std::swap((*this)[i], RHS[i]);
  708|       |
  709|       |  // Copy over the extra elts.
  710|  6.37k|  if (this->size() > RHS.size()) {
  ------------------
  |  Branch (710:7): [True: 0, False: 6.37k]
  ------------------
  711|      0|    size_t EltDiff = this->size() - RHS.size();
  712|      0|    this->uninitialized_copy(this->begin()+NumShared, this->end(), RHS.end());
  713|      0|    RHS.set_size(RHS.size() + EltDiff);
  714|      0|    this->destroy_range(this->begin()+NumShared, this->end());
  715|      0|    this->set_size(NumShared);
  716|  6.37k|  } else if (RHS.size() > this->size()) {
  ------------------
  |  Branch (716:14): [True: 8, False: 6.36k]
  ------------------
  717|      8|    size_t EltDiff = RHS.size() - this->size();
  718|      8|    this->uninitialized_copy(RHS.begin()+NumShared, RHS.end(), this->end());
  719|      8|    this->set_size(this->size() + EltDiff);
  720|      8|    this->destroy_range(RHS.begin()+NumShared, RHS.end());
  721|      8|    RHS.set_size(NumShared);
  722|      8|  }
  723|  6.37k|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm6GCCellELb1EE4growEm:
  317|     16|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes2vm6GCCellEvE8grow_podEmm:
  104|     16|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     16|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     16|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes2vm6GCCellELb1EE18uninitialized_copyIS4_S4_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|    149|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|    149|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 16, False: 133]
  ------------------
  312|     16|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    149|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEE7reserveEm:
  386|  6.37k|  void reserve(size_type N) {
  387|  6.37k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 0, False: 6.37k]
  ------------------
  388|      0|      this->grow(N);
  389|  6.37k|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEE6insertIPS4_vEES7_S7_T_S8_:
  602|    141|  iterator insert(iterator I, ItTy From, ItTy To) {
  603|       |    // Convert iterator to elt# to avoid invalidating iterator when we reserve()
  604|    141|    size_t InsertElt = I - this->begin();
  605|       |
  606|    141|    if (I == this->end()) {  // Important special case for empty vector.
  ------------------
  |  Branch (606:9): [True: 141, False: 0]
  ------------------
  607|    141|      append(From, To);
  608|    141|      return this->begin()+InsertElt;
  609|    141|    }
  610|       |
  611|      0|    assert(I >= this->begin() && "Insertion iterator is out of bounds.");
  612|      0|    assert(I <= this->end() && "Inserting past the end of the vector.");
  613|       |
  614|      0|    size_t NumToInsert = std::distance(From, To);
  615|       |
  616|       |    // Ensure there is enough space.
  617|      0|    reserve(this->size() + NumToInsert);
  618|       |
  619|       |    // Uninvalidate the iterator.
  620|      0|    I = this->begin()+InsertElt;
  621|       |
  622|       |    // If there are more elements between the insertion point and the end of the
  623|       |    // range than there are being inserted, we can use a simple approach to
  624|       |    // insertion.  Since we already reserved space, we know that this won't
  625|       |    // reallocate the vector.
  626|      0|    if (size_t(this->end()-I) >= NumToInsert) {
  ------------------
  |  Branch (626:9): [True: 0, False: 0]
  ------------------
  627|      0|      T *OldEnd = this->end();
  628|      0|      append(std::move_iterator<iterator>(this->end() - NumToInsert),
  629|      0|             std::move_iterator<iterator>(this->end()));
  630|       |
  631|       |      // Copy the existing elements that get replaced.
  632|      0|      std::move_backward(I, OldEnd-NumToInsert, OldEnd);
  633|       |
  634|      0|      std::copy(From, To, I);
  635|      0|      return I;
  636|      0|    }
  637|       |
  638|       |    // Otherwise, we're inserting more elements than exist already, and we're
  639|       |    // not inserting at the end.
  640|       |
  641|       |    // Move over the elements that we're about to overwrite.
  642|      0|    T *OldEnd = this->end();
  643|      0|    this->set_size(this->size() + NumToInsert);
  644|      0|    size_t NumOverwritten = OldEnd-I;
  645|      0|    this->uninitialized_move(I, OldEnd, this->end()-NumOverwritten);
  646|       |
  647|       |    // Replace the overwritten part.
  648|      0|    for (T *J = I; NumOverwritten > 0; --NumOverwritten) {
  ------------------
  |  Branch (648:20): [True: 0, False: 0]
  ------------------
  649|      0|      *J = *From;
  650|      0|      ++J; ++From;
  651|      0|    }
  652|       |
  653|       |    // Insert the non-overwritten middle part.
  654|      0|    this->uninitialized_copy(From, To, OldEnd);
  655|      0|    return I;
  656|      0|  }
_ZN4llvh15SmallVectorImplIPN6hermes2vm6GCCellEE6appendIPS4_vEEvT_S8_:
  404|    141|  void append(in_iter in_start, in_iter in_end) {
  405|    141|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    141|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 8, False: 133]
  ------------------
  408|      8|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    141|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    141|    this->set_size(this->size() + NumInputs);
  413|    141|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE5beginEv:
  137|     48|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIcLj16EEC2Ev:
  859|  3.58M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj16EED2Ev:
  861|  3.58M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  3.58M|    this->destroy_range(this->begin(), this->end());
  864|  3.58M|  }
_ZN4llvh11SmallVectorIPN6hermes8FunctionELj8EEC2Ev:
  859|     56|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes8FunctionEEC2Ej:
  344|     56|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EEC2Em:
  279|     56|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvEC2Em:
  102|     56|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE10getFirstElEv:
   93|    177|  void *getFirstEl() const {
   94|    177|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    177|        reinterpret_cast<const char *>(this) +
   96|    177|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    177|  }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj8EEC2Ev:
  859|  35.2k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes7LiteralEEC2Ej:
  344|  35.2k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EEC2Em:
  279|  35.2k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvEC2Em:
  102|  35.2k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE10getFirstElEv:
   93|  70.8k|  void *getFirstEl() const {
   94|  70.8k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  70.8k|        reinterpret_cast<const char *>(this) +
   96|  70.8k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  70.8k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE9push_backERKS3_:
  320|   702k|  void push_back(const T &Elt) {
  321|   702k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   702k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 342, False: 702k]
  |  |  ------------------
  ------------------
  322|    342|      this->grow();
  323|   702k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   702k|    this->set_size(this->size() + 1);
  325|   702k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE4growEm:
  317|    342|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE8grow_podEmm:
  104|    342|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    342|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    342|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE3endEv:
  139|   738k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE5beginEv:
  135|   773k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE4dataEv:
  157|  35.2k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE5beginEv:
  137|  35.2k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj8EED2Ev:
  861|  35.2k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  35.2k|    this->destroy_range(this->begin(), this->end());
  864|  35.2k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7LiteralELb1EE13destroy_rangeEPS3_S5_:
  282|  35.2k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes7LiteralEED2Ev:
  349|  35.2k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  35.2k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 73, False: 35.2k]
  ------------------
  353|     73|      free(this->begin());
  354|  35.2k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7LiteralEvE7isSmallEv:
  110|  35.2k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj32EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIN6hermes8IntervalELj32EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes8IntervalEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EEC2Em:
  194|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIN6hermes8IntervalELj32EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE13destroy_rangeEPS2_S4_:
  196|   114k|  static void destroy_range(T *S, T *E) {
  197|  1.47M|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 1.35M, False: 114k]
  ------------------
  198|  1.35M|      --E;
  199|  1.35M|      E->~T();
  200|  1.35M|    }
  201|   114k|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EED2Ev:
  861|  2.45M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.45M|    this->destroy_range(this->begin(), this->end());
  864|  2.45M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE13destroy_rangeEPS2_S4_:
  282|  2.99M|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE5beginEv:
  135|  11.3M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE3endEv:
  139|  5.66M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEED2Ev:
  349|  2.45M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  2.45M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 2.45M]
  ------------------
  353|      0|      free(this->begin());
  354|  2.45M|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE7isSmallEv:
  110|  2.99M|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE10getFirstElEv:
   93|  5.44M|  void *getFirstEl() const {
   94|  5.44M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  5.44M|        reinterpret_cast<const char *>(this) +
   96|  5.44M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  5.44M|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE5beginEv:
  135|  49.1M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE3endEv:
  139|   661k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8IntervalEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 39, False: 114k]
  ------------------
  353|     39|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj32EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEED2Ev:
  349|  3.95M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  3.95M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 73.6k, False: 3.88M]
  ------------------
  353|  73.6k|      free(this->begin());
  354|  3.95M|  }
_ZN4llvh11SmallVectorIN6hermes3hbc7HBCISel10RelocationELj8EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3hbc7HBCISel10RelocationEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EED2Ev:
  861|    230|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    230|    this->destroy_range(this->begin(), this->end());
  864|    230|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEED2Ev:
  349|   343k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   343k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 16, False: 343k]
  ------------------
  353|     16|      free(this->begin());
  354|   343k|  }
_ZN4llvh11SmallVectorIN6hermes3hbc7HBCISel10RelocationELj8EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE13destroy_rangeEPS4_S6_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE5beginEv:
  135|  1.95M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE3endEv:
  139|  1.49M|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes3hbc7HBCISel10RelocationEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 123, False: 114k]
  ------------------
  353|    123|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes8FunctionELj8EED2Ev:
  861|     56|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     56|    this->destroy_range(this->begin(), this->end());
  864|     56|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE13destroy_rangeEPS3_S5_:
  282|     56|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE5beginEv:
  135|   114k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE3endEv:
  139|   114k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes8FunctionEED2Ev:
  349|     56|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|     56|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 7, False: 49]
  ------------------
  353|      7|      free(this->begin());
  354|     56|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE7isSmallEv:
  110|     56|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj16EEC2INSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEEvEET_SC_:
  875|   342k|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|   342k|    this->append(S, E);
  877|   342k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEC2Ej:
  344|   343k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EEC2Em:
  279|   343k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEC2Em:
  102|   343k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendINSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEEvEEvT_SC_:
  404|   342k|  void append(in_iter in_start, in_iter in_end) {
  405|   342k|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|   342k|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 14, False: 342k]
  ------------------
  408|     14|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|   342k|    this->uninitialized_copy(in_start, in_end, this->end());
  412|   342k|    this->set_size(this->size() + NumInputs);
  413|   342k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE4growEm:
  317|     18|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE8grow_podEmm:
  104|     18|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     18|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     18|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyINSt3__116reverse_iteratorINS6_11__wrap_iterIPS3_EEEES9_EEvT_SC_T0_:
  295|   342k|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|   342k|    std::uninitialized_copy(I, E, Dest);
  298|   342k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj16EED2Ev:
  861|   342k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   342k|    this->destroy_range(this->begin(), this->end());
  864|   342k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE4dataEv:
  157|   228k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5beginEv:
  137|   228k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE5clearEv:
  356|    110|  void clear() {
  357|    110|    this->destroy_range(this->begin(), this->end());
  358|    110|    this->Size = 0;
  359|    110|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE5beginEv:
  137|   270M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvE3endEv:
  141|  90.2M|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE9push_backERKS2_:
  320|   547k|  void push_back(const T &Elt) {
  321|   547k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   547k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 547k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   547k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   547k|    this->set_size(this->size() + 1);
  325|   547k|  }
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEEaSEOS3_:
  775|   547k|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|   547k|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 547k]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|   547k|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 547k]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|   547k|  size_t RHSSize = RHS.size();
  793|   547k|  size_t CurSize = this->size();
  794|   547k|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 547k]
  ------------------
  795|       |    // Assign common elements.
  796|      0|    iterator NewEnd = this->begin();
  797|      0|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 0]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      0|    this->destroy_range(NewEnd, this->end());
  802|      0|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      0|    RHS.clear();
  806|       |
  807|      0|    return *this;
  808|      0|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|   547k|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 547k]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|   547k|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 547k]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|   547k|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|   547k|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|   547k|  this->set_size(RHSSize);
  831|       |
  832|   547k|  RHS.clear();
  833|   547k|  return *this;
  834|   547k|}
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEE5clearEv:
  356|   547k|  void clear() {
  357|   547k|    this->destroy_range(this->begin(), this->end());
  358|   547k|    this->Size = 0;
  359|   547k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  287|   547k|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|   547k|    uninitialized_copy(I, E, Dest);
  290|   547k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EE18uninitialized_copyIS2_S2_EEvPT_S6_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS9_12remove_constIS5_E4typeES7_EE5valueEvE4typeE:
  306|   547k|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|   547k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 547k, False: 0]
  ------------------
  312|   547k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|   547k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvEixEm:
  165|  90.2M|  const_reference operator[](size_type idx) const {
  166|  90.2M|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|  90.2M|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2Ev:
  859|     58|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEaSEOS4_:
  909|     12|  const SmallVector &operator=(SmallVector &&RHS) {
  910|     12|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|     12|    return *this;
  912|     12|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEaSEOS4_:
  775|    106|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|    106|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 106]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|    106|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 106]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|    106|  size_t RHSSize = RHS.size();
  793|    106|  size_t CurSize = this->size();
  794|    106|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 12, False: 94]
  ------------------
  795|       |    // Assign common elements.
  796|     12|    iterator NewEnd = this->begin();
  797|     12|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 12]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|     12|    this->destroy_range(NewEnd, this->end());
  802|     12|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|     12|    RHS.clear();
  806|       |
  807|     12|    return *this;
  808|     12|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|     94|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 94]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|     94|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 94]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|     94|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|     94|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|     94|  this->set_size(RHSSize);
  831|       |
  832|     94|  RHS.clear();
  833|     94|  return *this;
  834|    106|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_moveIPS3_S6_EEvT_S7_T0_:
  287|     94|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|     94|    uninitialized_copy(I, E, Dest);
  290|     94|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyIS3_S3_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|     94|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|     94|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 94, False: 0]
  ------------------
  312|     94|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|     94|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE9push_backERKS4_:
  320|  1.04M|  void push_back(const T &Elt) {
  321|  1.04M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.04M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 565, False: 1.04M]
  |  |  ------------------
  ------------------
  322|    565|      this->grow();
  323|  1.04M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.04M|    this->set_size(this->size() + 1);
  325|  1.04M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc7HBCISel10RelocationELb1EE4growEm:
  317|    565|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc7HBCISel10RelocationEvE8grow_podEmm:
  104|    565|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    565|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    565|  }
_ZN4llvh11SmallVectorIN6hermes20ExceptionHandlerInfoELj4EED2Ev:
  861|      4|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      4|    this->destroy_range(this->begin(), this->end());
  864|      4|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE13destroy_rangeEPS2_S4_:
  282|      6|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEED2Ev:
  349|      4|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|      4|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 4]
  ------------------
  353|      0|      free(this->begin());
  354|      4|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE7isSmallEv:
  110|      6|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE10getFirstElEv:
   93|     10|  void *getFirstEl() const {
   94|     10|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     10|        reinterpret_cast<const char *>(this) +
   96|     10|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     10|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE5beginEv:
  135|     32|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvE3endEv:
  139|     18|  iterator end() { return begin() + size(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE5beginEv:
  137|   481k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8VariableEvE3endEv:
  141|   240k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE5frontEv:
  170|   114k|  reference front() {
  171|   114k|    assert(!empty());
  172|      0|    return begin()[0];
  173|   114k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEixEm:
  160|   193k|  reference operator[](size_type idx) {
  161|   193k|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|   193k|  }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEC2Ev:
  859|    112|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3hbc15DebugFileRegionEEC2Ej:
  344|    168|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EEC2Em:
  279|    168|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvEC2Em:
  102|    168|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE9push_backERKS3_:
  320|   114k|  void push_back(const T &Elt) {
  321|   114k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 65, False: 114k]
  |  |  ------------------
  ------------------
  322|     65|      this->grow();
  323|   114k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   114k|    this->set_size(this->size() + 1);
  325|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes8FunctionELb1EE4growEm:
  317|     65|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE8grow_podEmm:
  104|     65|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     65|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     65|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE4dataEv:
  157|    112|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes8FunctionEvE5beginEv:
  137|    112|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorIN6hermes3hbc15DebugFileRegionELj1EEC2EOS4_:
  899|     56|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|     56|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 56, False: 0]
  ------------------
  901|     56|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|     56|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3hbc15DebugFileRegionELb1EE9push_backERKS3_:
  320|     56|  void push_back(const T &Elt) {
  321|     56|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     56|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 56]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|     56|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     56|    this->set_size(this->size() + 1);
  325|     56|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree21ImportDeclarationNodeELj2EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree21ImportDeclarationNodeEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 114k]
  ------------------
  353|      0|      free(this->begin());
  354|   114k|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj2EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree23FunctionDeclarationNodeEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 58, False: 114k]
  ------------------
  353|     58|      free(this->begin());
  354|   114k|  }
_ZN4llvh11SmallVectorIN6hermes3sem12FunctionInfo7VarDeclELj4EED2Ev:
  861|   229k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   229k|    this->destroy_range(this->begin(), this->end());
  864|   229k|  }
_ZN4llvh15SmallVectorImplIN6hermes3sem12FunctionInfo7VarDeclEED2Ev:
  349|   229k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   229k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 229k]
  ------------------
  353|      0|      free(this->begin());
  354|   229k|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIvPDoFvPvEEELj0EEC2Ev:
  859|  1.07k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIvPDoFvPvEEEEC2Ej:
  344|  1.07k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIvPDoFvPvEEELb0EEC2Em:
  194|  1.07k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIvPDoFvPvEEEvEC2Em:
  102|  1.07k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELj4EED2Ev:
  861|     99|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     99|    this->destroy_range(this->begin(), this->end());
  864|     99|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EED2Ev:
  861|  3.37k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  3.37k|    this->destroy_range(this->begin(), this->end());
  864|  3.37k|  }
_ZN4llvh11SmallVectorIcLj24EED2Ev:
  861|     22|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     22|    this->destroy_range(this->begin(), this->end());
  864|     22|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEED2Ev:
  349|  3.37k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  3.37k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 3.37k]
  ------------------
  353|      0|      free(this->begin());
  354|  3.37k|  }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEED2Ev:
  349|     99|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|     99|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 99]
  ------------------
  353|      0|      free(this->begin());
  354|     99|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIvPDoFvPvEEELj0EED2Ev:
  861|  1.07k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.07k|    this->destroy_range(this->begin(), this->end());
  864|  1.07k|  }
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIvPDoFvPvEEEED2Ev:
  349|  1.07k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  1.07k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 12, False: 1.06k]
  ------------------
  353|     12|      free(this->begin());
  354|  1.07k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvEixEm:
  165|     48|  const_reference operator[](size_type idx) const {
  166|     48|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|     48|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3hbc15DebugFileRegionEvE4backEv:
  179|   114k|  reference back() {
  180|   114k|    assert(!empty());
  181|      0|    return end()[-1];
  182|   114k|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj16EEC2Ev:
  859|      2|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj16EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj8EEC2Ev:
  859|   496k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj8EED2Ev:
  861|   496k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   496k|    this->destroy_range(this->begin(), this->end());
  864|   496k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EED2Ev:
  861|      4|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      4|    this->destroy_range(this->begin(), this->end());
  864|      4|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj4EEC2Ev:
  859|  2.85k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj4EED2Ev:
  861|  2.85k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.85k|    this->destroy_range(this->begin(), this->end());
  864|  2.85k|  }
_ZN4llvh15SmallVectorImplIPN6hermes11InstructionEE5clearEv:
  356|      2|  void clear() {
  357|      2|    this->destroy_range(this->begin(), this->end());
  358|      2|    this->Size = 0;
  359|      2|  }
_ZN4llvh11SmallVectorIPN6hermes21HBCReifyArgumentsInstELj4EEC2Ev:
  859|      2|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes21HBCReifyArgumentsInstEEC2Ej:
  344|      2|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EEC2Em:
  279|      2|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvEC2Em:
  102|      2|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE10getFirstElEv:
   93|      4|  void *getFirstEl() const {
   94|      4|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|      4|        reinterpret_cast<const char *>(this) +
   96|      4|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|      4|  }
_ZN4llvh11SmallVectorIPN6hermes21HBCReifyArgumentsInstELj4EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EE13destroy_rangeEPS3_S5_:
  282|      2|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes21HBCReifyArgumentsInstEED2Ev:
  349|      2|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|      2|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 2]
  ------------------
  353|      0|      free(this->begin());
  354|      2|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE7isSmallEv:
  110|      2|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE5beginEv:
  135|     10|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes21HBCReifyArgumentsInstEvE3endEv:
  139|      6|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes21HBCReifyArgumentsInstELb1EE9push_backERKS3_:
  320|      2|  void push_back(const T &Elt) {
  321|      2|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|      2|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|      2|    this->set_size(this->size() + 1);
  325|      2|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj8EEC2Ev:
  859|     34|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEEC2Ej:
  344|   215k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EEC2Em:
  279|   215k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEC2Em:
  102|   215k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE10getFirstElEv:
   93|   430k|  void *getFirstEl() const {
   94|   430k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   430k|        reinterpret_cast<const char *>(this) +
   96|   430k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   430k|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj8EED2Ev:
  861|     34|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     34|    this->destroy_range(this->begin(), this->end());
  864|     34|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE13destroy_rangeEPS3_S5_:
  282|   215k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEED2Ev:
  349|   215k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   215k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 339, False: 214k]
  ------------------
  353|    339|      free(this->begin());
  354|   215k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE7isSmallEv:
  110|   215k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE9push_backERKS3_:
  320|   744k|  void push_back(const T &Elt) {
  321|   744k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   744k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 540, False: 743k]
  |  |  ------------------
  ------------------
  322|    540|      this->grow();
  323|   744k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   744k|    this->set_size(this->size() + 1);
  325|   744k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE4growEm:
  317|    574|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE8grow_podEmm:
  104|    574|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    574|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    574|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE4dataEv:
  157|   114k|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE5beginEv:
  137|   195k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELj2EEC2Ev:
  859|      5|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEEC2Ej:
  344|      5|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EEC2Em:
  279|      5|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvEC2Em:
  102|      5|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE10getFirstElEv:
   93|     10|  void *getFirstEl() const {
   94|     10|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|     10|        reinterpret_cast<const char *>(this) +
   96|     10|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|     10|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELj2EED2Ev:
  861|      5|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      5|    this->destroy_range(this->begin(), this->end());
  864|      5|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EE13destroy_rangeEPS7_S9_:
  282|   141k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEED2Ev:
  349|      5|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|      5|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 5]
  ------------------
  353|      0|      free(this->begin());
  354|      5|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE7isSmallEv:
  110|      5|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEE5clearEv:
  356|   141k|  void clear() {
  357|   141k|    this->destroy_range(this->begin(), this->end());
  358|   141k|    this->Size = 0;
  359|   141k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEELb1EE9push_backERKS7_:
  320|  2.85k|  void push_back(const T &Elt) {
  321|  2.85k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.85k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.85k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  2.85k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.85k|    this->set_size(this->size() + 1);
  325|  2.85k|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE5beginEv:
  135|   291k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes11InstructionENS3_8RegisterEEEvE3endEv:
  139|   147k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes10SwitchInstELj4EEC2Ev:
  859|   228k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes10SwitchInstEEC2Ej:
  344|   228k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10SwitchInstELb1EEC2Em:
  279|   228k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvEC2Em:
  102|   228k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE10getFirstElEv:
   93|   456k|  void *getFirstEl() const {
   94|   456k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   456k|        reinterpret_cast<const char *>(this) +
   96|   456k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   456k|  }
_ZN4llvh11SmallVectorIPN6hermes10SwitchInstELj4EED2Ev:
  861|   228k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   228k|    this->destroy_range(this->begin(), this->end());
  864|   228k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10SwitchInstELb1EE13destroy_rangeEPS3_S5_:
  282|   228k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes10SwitchInstEED2Ev:
  349|   228k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   228k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 228k]
  ------------------
  353|      0|      free(this->begin());
  354|   228k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE7isSmallEv:
  110|   228k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE5beginEv:
  135|   913k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10SwitchInstEvE3endEv:
  139|   456k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE9push_backERKS3_:
  320|  39.7k|  void push_back(const T &Elt) {
  321|  39.7k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  39.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 39.7k]
  |  |  ------------------
  ------------------
  322|      4|      this->grow();
  323|  39.7k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  39.7k|    this->set_size(this->size() + 1);
  325|  39.7k|  }
_ZN4llvh11SmallVectorIjLj32EED2Ev:
  861|  2.88M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.88M|    this->destroy_range(this->begin(), this->end());
  864|  2.88M|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEC2Ev:
  859|  1.09M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes7SegmentEEC2Ej:
  344|  2.45M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes7SegmentELb1EEC2Em:
  279|  2.45M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes7SegmentEvEC2Em:
  102|  2.45M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEaSEOS3_:
  909|   547k|  const SmallVector &operator=(SmallVector &&RHS) {
  910|   547k|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|   547k|    return *this;
  912|   547k|  }
_ZN4llvh11SmallVectorIPN6hermes11InstructionELj2EED2Ev:
  861|  3.34M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  3.34M|    this->destroy_range(this->begin(), this->end());
  864|  3.34M|  }
_ZN4llvh11SmallVectorIPN6hermes7PhiInstELj8EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes7PhiInstEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIPN6hermes7PhiInstELj8EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes7PhiInstEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 2, False: 114k]
  ------------------
  353|      2|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE9push_backERKS3_:
  320|     34|  void push_back(const T &Elt) {
  321|     34|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     34|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 32]
  |  |  ------------------
  ------------------
  322|      2|      this->grow();
  323|     34|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     34|    this->set_size(this->size() + 1);
  325|     34|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes7PhiInstELb1EE4growEm:
  317|      2|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE8grow_podEmm:
  104|      2|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      2|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      2|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE5beginEv:
  135|   685k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes7PhiInstEvE3endEv:
  139|   342k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8IntervalEvEixEm:
  160|  48.3M|  reference operator[](size_type idx) {
  161|  48.3M|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|  48.3M|  }
_ZN4llvh11SmallVectorIN6hermes8RegisterELj16EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIN6hermes8RegisterELj16EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE13destroy_rangeEPS2_S4_:
  282|   267k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 5, False: 114k]
  ------------------
  353|      5|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE9push_backERKS2_:
  320|   333k|  void push_back(const T &Elt) {
  321|   333k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   333k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 13, False: 333k]
  |  |  ------------------
  ------------------
  322|     13|      this->grow();
  323|   333k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   333k|    this->set_size(this->size() + 1);
  325|   333k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8RegisterELb1EE4growEm:
  317|     13|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE8grow_podEmm:
  104|     13|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     13|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     13|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE5beginEv:
  135|  1.17M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes8RegisterEvE3endEv:
  139|   754k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes8RegisterEE5clearEv:
  356|   153k|  void clear() {
  357|   153k|    this->destroy_range(this->begin(), this->end());
  358|   153k|    this->Size = 0;
  359|   153k|  }
_ZN4llvh11SmallVectorIjLj32EEC2Ev:
  859|  2.88M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvEixEm:
  160|  5.47M|  reference operator[](size_type idx) {
  161|  5.47M|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|  5.47M|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE9push_backEOS2_:
  231|   547k|  void push_back(T &&Elt) {
  232|   547k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   547k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 301, False: 546k]
  |  |  ------------------
  ------------------
  233|    301|      this->grow();
  234|   547k|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|   547k|    this->set_size(this->size() + 1);
  236|   547k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE4growEm:
  246|    301|void SmallVectorTemplateBase<T, isPodLike>::grow(size_t MinSize) {
  247|       |  // Always grow, even from zero.
  248|    301|  constexpr size_t MinGrowth = 2;
  249|    301|  size_t NewCapacity = size_t(NextPowerOf2(this->capacity() + MinGrowth));
  250|    301|  NewCapacity = static_cast<unsigned>(std::max(NewCapacity, MinSize));
  251|       |  // Ensure that NewCapacity did not overflow an unsigned int,
  252|       |  // and that the capacity in bytes will not overflow a size_t.
  253|    301|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (253:7): [True: 0, False: 301]
  ------------------
  254|    301|      NewCapacity < MinSize ||
  ------------------
  |  Branch (254:7): [True: 0, False: 301]
  ------------------
  255|    301|      NewCapacity > size_t(-1) / sizeof(T))
  ------------------
  |  Branch (255:7): [True: 0, False: 301]
  ------------------
  256|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
  257|    301|  T *NewElts = static_cast<T*>(llvh::safe_malloc(NewCapacity*sizeof(T)));
  258|       |
  259|       |  // Move the elements over.
  260|    301|  this->uninitialized_move(this->begin(), this->end(), NewElts);
  261|       |
  262|       |  // Destroy the original elements.
  263|    301|  destroy_range(this->begin(), this->end());
  264|       |
  265|       |  // If this wasn't grown from the inline copy, deallocate the old space.
  266|    301|  if (!this->isSmall())
  ------------------
  |  Branch (266:7): [True: 262, False: 39]
  ------------------
  267|    262|    free(this->begin());
  268|       |
  269|    301|  this->BeginX = NewElts;
  270|    301|  this->Capacity = NewCapacity;
  271|    301|}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes8IntervalELb0EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  206|    301|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  207|    301|    std::uninitialized_copy(std::make_move_iterator(I),
  208|    301|                            std::make_move_iterator(E), Dest);
  209|    301|  }
_ZN4llvh11SmallVectorIN6hermes7SegmentELj2EEC2EOS3_:
  899|  1.35M|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  1.35M|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 0, False: 1.35M]
  ------------------
  901|      0|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  1.35M|  }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EEC2Ev:
  859|   147k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EED2Ev:
  861|   214k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   214k|    this->destroy_range(this->begin(), this->end());
  864|   214k|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj4EEC2Ev:
  859|     14|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj4EED2Ev:
  861|     14|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     14|    this->destroy_range(this->begin(), this->end());
  864|     14|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE4backEv:
  179|  39.4k|  reference back() {
  180|  39.4k|    assert(!empty());
  181|      0|    return end()[-1];
  182|  39.4k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE8pop_backEv:
  327|  39.4k|  void pop_back() { this->set_size(this->size() - 1); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvE3endEv:
  141|     12|  const_iterator end() const { return begin() + size(); }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes7LiteralES5_EELj4EEC2Ev:
  859|    880|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes7LiteralES5_EEEC2Ej:
  344|  1.76k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes7LiteralES5_EELb1EEC2Em:
  279|  1.76k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvEC2Em:
  102|  1.76k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE10getFirstElEv:
   93|  3.52k|  void *getFirstEl() const {
   94|  3.52k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  3.52k|        reinterpret_cast<const char *>(this) +
   96|  3.52k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  3.52k|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes7LiteralES5_EELj4EED2Ev:
  861|  1.76k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  1.76k|    this->destroy_range(this->begin(), this->end());
  864|  1.76k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes7LiteralES5_EELb1EE13destroy_rangeEPS6_S8_:
  282|  1.76k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE5beginEv:
  135|  6.21k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE3endEv:
  139|  3.57k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes7LiteralES5_EEED2Ev:
  349|  1.76k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  1.76k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 1.76k]
  ------------------
  353|      0|      free(this->begin());
  354|  1.76k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE7isSmallEv:
  110|  1.76k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes7LiteralES5_EELb1EE9push_backERKS6_:
  320|  1.81k|  void push_back(const T &Elt) {
  321|  1.81k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.81k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.81k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  1.81k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.81k|    this->set_size(this->size() + 1);
  325|  1.81k|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes7LiteralES5_EELj4EEC2ERKS7_:
  889|    880|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|    880|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 880, False: 0]
  ------------------
  891|    880|      SmallVectorImpl<T>::operator=(RHS);
  892|    880|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes7LiteralES5_EEEaSERKS7_:
  727|    880|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|    880|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 880]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|    880|  size_t RHSSize = RHS.size();
  734|    880|  size_t CurSize = this->size();
  735|    880|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 880]
  ------------------
  736|       |    // Assign common elements.
  737|      0|    iterator NewEnd;
  738|      0|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 0]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|      0|    else
  741|      0|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|      0|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|      0|    this->set_size(RHSSize);
  748|      0|    return *this;
  749|      0|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|    880|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 880]
  ------------------
  755|       |    // Destroy current elements.
  756|      0|    this->destroy_range(this->begin(), this->end());
  757|      0|    this->set_size(0);
  758|      0|    CurSize = 0;
  759|      0|    this->grow(RHSSize);
  760|    880|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 880]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|    880|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|    880|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|    880|  this->set_size(RHSSize);
  771|    880|  return *this;
  772|    880|}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes7LiteralES5_EELb1EE18uninitialized_copyIKS6_S6_EEvPT_SB_PT0_PNS1_9enable_ifIXsr3std7is_sameINS1_12remove_constISA_E4typeESC_EE5valueEvE4typeE:
  306|    880|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|    880|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 880, False: 0]
  ------------------
  312|    880|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|    880|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes7LiteralES5_EEvE3endEv:
  141|    880|  const_iterator end() const { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes22AllocObjectLiteralInstELj4EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes22AllocObjectLiteralInstEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes22AllocObjectLiteralInstELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes22AllocObjectLiteralInstEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes22AllocObjectLiteralInstEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIPN6hermes22AllocObjectLiteralInstELj4EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes22AllocObjectLiteralInstELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes22AllocObjectLiteralInstEvE5beginEv:
  135|   228k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes22AllocObjectLiteralInstEvE3endEv:
  139|   114k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes22AllocObjectLiteralInstEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 114k]
  ------------------
  353|      0|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes22AllocObjectLiteralInstEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2ERKS4_:
  889|     12|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|     12|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 12, False: 0]
  ------------------
  891|     12|      SmallVectorImpl<T>::operator=(RHS);
  892|     12|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEEaSERKS4_:
  727|     12|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|     12|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 12]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|     12|  size_t RHSSize = RHS.size();
  734|     12|  size_t CurSize = this->size();
  735|     12|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 12]
  ------------------
  736|       |    // Assign common elements.
  737|      0|    iterator NewEnd;
  738|      0|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 0]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|      0|    else
  741|      0|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|      0|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|      0|    this->set_size(RHSSize);
  748|      0|    return *this;
  749|      0|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|     12|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 12]
  ------------------
  755|       |    // Destroy current elements.
  756|      0|    this->destroy_range(this->begin(), this->end());
  757|      0|    this->set_size(0);
  758|      0|    CurSize = 0;
  759|      0|    this->grow(RHSSize);
  760|     12|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 12]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|     12|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|     12|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|     12|  this->set_size(RHSSize);
  771|     12|  return *this;
  772|     12|}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyIKS3_S3_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|     14|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|     14|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 14, False: 0]
  ------------------
  312|     14|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|     14|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE12pop_back_valEv:
  391|  39.4k|  LLVM_NODISCARD T pop_back_val() {
  392|  39.4k|    T Result = ::std::move(this->back());
  393|  39.4k|    this->pop_back();
  394|  39.4k|    return Result;
  395|  39.4k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE5beginEv:
  135|  78.6k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE3endEv:
  139|  39.3k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE9push_backERKS3_:
  320|     12|  void push_back(const T &Elt) {
  321|     12|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     12|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|     12|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|     12|    this->set_size(this->size() + 1);
  325|     12|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE10getFirstElEv:
   93|      4|  void *getFirstEl() const {
   94|      4|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|      4|        reinterpret_cast<const char *>(this) +
   96|      4|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|      4|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE8pop_backEv:
  327|     12|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes9CatchInstELj4EEC2Ev:
  859|      2|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9CatchInstEEC2Ej:
  344|      2|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EEC2Em:
  279|      2|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvEC2Em:
  102|      2|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes9CatchInstELj4EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9CatchInstELb1EE13destroy_rangeEPS3_S5_:
  282|      2|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes9CatchInstEED2Ev:
  349|      2|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|      2|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 2]
  ------------------
  353|      0|      free(this->begin());
  354|      2|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9CatchInstEvE7isSmallEv:
  110|      2|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes20ExceptionHandlerInfoELj4EEC2Ev:
  859|      2|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEEC2Ej:
  344|      4|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EEC2Em:
  279|      4|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes20ExceptionHandlerInfoEvEC2Em:
  102|      4|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorINSt3__14pairIjjEELj4EEC2Ev:
  859|    260|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEEC2Ej:
  344|    260|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EEC2Em:
  279|    260|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvEC2Em:
  102|    260|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE10getFirstElEv:
   93|    520|  void *getFirstEl() const {
   94|    520|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    520|        reinterpret_cast<const char *>(this) +
   96|    520|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    520|  }
_ZN4llvh11SmallVectorINSt3__14pairIjjEELj4EED2Ev:
  861|    260|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    260|    this->destroy_range(this->begin(), this->end());
  864|    260|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EE13destroy_rangeEPS3_S5_:
  282|    266|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEED2Ev:
  349|    260|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    260|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 260]
  ------------------
  353|      0|      free(this->begin());
  354|    260|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE7isSmallEv:
  110|    260|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIjjEELb1EE9push_backERKS3_:
  320|    186|  void push_back(const T &Elt) {
  321|    186|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    186|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 186]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|    186|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|    186|    this->set_size(this->size() + 1);
  325|    186|  }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE5beginEv:
  135|    808|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE3endEv:
  139|    488|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvEixEm:
  160|     18|  reference operator[](size_type idx) {
  161|     18|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|     18|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIjjEEE6resizeEm:
  361|     12|  void resize(size_type N) {
  362|     12|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 6, False: 6]
  ------------------
  363|      6|      this->destroy_range(this->begin()+N, this->end());
  364|      6|      this->set_size(N);
  365|      6|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 0, False: 6]
  ------------------
  366|      0|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 0, False: 0]
  ------------------
  367|      0|        this->grow(N);
  368|      0|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 0, False: 0]
  ------------------
  369|      0|        new (&*I) T();
  370|      0|      this->set_size(N);
  371|      0|    }
  372|     12|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE9push_backERKS2_:
  320|      6|  void push_back(const T &Elt) {
  321|      6|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|      6|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 6]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|      6|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|      6|    this->set_size(this->size() + 1);
  325|      6|  }
_ZN4llvh11SmallVectorIN6hermes20ExceptionHandlerInfoELj4EEC2EOS3_:
  899|      2|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|      2|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 2, False: 0]
  ------------------
  901|      2|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|      2|  }
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEEaSEOS3_:
  775|      2|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|      2|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 2]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|      2|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 2]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|      2|  size_t RHSSize = RHS.size();
  793|      2|  size_t CurSize = this->size();
  794|      2|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 0, False: 2]
  ------------------
  795|       |    // Assign common elements.
  796|      0|    iterator NewEnd = this->begin();
  797|      0|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 0]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|      0|    this->destroy_range(NewEnd, this->end());
  802|      0|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|      0|    RHS.clear();
  806|       |
  807|      0|    return *this;
  808|      0|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|      2|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 2]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|      2|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 2]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|      2|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|      2|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|      2|  this->set_size(RHSSize);
  831|       |
  832|      2|  RHS.clear();
  833|      2|  return *this;
  834|      2|}
_ZN4llvh15SmallVectorImplIN6hermes20ExceptionHandlerInfoEE5clearEv:
  356|      2|  void clear() {
  357|      2|    this->destroy_range(this->begin(), this->end());
  358|      2|    this->Size = 0;
  359|      2|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  287|      2|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  288|       |    // Just do a copy.
  289|      2|    uninitialized_copy(I, E, Dest);
  290|      2|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes20ExceptionHandlerInfoELb1EE18uninitialized_copyIS2_S2_EEvPT_S6_PT0_PNSt3__19enable_ifIXsr3std7is_sameINS9_12remove_constIS5_E4typeES7_EE5valueEvE4typeE:
  306|      2|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|      2|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 2, False: 0]
  ------------------
  312|      2|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|      2|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvEixEm:
  160|  39.2k|  reference operator[](size_type idx) {
  161|  39.2k|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|  39.2k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE5beginEv:
  135|   267k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIPN6hermes6ESTree22VariableDeclaratorNodeELj8EEC2Ev:
  859|     56|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree22VariableDeclaratorNodeEEC2Ej:
  344|     56|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EEC2Em:
  279|     56|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvEC2Em:
  102|     56|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE10getFirstElEv:
   93|    224|  void *getFirstEl() const {
   94|    224|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    224|        reinterpret_cast<const char *>(this) +
   96|    224|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    224|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj8EEC2Ev:
  859|     56|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree23FunctionDeclarationNodeEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj8EED2Ev:
  861|     56|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     56|    this->destroy_range(this->begin(), this->end());
  864|     56|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree22VariableDeclaratorNodeELj8EED2Ev:
  861|     56|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     56|    this->destroy_range(this->begin(), this->end());
  864|     56|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE13destroy_rangeEPS4_S6_:
  282|     56|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree22VariableDeclaratorNodeEED2Ev:
  349|     56|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|     56|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 56, False: 0]
  ------------------
  353|     56|      free(this->begin());
  354|     56|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE7isSmallEv:
  110|     56|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE9push_backERKS4_:
  320|  1.34k|  void push_back(const T &Elt) {
  321|  1.34k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.34k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 112, False: 1.23k]
  |  |  ------------------
  ------------------
  322|    112|      this->grow();
  323|  1.34k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  1.34k|    this->set_size(this->size() + 1);
  325|  1.34k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree22VariableDeclaratorNodeELb1EE4growEm:
  317|    112|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE8grow_podEmm:
  104|    112|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    112|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    112|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE9push_backERKS4_:
  320|  2.67k|  void push_back(const T &Elt) {
  321|  2.67k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.67k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 127, False: 2.54k]
  |  |  ------------------
  ------------------
  322|    127|      this->grow();
  323|  2.67k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  2.67k|    this->set_size(this->size() + 1);
  325|  2.67k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree23FunctionDeclarationNodeELb1EE4growEm:
  317|    127|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree23FunctionDeclarationNodeEvE8grow_podEmm:
  104|    127|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    127|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    127|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE5beginEv:
  135|  1.62k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree22VariableDeclaratorNodeEvE3endEv:
  139|  1.45k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEELj4EEC2Ev:
  859|  5.04k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEEC2Ej:
  344|  5.04k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEELb1EEC2Em:
  279|  5.04k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvEC2Em:
  102|  5.04k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvE10getFirstElEv:
   93|  10.0k|  void *getFirstEl() const {
   94|  10.0k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  10.0k|        reinterpret_cast<const char *>(this) +
   96|  10.0k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  10.0k|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEELj4EED2Ev:
  861|  5.04k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  5.04k|    this->destroy_range(this->begin(), this->end());
  864|  5.04k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEELb1EE13destroy_rangeEPS8_SA_:
  282|  5.04k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvE5beginEv:
  135|  16.0k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvE3endEv:
  139|  11.0k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEED2Ev:
  349|  5.04k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  5.04k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 5.04k]
  ------------------
  353|      0|      free(this->begin());
  354|  5.04k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEEvE7isSmallEv:
  110|  5.04k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvE3endEv:
  141|  40.3k|  const_iterator end() const { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes5ValueELb1EE18uninitialized_copyIKS3_S3_EEvPT_S8_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSB_12remove_constIS7_E4typeES9_EE5valueEvE4typeE:
  306|  40.3k|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|  40.3k|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 40.3k, False: 0]
  ------------------
  312|  40.3k|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|  40.3k|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6assignESt16initializer_listIS3_E:
  450|      2|  void assign(std::initializer_list<T> IL) {
  451|      2|    clear();
  452|      2|    append(IL);
  453|      2|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendESt16initializer_listIS3_E:
  426|      2|  void append(std::initializer_list<T> IL) {
  427|      2|    append(IL.begin(), IL.end());
  428|      2|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendIPKS3_vEEvT_S8_:
  404|      2|  void append(in_iter in_start, in_iter in_end) {
  405|      2|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|      2|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 2]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|      2|    this->uninitialized_copy(in_start, in_end, this->end());
  412|      2|    this->set_size(this->size() + NumInputs);
  413|      2|  }
_ZN4llvh11SmallVectorIN6hermes15SerializedScope11DeclarationELj16EEC2Ev:
  859|    674|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes15SerializedScope11DeclarationEEC2Ej:
  344|    674|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes15SerializedScope11DeclarationELb1EEC2Em:
  279|    674|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvEC2Em:
  102|    674|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE10getFirstElEv:
   93|  1.34k|  void *getFirstEl() const {
   94|  1.34k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.34k|        reinterpret_cast<const char *>(this) +
   96|  1.34k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.34k|  }
_ZN4llvh11SmallVectorIN6hermes15SerializedScope11DeclarationELj16EED2Ev:
  861|    674|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    674|    this->destroy_range(this->begin(), this->end());
  864|    674|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes15SerializedScope11DeclarationELb1EE13destroy_rangeEPS3_S5_:
  282|    674|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE5beginEv:
  135|  1.34k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE3endEv:
  139|    674|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes15SerializedScope11DeclarationEED2Ev:
  349|    674|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    674|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 674]
  ------------------
  353|      0|      free(this->begin());
  354|    674|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes15SerializedScope11DeclarationEvE7isSmallEv:
  110|    674|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIPN6hermes5ValueELj4EEC2ERKS4_:
  889|  66.9k|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|  66.9k|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 40.3k, False: 26.5k]
  ------------------
  891|  40.3k|      SmallVectorImpl<T>::operator=(RHS);
  892|  66.9k|  }
_ZN4llvh15SmallVectorImplIPN6hermes5ValueEEaSERKS4_:
  727|  40.3k|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|  40.3k|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 40.3k]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|  40.3k|  size_t RHSSize = RHS.size();
  734|  40.3k|  size_t CurSize = this->size();
  735|  40.3k|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 40.3k]
  ------------------
  736|       |    // Assign common elements.
  737|      0|    iterator NewEnd;
  738|      0|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 0]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|      0|    else
  741|      0|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|      0|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|      0|    this->set_size(RHSSize);
  748|      0|    return *this;
  749|      0|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|  40.3k|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 34, False: 40.2k]
  ------------------
  755|       |    // Destroy current elements.
  756|     34|    this->destroy_range(this->begin(), this->end());
  757|     34|    this->set_size(0);
  758|     34|    CurSize = 0;
  759|     34|    this->grow(RHSSize);
  760|  40.2k|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 40.2k]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|  40.3k|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|  40.3k|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|  40.3k|  this->set_size(RHSSize);
  771|  40.3k|  return *this;
  772|  40.3k|}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj2EEC2Ev:
  859|    574|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes5ValueELj2EED2Ev:
  861|    574|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    574|    this->destroy_range(this->begin(), this->end());
  864|    574|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEixEm:
  160|    283|  reference operator[](size_type idx) {
  161|    283|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|    283|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes13LiteralStringEPNS3_5ValueEEELb1EE9push_backERKS8_:
  320|  5.97k|  void push_back(const T &Elt) {
  321|  5.97k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  5.97k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.97k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  5.97k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  5.97k|    this->set_size(this->size() + 1);
  325|  5.97k|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree20BinaryExpressionNodeELj1EEC2Ev:
  859|    356|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree20BinaryExpressionNodeEEC2Ej:
  344|    356|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EEC2Em:
  279|    356|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvEC2Em:
  102|    356|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE10getFirstElEv:
   93|  1.25k|  void *getFirstEl() const {
   94|  1.25k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  1.25k|        reinterpret_cast<const char *>(this) +
   96|  1.25k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  1.25k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE9push_backERKS4_:
  320|   386k|  void push_back(const T &Elt) {
  321|   386k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   386k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 540, False: 385k]
  |  |  ------------------
  ------------------
  322|    540|      this->grow();
  323|   386k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   386k|    this->set_size(this->size() + 1);
  325|   386k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE4growEm:
  317|    540|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE8grow_podEmm:
  104|    540|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    540|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    540|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree20BinaryExpressionNodeELj1EED2Ev:
  861|    356|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    356|    this->destroy_range(this->begin(), this->end());
  864|    356|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree20BinaryExpressionNodeELb1EE13destroy_rangeEPS4_S6_:
  282|    356|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree20BinaryExpressionNodeEED2Ev:
  349|    356|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    356|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 167, False: 189]
  ------------------
  353|    167|      free(this->begin());
  354|    356|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE7isSmallEv:
  110|    356|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvEixEm:
  160|    623|  reference operator[](size_type idx) {
  161|    623|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|    623|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE5beginEv:
  135|   388k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree20BinaryExpressionNodeEvE3endEv:
  139|   387k|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIPN6hermes6ESTree24AssignmentExpressionNodeELj1EEC2Ev:
  859|  7.84k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree24AssignmentExpressionNodeEEC2Ej:
  344|  7.84k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EEC2Em:
  279|  7.84k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvEC2Em:
  102|  7.84k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE10getFirstElEv:
   93|  15.7k|  void *getFirstEl() const {
   94|  15.7k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  15.7k|        reinterpret_cast<const char *>(this) +
   96|  15.7k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  15.7k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE9push_backERKS4_:
  320|  7.88k|  void push_back(const T &Elt) {
  321|  7.88k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  7.88k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 23, False: 7.86k]
  |  |  ------------------
  ------------------
  322|     23|      this->grow();
  323|  7.88k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  7.88k|    this->set_size(this->size() + 1);
  325|  7.88k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE4growEm:
  317|     23|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE8grow_podEmm:
  104|     23|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     23|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     23|  }
_ZN4llvh11SmallVectorIPN6hermes6ESTree24AssignmentExpressionNodeELj1EED2Ev:
  861|  7.84k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  7.84k|    this->destroy_range(this->begin(), this->end());
  864|  7.84k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree24AssignmentExpressionNodeELb1EE13destroy_rangeEPS4_S6_:
  282|  7.84k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree24AssignmentExpressionNodeEED2Ev:
  349|  7.84k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  7.84k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 23, False: 7.82k]
  ------------------
  353|     23|      free(this->begin());
  354|  7.84k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE7isSmallEv:
  110|  7.84k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes5irgen10LReferenceELj1EEC2Ev:
  859|  3.85k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEEC2Ej:
  344|  3.85k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EEC2Em:
  279|  3.85k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvEC2Em:
  102|  3.85k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE10getFirstElEv:
   93|  7.70k|  void *getFirstEl() const {
   94|  7.70k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  7.70k|        reinterpret_cast<const char *>(this) +
   96|  7.70k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  7.70k|  }
_ZN4llvh11SmallVectorIN6hermes5irgen10LReferenceELj1EED2Ev:
  861|  3.85k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  3.85k|    this->destroy_range(this->begin(), this->end());
  864|  3.85k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE13destroy_rangeEPS3_S5_:
  282|  3.85k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE5beginEv:
  135|  15.4k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEED2Ev:
  349|  3.85k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  3.85k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 2, False: 3.84k]
  ------------------
  353|      2|      free(this->begin());
  354|  3.85k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE7isSmallEv:
  110|  3.85k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen10LReferenceEE7reserveEm:
  386|  3.85k|  void reserve(size_type N) {
  387|  3.85k|    if (this->capacity() < N)
  ------------------
  |  Branch (387:9): [True: 2, False: 3.84k]
  ------------------
  388|      2|      this->grow(N);
  389|  3.85k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE4growEm:
  317|      2|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE8grow_podEmm:
  104|      2|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      2|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      2|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE5beginEv:
  135|  54.9k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE3endEv:
  139|  35.4k|  iterator end() { return begin() + size(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen10LReferenceELb1EE9push_backERKS3_:
  320|  3.85k|  void push_back(const T &Elt) {
  321|  3.85k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  3.85k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.85k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|  3.85k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  3.85k|    this->set_size(this->size() + 1);
  325|  3.85k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen10LReferenceEvE3endEv:
  139|  11.5k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE6rbeginEv:
  144|  3.85k|  reverse_iterator rbegin()            { return reverse_iterator(end()); }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE4rendEv:
  146|  3.85k|  reverse_iterator rend()              { return reverse_iterator(begin()); }
_ZN4llvh11SmallVectorIN6hermes5irgen9GotoLabelELj2EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE10getFirstElEv:
   93|   228k|  void *getFirstEl() const {
   94|   228k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   228k|        reinterpret_cast<const char *>(this) +
   96|   228k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   228k|  }
_ZN4llvh11SmallVectorIN6hermes5irgen9GotoLabelELj2EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE3endEv:
  139|   114k|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 4, False: 114k]
  ------------------
  353|      4|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh15SmallVectorImplIN6hermes5irgen9GotoLabelEE6resizeEm:
  361|   114k|  void resize(size_type N) {
  362|   114k|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 0, False: 114k]
  ------------------
  363|      0|      this->destroy_range(this->begin()+N, this->end());
  364|      0|      this->set_size(N);
  365|   114k|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 10, False: 114k]
  ------------------
  366|     10|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 4, False: 6]
  ------------------
  367|      4|        this->grow(N);
  368|  39.2k|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 39.2k, False: 10]
  ------------------
  369|  39.2k|        new (&*I) T();
  370|     10|      this->set_size(N);
  371|     10|    }
  372|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5irgen9GotoLabelELb1EE4growEm:
  317|      4|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5irgen9GotoLabelEvE8grow_podEmm:
  104|      4|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|      4|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|      4|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes5ValueEjEELj2EED2Ev:
  861|  2.27M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.27M|    this->destroy_range(this->begin(), this->end());
  864|  2.27M|  }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEED2Ev:
  349|  2.27M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  2.27M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 487k, False: 1.78M]
  ------------------
  353|   487k|      free(this->begin());
  354|  2.27M|  }
_ZN4llvh11SmallVectorINSt3__14pairIPN6hermes5ValueEjEELj2EEC2Ev:
  859|  2.27M|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEEC2Ej:
  344|  2.27M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EEC2Em:
  279|  2.27M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEC2Em:
  102|  2.27M|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes9ScopeDescELj8EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh15SmallVectorImplIPN6hermes9ScopeDescEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 7, False: 114k]
  ------------------
  353|      7|      free(this->begin());
  354|   114k|  }
_ZN4llvh11SmallVectorIPN6hermes8VariableELj8EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh15SmallVectorImplIPN6hermes8VariableEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 114k]
  ------------------
  353|      0|      free(this->begin());
  354|   114k|  }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes11InstructionEvE4backEv:
  179|  2.32M|  reference back() {
  180|  2.32M|    assert(!empty());
  181|      0|    return end()[-1];
  182|  2.32M|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes11InstructionELb1EE8pop_backEv:
  327|  2.32M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEixEm:
  160|   674M|  reference operator[](size_type idx) {
  161|   674M|    assert(idx < size());
  162|      0|    return begin()[idx];
  163|   674M|  }
_ZN4llvh11SmallVectorIPN6hermes9ParameterELj8EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ParameterEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE10getFirstElEv:
   93|   229k|  void *getFirstEl() const {
   94|   229k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   229k|        reinterpret_cast<const char *>(this) +
   96|   229k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   229k|  }
_ZN4llvh11SmallVectorIPN6hermes9ParameterELj8EED2Ev:
  861|   114k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   114k|    this->destroy_range(this->begin(), this->end());
  864|   114k|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EE13destroy_rangeEPS3_S5_:
  282|   114k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIPN6hermes9ParameterEED2Ev:
  349|   114k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   114k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 114k]
  ------------------
  353|      0|      free(this->begin());
  354|   114k|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes9ParameterEvE7isSmallEv:
  110|   114k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE9push_backERKS6_:
  320|  4.50M|  void push_back(const T &Elt) {
  321|  4.50M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  4.50M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 488k, False: 4.01M]
  |  |  ------------------
  ------------------
  322|   488k|      this->grow();
  323|  4.50M|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|  4.50M|    this->set_size(this->size() + 1);
  325|  4.50M|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE4growEm:
  317|   488k|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
_ZN4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE8grow_podEmm:
  104|   488k|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|   488k|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|   488k|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvEixEm:
  165|  18.9M|  const_reference operator[](size_type idx) const {
  166|  18.9M|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|  18.9M|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIPN6hermes5ValueEjEEvE5beginEv:
  137|  18.9M|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh15SmallVectorImplINSt3__14pairIPN6hermes5ValueEjEEE5eraseEPKS6_:
  455|  19.7k|  iterator erase(const_iterator CI) {
  456|       |    // Just cast away constness because this is a non-const member function.
  457|  19.7k|    iterator I = const_cast<iterator>(CI);
  458|       |
  459|  19.7k|    assert(I >= this->begin() && "Iterator to erase is out of bounds.");
  460|      0|    assert(I < this->end() && "Erasing at past-the-end iterator.");
  461|       |
  462|      0|    iterator N = I;
  463|       |    // Shift all elts down one.
  464|  19.7k|    std::move(I+1, this->end(), I);
  465|       |    // Drop the last elt.
  466|  19.7k|    this->pop_back();
  467|  19.7k|    return(N);
  468|  19.7k|  }
_ZN4llvh23SmallVectorTemplateBaseINSt3__14pairIPN6hermes5ValueEjEELb1EE8pop_backEv:
  327|  19.7k|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes9ParameterELb1EE9push_backERKS3_:
  320|   114k|  void push_back(const T &Elt) {
  321|   114k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   114k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   114k|    this->set_size(this->size() + 1);
  325|   114k|  }
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj32EEC2Ev:
  859|     56|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes7LiteralELj32EED2Ev:
  861|     56|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     56|    this->destroy_range(this->begin(), this->end());
  864|     56|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EEC2Ev:
  859|      4|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj1EEaSEOS4_:
  909|      2|  const SmallVector &operator=(SmallVector &&RHS) {
  910|      2|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|      2|    return *this;
  912|      2|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes10BasicBlockEvEixEm:
  165|     70|  const_reference operator[](size_type idx) const {
  166|     70|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|     70|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj64EEC2ESt16initializer_listIS3_E:
  885|      2|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|      2|    this->assign(IL);
  887|      2|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EEC2EOS4_:
  899|     94|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|     94|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 92, False: 2]
  ------------------
  901|     92|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|     94|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EED2Ev:
  861|    254|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    254|    this->destroy_range(this->begin(), this->end());
  864|    254|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj2EEC2Ev:
  859|    160|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj8EEC2INSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEvEET_SC_:
  875|    160|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|    160|    this->append(S, E);
  877|    160|  }
_ZN4llvh15SmallVectorImplIPN6hermes10BasicBlockEE6appendINSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEvEEvT_SC_:
  404|    160|  void append(in_iter in_start, in_iter in_end) {
  405|    160|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    160|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 160]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    160|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    160|    this->set_size(this->size() + NumInputs);
  413|    160|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes10BasicBlockELb1EE18uninitialized_copyINSt3__116reverse_iteratorINS_12SuccIteratorINS1_14TerminatorInstES2_EEEEPS3_EEvT_SD_T0_:
  295|    160|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  296|       |    // Arbitrary iterator types; just use the basic implementation.
  297|    160|    std::uninitialized_copy(I, E, Dest);
  298|    160|  }
_ZN4llvh11SmallVectorIPN6hermes10BasicBlockELj64EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes5ValueEvEixEm:
  165|     68|  const_reference operator[](size_type idx) const {
  166|     68|    assert(idx < size());
  167|      0|    return begin()[idx];
  168|     68|  }
_ZN4llvh11SmallVectorINS_5TimerELj32EEC2Ev:
  859|     56|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINS_5TimerEEC2Ej:
  344|     56|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_5TimerELb0EEC2Em:
  194|     56|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvEC2Em:
  102|     56|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonINS_5TimerEvE10getFirstElEv:
   93|    112|  void *getFirstEl() const {
   94|    112|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    112|        reinterpret_cast<const char *>(this) +
   96|    112|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    112|  }
_ZN4llvh11SmallVectorINS_5TimerELj32EED2Ev:
  861|     56|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|     56|    this->destroy_range(this->begin(), this->end());
  864|     56|  }
_ZN4llvh23SmallVectorTemplateBaseINS_5TimerELb0EE13destroy_rangeEPS1_S3_:
  196|     56|  static void destroy_range(T *S, T *E) {
  197|     56|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 56]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|     56|  }
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvE5beginEv:
  135|    112|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonINS_5TimerEvE3endEv:
  139|     56|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplINS_5TimerEED2Ev:
  349|     56|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|     56|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 56]
  ------------------
  353|      0|      free(this->begin());
  354|     56|  }
_ZNK4llvh25SmallVectorTemplateCommonINS_5TimerEvE7isSmallEv:
  110|     56|  bool isSmall() const { return BeginX == getFirstEl(); }
Analysis.cpp:_ZN4llvh11SmallVectorIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLj32EEC2Ev:
  859|   342k|  SmallVector() : SmallVectorImpl<T>(N) {}
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateEC2Ej:
  344|   342k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EEC2Em:
  279|   342k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevEC2Em:
  102|   342k|      : SmallVectorBase(getFirstEl(), Size) {}
Analysis.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE10getFirstElEv:
   93|   685k|  void *getFirstEl() const {
   94|   685k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   685k|        reinterpret_cast<const char *>(this) +
   96|   685k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   685k|  }
Analysis.cpp:_ZN4llvh11SmallVectorIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLj32EED2Ev:
  861|   342k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   342k|    this->destroy_range(this->begin(), this->end());
  864|   342k|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE13destroy_rangeEPSB_SD_:
  282|   342k|  static void destroy_range(T *, T *) {}
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE5beginEv:
  135|  2.88M|  iterator begin() { return (iterator)this->BeginX; }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE3endEv:
  139|  2.54M|  iterator end() { return begin() + size(); }
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateED2Ev:
  349|   342k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   342k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 14, False: 342k]
  ------------------
  353|     14|      free(this->begin());
  354|   342k|  }
Analysis.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE7isSmallEv:
  110|   342k|  bool isSmall() const { return BeginX == getFirstEl(); }
Analysis.cpp:_ZN4llvh15SmallVectorImplIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateE12emplace_backIJRS4_EEEvDpOT_:
  662|   461k|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|   461k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   461k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 76, False: 461k]
  |  |  ------------------
  ------------------
  664|     76|      this->grow();
  665|   461k|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|   461k|    this->set_size(this->size() + 1);
  667|   461k|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE4growEm:
  317|     76|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE8grow_podEmm:
  104|     76|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|     76|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|     76|  }
Analysis.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StatevE4backEv:
  179|  1.74M|  reference back() {
  180|  1.74M|    assert(!empty());
  181|      0|    return end()[-1];
  182|  1.74M|  }
Analysis.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes17PostOrderAnalysis14visitPostOrderEPNS1_10BasicBlockERNSt3__16vectorIS4_NS5_9allocatorIS4_EEEEE5StateLb1EE8pop_backEv:
  327|   461k|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIPN6hermes12UniqueStringELj1EED2Ev:
  861|    263|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|    263|    this->destroy_range(this->begin(), this->end());
  864|    263|  }
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EE13destroy_rangeEPS3_S5_:
  282|    264|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE5beginEv:
  135|    529|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE3endEv:
  139|    265|  iterator end() { return begin() + size(); }
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEED2Ev:
  349|    263|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|    263|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 263]
  ------------------
  353|      0|      free(this->begin());
  354|    263|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE7isSmallEv:
  110|    263|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE10getFirstElEv:
   93|    526|  void *getFirstEl() const {
   94|    526|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|    526|        reinterpret_cast<const char *>(this) +
   96|    526|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|    526|  }
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEE6resizeEm:
  361|   245k|  void resize(size_type N) {
  362|   245k|    if (N < this->size()) {
  ------------------
  |  Branch (362:9): [True: 1, False: 245k]
  ------------------
  363|      1|      this->destroy_range(this->begin()+N, this->end());
  364|      1|      this->set_size(N);
  365|   245k|    } else if (N > this->size()) {
  ------------------
  |  Branch (365:16): [True: 0, False: 245k]
  ------------------
  366|      0|      if (this->capacity() < N)
  ------------------
  |  Branch (366:11): [True: 0, False: 0]
  ------------------
  367|      0|        this->grow(N);
  368|      0|      for (auto I = this->end(), E = this->begin() + N; I != E; ++I)
  ------------------
  |  Branch (368:57): [True: 0, False: 0]
  ------------------
  369|      0|        new (&*I) T();
  370|      0|      this->set_size(N);
  371|      0|    }
  372|   245k|  }
_ZN4llvh11SmallVectorINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELj4EEC2Ev:
  859|     99|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEEC2Ej:
  344|     99|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEELb0EEC2Em:
  194|     99|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINSt3__110unique_ptrIN6hermes6parser19PreParsedBufferInfoENS1_14default_deleteIS5_EEEEvEC2Em:
  102|     99|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIcLj4EEC2Ev:
  859|      7|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIcLj4EED2Ev:
  861|      7|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      7|    this->destroy_range(this->begin(), this->end());
  864|      7|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEC2ERKS3_:
  889|    768|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|    768|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 0, False: 768]
  ------------------
  891|      0|      SmallVectorImpl<T>::operator=(RHS);
  892|    768|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEEC2Ej:
  344|  3.37k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseINS_11SmallStringILj24EEELb0EEC2Em:
  194|  3.37k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonINS_11SmallStringILj24EEEvEC2Em:
  102|  3.37k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh23SmallVectorTemplateBaseINS_11SmallStringILj24EEELb0EE18uninitialized_moveIPS2_S5_EEvT_S6_T0_:
  206|     11|  static void uninitialized_move(It1 I, It1 E, It2 Dest) {
  207|     11|    std::uninitialized_copy(std::make_move_iterator(I),
  208|     11|                            std::make_move_iterator(E), Dest);
  209|     11|  }
_ZN4llvh11SmallVectorIcLj24EEC2EOS1_:
  899|     11|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|     11|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 11, False: 0]
  ------------------
  901|     11|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|     11|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEaSEOS3_:
  909|    779|  const SmallVector &operator=(SmallVector &&RHS) {
  910|    779|    SmallVectorImpl<T>::operator=(::std::move(RHS));
  911|    779|    return *this;
  912|    779|  }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEEaSEOS3_:
  775|    779|SmallVectorImpl<T> &SmallVectorImpl<T>::operator=(SmallVectorImpl<T> &&RHS) {
  776|       |  // Avoid self-assignment.
  777|    779|  if (this == &RHS) return *this;
  ------------------
  |  Branch (777:7): [True: 0, False: 779]
  ------------------
  778|       |
  779|       |  // If the RHS isn't small, clear this vector and then steal its buffer.
  780|    779|  if (!RHS.isSmall()) {
  ------------------
  |  Branch (780:7): [True: 0, False: 779]
  ------------------
  781|      0|    this->destroy_range(this->begin(), this->end());
  782|      0|    if (!this->isSmall()) free(this->begin());
  ------------------
  |  Branch (782:9): [True: 0, False: 0]
  ------------------
  783|      0|    this->BeginX = RHS.BeginX;
  784|      0|    this->Size = RHS.Size;
  785|      0|    this->Capacity = RHS.Capacity;
  786|      0|    RHS.resetToSmall();
  787|      0|    return *this;
  788|      0|  }
  789|       |
  790|       |  // If we already have sufficient space, assign the common elements, then
  791|       |  // destroy any excess.
  792|    779|  size_t RHSSize = RHS.size();
  793|    779|  size_t CurSize = this->size();
  794|    779|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (794:7): [True: 768, False: 11]
  ------------------
  795|       |    // Assign common elements.
  796|    768|    iterator NewEnd = this->begin();
  797|    768|    if (RHSSize)
  ------------------
  |  Branch (797:9): [True: 0, False: 768]
  ------------------
  798|      0|      NewEnd = std::move(RHS.begin(), RHS.end(), NewEnd);
  799|       |
  800|       |    // Destroy excess elements and trim the bounds.
  801|    768|    this->destroy_range(NewEnd, this->end());
  802|    768|    this->set_size(RHSSize);
  803|       |
  804|       |    // Clear the RHS.
  805|    768|    RHS.clear();
  806|       |
  807|    768|    return *this;
  808|    768|  }
  809|       |
  810|       |  // If we have to grow to have enough elements, destroy the current elements.
  811|       |  // This allows us to avoid copying them during the grow.
  812|       |  // FIXME: this may not actually make any sense if we can efficiently move
  813|       |  // elements.
  814|     11|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (814:7): [True: 0, False: 11]
  ------------------
  815|       |    // Destroy current elements.
  816|      0|    this->destroy_range(this->begin(), this->end());
  817|      0|    this->set_size(0);
  818|      0|    CurSize = 0;
  819|      0|    this->grow(RHSSize);
  820|     11|  } else if (CurSize) {
  ------------------
  |  Branch (820:14): [True: 0, False: 11]
  ------------------
  821|       |    // Otherwise, use assignment for the already-constructed elements.
  822|      0|    std::move(RHS.begin(), RHS.begin()+CurSize, this->begin());
  823|      0|  }
  824|       |
  825|       |  // Move-construct the new elements in place.
  826|     11|  this->uninitialized_move(RHS.begin()+CurSize, RHS.end(),
  827|     11|                           this->begin()+CurSize);
  828|       |
  829|       |  // Set end.
  830|     11|  this->set_size(RHSSize);
  831|       |
  832|     11|  RHS.clear();
  833|     11|  return *this;
  834|    779|}
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEE5clearEv:
  356|    779|  void clear() {
  357|    779|    this->destroy_range(this->begin(), this->end());
  358|    779|    this->Size = 0;
  359|    779|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEC2Ev:
  859|  1.55k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes12UniqueStringELj1EEC2Ev:
  859|    263|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes12UniqueStringEEC2Ej:
  344|    263|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EEC2Em:
  279|    263|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvEC2Em:
  102|    263|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes12UniqueStringELb1EE9push_backERKS3_:
  320|      1|  void push_back(const T &Elt) {
  321|      1|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|      1|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|      1|    this->set_size(this->size() + 1);
  325|      1|  }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE5beginEv:
  137|  1.55k|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIPN6hermes12UniqueStringEvE3endEv:
  141|    779|  const_iterator end() const { return begin() + size(); }
_ZN4llvh15SmallVectorImplINS_11SmallStringILj24EEEE12emplace_backIJRKNS_9StringRefEEEEvDpOT_:
  662|     11|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|     11|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|     11|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|     11|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|     11|    this->set_size(this->size() + 1);
  667|     11|  }
_ZN4llvh11SmallVectorIcLj24EEC2IPKcvEET_S5_:
  875|     11|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|     11|    this->append(S, E);
  877|     11|  }
_ZN4llvh11SmallVectorINS_11SmallStringILj24EEELj1EEC2EOS3_:
  899|  1.04k|  SmallVector(SmallVector &&RHS) : SmallVectorImpl<T>(N) {
  900|  1.04k|    if (!RHS.empty())
  ------------------
  |  Branch (900:9): [True: 0, False: 1.04k]
  ------------------
  901|      0|      SmallVectorImpl<T>::operator=(::std::move(RHS));
  902|  1.04k|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLj16EEC2Ev:
  859|  2.56M|  SmallVector() : SmallVectorImpl<T>(N) {}
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryEC2Ej:
  344|  2.56M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EEC2Em:
  279|  2.56M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvEC2Em:
  102|  2.56M|      : SmallVectorBase(getFirstEl(), Size) {}
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE10getFirstElEv:
   93|  5.12M|  void *getFirstEl() const {
   94|  5.12M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  5.12M|        reinterpret_cast<const char *>(this) +
   96|  5.12M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  5.12M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLj16EED2Ev:
  861|  2.56M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.56M|    this->destroy_range(this->begin(), this->end());
  864|  2.56M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EE13destroy_rangeEPS6_S8_:
  282|  2.56M|  static void destroy_range(T *, T *) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE5beginEv:
  135|  15.1M|  iterator begin() { return (iterator)this->BeginX; }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE3endEv:
  139|  12.6M|  iterator end() { return begin() + size(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryED2Ev:
  349|  2.56M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  2.56M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 2.56M]
  ------------------
  353|      0|      free(this->begin());
  354|  2.56M|  }
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE7isSmallEv:
  110|  2.56M|  bool isSmall() const { return BeginX == getFirstEl(); }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryvE4backEv:
  179|  8.68M|  reference back() {
  180|  8.68M|    assert(!empty());
  181|      0|    return end()[-1];
  182|  8.68M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryLb1EE8pop_backEv:
  327|  1.39M|  void pop_back() { this->set_size(this->size() - 1); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS3_5ParamEE20PrecedenceStackEntryE12emplace_backIJRPNS1_6ESTree4NodeENS2_9TokenKindERNS_5SMLocEEEEvDpOT_:
  662|  1.39M|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  1.39M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  1.39M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.39M]
  |  |  ------------------
  ------------------
  664|      0|      this->grow();
  665|  1.39M|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  1.39M|    this->set_size(this->size() + 1);
  667|  1.39M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLj2EEC2Ev:
  859|  2.55M|  SmallVector() : SmallVectorImpl<T>(N) {}
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateEC2Ej:
  344|  2.55M|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EEC2Em:
  279|  2.55M|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevEC2Em:
  102|  2.55M|      : SmallVectorBase(getFirstEl(), Size) {}
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE10getFirstElEv:
   93|  5.10M|  void *getFirstEl() const {
   94|  5.10M|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  5.10M|        reinterpret_cast<const char *>(this) +
   96|  5.10M|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  5.10M|  }
JSParserImpl.cpp:_ZN4llvh11SmallVectorIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLj2EED2Ev:
  861|  2.55M|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  2.55M|    this->destroy_range(this->begin(), this->end());
  864|  2.55M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE13destroy_rangeEPSB_SD_:
  282|  2.55M|  static void destroy_range(T *, T *) {}
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE5beginEv:
  135|  12.7M|  iterator begin() { return (iterator)this->BeginX; }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE3endEv:
  139|  10.2M|  iterator end() { return begin() + size(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateED2Ev:
  349|  2.55M|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  2.55M|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 182, False: 2.55M]
  ------------------
  353|    182|      free(this->begin());
  354|  2.55M|  }
JSParserImpl.cpp:_ZNK4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE7isSmallEv:
  110|  2.55M|  bool isSmall() const { return BeginX == getFirstEl(); }
JSParserImpl.cpp:_ZN4llvh15SmallVectorImplIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateE12emplace_backIJEEEvDpOT_:
  662|  2.56M|  template <typename... ArgTypes> void emplace_back(ArgTypes &&... Args) {
  663|  2.56M|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|  2.56M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 182, False: 2.56M]
  |  |  ------------------
  ------------------
  664|    182|      this->grow();
  665|  2.56M|    ::new ((void *)this->end()) T(std::forward<ArgTypes>(Args)...);
  666|  2.56M|    this->set_size(this->size() + 1);
  667|  2.56M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE4growEm:
  317|    182|  void grow(size_t MinSize = 0) { this->grow_pod(MinSize, sizeof(T)); }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE8grow_podEmm:
  104|    182|  void grow_pod(size_t MinCapacity, size_t TSize) {
  105|    182|    SmallVectorBase::grow_pod(getFirstEl(), MinCapacity, TSize);
  106|    182|  }
JSParserImpl.cpp:_ZN4llvh25SmallVectorTemplateCommonIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StatevE4backEv:
  179|  5.12M|  reference back() {
  180|  5.12M|    assert(!empty());
  181|      0|    return end()[-1];
  182|  5.12M|  }
JSParserImpl.cpp:_ZN4llvh23SmallVectorTemplateBaseIZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS3_5ParamENS4_23AllowTypedArrowFunctionENS4_20CoverTypedParametersEPNS1_6ESTree4NodeEE5StateLb1EE8pop_backEv:
  327|  2.55M|  void pop_back() { this->set_size(this->size() - 1); }
_ZN4llvh11SmallVectorIN6hermes3sem12FunctionInfo7VarDeclELj4EEC2Ev:
  859|   229k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes3sem12FunctionInfo7VarDeclEEC2Ej:
  344|   229k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3sem12FunctionInfo7VarDeclELb1EEC2Em:
  279|   229k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes3sem12FunctionInfo7VarDeclEvEC2Em:
  102|   229k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIPN6hermes6ESTree23FunctionDeclarationNodeELj2EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh11SmallVectorIPN6hermes6ESTree21ImportDeclarationNodeELj2EEC2Ev:
  859|   114k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPN6hermes6ESTree21ImportDeclarationNodeEEC2Ej:
  344|   114k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPN6hermes6ESTree21ImportDeclarationNodeELb1EEC2Em:
  279|   114k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree21ImportDeclarationNodeEvEC2Em:
  102|   114k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPN6hermes6ESTree24AssignmentExpressionNodeEvE4backEv:
  179|  7.99k|  reference back() {
  180|  7.99k|    assert(!empty());
  181|      0|    return end()[-1];
  182|  7.99k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes3sem12FunctionInfo7VarDeclELb1EE9push_backERKS4_:
  320|   114k|  void push_back(const T &Elt) {
  321|   114k|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|   114k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 114k]
  |  |  ------------------
  ------------------
  322|      0|      this->grow();
  323|   114k|    memcpy(reinterpret_cast<void *>(this->end()), &Elt, sizeof(T));
  324|   114k|    this->set_size(this->size() + 1);
  325|   114k|  }
_ZN4llvh11SmallVectorIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELj4EEC2Ev:
  859|  11.4k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEEC2Ej:
  344|  11.4k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EEC2Em:
  194|  11.4k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvEC2Em:
  102|  11.4k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE10getFirstElEv:
   93|  22.9k|  void *getFirstEl() const {
   94|  22.9k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  22.9k|        reinterpret_cast<const char *>(this) +
   96|  22.9k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  22.9k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE4backEv:
  179|  1.06k|  reference back() {
  180|  1.06k|    assert(!empty());
  181|      0|    return end()[-1];
  182|  1.06k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE3endEv:
  139|  12.9k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE5beginEv:
  135|  24.4k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE9push_backEOSA_:
  231|    234|  void push_back(T &&Elt) {
  232|    234|    if (LLVM_UNLIKELY(this->size() >= this->capacity()))
  ------------------
  |  |  189|    234|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 234]
  |  |  ------------------
  ------------------
  233|      0|      this->grow();
  234|    234|    ::new ((void*) this->end()) T(::std::move(Elt));
  235|    234|    this->set_size(this->size() + 1);
  236|    234|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE13destroy_rangeEPSA_SC_:
  196|  11.4k|  static void destroy_range(T *S, T *E) {
  197|  11.4k|    while (S != E) {
  ------------------
  |  Branch (197:12): [True: 0, False: 11.4k]
  ------------------
  198|      0|      --E;
  199|      0|      E->~T();
  200|      0|    }
  201|  11.4k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEvE7isSmallEv:
  110|  11.4k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELb0EE8pop_backEv:
  238|    234|  void pop_back() {
  239|    234|    this->set_size(this->size() - 1);
  240|    234|    this->end()->~T();
  241|    234|  }
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EEC2Ev:
  859|      1|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEEC2Ej:
  344|      2|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EEC2Em:
  279|      2|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvEC2Em:
  102|      2|      : SmallVectorBase(getFirstEl(), Size) {}
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EED2Ev:
  861|      2|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|      2|    this->destroy_range(this->begin(), this->end());
  864|      2|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEED2Ev:
  349|      2|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|      2|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 1, False: 1]
  ------------------
  353|      1|      free(this->begin());
  354|      2|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes14CodePointRangeEvE7isSmallEv:
  110|      2|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes14CodePointRangeELj4EEC2ERKS3_:
  889|      1|  SmallVector(const SmallVector &RHS) : SmallVectorImpl<T>(N) {
  890|      1|    if (!RHS.empty())
  ------------------
  |  Branch (890:9): [True: 1, False: 0]
  ------------------
  891|      1|      SmallVectorImpl<T>::operator=(RHS);
  892|      1|  }
_ZN4llvh15SmallVectorImplIN6hermes14CodePointRangeEEaSERKS3_:
  727|      1|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|      1|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 1]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|      1|  size_t RHSSize = RHS.size();
  734|      1|  size_t CurSize = this->size();
  735|      1|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 0, False: 1]
  ------------------
  736|       |    // Assign common elements.
  737|      0|    iterator NewEnd;
  738|      0|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 0]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|      0|    else
  741|      0|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|      0|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|      0|    this->set_size(RHSSize);
  748|      0|    return *this;
  749|      0|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|      1|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 1]
  ------------------
  755|       |    // Destroy current elements.
  756|      0|    this->destroy_range(this->begin(), this->end());
  757|      0|    this->set_size(0);
  758|      0|    CurSize = 0;
  759|      0|    this->grow(RHSSize);
  760|      1|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 1]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|      1|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|      1|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|      1|  this->set_size(RHSSize);
  771|      1|  return *this;
  772|      1|}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes14CodePointRangeELb1EE18uninitialized_copyIKS2_S2_EEvPT_S7_PT0_PNSt3__19enable_ifIXsr3std7is_sameINSA_12remove_constIS6_E4typeES8_EE5valueEvE4typeE:
  306|      1|                                           T2>::value>::type * = nullptr) {
  307|       |    // Use memcpy for PODs iterated by pointers (which includes SmallVector
  308|       |    // iterators): std::uninitialized_copy optimizes to memmove, but we can
  309|       |    // use memcpy here. Note that I and E are iterators and thus might be
  310|       |    // invalid for memcpy if they are equal.
  311|      1|    if (I != E)
  ------------------
  |  Branch (311:9): [True: 1, False: 0]
  ------------------
  312|      1|      memcpy(reinterpret_cast<void *>(Dest), I, (E - I) * sizeof(T));
  313|      1|  }
_ZN4llvh11SmallVectorIjLj5EEC2ESt16initializer_listIjE:
  885|   882k|  SmallVector(std::initializer_list<T> IL) : SmallVectorImpl<T>(N) {
  886|   882k|    this->assign(IL);
  887|   882k|  }
_ZN4llvh15SmallVectorImplIjE6assignESt16initializer_listIjE:
  450|   882k|  void assign(std::initializer_list<T> IL) {
  451|   882k|    clear();
  452|   882k|    append(IL);
  453|   882k|  }
_ZN4llvh15SmallVectorImplIjE6appendESt16initializer_listIjE:
  426|   882k|  void append(std::initializer_list<T> IL) {
  427|   882k|    append(IL.begin(), IL.end());
  428|   882k|  }
_ZN4llvh11SmallVectorIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementELj4EED2Ev:
  861|  11.4k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  11.4k|    this->destroy_range(this->begin(), this->end());
  864|  11.4k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex6ParserINS2_5RegexINS2_16UTF16RegexTraitsEEEPKDsE17ParseStackElementEED2Ev:
  349|  11.4k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  11.4k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 11.4k]
  ------------------
  353|      0|      free(this->begin());
  354|  11.4k|  }
_ZN4llvh11SmallVectorIN6hermes5regex13CapturedRangeELj16EEC2EmRKS3_:
  867|   404k|    : SmallVectorImpl<T>(N) {
  868|   404k|    this->assign(Size, Value);
  869|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEEC2Ej:
  344|   404k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex13CapturedRangeELb1EEC2Em:
  279|   404k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvEC2Em:
  102|   404k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE10getFirstElEv:
   93|   808k|  void *getFirstEl() const {
   94|   808k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   808k|        reinterpret_cast<const char *>(this) +
   96|   808k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   808k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEE6assignEmRKS3_:
  433|   404k|  void assign(size_type NumElts, const T &Elt) {
  434|   404k|    clear();
  435|   404k|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 0, False: 404k]
  ------------------
  436|      0|      this->grow(NumElts);
  437|   404k|    this->set_size(NumElts);
  438|   404k|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEE5clearEv:
  356|   404k|  void clear() {
  357|   404k|    this->destroy_range(this->begin(), this->end());
  358|   404k|    this->Size = 0;
  359|   404k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex13CapturedRangeELb1EE13destroy_rangeEPS3_S5_:
  282|   808k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE3endEv:
  139|  1.21M|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIN6hermes5regex8LoopDataELj16EEC2EmRKS3_:
  867|   404k|    : SmallVectorImpl<T>(N) {
  868|   404k|    this->assign(Size, Value);
  869|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEEC2Ej:
  344|   404k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex8LoopDataELb1EEC2Em:
  279|   404k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvEC2Em:
  102|   404k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE10getFirstElEv:
   93|   808k|  void *getFirstEl() const {
   94|   808k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   808k|        reinterpret_cast<const char *>(this) +
   96|   808k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   808k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEE6assignEmRKS3_:
  433|   404k|  void assign(size_type NumElts, const T &Elt) {
  434|   404k|    clear();
  435|   404k|    if (this->capacity() < NumElts)
  ------------------
  |  Branch (435:9): [True: 0, False: 404k]
  ------------------
  436|      0|      this->grow(NumElts);
  437|   404k|    this->set_size(NumElts);
  438|   404k|    std::uninitialized_fill(this->begin(), this->end(), Elt);
  439|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEE5clearEv:
  356|   404k|  void clear() {
  357|   404k|    this->destroy_range(this->begin(), this->end());
  358|   404k|    this->Size = 0;
  359|   404k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex8LoopDataELb1EE13destroy_rangeEPS3_S5_:
  282|   808k|  static void destroy_range(T *, T *) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE5beginEv:
  135|  2.42M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE3endEv:
  139|  1.21M|  iterator end() { return begin() + size(); }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELj64EEC2Ev:
  859|   355k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEEC2Ej:
  344|   355k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EEC2Em:
  279|   355k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvEC2Em:
  102|   355k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE10getFirstElEv:
   93|   711k|  void *getFirstEl() const {
   94|   711k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|   711k|        reinterpret_cast<const char *>(this) +
   96|   711k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|   711k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE3endEv:
  139|   355k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE5beginEv:
  135|   711k|  iterator begin() { return (iterator)this->BeginX; }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE7isSmallEv:
  110|   404k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex8LoopDataEvE7isSmallEv:
  110|   404k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELj64EED2Ev:
  861|   355k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   355k|    this->destroy_range(this->begin(), this->end());
  864|   355k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnELb1EE13destroy_rangeEPS6_S8_:
  282|   355k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEED2Ev:
  349|   355k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   355k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 355k]
  ------------------
  353|      0|      free(this->begin());
  354|   355k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16UTF16RegexTraitsEE13BacktrackInsnEvE7isSmallEv:
  110|   355k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex13CapturedRangeEvE5beginEv:
  135|  2.83M|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIN6hermes5regex8LoopDataELj16EED2Ev:
  861|   404k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   404k|    this->destroy_range(this->begin(), this->end());
  864|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex8LoopDataEED2Ev:
  349|   404k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   404k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 404k]
  ------------------
  353|      0|      free(this->begin());
  354|   404k|  }
_ZN4llvh11SmallVectorIN6hermes5regex13CapturedRangeELj16EED2Ev:
  861|   404k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|   404k|    this->destroy_range(this->begin(), this->end());
  864|   404k|  }
_ZN4llvh15SmallVectorImplIN6hermes5regex13CapturedRangeEED2Ev:
  349|   404k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|   404k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 404k]
  ------------------
  353|      0|      free(this->begin());
  354|   404k|  }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnELj64EEC2Ev:
  859|  48.9k|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEEC2Ej:
  344|  48.9k|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnELb1EEC2Em:
  279|  48.9k|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEvEC2Em:
  102|  48.9k|      : SmallVectorBase(getFirstEl(), Size) {}
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEvE10getFirstElEv:
   93|  97.8k|  void *getFirstEl() const {
   94|  97.8k|    return const_cast<void *>(reinterpret_cast<const void *>(
   95|  97.8k|        reinterpret_cast<const char *>(this) +
   96|  97.8k|        offsetof(SmallVectorAlignmentAndSize<T>, FirstEl)));
   97|  97.8k|  }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEvE3endEv:
  139|  48.9k|  iterator end() { return begin() + size(); }
_ZN4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEvE5beginEv:
  135|  97.8k|  iterator begin() { return (iterator)this->BeginX; }
_ZN4llvh11SmallVectorIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnELj64EED2Ev:
  861|  48.9k|  ~SmallVector() {
  862|       |    // Destroy the constructed elements in the vector.
  863|  48.9k|    this->destroy_range(this->begin(), this->end());
  864|  48.9k|  }
_ZN4llvh23SmallVectorTemplateBaseIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnELb1EE13destroy_rangeEPS6_S8_:
  282|  48.9k|  static void destroy_range(T *, T *) {}
_ZN4llvh15SmallVectorImplIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEED2Ev:
  349|  48.9k|  ~SmallVectorImpl() {
  350|       |    // Subclass has already destructed this vector's elements.
  351|       |    // If this wasn't grown from the inline copy, deallocate the old space.
  352|  48.9k|    if (!this->isSmall())
  ------------------
  |  Branch (352:9): [True: 0, False: 48.9k]
  ------------------
  353|      0|      free(this->begin());
  354|  48.9k|  }
_ZNK4llvh25SmallVectorTemplateCommonIN6hermes5regex7ContextINS2_16ASCIIRegexTraitsEE13BacktrackInsnEvE7isSmallEv:
  110|  48.9k|  bool isSmall() const { return BeginX == getFirstEl(); }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEaSERKS2_:
  894|     43|  const SmallVector &operator=(const SmallVector &RHS) {
  895|     43|    SmallVectorImpl<T>::operator=(RHS);
  896|     43|    return *this;
  897|     43|  }
_ZN4llvh15SmallVectorImplINS_7SMFixItEEaSERKS2_:
  727|     43|  operator=(const SmallVectorImpl<T> &RHS) {
  728|       |  // Avoid self-assignment.
  729|     43|  if (this == &RHS) return *this;
  ------------------
  |  Branch (729:7): [True: 0, False: 43]
  ------------------
  730|       |
  731|       |  // If we already have sufficient space, assign the common elements, then
  732|       |  // destroy any excess.
  733|     43|  size_t RHSSize = RHS.size();
  734|     43|  size_t CurSize = this->size();
  735|     43|  if (CurSize >= RHSSize) {
  ------------------
  |  Branch (735:7): [True: 43, False: 0]
  ------------------
  736|       |    // Assign common elements.
  737|     43|    iterator NewEnd;
  738|     43|    if (RHSSize)
  ------------------
  |  Branch (738:9): [True: 0, False: 43]
  ------------------
  739|      0|      NewEnd = std::copy(RHS.begin(), RHS.begin()+RHSSize, this->begin());
  740|     43|    else
  741|     43|      NewEnd = this->begin();
  742|       |
  743|       |    // Destroy excess elements.
  744|     43|    this->destroy_range(NewEnd, this->end());
  745|       |
  746|       |    // Trim.
  747|     43|    this->set_size(RHSSize);
  748|     43|    return *this;
  749|     43|  }
  750|       |
  751|       |  // If we have to grow to have enough elements, destroy the current elements.
  752|       |  // This allows us to avoid copying them during the grow.
  753|       |  // FIXME: don't do this if they're efficiently moveable.
  754|      0|  if (this->capacity() < RHSSize) {
  ------------------
  |  Branch (754:7): [True: 0, False: 0]
  ------------------
  755|       |    // Destroy current elements.
  756|      0|    this->destroy_range(this->begin(), this->end());
  757|      0|    this->set_size(0);
  758|      0|    CurSize = 0;
  759|      0|    this->grow(RHSSize);
  760|      0|  } else if (CurSize) {
  ------------------
  |  Branch (760:14): [True: 0, False: 0]
  ------------------
  761|       |    // Otherwise, use assignment for the already-constructed elements.
  762|      0|    std::copy(RHS.begin(), RHS.begin()+CurSize, this->begin());
  763|      0|  }
  764|       |
  765|       |  // Copy construct the new elements in place.
  766|      0|  this->uninitialized_copy(RHS.begin()+CurSize, RHS.end(),
  767|      0|                           this->begin()+CurSize);
  768|       |
  769|       |  // Set end.
  770|      0|  this->set_size(RHSSize);
  771|      0|  return *this;
  772|     43|}
_ZN4llvh23SmallVectorTemplateBaseINS_7SMFixItELb0EE18uninitialized_copyIPKS1_PS1_EEvT_S7_T0_:
  214|    248|  static void uninitialized_copy(It1 I, It1 E, It2 Dest) {
  215|    248|    std::uninitialized_copy(I, E, Dest);
  216|    248|  }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE4dataEv:
  157|    248|  const_pointer data() const { return const_pointer(begin()); }
_ZNK4llvh25SmallVectorTemplateCommonINSt3__14pairIjjEEvE5beginEv:
  137|    248|  const_iterator begin() const { return (const_iterator)this->BeginX; }
_ZN4llvh11SmallVectorINS_7SMFixItELj4EEC2IPKS1_vEET_S6_:
  875|    248|  SmallVector(ItTy S, ItTy E) : SmallVectorImpl<T>(N) {
  876|    248|    this->append(S, E);
  877|    248|  }
_ZN4llvh15SmallVectorImplINS_7SMFixItEE6appendIPKS1_vEEvT_S6_:
  404|    248|  void append(in_iter in_start, in_iter in_end) {
  405|    248|    size_type NumInputs = std::distance(in_start, in_end);
  406|       |    // Grow allocated space if needed.
  407|    248|    if (NumInputs > this->capacity() - this->size())
  ------------------
  |  Branch (407:9): [True: 0, False: 248]
  ------------------
  408|      0|      this->grow(this->size()+NumInputs);
  409|       |
  410|       |    // Copy the new elements over.
  411|    248|    this->uninitialized_copy(in_start, in_end, this->end());
  412|    248|    this->set_size(this->size() + NumInputs);
  413|    248|  }
_ZN4llvh11SmallVectorIPNS_2cl6OptionELj4EEC2Ev:
  859|      8|  SmallVector() : SmallVectorImpl<T>(N) {}
_ZN4llvh15SmallVectorImplIPNS_2cl6OptionEEC2Ej:
  344|      8|      : SmallVectorTemplateBase<T, isPodLike<T>::value>(N) {}
_ZN4llvh23SmallVectorTemplateBaseIPNS_2cl6OptionELb1EEC2Em:
  279|      8|  SmallVectorTemplateBase(size_t Size) : SmallVectorTemplateCommon<T>(Size) {}
_ZN4llvh25SmallVectorTemplateCommonIPNS_2cl6OptionEvEC2Em:
  102|      8|      : SmallVectorBase(getFirstEl(), Size) {}

_ZN4llvh9StatisticppEv:
   79|  5.85M|  const Statistic &operator++() {
   80|  5.85M|    Value.fetch_add(1, std::memory_order_relaxed);
   81|  5.85M|    return init();
   82|  5.85M|  }
_ZN4llvh9Statistic4initEv:
  158|  7.16M|  Statistic &init() {
  159|  7.16M|    if (!Initialized.load(std::memory_order_acquire))
  ------------------
  |  Branch (159:9): [True: 19, False: 7.16M]
  ------------------
  160|     19|      RegisterStatistic();
  161|  7.16M|    return *this;
  162|  7.16M|  }
_ZN4llvh9StatisticppEi:
   84|  1.31M|  unsigned operator++(int) {
   85|  1.31M|    init();
   86|  1.31M|    return Value.fetch_add(1, std::memory_order_relaxed);
   87|  1.31M|  }
_ZN4llvh9StatisticpLEj:
   99|    560|  const Statistic &operator+=(unsigned V) {
  100|    560|    if (V == 0)
  ------------------
  |  Branch (100:9): [True: 444, False: 116]
  ------------------
  101|    444|      return *this;
  102|    116|    Value.fetch_add(V, std::memory_order_relaxed);
  103|    116|    return init();
  104|    560|  }

_ZN4llvh8hexdigitEjb:
   37|  1.25k|inline char hexdigit(unsigned X, bool LowerCase = false) {
   38|  1.25k|  const char HexChar = LowerCase ? 'a' : 'A';
  ------------------
  |  Branch (38:24): [True: 1.25k, False: 0]
  ------------------
   39|  1.25k|  return X < 10 ? '0' + X : HexChar + X - 10;
  ------------------
  |  Branch (39:10): [True: 951, False: 301]
  ------------------
   40|  1.25k|}

_ZN4llvh18StringMapEntryBaseC2Em:
   43|  11.9k|  explicit StringMapEntryBase(size_t Len) : StrLen(Len) {}
_ZNK4llvh18StringMapEntryBase12getKeyLengthEv:
   45|  17.9k|  size_t getKeyLength() const { return StrLen; }
_ZN4llvh13StringMapImplC2Ej:
   63|  10.0k|      : ItemSize(itemSize) {}
_ZN4llvh13StringMapImpl15getTombstoneValEv:
  102|  54.1k|  static StringMapEntryBase *getTombstoneVal() {
  103|  54.1k|    uintptr_t Val = static_cast<uintptr_t>(-1);
  104|  54.1k|    Val <<= PointerLikeTypeTraits<StringMapEntryBase *>::NumLowBitsAvailable;
  105|  54.1k|    return reinterpret_cast<StringMapEntryBase *>(Val);
  106|  54.1k|  }
_ZNK4llvh13StringMapImpl5emptyEv:
  111|  10.0k|  bool empty() const { return NumItems == 0; }
_ZNK4llvh13StringMapImpl4sizeEv:
  112|  5.04k|  unsigned size() const { return NumItems; }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEEC2Ev:
  226|  5.04k|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEED2Ev:
  289|  5.04k|  ~StringMap() {
  290|       |    // Delete all the elements in the map, but don't reset the elements
  291|       |    // to default values.  This is a copy of clear(), but avoids unnecessary
  292|       |    // work not required in the destructor.
  293|  5.04k|    if (!empty()) {
  ------------------
  |  Branch (293:9): [True: 5.04k, False: 0]
  ------------------
  294|  85.6k|      for (unsigned I = 0, E = NumBuckets; I != E; ++I) {
  ------------------
  |  Branch (294:44): [True: 80.6k, False: 5.04k]
  ------------------
  295|  80.6k|        StringMapEntryBase *Bucket = TheTable[I];
  296|  80.6k|        if (Bucket && Bucket != getTombstoneVal()) {
  ------------------
  |  Branch (296:13): [True: 5.97k, False: 74.6k]
  |  Branch (296:23): [True: 5.97k, False: 0]
  ------------------
  297|  5.97k|          static_cast<MapEntryTy*>(Bucket)->Destroy(Allocator);
  298|  5.97k|        }
  299|  80.6k|      }
  300|  5.04k|    }
  301|  5.04k|    free(TheTable);
  302|  5.04k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE7DestroyINS_15MallocAllocatorEEEvRT_:
  201|  5.97k|  void Destroy(AllocatorTy &Allocator) {
  202|       |    // Free memory referenced by the item.
  203|  5.97k|    size_t AllocSize = sizeof(StringMapEntry) + getKeyLength() + 1;
  204|  5.97k|    this->~StringMapEntry();
  205|  5.97k|    Allocator.Deallocate(static_cast<void *>(this), AllocSize);
  206|  5.97k|  }
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEEC2Ev:
  226|  5.04k|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEED2Ev:
  289|  5.04k|  ~StringMap() {
  290|       |    // Delete all the elements in the map, but don't reset the elements
  291|       |    // to default values.  This is a copy of clear(), but avoids unnecessary
  292|       |    // work not required in the destructor.
  293|  5.04k|    if (!empty()) {
  ------------------
  |  Branch (293:9): [True: 5.04k, False: 0]
  ------------------
  294|  85.6k|      for (unsigned I = 0, E = NumBuckets; I != E; ++I) {
  ------------------
  |  Branch (294:44): [True: 80.6k, False: 5.04k]
  ------------------
  295|  80.6k|        StringMapEntryBase *Bucket = TheTable[I];
  296|  80.6k|        if (Bucket && Bucket != getTombstoneVal()) {
  ------------------
  |  Branch (296:13): [True: 5.97k, False: 74.6k]
  |  Branch (296:23): [True: 5.97k, False: 0]
  ------------------
  297|  5.97k|          static_cast<MapEntryTy*>(Bucket)->Destroy(Allocator);
  298|  5.97k|        }
  299|  80.6k|      }
  300|  5.04k|    }
  301|  5.04k|    free(TheTable);
  302|  5.04k|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEE7DestroyINS_15MallocAllocatorEEEvRT_:
  201|  5.97k|  void Destroy(AllocatorTy &Allocator) {
  202|       |    // Free memory referenced by the item.
  203|  5.97k|    size_t AllocSize = sizeof(StringMapEntry) + getKeyLength() + 1;
  204|  5.97k|    this->~StringMapEntry();
  205|  5.97k|    Allocator.Deallocate(static_cast<void *>(this), AllocSize);
  206|  5.97k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEEixENS_9StringRefE:
  356|  11.9k|  ValueTy &operator[](StringRef Key) { return try_emplace(Key).first->second; }
ESTreeIRGen-expr.cpp:_ZN4llvh9StringMapIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueNS_15MallocAllocatorEE11try_emplaceIJEEENSt3__14pairINS_17StringMapIteratorIS7_EEbEENS_9StringRefEDpOT_:
  395|  11.9k|  std::pair<iterator, bool> try_emplace(StringRef Key, ArgsTy &&... Args) {
  396|  11.9k|    unsigned BucketNo = LookupBucketFor(Key);
  397|  11.9k|    StringMapEntryBase *&Bucket = TheTable[BucketNo];
  398|  11.9k|    if (Bucket && Bucket != getTombstoneVal())
  ------------------
  |  Branch (398:9): [True: 5.97k, False: 5.97k]
  |  Branch (398:19): [True: 5.97k, False: 0]
  ------------------
  399|  5.97k|      return std::make_pair(iterator(TheTable + BucketNo, false),
  400|  5.97k|                            false); // Already exists in map.
  401|       |
  402|  5.97k|    if (Bucket == getTombstoneVal())
  ------------------
  |  Branch (402:9): [True: 0, False: 5.97k]
  ------------------
  403|      0|      --NumTombstones;
  404|  5.97k|    Bucket = MapEntryTy::Create(Key, Allocator, std::forward<ArgsTy>(Args)...);
  405|  5.97k|    ++NumItems;
  406|  5.97k|    assert(NumItems + NumTombstones <= NumBuckets);
  407|       |
  408|      0|    BucketNo = RehashTable(BucketNo);
  409|  5.97k|    return std::make_pair(iterator(TheTable + BucketNo, false), true);
  410|  11.9k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEC2EPPNS_18StringMapEntryBaseEb:
  520|  11.9k|      : base(Bucket, NoAdvance) {}
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENS_14StringMapEntryIS8_EEEC2EPPNS_18StringMapEntryBaseEb:
  462|  11.9k|      : Ptr(Bucket) {
  463|  11.9k|    if (!NoAdvance) AdvancePastEmptyBuckets();
  ------------------
  |  Branch (463:9): [True: 11.9k, False: 0]
  ------------------
  464|  11.9k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENS_14StringMapEntryIS8_EEE23AdvancePastEmptyBucketsEv:
  486|  11.9k|  void AdvancePastEmptyBuckets() {
  487|  11.9k|    while (*Ptr == nullptr || *Ptr == StringMapImpl::getTombstoneVal())
  ------------------
  |  Branch (487:12): [True: 0, False: 11.9k]
  |  Branch (487:31): [True: 0, False: 11.9k]
  ------------------
  488|      0|      ++Ptr;
  489|  11.9k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE6CreateINS_15MallocAllocatorEJEEEPS8_NS_9StringRefERT_DpOT0_:
  157|  5.97k|                                InitTy &&... InitVals) {
  158|  5.97k|    size_t KeyLength = Key.size();
  159|       |
  160|       |    // Allocate a new item with space for the string at the end and a null
  161|       |    // terminator.
  162|  5.97k|    size_t AllocSize = sizeof(StringMapEntry) + KeyLength + 1;
  163|  5.97k|    size_t Alignment = alignof(StringMapEntry);
  164|       |
  165|  5.97k|    StringMapEntry *NewItem =
  166|  5.97k|      static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
  167|  5.97k|    assert(NewItem && "Unhandled out-of-memory");
  168|       |
  169|       |    // Construct the value.
  170|      0|    new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...);
  171|       |
  172|       |    // Copy the string information.
  173|  5.97k|    char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
  174|  5.97k|    if (KeyLength > 0)
  ------------------
  |  Branch (174:9): [True: 3.47k, False: 2.50k]
  ------------------
  175|  3.47k|      memcpy(StrBuffer, Key.data(), KeyLength);
  176|  5.97k|    StrBuffer[KeyLength] = 0;  // Null terminate for convenience of clients.
  177|  5.97k|    return NewItem;
  178|  5.97k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEC2Em:
  131|  5.97k|    : StringMapEntryBase(strLen), second() {}
ESTreeIRGen-expr.cpp:_ZNK4llvh14StringMapEntryIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueE10getKeyDataEv:
  149|  5.97k|  const char *getKeyData() const {return reinterpret_cast<const char*>(this+1);}
ESTreeIRGen-expr.cpp:_ZNK4llvh17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS1_6ESTree20ObjectExpressionNodeEE13PropertyValueEdeEv:
  522|  11.9k|  StringMapEntry<ValueTy> &operator*() const {
  523|  11.9k|    return *static_cast<StringMapEntry<ValueTy> *>(*this->Ptr);
  524|  11.9k|  }
_ZN4llvh9StringMapINS_7SMRangeENS_15MallocAllocatorEE11try_emplaceIJS1_EEENSt3__14pairINS_17StringMapIteratorIS1_EEbEENS_9StringRefEDpOT_:
  395|  5.97k|  std::pair<iterator, bool> try_emplace(StringRef Key, ArgsTy &&... Args) {
  396|  5.97k|    unsigned BucketNo = LookupBucketFor(Key);
  397|  5.97k|    StringMapEntryBase *&Bucket = TheTable[BucketNo];
  398|  5.97k|    if (Bucket && Bucket != getTombstoneVal())
  ------------------
  |  Branch (398:9): [True: 0, False: 5.97k]
  |  Branch (398:19): [True: 0, False: 0]
  ------------------
  399|      0|      return std::make_pair(iterator(TheTable + BucketNo, false),
  400|      0|                            false); // Already exists in map.
  401|       |
  402|  5.97k|    if (Bucket == getTombstoneVal())
  ------------------
  |  Branch (402:9): [True: 0, False: 5.97k]
  ------------------
  403|      0|      --NumTombstones;
  404|  5.97k|    Bucket = MapEntryTy::Create(Key, Allocator, std::forward<ArgsTy>(Args)...);
  405|  5.97k|    ++NumItems;
  406|  5.97k|    assert(NumItems + NumTombstones <= NumBuckets);
  407|       |
  408|      0|    BucketNo = RehashTable(BucketNo);
  409|  5.97k|    return std::make_pair(iterator(TheTable + BucketNo, false), true);
  410|  5.97k|  }
_ZN4llvh17StringMapIteratorINS_7SMRangeEEC2EPPNS_18StringMapEntryBaseEb:
  520|  5.97k|      : base(Bucket, NoAdvance) {}
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorINS_7SMRangeEEENS_14StringMapEntryIS2_EEEC2EPPNS_18StringMapEntryBaseEb:
  462|  5.97k|      : Ptr(Bucket) {
  463|  5.97k|    if (!NoAdvance) AdvancePastEmptyBuckets();
  ------------------
  |  Branch (463:9): [True: 5.97k, False: 0]
  ------------------
  464|  5.97k|  }
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorINS_7SMRangeEEENS_14StringMapEntryIS2_EEE23AdvancePastEmptyBucketsEv:
  486|  5.97k|  void AdvancePastEmptyBuckets() {
  487|  5.97k|    while (*Ptr == nullptr || *Ptr == StringMapImpl::getTombstoneVal())
  ------------------
  |  Branch (487:12): [True: 0, False: 5.97k]
  |  Branch (487:31): [True: 0, False: 5.97k]
  ------------------
  488|      0|      ++Ptr;
  489|  5.97k|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEE6CreateINS_15MallocAllocatorEJS1_EEEPS2_NS_9StringRefERT_DpOT0_:
  157|  5.97k|                                InitTy &&... InitVals) {
  158|  5.97k|    size_t KeyLength = Key.size();
  159|       |
  160|       |    // Allocate a new item with space for the string at the end and a null
  161|       |    // terminator.
  162|  5.97k|    size_t AllocSize = sizeof(StringMapEntry) + KeyLength + 1;
  163|  5.97k|    size_t Alignment = alignof(StringMapEntry);
  164|       |
  165|  5.97k|    StringMapEntry *NewItem =
  166|  5.97k|      static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
  167|  5.97k|    assert(NewItem && "Unhandled out-of-memory");
  168|       |
  169|       |    // Construct the value.
  170|      0|    new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...);
  171|       |
  172|       |    // Copy the string information.
  173|  5.97k|    char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
  174|  5.97k|    if (KeyLength > 0)
  ------------------
  |  Branch (174:9): [True: 5.97k, False: 0]
  ------------------
  175|  5.97k|      memcpy(StrBuffer, Key.data(), KeyLength);
  176|  5.97k|    StrBuffer[KeyLength] = 0;  // Null terminate for convenience of clients.
  177|  5.97k|    return NewItem;
  178|  5.97k|  }
_ZN4llvh14StringMapEntryINS_7SMRangeEEC2IJS1_EEEmDpOT_:
  134|  5.97k|      : StringMapEntryBase(strLen), second(std::forward<InitTy>(InitVals)...) {}
_ZNK4llvh14StringMapEntryINS_7SMRangeEE10getKeyDataEv:
  149|  5.97k|  const char *getKeyData() const {return reinterpret_cast<const char*>(this+1);}
_ZN4llvh9StringMapINSt3__14pairIPNS_10TimerGroupENS0_INS_5TimerENS_15MallocAllocatorEEEEES6_EC2Ev:
  226|      1|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
_ZN4llvh9StringMapIPNS_2cl6OptionENS_15MallocAllocatorEE6insertENSt3__14pairINS_9StringRefES3_EE:
  386|     42|  std::pair<iterator, bool> insert(std::pair<StringRef, ValueTy> KV) {
  387|     42|    return try_emplace(KV.first, std::move(KV.second));
  388|     42|  }
_ZN4llvh9StringMapIPNS_2cl6OptionENS_15MallocAllocatorEE11try_emplaceIJS3_EEENSt3__14pairINS_17StringMapIteratorIS3_EEbEENS_9StringRefEDpOT_:
  395|     42|  std::pair<iterator, bool> try_emplace(StringRef Key, ArgsTy &&... Args) {
  396|     42|    unsigned BucketNo = LookupBucketFor(Key);
  397|     42|    StringMapEntryBase *&Bucket = TheTable[BucketNo];
  398|     42|    if (Bucket && Bucket != getTombstoneVal())
  ------------------
  |  Branch (398:9): [True: 0, False: 42]
  |  Branch (398:19): [True: 0, False: 0]
  ------------------
  399|      0|      return std::make_pair(iterator(TheTable + BucketNo, false),
  400|      0|                            false); // Already exists in map.
  401|       |
  402|     42|    if (Bucket == getTombstoneVal())
  ------------------
  |  Branch (402:9): [True: 0, False: 42]
  ------------------
  403|      0|      --NumTombstones;
  404|     42|    Bucket = MapEntryTy::Create(Key, Allocator, std::forward<ArgsTy>(Args)...);
  405|     42|    ++NumItems;
  406|     42|    assert(NumItems + NumTombstones <= NumBuckets);
  407|       |
  408|      0|    BucketNo = RehashTable(BucketNo);
  409|     42|    return std::make_pair(iterator(TheTable + BucketNo, false), true);
  410|     42|  }
_ZN4llvh17StringMapIteratorIPNS_2cl6OptionEEC2EPPNS_18StringMapEntryBaseEb:
  520|     46|      : base(Bucket, NoAdvance) {}
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIPNS_2cl6OptionEEENS_14StringMapEntryIS4_EEEC2EPPNS_18StringMapEntryBaseEb:
  462|     46|      : Ptr(Bucket) {
  463|     46|    if (!NoAdvance) AdvancePastEmptyBuckets();
  ------------------
  |  Branch (463:9): [True: 42, False: 4]
  ------------------
  464|     46|  }
_ZN4llvh17StringMapIterBaseINS_17StringMapIteratorIPNS_2cl6OptionEEENS_14StringMapEntryIS4_EEE23AdvancePastEmptyBucketsEv:
  486|     42|  void AdvancePastEmptyBuckets() {
  487|     42|    while (*Ptr == nullptr || *Ptr == StringMapImpl::getTombstoneVal())
  ------------------
  |  Branch (487:12): [True: 0, False: 42]
  |  Branch (487:31): [True: 0, False: 42]
  ------------------
  488|      0|      ++Ptr;
  489|     42|  }
_ZN4llvh14StringMapEntryIPNS_2cl6OptionEE6CreateINS_15MallocAllocatorEJS3_EEEPS4_NS_9StringRefERT_DpOT0_:
  157|     42|                                InitTy &&... InitVals) {
  158|     42|    size_t KeyLength = Key.size();
  159|       |
  160|       |    // Allocate a new item with space for the string at the end and a null
  161|       |    // terminator.
  162|     42|    size_t AllocSize = sizeof(StringMapEntry) + KeyLength + 1;
  163|     42|    size_t Alignment = alignof(StringMapEntry);
  164|       |
  165|     42|    StringMapEntry *NewItem =
  166|     42|      static_cast<StringMapEntry*>(Allocator.Allocate(AllocSize,Alignment));
  167|     42|    assert(NewItem && "Unhandled out-of-memory");
  168|       |
  169|       |    // Construct the value.
  170|      0|    new (NewItem) StringMapEntry(KeyLength, std::forward<InitTy>(InitVals)...);
  171|       |
  172|       |    // Copy the string information.
  173|     42|    char *StrBuffer = const_cast<char*>(NewItem->getKeyData());
  174|     42|    if (KeyLength > 0)
  ------------------
  |  Branch (174:9): [True: 42, False: 0]
  ------------------
  175|     42|      memcpy(StrBuffer, Key.data(), KeyLength);
  176|     42|    StrBuffer[KeyLength] = 0;  // Null terminate for convenience of clients.
  177|     42|    return NewItem;
  178|     42|  }
_ZN4llvh14StringMapEntryIPNS_2cl6OptionEEC2IJS3_EEEmDpOT_:
  134|     42|      : StringMapEntryBase(strLen), second(std::forward<InitTy>(InitVals)...) {}
_ZNK4llvh14StringMapEntryIPNS_2cl6OptionEE10getKeyDataEv:
  149|     42|  const char *getKeyData() const {return reinterpret_cast<const char*>(this+1);}
_ZNK4llvh17StringMapIterBaseINS_17StringMapIteratorIPNS_2cl6OptionEEENS_14StringMapEntryIS4_EEEeqERKS5_:
  471|      2|  bool operator==(const DerivedTy &RHS) const { return Ptr == RHS.Ptr; }
_ZN4llvh9StringMapIPNS_2cl6OptionENS_15MallocAllocatorEEC2Ev:
  226|      4|  StringMap() : StringMapImpl(static_cast<unsigned>(sizeof(MapEntryTy))) {}
_ZN4llvh9StringMapIPNS_2cl6OptionENS_15MallocAllocatorEE5beginEv:
  315|      2|  iterator begin() {
  316|      2|    return iterator(TheTable, NumBuckets == 0);
  317|      2|  }
_ZN4llvh9StringMapIPNS_2cl6OptionENS_15MallocAllocatorEE3endEv:
  318|      2|  iterator end() {
  319|      2|    return iterator(TheTable+NumBuckets, true);
  320|      2|  }

_ZN4llvh9StringRefC2EPKc:
   91|  2.74M|        : Data(Str), Length(Str ? ::strlen(Str) : 0) {}
_ZN4llvh9StringRefC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  101|  35.3k|      : Data(Str.data()), Length(Str.length()) {}
_ZN4llvh9StringRefC2EPKcm:
   96|   159M|        : Data(data), Length(length) {}
_ZNK4llvh9StringRef4dataEv:
  133|   167M|    const char *data() const { return Data; }
_ZN4llvheqENS_9StringRefES0_:
  903|  67.6M|  inline bool operator==(StringRef LHS, StringRef RHS) {
  904|  67.6M|    return LHS.equals(RHS);
  905|  67.6M|  }
_ZNK4llvh9StringRef6equalsES0_:
  174|  67.6M|    bool equals(StringRef RHS) const {
  175|  67.6M|      return (Length == RHS.Length &&
  ------------------
  |  Branch (175:15): [True: 7.01M, False: 60.5M]
  ------------------
  176|  67.6M|              compareMemory(Data, RHS.Data, RHS.Length) == 0);
  ------------------
  |  Branch (176:15): [True: 5.09M, False: 1.91M]
  ------------------
  177|  67.6M|    }
_ZN4llvh9StringRef13compareMemoryEPKcS2_m:
   72|  7.02M|    static int compareMemory(const char *Lhs, const char *Rhs, size_t Length) {
   73|  7.02M|      if (Length == 0) { return 0; }
  ------------------
  |  Branch (73:11): [True: 763k, False: 6.25M]
  ------------------
   74|  6.25M|      return ::memcmp(Lhs,Rhs,Length);
   75|  7.02M|    }
_ZNK4llvh9StringRef4sizeEv:
  143|   379k|    size_t size() const { return Length; }
_ZNK4llvh9StringRef5beginEv:
  111|  7.79M|    iterator begin() const { return Data; }
_ZNK4llvh9StringRef3endEv:
  113|  7.76M|    iterator end() const { return Data + Length; }
_ZNK4llvh9StringRef11bytes_beginEv:
  115|  18.1k|    const unsigned char *bytes_begin() const {
  116|  18.1k|      return reinterpret_cast<const unsigned char *>(begin());
  117|  18.1k|    }
_ZNK4llvh9StringRef9bytes_endEv:
  118|  18.1k|    const unsigned char *bytes_end() const {
  119|  18.1k|      return reinterpret_cast<const unsigned char *>(end());
  120|  18.1k|    }
_ZNK4llvh9StringRef5bytesEv:
  121|  17.9k|    iterator_range<const unsigned char *> bytes() const {
  122|  17.9k|      return make_range(bytes_begin(), bytes_end());
  123|  17.9k|    }
_ZNK4llvh9StringRef5emptyEv:
  138|    414|    bool empty() const { return Length == 0; }
_ZNK4llvh9StringRef7compareES0_:
  189|  7.33k|    int compare(StringRef RHS) const {
  190|       |      // Check the prefix for a mismatch.
  191|  7.33k|      if (int Res = compareMemory(Data, RHS.Data, std::min(Length, RHS.Length)))
  ------------------
  |  Branch (191:15): [True: 6.27k, False: 1.06k]
  ------------------
  192|  6.27k|        return Res < 0 ? -1 : 1;
  ------------------
  |  Branch (192:16): [True: 5.06k, False: 1.21k]
  ------------------
  193|       |
  194|       |      // Otherwise the prefixes match, so we only need to check the lengths.
  195|  1.06k|      if (Length == RHS.Length)
  ------------------
  |  Branch (195:11): [True: 48, False: 1.01k]
  ------------------
  196|     48|        return 0;
  197|  1.01k|      return Length < RHS.Length ? -1 : 1;
  ------------------
  |  Branch (197:14): [True: 575, False: 438]
  ------------------
  198|  1.06k|    }
_ZNK4llvh9StringRef3strEv:
  233|  30.9k|    std::string str() const {
  234|  30.9k|      if (!Data) return std::string();
  ------------------
  |  Branch (234:11): [True: 24, False: 30.9k]
  ------------------
  235|  30.9k|      return std::string(Data, Length);
  236|  30.9k|    }
_ZNK4llvh9StringRefixEm:
  243|  31.5M|    char operator[](size_t Index) const {
  244|  31.5M|      assert(Index < Length && "Invalid index!");
  245|      0|      return Data[Index];
  246|  31.5M|    }
_ZNK4llvh9StringRefcvNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEEv:
  261|  24.6k|    operator std::string() const {
  262|  24.6k|      return str();
  263|  24.6k|    }
_ZNK4llvh9StringRef10startswithES0_:
  272|      3|    bool startswith(StringRef Prefix) const {
  273|      3|      return Length >= Prefix.Length &&
  ------------------
  |  Branch (273:14): [True: 3, False: 0]
  ------------------
  274|      3|             compareMemory(Data, Prefix.Data, Prefix.Length) == 0;
  ------------------
  |  Branch (274:14): [True: 0, False: 3]
  ------------------
  275|      3|    }
_ZN4llvh9StringRef13consume_frontES0_:
  683|      3|    bool consume_front(StringRef Prefix) {
  684|      3|      if (!startswith(Prefix))
  ------------------
  |  Branch (684:11): [True: 3, False: 0]
  ------------------
  685|      3|        return false;
  686|       |
  687|      0|      *this = drop_front(Prefix.size());
  688|      0|      return true;
  689|      3|    }
_ZN4llvhltENS_9StringRefES0_:
  910|  7.33k|  inline bool operator<(StringRef LHS, StringRef RHS) {
  911|  7.33k|    return LHS.compare(RHS) == -1;
  912|  7.33k|  }
_ZN4llvh9StringRefC2Ev:
   82|  11.7k|    /*implicit*/ StringRef() = default;
_ZN4llvh13StringLiteralC2ILm4EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm4ELi1EEERAT__Kc:
  889|  5.29M|        : StringRef(Str, N - 1) {
  890|  5.29M|    }
_ZN4llvh13StringLiteralC2ILm3EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm3ELi1EEERAT__Kc:
  889|  3.97M|        : StringRef(Str, N - 1) {
  890|  3.97M|    }
_ZN4llvh13StringLiteralC2ILm6EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm6ELi1EEERAT__Kc:
  889|  11.9M|        : StringRef(Str, N - 1) {
  890|  11.9M|    }
_ZN4llvh13StringLiteralC2ILm7EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm7ELi1EEERAT__Kc:
  889|  10.5M|        : StringRef(Str, N - 1) {
  890|  10.5M|    }
_ZN4llvh13StringLiteralC2ILm8EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm8ELi1EEERAT__Kc:
  889|  6.61M|        : StringRef(Str, N - 1) {
  890|  6.61M|    }
_ZN4llvh13StringLiteralC2ILm9EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm9ELi1EEERAT__Kc:
  889|  3.97M|        : StringRef(Str, N - 1) {
  890|  3.97M|    }
_ZN4llvh13StringLiteralC2ILm5EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm5ELi1EEERAT__Kc:
  889|  10.5M|        : StringRef(Str, N - 1) {
  890|  10.5M|    }
_ZN4llvh13StringLiteralC2ILm11EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm11ELi1EEERAT__Kc:
  889|  2.64M|        : StringRef(Str, N - 1) {
  890|  2.64M|    }
_ZN4llvh13StringLiteralC2ILm10EEEUa9enable_ifIXeqclL_Z16__builtin_strlenEfL0p_EmiLm10ELi1EEERAT__Kc:
  889|  2.64M|        : StringRef(Str, N - 1) {
  890|  2.64M|    }

_ZN4llvh12StringSwitchIN6hermes6parser9TokenKindES3_EC2ENS_9StringRefE:
   54|  1.32M|  : Str(S), Result() { }
_ZN4llvh12StringSwitchIN6hermes6parser9TokenKindES3_E4CaseENS_13StringLiteralES3_:
   70|  58.2M|  StringSwitch &Case(StringLiteral S, T Value) {
   71|  58.2M|    if (!Result && Str == S) {
  ------------------
  |  Branch (71:9): [True: 57.7M, False: 465k]
  |  Branch (71:20): [True: 12.1k, False: 57.7M]
  ------------------
   72|  12.1k|      Result = std::move(Value);
   73|  12.1k|    }
   74|  58.2M|    return *this;
   75|  58.2M|  }
_ZN4llvh12StringSwitchIN6hermes6parser9TokenKindES3_E7DefaultES3_:
  203|  1.32M|  R Default(T Value) {
  204|  1.32M|    if (Result)
  ------------------
  |  Branch (204:9): [True: 12.1k, False: 1.31M]
  ------------------
  205|  12.1k|      return std::move(*Result);
  206|  1.31M|    return Value;
  207|  1.32M|  }

_ZN4llvh5TwineC2ENS0_5ChildENS0_8NodeKindES1_S2_:
  184|  7.45k|        : LHS(LHS), RHS(RHS), LHSKind(LHSKind), RHSKind(RHSKind) {
  185|  7.45k|      assert(isValid() && "Invalid twine!");
  186|  7.45k|    }
_ZNK4llvh5Twine6isNullEv:
  189|  48.0k|    bool isNull() const {
  190|  48.0k|      return getLHSKind() == NullKind;
  191|  48.0k|    }
_ZNK4llvh5Twine7isEmptyEv:
  194|  48.0k|    bool isEmpty() const {
  195|  48.0k|      return getLHSKind() == EmptyKind;
  196|  48.0k|    }
_ZNK4llvh5Twine9isNullaryEv:
  199|  34.4k|    bool isNullary() const {
  200|  34.4k|      return isNull() || isEmpty();
  ------------------
  |  Branch (200:14): [True: 0, False: 34.4k]
  |  Branch (200:26): [True: 0, False: 34.4k]
  ------------------
  201|  34.4k|    }
_ZNK4llvh5Twine7isUnaryEv:
  204|  13.6k|    bool isUnary() const {
  205|  13.6k|      return getRHSKind() == EmptyKind && !isNullary();
  ------------------
  |  Branch (205:14): [True: 13.4k, False: 130]
  |  Branch (205:43): [True: 13.4k, False: 0]
  ------------------
  206|  13.6k|    }
_ZNK4llvh5Twine8isBinaryEv:
  209|    130|    bool isBinary() const {
  210|    130|      return getLHSKind() != NullKind && getRHSKind() != EmptyKind;
  ------------------
  |  Branch (210:14): [True: 130, False: 0]
  |  Branch (210:42): [True: 130, False: 0]
  ------------------
  211|    130|    }
_ZNK4llvh5Twine7isValidEv:
  215|  20.9k|    bool isValid() const {
  216|       |      // Nullary twines always have Empty on the RHS.
  217|  20.9k|      if (isNullary() && getRHSKind() != EmptyKind)
  ------------------
  |  Branch (217:11): [True: 0, False: 20.9k]
  |  Branch (217:26): [True: 0, False: 0]
  ------------------
  218|      0|        return false;
  219|       |
  220|       |      // Null should never appear on the RHS.
  221|  20.9k|      if (getRHSKind() == NullKind)
  ------------------
  |  Branch (221:11): [True: 0, False: 20.9k]
  ------------------
  222|      0|        return false;
  223|       |
  224|       |      // The RHS cannot be non-empty if the LHS is empty.
  225|  20.9k|      if (getRHSKind() != EmptyKind && getLHSKind() == EmptyKind)
  ------------------
  |  Branch (225:11): [True: 6.80k, False: 14.1k]
  |  Branch (225:40): [True: 0, False: 6.80k]
  ------------------
  226|      0|        return false;
  227|       |
  228|       |      // A twine child should always be binary.
  229|  20.9k|      if (getLHSKind() == TwineKind &&
  ------------------
  |  Branch (229:11): [True: 130, False: 20.8k]
  ------------------
  230|  20.9k|          !LHS.twine->isBinary())
  ------------------
  |  Branch (230:11): [True: 0, False: 130]
  ------------------
  231|      0|        return false;
  232|  20.9k|      if (getRHSKind() == TwineKind &&
  ------------------
  |  Branch (232:11): [True: 0, False: 20.9k]
  ------------------
  233|  20.9k|          !RHS.twine->isBinary())
  ------------------
  |  Branch (233:11): [True: 0, False: 0]
  ------------------
  234|      0|        return false;
  235|       |
  236|  20.9k|      return true;
  237|  20.9k|    }
_ZNK4llvh5Twine10getLHSKindEv:
  240|   144k|    NodeKind getLHSKind() const { return LHSKind; }
_ZNK4llvh5Twine10getRHSKindEv:
  243|  89.5k|    NodeKind getRHSKind() const { return RHSKind; }
_ZN4llvh5TwineC2EPKc:
  268|  1.39k|    /*implicit*/ Twine(const char *Str) {
  269|  1.39k|      if (Str[0] != '\0') {
  ------------------
  |  Branch (269:11): [True: 1.39k, False: 0]
  ------------------
  270|  1.39k|        LHS.cString = Str;
  271|  1.39k|        LHSKind = CStringKind;
  272|  1.39k|      } else
  273|      0|        LHSKind = EmptyKind;
  274|       |
  275|  1.39k|      assert(isValid() && "Invalid twine!");
  276|  1.39k|    }
_ZN4llvh5TwineC2ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  279|     18|    /*implicit*/ Twine(const std::string &Str) : LHSKind(StdStringKind) {
  280|     18|      LHS.stdString = &Str;
  281|     18|      assert(isValid() && "Invalid twine!");
  282|     18|    }
_ZN4llvh5TwineC2ERKNS_9StringRefE:
  285|  12.1k|    /*implicit*/ Twine(const StringRef &Str) : LHSKind(StringRefKind) {
  286|  12.1k|      LHS.stringRef = &Str;
  287|  12.1k|      assert(isValid() && "Invalid twine!");
  288|  12.1k|    }
_ZN4llvh5TwineC2Ei:
  325|     86|    explicit Twine(int Val) : LHSKind(DecIKind) {
  326|     86|      LHS.decI = Val;
  327|     86|    }
_ZN4llvh5Twine9utohexstrERKm:
  385|    652|    static Twine utohexstr(const uint64_t &Val) {
  386|    652|      Child LHS, RHS;
  387|    652|      LHS.uHex = &Val;
  388|    652|      RHS.twine = nullptr;
  389|    652|      return Twine(LHS, UHexKind, RHS, EmptyKind);
  390|    652|    }
_ZNK4llvh5Twine17isSingleStringRefEv:
  404|  6.70k|    bool isSingleStringRef() const {
  405|  6.70k|      if (getRHSKind() != EmptyKind) return false;
  ------------------
  |  Branch (405:11): [True: 6.02k, False: 680]
  ------------------
  406|       |
  407|    680|      switch (getLHSKind()) {
  408|      0|      case EmptyKind:
  ------------------
  |  Branch (408:7): [True: 0, False: 680]
  ------------------
  409|    474|      case CStringKind:
  ------------------
  |  Branch (409:7): [True: 474, False: 206]
  ------------------
  410|    474|      case StdStringKind:
  ------------------
  |  Branch (410:7): [True: 0, False: 680]
  ------------------
  411|    680|      case StringRefKind:
  ------------------
  |  Branch (411:7): [True: 206, False: 474]
  ------------------
  412|    680|      case SmallStringKind:
  ------------------
  |  Branch (412:7): [True: 0, False: 680]
  ------------------
  413|    680|        return true;
  414|      0|      default:
  ------------------
  |  Branch (414:7): [True: 0, False: 680]
  ------------------
  415|      0|        return false;
  416|    680|      }
  417|    680|    }
_ZNK4llvh5Twine18getSingleStringRefEv:
  437|    340|    StringRef getSingleStringRef() const {
  438|    340|      assert(isSingleStringRef() &&"This cannot be had as a single stringref!");
  439|      0|      switch (getLHSKind()) {
  440|      0|      default: llvm_unreachable("Out of sync with isSingleStringRef");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  |  Branch (440:7): [True: 0, False: 340]
  ------------------
  441|      0|      case EmptyKind:      return StringRef();
  ------------------
  |  Branch (441:7): [True: 0, False: 340]
  ------------------
  442|    237|      case CStringKind:    return StringRef(LHS.cString);
  ------------------
  |  Branch (442:7): [True: 237, False: 103]
  ------------------
  443|      0|      case StdStringKind:  return StringRef(*LHS.stdString);
  ------------------
  |  Branch (443:7): [True: 0, False: 340]
  ------------------
  444|    103|      case StringRefKind:  return *LHS.stringRef;
  ------------------
  |  Branch (444:7): [True: 103, False: 237]
  ------------------
  445|      0|      case SmallStringKind:
  ------------------
  |  Branch (445:7): [True: 0, False: 340]
  ------------------
  446|      0|        return StringRef(LHS.smallString->data(), LHS.smallString->size());
  447|    340|      }
  448|    340|    }
_ZNK4llvh5Twine11toStringRefERNS_15SmallVectorImplIcEE:
  453|  6.36k|    StringRef toStringRef(SmallVectorImpl<char> &Out) const {
  454|  6.36k|      if (isSingleStringRef())
  ------------------
  |  Branch (454:11): [True: 340, False: 6.02k]
  ------------------
  455|    340|        return getSingleStringRef();
  456|  6.02k|      toVector(Out);
  457|  6.02k|      return StringRef(Out.data(), Out.size());
  458|  6.36k|    }
_ZNK4llvh5Twine6concatERKS0_:
  486|  6.80k|  inline Twine Twine::concat(const Twine &Suffix) const {
  487|       |    // Concatenation with null is null.
  488|  6.80k|    if (isNull() || Suffix.isNull())
  ------------------
  |  Branch (488:9): [True: 0, False: 6.80k]
  |  Branch (488:21): [True: 0, False: 6.80k]
  ------------------
  489|      0|      return Twine(NullKind);
  490|       |
  491|       |    // Concatenation with empty yields the other side.
  492|  6.80k|    if (isEmpty())
  ------------------
  |  Branch (492:9): [True: 0, False: 6.80k]
  ------------------
  493|      0|      return Suffix;
  494|  6.80k|    if (Suffix.isEmpty())
  ------------------
  |  Branch (494:9): [True: 0, False: 6.80k]
  ------------------
  495|      0|      return *this;
  496|       |
  497|       |    // Otherwise we need to create a new node, taking care to fold in unary
  498|       |    // twines.
  499|  6.80k|    Child NewLHS, NewRHS;
  500|  6.80k|    NewLHS.twine = this;
  501|  6.80k|    NewRHS.twine = &Suffix;
  502|  6.80k|    NodeKind NewLHSKind = TwineKind, NewRHSKind = TwineKind;
  503|  6.80k|    if (isUnary()) {
  ------------------
  |  Branch (503:9): [True: 6.67k, False: 130]
  ------------------
  504|  6.67k|      NewLHS = LHS;
  505|  6.67k|      NewLHSKind = getLHSKind();
  506|  6.67k|    }
  507|  6.80k|    if (Suffix.isUnary()) {
  ------------------
  |  Branch (507:9): [True: 6.80k, False: 0]
  ------------------
  508|  6.80k|      NewRHS = Suffix.LHS;
  509|  6.80k|      NewRHSKind = Suffix.getLHSKind();
  510|  6.80k|    }
  511|       |
  512|  6.80k|    return Twine(NewLHS, NewLHSKind, NewRHS, NewRHSKind);
  513|  6.80k|  }
_ZN4llvhplERKNS_5TwineES2_:
  515|  6.80k|  inline Twine operator+(const Twine &LHS, const Twine &RHS) {
  516|  6.80k|    return LHS.concat(RHS);
  517|  6.80k|  }

_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE5clearEv:
  309|   267k|  void clear() { erase(begin(), end()); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEESC_:
  303|   267k|  iterator erase(iterator first, iterator last) {
  304|  1.93M|    while (first != last)
  ------------------
  |  Branch (304:12): [True: 1.67M, False: 267k]
  ------------------
  305|  1.67M|      first = erase(first);
  306|   267k|    return last;
  307|   267k|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  267|  2.27M|  iterator erase(iterator where) {
  268|  2.27M|    this->deleteNode(remove(where));
  269|  2.27M|    return where;
  270|  2.27M|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE6removeERNS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  251|  2.27M|  pointer remove(iterator &IT) {
  252|  2.27M|    pointer Node = &*IT++;
  253|  2.27M|    this->removeNodeFromList(Node); // Notify traits that we removed a node...
  254|  2.27M|    base_list_type::remove(*Node);
  255|  2.27M|    return Node;
  256|  2.27M|  }
_ZN4llvh21ilist_callback_traitsIN6hermes11InstructionEE18removeNodeFromListEPS2_:
   67|  2.27M|  void removeNodeFromList(NodeTy *) {}
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE5clearEv:
  309|   114k|  void clear() { erase(begin(), end()); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEESC_:
  303|   114k|  iterator erase(iterator first, iterator last) {
  304|   382k|    while (first != last)
  ------------------
  |  Branch (304:12): [True: 267k, False: 114k]
  ------------------
  305|   267k|      first = erase(first);
  306|   114k|    return last;
  307|   114k|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  267|   267k|  iterator erase(iterator where) {
  268|   267k|    this->deleteNode(remove(where));
  269|   267k|    return where;
  270|   267k|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE6removeERNS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  251|   267k|  pointer remove(iterator &IT) {
  252|   267k|    pointer Node = &*IT++;
  253|   267k|    this->removeNodeFromList(Node); // Notify traits that we removed a node...
  254|   267k|    base_list_type::remove(*Node);
  255|   267k|    return Node;
  256|   267k|  }
_ZN4llvh21ilist_callback_traitsIN6hermes10BasicBlockEE18removeNodeFromListEPS2_:
   67|   267k|  void removeNodeFromList(NodeTy *) {}
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE5clearEv:
  309|    112|  void clear() { erase(begin(), end()); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEESC_:
  303|    112|  iterator erase(iterator first, iterator last) {
  304|   114k|    while (first != last)
  ------------------
  |  Branch (304:12): [True: 114k, False: 112]
  ------------------
  305|   114k|      first = erase(first);
  306|    112|    return last;
  307|    112|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE5eraseENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  267|   114k|  iterator erase(iterator where) {
  268|   114k|    this->deleteNode(remove(where));
  269|   114k|    return where;
  270|   114k|  }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE6removeERNS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEE:
  251|   114k|  pointer remove(iterator &IT) {
  252|   114k|    pointer Node = &*IT++;
  253|   114k|    this->removeNodeFromList(Node); // Notify traits that we removed a node...
  254|   114k|    base_list_type::remove(*Node);
  255|   114k|    return Node;
  256|   114k|  }
_ZN4llvh21ilist_callback_traitsIN6hermes8FunctionEE18removeNodeFromListEPS2_:
   67|   114k|  void removeNodeFromList(NodeTy *) {}
_ZN4llvh6iplistIN6hermes8FunctionEJEEC2Ev:
  395|     56|  iplist() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEEC2Ev:
  197|     56|  iplist_impl() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEED2Ev:
  210|   267k|  ~iplist_impl() { clear(); }
_ZN4llvh6iplistIN6hermes10BasicBlockEJEEC2Ev:
  395|   114k|  iplist() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEEC2Ev:
  197|   114k|  iplist_impl() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEED2Ev:
  210|   114k|  ~iplist_impl() { clear(); }
_ZN4llvh6iplistIN6hermes11InstructionEJEEC2Ev:
  395|   267k|  iplist() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEEC2Ev:
  197|   267k|  iplist_impl() = default;
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEED2Ev:
  210|     56|  ~iplist_impl() { clear(); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEEPS3_:
  228|  2.27M|  iterator insert(iterator where, pointer New) {
  229|  2.27M|    this->addNodeToList(New); // Notify traits that we added a node...
  230|  2.27M|    return base_list_type::insert(where, *New);
  231|  2.27M|  }
_ZN4llvh21ilist_callback_traitsIN6hermes11InstructionEE13addNodeToListEPS2_:
   66|  2.27M|  void addNodeToList(NodeTy *) {}
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes11InstructionEJEEENS_12ilist_traitsIS3_EEE5eraseEPS3_:
  272|   602k|  iterator erase(pointer IT) { return erase(iterator(IT)); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE9push_backEPS3_:
  313|   267k|  void push_back(pointer val) { insert(end(), val); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes10BasicBlockEJEEENS_12ilist_traitsIS3_EEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEEPS3_:
  228|   267k|  iterator insert(iterator where, pointer New) {
  229|   267k|    this->addNodeToList(New); // Notify traits that we added a node...
  230|   267k|    return base_list_type::insert(where, *New);
  231|   267k|  }
_ZN4llvh21ilist_callback_traitsIN6hermes10BasicBlockEE13addNodeToListEPS2_:
   66|   267k|  void addNodeToList(NodeTy *) {}
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE9push_backEPS3_:
  313|   114k|  void push_back(pointer val) { insert(end(), val); }
_ZN4llvh11iplist_implINS_12simple_ilistIN6hermes8FunctionEJEEENS_12ilist_traitsIS3_EEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEEPS3_:
  228|   114k|  iterator insert(iterator where, pointer New) {
  229|   114k|    this->addNodeToList(New); // Notify traits that we added a node...
  230|   114k|    return base_list_type::insert(where, *New);
  231|   114k|  }
_ZN4llvh21ilist_callback_traitsIN6hermes8FunctionEE13addNodeToListEPS2_:
   66|   114k|  void addNodeToList(NodeTy *) {}

_ZN4llvh10ilist_baseILb0EE14transferBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEEEEvRT_SC_SC_:
   86|  1.92M|  template <class T> static void transferBefore(T &Next, T &First, T &Last) {
   87|  1.92M|    transferBeforeImpl(Next, First, Last);
   88|  1.92M|  }
_ZN4llvh10ilist_baseILb0EE18transferBeforeImplERNS_15ilist_node_baseILb0EEES4_S4_:
   54|  1.92M|                                 node_base_type &Last) {
   55|  1.92M|    if (&Next == &Last || &First == &Last)
  ------------------
  |  Branch (55:9): [True: 0, False: 1.92M]
  |  Branch (55:27): [True: 780k, False: 1.14M]
  ------------------
   56|   780k|      return;
   57|       |
   58|       |    // Position cannot be contained in the range to be transferred.
   59|  1.14M|    assert(&Next != &First &&
   60|       |           // Check for the most common mistake.
   61|  1.14M|           "Insertion point can't be one of the transferred nodes");
   62|       |
   63|      0|    node_base_type &Final = *Last.getPrev();
   64|       |
   65|       |    // Detach from old list/position.
   66|  1.14M|    First.getPrev()->setNext(&Last);
   67|  1.14M|    Last.setPrev(First.getPrev());
   68|       |
   69|       |    // Splice [First, Final] into its new list/position.
   70|  1.14M|    node_base_type &Prev = *Next.getPrev();
   71|  1.14M|    Final.setNext(&Next);
   72|  1.14M|    First.setPrev(&Prev);
   73|  1.14M|    Prev.setNext(&First);
   74|  1.14M|    Next.setPrev(&Final);
   75|  1.14M|  }
_ZN4llvh10ilist_baseILb0EE6removeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEEEEvRT_:
   81|  2.27M|  template <class T> static void remove(T &N) { removeImpl(N); }
_ZN4llvh10ilist_baseILb0EE10removeImplERNS_15ilist_node_baseILb0EEE:
   31|  2.65M|  static void removeImpl(node_base_type &N) {
   32|  2.65M|    node_base_type *Prev = N.getPrev();
   33|  2.65M|    node_base_type *Next = N.getNext();
   34|  2.65M|    Next->setPrev(Prev);
   35|  2.65M|    Prev->setNext(Next);
   36|       |
   37|       |    // Not strictly necessary, but helps catch a class of bugs.
   38|  2.65M|    N.setPrev(nullptr);
   39|  2.65M|    N.setNext(nullptr);
   40|  2.65M|  }
_ZN4llvh10ilist_baseILb0EE6removeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEEEEvRT_:
   81|   267k|  template <class T> static void remove(T &N) { removeImpl(N); }
_ZN4llvh10ilist_baseILb0EE6removeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEEEEvRT_:
   81|   114k|  template <class T> static void remove(T &N) { removeImpl(N); }
_ZN4llvh10ilist_baseILb0EE12insertBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEEEEvRT_SC_:
   77|    928|  template <class T> static void insertBefore(T &Next, T &N) {
   78|    928|    insertBeforeImpl(Next, N);
   79|    928|  }
_ZN4llvh10ilist_baseILb0EE16insertBeforeImplERNS_15ilist_node_baseILb0EEES4_:
   23|  6.41M|  static void insertBeforeImpl(node_base_type &Next, node_base_type &N) {
   24|  6.41M|    node_base_type &Prev = *Next.getPrev();
   25|  6.41M|    N.setNext(&Next);
   26|  6.41M|    N.setPrev(&Prev);
   27|  6.41M|    Prev.setNext(&N);
   28|  6.41M|    Next.setPrev(&N);
   29|  6.41M|  }
_ZN4llvh10ilist_baseILb0EE6removeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEEEEvRT_:
   81|    928|  template <class T> static void remove(T &N) { removeImpl(N); }
_ZN4llvh10ilist_baseILb0EE12insertBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEEEEvRT_SB_:
   77|  2.27M|  template <class T> static void insertBefore(T &Next, T &N) {
   78|  2.27M|    insertBeforeImpl(Next, N);
   79|  2.27M|  }
_ZN4llvh10ilist_baseILb0EE12insertBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEEEEvRT_SB_:
   77|   267k|  template <class T> static void insertBefore(T &Next, T &N) {
   78|   267k|    insertBeforeImpl(Next, N);
   79|   267k|  }
_ZN4llvh10ilist_baseILb0EE12insertBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEEEEvRT_SB_:
   77|   114k|  template <class T> static void insertBefore(T &Next, T &N) {
   78|   114k|    insertBeforeImpl(Next, N);
   79|   114k|  }
_ZN4llvh10ilist_baseILb0EE12insertBeforeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEEEEvRT_SC_:
   77|  3.75M|  template <class T> static void insertBefore(T &Next, T &N) {
   78|  3.75M|    insertBeforeImpl(Next, N);
   79|  3.75M|  }
_ZN4llvh10ilist_baseILb0EE6removeINS_15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEEEEvRT_:
   81|    650|  template <class T> static void remove(T &N) { removeImpl(N); }

_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEppEv:
  158|  6.83M|  ilist_iterator &operator++() {
  159|  6.83M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  6.83M|    return *this;
  161|  6.83M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|  9.52M|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEES8_:
  149|  40.2M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  40.2M|    return LHS.NodePtr != RHS.NodePtr;
  151|  40.2M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEppEi:
  167|  4.73M|  ilist_iterator operator++(int) {
  168|  4.73M|    ilist_iterator tmp = *this;
  169|  4.73M|    ++*this;
  170|  4.73M|    return tmp;
  171|  4.73M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEppEv:
  158|  39.9M|  ilist_iterator &operator++() {
  159|  39.9M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  39.9M|    return *this;
  161|  39.9M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEdeEv:
  139|  35.8M|  reference operator*() const {
  140|  35.8M|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  35.8M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEppEv:
  158|  1.30M|  ilist_iterator &operator++() {
  159|  1.30M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  1.30M|    return *this;
  161|  1.30M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEppEv:
  158|  1.57M|  ilist_iterator &operator++() {
  159|  1.57M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  1.57M|    return *this;
  161|  1.57M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEppEv:
  158|   307k|  ilist_iterator &operator++() {
  159|   307k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|   307k|    return *this;
  161|   307k|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEES8_:
  149|  1.57M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  1.57M|    return LHS.NodePtr != RHS.NodePtr;
  151|  1.57M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEdeEv:
  139|  1.30M|  reference operator*() const {
  140|  1.30M|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  1.30M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEdeEv:
  139|   307k|  reference operator*() const {
  140|   307k|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|   307k|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEES8_:
  149|  6.49M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  6.49M|    return LHS.NodePtr != RHS.NodePtr;
  151|  6.49M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEppEi:
  167|   267k|  ilist_iterator operator++(int) {
  168|   267k|    ilist_iterator tmp = *this;
  169|   267k|    ++*this;
  170|   267k|    return tmp;
  171|   267k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEppEv:
  158|  7.56M|  ilist_iterator &operator++() {
  159|  7.56M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  7.56M|    return *this;
  161|  7.56M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEdeEv:
  139|  5.61M|  reference operator*() const {
  140|  5.61M|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  5.61M|  }
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEES8_:
  149|  2.41M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  2.41M|    return LHS.NodePtr != RHS.NodePtr;
  151|  2.41M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEppEi:
  167|   114k|  ilist_iterator operator++(int) {
  168|   114k|    ilist_iterator tmp = *this;
  169|   114k|    ++*this;
  170|   114k|    return tmp;
  171|   114k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEppEv:
  158|  2.41M|  ilist_iterator &operator++() {
  159|  2.41M|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  2.41M|    return *this;
  161|  2.41M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEdeEv:
  139|  2.41M|  reference operator*() const {
  140|  2.41M|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  2.41M|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|    928|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|     99|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEppEv:
  158|     99|  ilist_iterator &operator++() {
  159|     99|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|     99|    return *this;
  161|     99|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb1ELb0EEdeEv:
  139|     99|  reference operator*() const {
  140|     99|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|     99|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|  7.65k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEES9_:
  149|  49.5k|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  49.5k|    return LHS.NodePtr != RHS.NodePtr;
  151|  49.5k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEppEv:
  158|  49.5k|  ilist_iterator &operator++() {
  159|  49.5k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  49.5k|    return *this;
  161|  49.5k|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEdeEv:
  139|  46.1k|  reference operator*() const {
  140|  46.1k|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  46.1k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEELb0ELb0EEC2EPS5_:
   85|    928|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  5.22M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  13.8M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|   117k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|  4.39M|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEES9_:
  149|   591k|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|   591k|    return LHS.NodePtr != RHS.NodePtr;
  151|   591k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEppEv:
  158|   591k|  ilist_iterator &operator++() {
  159|   591k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|   591k|    return *this;
  161|   591k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEC2ERKNS_15ilist_node_implIS6_EE:
   83|   231k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|  11.7M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEdeEv:
  139|  3.92M|  reference operator*() const {
  140|  3.92M|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  3.92M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb1EEC2ERKNS_15ilist_node_implIS5_EE:
   83|   307k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvhneERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEES9_:
  149|  4.82M|  friend bool operator!=(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  150|  4.82M|    return LHS.NodePtr != RHS.NodePtr;
  151|  4.82M|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS6_EE:
   83|  20.4k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEppEv:
  158|  20.4k|  ilist_iterator &operator++() {
  159|  20.4k|    NodePtr = IsReverse ? NodePtr->getPrev() : NodePtr->getNext();
  ------------------
  |  Branch (159:15): [Folded - Ignored]
  ------------------
  160|  20.4k|    return *this;
  161|  20.4k|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb1ELb0EEdeEv:
  139|  20.4k|  reference operator*() const {
  140|  20.4k|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|  20.4k|  }
_ZN4llvheqERKNS_14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEES9_:
  146|  41.0k|  friend bool operator==(const ilist_iterator &LHS, const ilist_iterator &RHS) {
  147|  41.0k|    return LHS.NodePtr == RHS.NodePtr;
  148|  41.0k|  }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb0EEC2ERNS_15ilist_node_implIS5_EE:
   83|  1.30M|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb1ELb1EEC2ERKNS_15ilist_node_implIS5_EE:
   83|   307k|  explicit ilist_iterator(node_reference N) : NodePtr(&N) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|  2.27M|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEELb0ELb0EEptEv:
  143|   943k|  pointer operator->() const { return &operator*(); }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|   267k|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|   267k|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EE10getNodePtrEv:
  174|   114k|  node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); }
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEELb0ELb0EEC2EPS4_:
   85|   114k|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEC2EPS5_:
   85|  3.75M|  explicit ilist_iterator(pointer NP) : NodePtr(Access::getNodePtr(NP)) {}
_ZN4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb0EEppEi:
  167|    650|  ilist_iterator operator++(int) {
  168|    650|    ilist_iterator tmp = *this;
  169|    650|    ++*this;
  170|    650|    return tmp;
  171|    650|  }
_ZNK4llvh14ilist_iteratorINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEELb0ELb1EEdeEv:
  139|     73|  reference operator*() const {
  140|     73|    assert(!NodePtr->isKnownSentinel());
  141|      0|    return *Access::getValuePtr(NodePtr);
  142|     73|  }

_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getPrevEv:
   62|  20.4k|  ilist_node_impl *getPrev() {
   63|  20.4k|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|  20.4k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getNextEv:
   66|  6.83M|  ilist_node_impl *getNext() {
   67|  6.83M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  6.83M|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE5resetEv:
  244|  3.85M|  void reset() {
  245|  3.85M|    this->setPrev(this);
  246|  3.85M|    this->setNext(this);
  247|  3.85M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7setPrevEPS7_:
   78|  3.85M|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7setNextEPS7_:
   79|  3.85M|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE5resetEv:
  244|   267k|  void reset() {
  245|   267k|    this->setPrev(this);
  246|   267k|    this->setNext(this);
  247|   267k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7setPrevEPS6_:
   78|   267k|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7setNextEPS6_:
   79|   267k|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getPrevEv:
   62|  1.30M|  ilist_node_impl *getPrev() {
   63|  1.30M|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|  1.30M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getNextEv:
   66|  39.9M|  ilist_node_impl *getNext() {
   67|  39.9M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  39.9M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|  37.1M|  static pointer getValuePtr(node_type *N) {
  226|  37.1M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  37.1M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|  37.1M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  37.1M|    return static_cast<typename OptionsT::pointer>(N);
  180|  37.1M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE10getNodePtrEPS4_:
  217|  8.94M|  static node_type *getNodePtr(pointer N) {
  218|  8.94M|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  8.94M|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|  8.94M|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  8.94M|    return N;
  169|  8.94M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getPrevEv:
   70|  2.03M|  const ilist_node_impl *getPrev() const {
   71|  2.03M|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|  2.03M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE7getNextEv:
   74|  1.57M|  const ilist_node_impl *getNext() const {
   75|  1.57M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   76|  1.57M|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE5emptyEv:
  249|  1.73M|  bool empty() const { return this == this->getPrev(); }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getValuePtrEPKNS_15ilist_node_implIS5_EE:
  229|   307k|  static const_pointer getValuePtr(const node_type *N) {
  230|   307k|    return NodeAccess::getValuePtr<OptionsT>(N);
  231|   307k|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes11InstructionELb0ELb0EvEEEENT_13const_pointerEPKNS_15ilist_node_implIS7_EE:
  184|   307k|  getValuePtr(const ilist_node_impl<OptionsT> *N) {
  185|   307k|    return static_cast<typename OptionsT::const_pointer>(N);
  186|   307k|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE5resetEv:
  244|   114k|  void reset() {
  245|   114k|    this->setPrev(this);
  246|   114k|    this->setNext(this);
  247|   114k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7setPrevEPS6_:
   78|   114k|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7setNextEPS6_:
   79|   114k|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE7getNextEv:
   66|  7.56M|  ilist_node_impl *getNext() {
   67|  7.56M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  7.56M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|  5.61M|  static pointer getValuePtr(node_type *N) {
  226|  5.61M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  5.61M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|  5.61M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  5.61M|    return static_cast<typename OptionsT::pointer>(N);
  180|  5.61M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE10getNodePtrEPS4_:
  217|   803k|  static node_type *getNodePtr(pointer N) {
  218|   803k|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|   803k|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|   803k|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|   803k|    return N;
  169|   803k|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE5resetEv:
  244|     56|  void reset() {
  245|     56|    this->setPrev(this);
  246|     56|    this->setNext(this);
  247|     56|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7setPrevEPS6_:
   78|     56|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7setNextEPS6_:
   79|     56|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7getNextEv:
   66|  2.41M|  ilist_node_impl *getNext() {
   67|  2.41M|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  2.41M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEE10getNodePtrEPS4_:
  217|   344k|  static node_type *getNodePtr(pointer N) {
  218|   344k|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|   344k|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS8_7pointerE:
  167|   344k|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|   344k|    return N;
  169|   344k|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE5emptyEv:
  249|     56|  bool empty() const { return this == this->getPrev(); }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEE7getPrevEv:
   70|     56|  const ilist_node_impl *getPrev() const {
   71|     56|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|     56|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS5_EE:
  225|  2.41M|  static pointer getValuePtr(node_type *N) {
  226|  2.41M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  2.41M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes8FunctionELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS7_EE:
  178|  2.41M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  2.41M|    return static_cast<typename OptionsT::pointer>(N);
  180|  2.41M|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE5resetEv:
  244|     99|  void reset() {
  245|     99|    this->setPrev(this);
  246|     99|    this->setNext(this);
  247|     99|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7setPrevEPS7_:
   78|     99|  void setPrev(ilist_node_impl *N) { node_base_type::setPrev(N); }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7setNextEPS7_:
   79|     99|  void setNext(ilist_node_impl *N) { node_base_type::setNext(N); }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE10getNodePtrEPS5_:
  217|  2.78k|  static node_type *getNodePtr(pointer N) {
  218|  2.78k|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  2.78k|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS9_7pointerE:
  167|  2.78k|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  2.78k|    return N;
  169|  2.78k|  }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEC2Ev:
  239|     56|  ilist_sentinel() {
  240|     56|    this->initializeSentinel();
  241|     56|    reset();
  242|     56|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes8FunctionELb0ELb0EvEEEC2Ev:
   59|   114k|  ilist_node_impl() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEC2Ev:
  239|     99|  ilist_sentinel() {
  240|     99|    this->initializeSentinel();
  241|     99|    reset();
  242|     99|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEC2Ev:
   59|  1.02k|  ilist_node_impl() = default;
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getPrevEv:
   62|     99|  ilist_node_impl *getPrev() {
   63|     99|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   64|     99|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS6_EE:
  225|  46.2k|  static pointer getValuePtr(node_type *N) {
  226|  46.2k|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  46.2k|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS8_EE:
  178|  46.2k|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  46.2k|    return static_cast<typename OptionsT::pointer>(N);
  180|  46.2k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getNextEv:
   66|  49.5k|  ilist_node_impl *getNext() {
   67|  49.5k|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   68|  49.5k|  }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE5emptyEv:
  249|     99|  bool empty() const { return this == this->getPrev(); }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes2vm13RuntimeModuleELb0ELb0EvEEE7getPrevEv:
   70|     99|  const ilist_node_impl *getPrev() const {
   71|     99|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|     99|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getNextEv:
   74|   591k|  const ilist_node_impl *getNext() const {
   75|   591k|    return static_cast<ilist_node_impl *>(node_base_type::getNext());
   76|   591k|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE11getValuePtrEPNS_15ilist_node_implIS6_EE:
  225|  3.95M|  static pointer getValuePtr(node_type *N) {
  226|  3.95M|    return NodeAccess::getValuePtr<OptionsT>(N);
  227|  3.95M|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEENT_7pointerEPNS_15ilist_node_implIS8_EE:
  178|  3.95M|  static typename OptionsT::pointer getValuePtr(ilist_node_impl<OptionsT> *N) {
  179|  3.95M|    return static_cast<typename OptionsT::pointer>(N);
  180|  3.95M|  }
_ZNK4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE7getPrevEv:
   70|  33.7k|  const ilist_node_impl *getPrev() const {
   71|  33.7k|    return static_cast<ilist_node_impl *>(node_base_type::getPrev());
   72|  33.7k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEE11getIteratorEv:
   82|   858k|  self_iterator getIterator() { return self_iterator(*this); }
_ZNK4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE5emptyEv:
  249|  33.7k|  bool empty() const { return this == this->getPrev(); }
_ZN4llvh22ilist_node_with_parentIN6hermes8FunctionENS1_6ModuleEJEEC2Ev:
  259|   114k|  ilist_node_with_parent() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEC2Ev:
  239|   114k|  ilist_sentinel() {
  240|   114k|    this->initializeSentinel();
  241|   114k|    reset();
  242|   114k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEEC2Ev:
   59|   382k|  ilist_node_impl() = default;
_ZN4llvh22ilist_node_with_parentIN6hermes10BasicBlockENS1_8FunctionEJEEC2Ev:
  259|   267k|  ilist_node_with_parent() = default;
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEC2Ev:
  239|   267k|  ilist_sentinel() {
  240|   267k|    this->initializeSentinel();
  241|   267k|    reset();
  242|   267k|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes11InstructionELb0ELb0EvEEEC2Ev:
   59|  2.54M|  ilist_node_impl() = default;
_ZN4llvh22ilist_node_with_parentIN6hermes11InstructionENS1_10BasicBlockEJEEC2Ev:
  259|  2.27M|  ilist_node_with_parent() = default;
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes10BasicBlockELb0ELb0EvEEE11getIteratorEv:
   82|      6|  self_iterator getIterator() { return self_iterator(*this); }
_ZN4llvh14ilist_sentinelINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEC2Ev:
  239|  3.85M|  ilist_sentinel() {
  240|  3.85M|    this->initializeSentinel();
  241|  3.85M|    reset();
  242|  3.85M|  }
_ZN4llvh15ilist_node_implINS_12ilist_detail12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEC2Ev:
   59|  11.3M|  ilist_node_impl() = default;
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE10getNodePtrEPS5_:
  217|  7.51M|  static node_type *getNodePtr(pointer N) {
  218|  7.51M|    return NodeAccess::getNodePtr<OptionsT>(N);
  219|  7.51M|  }
_ZN4llvh12ilist_detail10NodeAccess10getNodePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEEPNS_15ilist_node_implIT_EENS9_7pointerE:
  167|  7.51M|  static ilist_node_impl<OptionsT> *getNodePtr(typename OptionsT::pointer N) {
  168|  7.51M|    return N;
  169|  7.51M|  }
_ZN4llvh12ilist_detail18SpecificNodeAccessINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEE11getValuePtrEPKNS_15ilist_node_implIS6_EE:
  229|     73|  static const_pointer getValuePtr(const node_type *N) {
  230|     73|    return NodeAccess::getValuePtr<OptionsT>(N);
  231|     73|  }
_ZN4llvh12ilist_detail10NodeAccess11getValuePtrINS0_12node_optionsIN6hermes6ESTree4NodeELb0ELb0EvEEEENT_13const_pointerEPKNS_15ilist_node_implIS8_EE:
  184|     73|  getValuePtr(const ilist_node_impl<OptionsT> *N) {
  185|     73|    return static_cast<typename OptionsT::const_pointer>(N);
  186|     73|  }

_ZN4llvh15ilist_node_baseILb0EE7setPrevEPS1_:
   27|  25.8M|  void setPrev(ilist_node_base *Prev) { this->Prev = Prev; }
_ZN4llvh15ilist_node_baseILb0EE7setNextEPS1_:
   28|  25.8M|  void setNext(ilist_node_base *Next) { this->Next = Next; }
_ZNK4llvh15ilist_node_baseILb0EE7getPrevEv:
   29|  17.0M|  ilist_node_base *getPrev() const { return Prev; }
_ZNK4llvh15ilist_node_baseILb0EE7getNextEv:
   30|  61.6M|  ilist_node_base *getNext() const { return Next; }
_ZNK4llvh15ilist_node_baseILb0EE15isKnownSentinelEv:
   32|  49.4M|  bool isKnownSentinel() const { return false; }
_ZN4llvh15ilist_node_baseILb0EE18initializeSentinelEv:
   33|  4.23M|  void initializeSentinel() {}

_ZNK4llvh20iterator_facade_baseIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorENSt3__120forward_iterator_tagEPNS2_6GCCellElPS8_RS8_EneERKS4_:
  151|  11.9M|  bool operator!=(const DerivedT &RHS) const {
  152|  11.9M|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|  11.9M|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEENSt3__126random_access_iterator_tagES6_iPS6_SA_EppEv:
  126|  39.5k|  DerivedT &operator++() {
  127|  39.5k|    static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
  128|  39.5k|                  "Must pass the derived type to this template!");
  129|  39.5k|    return static_cast<DerivedT *>(this)->operator+=(1);
  130|  39.5k|  }
_ZNK4llvh20iterator_facade_baseINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEENSt3__126random_access_iterator_tagES6_iPS6_SA_EneERKS7_:
  151|   193k|  bool operator!=(const DerivedT &RHS) const {
  152|   193k|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|   193k|  }
_ZNK4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EneERKS5_:
  151|   659k|  bool operator!=(const DerivedT &RHS) const {
  152|   659k|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|   659k|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EppEv:
  126|   158k|  DerivedT &operator++() {
  127|   158k|    static_assert(std::is_base_of<iterator_facade_base, DerivedT>::value,
  128|   158k|                  "Must pass the derived type to this template!");
  129|   158k|    return static_cast<DerivedT *>(this)->operator+=(1);
  130|   158k|  }
ESTreeIRGen-expr.cpp:_ZN4llvh20iterator_facade_baseINS_17StringMapIteratorIZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS2_6ESTree20ObjectExpressionNodeEE13PropertyValueEENSt3__120forward_iterator_tagENS_14StringMapEntryIS8_EElPSD_RSD_EptEv:
  175|  11.9k|  PointerT operator->() { return &static_cast<DerivedT *>(this)->operator*(); }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EmmEv:
  136|    320|  DerivedT &operator--() {
  137|    320|    static_assert(
  138|    320|        IsBidirectional,
  139|    320|        "The decrement operator is only defined for bidirectional iterators.");
  140|    320|    return static_cast<DerivedT *>(this)->operator-=(1);
  141|    320|  }
_ZN4llvh20iterator_facade_baseINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEENSt3__126random_access_iterator_tagES4_iPS4_S8_EppEi:
  131|   118k|  DerivedT operator++(int) {
  132|   118k|    DerivedT tmp = *static_cast<DerivedT *>(this);
  133|   118k|    ++*static_cast<DerivedT *>(this);
  134|   118k|    return tmp;
  135|   118k|  }
_ZNK4llvh20iterator_facade_baseINS_17StringMapIteratorIPNS_2cl6OptionEEENSt3__120forward_iterator_tagENS_14StringMapEntryIS4_EElPS9_RS9_EneERKS5_:
  151|      2|  bool operator!=(const DerivedT &RHS) const {
  152|      2|    return !static_cast<const DerivedT *>(this)->operator==(RHS);
  153|      2|  }

_ZN4llvh10make_rangeIPKhEENS_14iterator_rangeIT_EES4_S4_:
   54|  17.9k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|  17.9k|  return iterator_range<T>(std::move(x), std::move(y));
   56|  17.9k|}
_ZN4llvh10make_rangeINS_28const_set_bits_iterator_implINS_9BitVectorEEEEENS_14iterator_rangeIT_EES5_S5_:
   54|    141|template <class T> iterator_range<T> make_range(T x, T y) {
   55|    141|  return iterator_range<T>(std::move(x), std::move(y));
   56|    141|}
_ZN4llvh10make_rangeIN6hermes2vm10NativeArgs15handle_iteratorEEENS_14iterator_rangeIT_EES6_S6_:
   54|      5|template <class T> iterator_range<T> make_range(T x, T y) {
   55|      5|  return iterator_range<T>(std::move(x), std::move(y));
   56|      5|}
_ZN4llvh14iterator_rangeINS_28const_set_bits_iterator_implINS_9BitVectorEEEEC2ES3_S3_:
   44|    141|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_28const_set_bits_iterator_implINS_9BitVectorEEEE5beginEv:
   46|    141|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_28const_set_bits_iterator_implINS_9BitVectorEEEE3endEv:
   47|    141|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEEC2ES4_S4_:
   44|    403|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEE5beginEv:
   46|    379|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm19StackFrameIteratorTILb0EEEE3endEv:
   47|     96|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEEC2ES4_S4_:
   44|      5|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEE5beginEv:
   46|      5|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm10NativeArgs15handle_iteratorEE3endEv:
   47|      5|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEEC2ES4_S4_:
   44|  3.02k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEE5beginEv:
   46|  3.02k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIN6hermes2vm18AlignedHeapSegment16HeapCellIteratorEE3endEv:
   47|  3.02k|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEEC2ES8_S8_:
   44|    112|        end_iterator(std::move(end_iterator)) {}
_ZN4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEEC2ES7_S7_:
   44|   153k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEE5beginEv:
   46|   153k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIKN6hermes14TerminatorInstEKNS2_10BasicBlockEEEE3endEv:
   47|   153k|  IteratorT end() const { return end_iterator; }
_ZNK4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEE5beginEv:
   46|    112|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__111__wrap_iterIPKPN6hermes20GlobalObjectPropertyEEEE3endEv:
   47|    112|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEC2ES5_S5_:
   44|  39.8k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEE5beginEv:
   46|  39.8k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEE3endEv:
   47|  39.8k|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEEENS_14iterator_rangeIT_EESA_SA_:
   54|  3.85k|template <class T> iterator_range<T> make_range(T x, T y) {
   55|  3.85k|  return iterator_range<T>(std::move(x), std::move(y));
   56|  3.85k|}
_ZN4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEEC2ES8_S8_:
   44|  3.85k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEE5beginEv:
   46|  3.85k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorIPPN6hermes6ESTree24AssignmentExpressionNodeEEEE3endEv:
   47|  3.85k|  IteratorT end() const { return end_iterator; }
_ZN4llvh10make_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEEENS_14iterator_rangeIT_EESA_SA_:
   54|    160|template <class T> iterator_range<T> make_range(T x, T y) {
   55|    160|  return iterator_range<T>(std::move(x), std::move(y));
   56|    160|}
_ZN4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEEC2ES8_S8_:
   44|    160|        end_iterator(std::move(end_iterator)) {}
_ZN4llvh10make_rangeINS_12SuccIteratorIN6hermes14TerminatorInstENS2_10BasicBlockEEEEENS_14iterator_rangeIT_EES7_S7_:
   54|    160|template <class T> iterator_range<T> make_range(T x, T y) {
   55|    160|  return iterator_range<T>(std::move(x), std::move(y));
   56|    160|}
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEE5beginEv:
   46|    160|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeINSt3__116reverse_iteratorINS_12SuccIteratorIN6hermes14TerminatorInstENS4_10BasicBlockEEEEEE3endEv:
   47|    160|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEEC2ES5_S5_:
   44|     18|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEE5beginEv:
   46|     18|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIPKN6hermes18SourceErrorManager11MessageDataEE3endEv:
   47|     18|  IteratorT end() const { return end_iterator; }
_ZN4llvh14iterator_rangeIPKhEC2ES2_S2_:
   44|  17.9k|        end_iterator(std::move(end_iterator)) {}
_ZNK4llvh14iterator_rangeIPKhE5beginEv:
   46|  17.9k|  IteratorT begin() const { return begin_iterator; }
_ZNK4llvh14iterator_rangeIPKhE3endEv:
   47|  17.9k|  IteratorT end() const { return end_iterator; }

_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE3endEv:
  120|  8.70M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6spliceENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS4_:
  239|  1.92M|  void splice(iterator I, simple_ilist &L2) {
  240|  1.92M|    splice(I, L2, L2.begin(), L2.end());
  241|  1.92M|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5beginEv:
  118|  3.02M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6spliceENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS4_S9_S9_:
  249|  1.92M|  void splice(iterator I, simple_ilist &, iterator First, iterator Last) {
  250|  1.92M|    list_base_type::transferBefore(*I.getNodePtr(), *First.getNodePtr(),
  251|  1.92M|                                   *Last.getNodePtr());
  252|  1.92M|  }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6removeERS2_:
  184|  2.27M|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE5beginEv:
  118|  5.81M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE3endEv:
  120|  7.21M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6rbeginEv:
  122|  1.30M|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE5beginEv:
  119|   153k|  const_iterator begin() const { return ++const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE3endEv:
  121|   153k|  const_iterator end() const { return const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE6rbeginEv:
  123|   307k|  const_reverse_iterator rbegin() const {
  124|   307k|    return ++const_reverse_iterator(Sentinel);
  125|   307k|  }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE4sizeEv:
  135|   153k|  LLVM_NODISCARD size_type size() const {
  136|   153k|    return std::distance(begin(), end());
  137|   153k|  }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE5emptyEv:
  132|  1.73M|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE5frontEv:
  139|  39.3k|  reference front() { return *begin(); }
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE4backEv:
  141|  1.30M|  reference back() { return *rbegin(); }
_ZNK4llvh12simple_ilistIN6hermes11InstructionEJEE4backEv:
  142|   307k|  const_reference back() const { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE6removeERS2_:
  184|   267k|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE5beginEv:
  118|  3.01M|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE3endEv:
  120|  2.21M|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE5frontEv:
  139|   724k|  reference front() { return *begin(); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE6removeERS2_:
  184|   114k|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZNK4llvh12simple_ilistIN6hermes8FunctionEJEE5emptyEv:
  132|     56|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE5beginEv:
  118|  1.23k|  iterator begin() { return ++iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE3endEv:
  120|   116k|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE9push_backERS3_:
  148|    928|  void push_back(reference Node) { insert(end(), Node); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE3endEv:
  120|  4.28k|  iterator end() { return iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS3_:
  160|    928|  iterator insert(iterator I, reference Node) {
  161|    928|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|    928|    return iterator(&Node);
  163|    928|  }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEEC2Ev:
  103|     56|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEEC2Ev:
  103|     99|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE4backEv:
  141|     99|  reference back() { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6rbeginEv:
  122|     99|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE5beginEv:
  118|  3.36k|  iterator begin() { return ++iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE5emptyEv:
  132|     99|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes2vm13RuntimeModuleEJEE6removeERS3_:
  184|    928|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE4sizeEv:
  135|   115k|  LLVM_NODISCARD size_type size() const {
  136|   115k|    return std::distance(begin(), end());
  137|   115k|  }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5beginEv:
  119|   115k|  const_iterator begin() const { return ++const_iterator(Sentinel); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE3endEv:
  121|   115k|  const_iterator end() const { return const_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5frontEv:
  139|     41|  reference front() { return *begin(); }
_ZNK4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE5emptyEv:
  132|  33.7k|  LLVM_NODISCARD bool empty() const { return Sentinel.empty(); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE4backEv:
  141|  20.4k|  reference back() { return *rbegin(); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6rbeginEv:
  122|  20.4k|  reverse_iterator rbegin() { return ++reverse_iterator(Sentinel); }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEEC2Ev:
  103|   114k|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEEC2Ev:
  103|   267k|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes11InstructionEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|  2.27M|  iterator insert(iterator I, reference Node) {
  161|  2.27M|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|  2.27M|    return iterator(&Node);
  163|  2.27M|  }
_ZN4llvh12simple_ilistIN6hermes10BasicBlockEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|   267k|  iterator insert(iterator I, reference Node) {
  161|   267k|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|   267k|    return iterator(&Node);
  163|   267k|  }
_ZN4llvh12simple_ilistIN6hermes8FunctionEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS2_Lb0ELb0EvEELb0ELb0EEERS2_:
  160|   114k|  iterator insert(iterator I, reference Node) {
  161|   114k|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|   114k|    return iterator(&Node);
  163|   114k|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEEC2Ev:
  103|  1.92M|  simple_ilist() = default;
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEEC2EOS4_:
  111|  1.92M|  simple_ilist(simple_ilist &&X) { splice(end(), X); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE9push_backERS3_:
  148|  3.75M|  void push_back(reference Node) { insert(end(), Node); }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6insertENS_14ilist_iteratorINS_12ilist_detail12node_optionsIS3_Lb0ELb0EvEELb0ELb0EEERS3_:
  160|  3.75M|  iterator insert(iterator I, reference Node) {
  161|  3.75M|    list_base_type::insertBefore(*I.getNodePtr(), *this->getNodePtr(&Node));
  162|  3.75M|    return iterator(&Node);
  163|  3.75M|  }
_ZN4llvh12simple_ilistIN6hermes6ESTree4NodeEJEE6removeERS3_:
  184|    650|  void remove(reference N) { list_base_type::remove(*this->getNodePtr(&N)); }

_ZNK4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEeqERKS6_:
  200|   193k|  inline bool operator==(const Self &x) const { return Idx == x.Idx; }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEpLEi:
  217|  39.5k|  inline Self &operator+=(int RHS) {
  218|  39.5k|    int NewIdx = Idx + RHS;
  219|  39.5k|    assert(index_is_valid(NewIdx) && "Iterator index out of bound");
  220|      0|    Idx = NewIdx;
  221|  39.5k|    return *this;
  222|  39.5k|  }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEE14index_is_validEi:
  151|  39.5k|  inline bool index_is_valid(int Idx) {
  152|       |    // Note that we specially support the index of zero being valid even in the
  153|       |    // face of a null instruction.
  154|  39.5k|    return Idx >= 0 && (Idx == 0 || Idx <= (int)Inst->getNumSuccessors());
  ------------------
  |  Branch (154:12): [True: 39.5k, False: 0]
  |  Branch (154:25): [True: 0, False: 39.5k]
  |  Branch (154:37): [True: 39.5k, False: 0]
  ------------------
  155|  39.5k|  }
_ZNK4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEdeEv:
  202|  39.5k|  inline BlockT *operator*() const { return Inst->getSuccessor(Idx); }
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEC2EPS3_:
  181|   153k|  explicit inline SuccIterator(InstructionT *Inst) : Inst(Inst), Idx(0) {}
_ZN4llvh12SuccIteratorIKN6hermes14TerminatorInstEKNS1_10BasicBlockEEC2EPS3_b:
  183|   153k|  inline SuccIterator(InstructionT *Inst, bool) : Inst(Inst) {
  184|   153k|    if (Inst)
  ------------------
  |  Branch (184:9): [True: 153k, False: 0]
  ------------------
  185|   153k|      Idx = Inst->getNumSuccessors();
  186|      0|    else
  187|       |      // Inst == NULL happens, if a basic block is not fully constructed and
  188|       |      // consequently getTerminator() returns NULL. In this case we construct
  189|       |      // a SuccIterator which describes a basic block that has zero
  190|       |      // successors.
  191|       |      // Defining SuccIterator for incomplete and malformed CFGs is especially
  192|       |      // useful for debugging.
  193|      0|      Idx = 0;
  194|   153k|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEC2EPS2_:
  181|   501k|  explicit inline SuccIterator(InstructionT *Inst) : Inst(Inst), Idx(0) {}
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEC2EPS2_b:
  183|   501k|  inline SuccIterator(InstructionT *Inst, bool) : Inst(Inst) {
  184|   501k|    if (Inst)
  ------------------
  |  Branch (184:9): [True: 501k, False: 0]
  ------------------
  185|   501k|      Idx = Inst->getNumSuccessors();
  186|      0|    else
  187|       |      // Inst == NULL happens, if a basic block is not fully constructed and
  188|       |      // consequently getTerminator() returns NULL. In this case we construct
  189|       |      // a SuccIterator which describes a basic block that has zero
  190|       |      // successors.
  191|       |      // Defining SuccIterator for incomplete and malformed CFGs is especially
  192|       |      // useful for debugging.
  193|      0|      Idx = 0;
  194|   501k|  }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEeqERKS4_:
  200|   659k|  inline bool operator==(const Self &x) const { return Idx == x.Idx; }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEpLEi:
  217|   158k|  inline Self &operator+=(int RHS) {
  218|   158k|    int NewIdx = Idx + RHS;
  219|   158k|    assert(index_is_valid(NewIdx) && "Iterator index out of bound");
  220|      0|    Idx = NewIdx;
  221|   158k|    return *this;
  222|   158k|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEE14index_is_validEi:
  151|   158k|  inline bool index_is_valid(int Idx) {
  152|       |    // Note that we specially support the index of zero being valid even in the
  153|       |    // face of a null instruction.
  154|   158k|    return Idx >= 0 && (Idx == 0 || Idx <= (int)Inst->getNumSuccessors());
  ------------------
  |  Branch (154:12): [True: 158k, False: 0]
  |  Branch (154:25): [True: 316, False: 158k]
  |  Branch (154:37): [True: 158k, False: 0]
  ------------------
  155|   158k|  }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEdeEv:
  202|   158k|  inline BlockT *operator*() const { return Inst->getSuccessor(Idx); }
_ZNK4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEmiERKS4_:
  212|    160|  int operator-(const Self &RHS) const {
  213|    160|    assert(Inst == RHS.Inst && "Cannot compare iterators of different blocks!");
  214|      0|    return Idx - RHS.Idx;
  215|    160|  }
_ZN4llvh12SuccIteratorIN6hermes14TerminatorInstENS1_10BasicBlockEEmIEi:
  224|    320|  inline Self &operator-=(int RHS) { return operator+=(-RHS); }

_ZN4llvh15MallocAllocator8AllocateEmm:
   99|  11.9k|                                                size_t /*Alignment*/) {
  100|  11.9k|    return safe_malloc(Size);
  101|  11.9k|  }
_ZN4llvh15MallocAllocator10DeallocateEPKvm:
  106|  11.9k|  void Deallocate(const void *Ptr, size_t /*Size*/) {
  107|  11.9k|    free(const_cast<void *>(Ptr));
  108|  11.9k|  }

_ZN4llvh4castIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.72M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.72M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.72M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.72M|}
_ZN4llvh3isaIN6hermes2vm15StringPrimitiveEPNS2_6GCCellEEEbRKT0_:
  142|  2.81M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.81M|  return isa_impl_wrap<X, const Y,
  144|  2.81M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.81M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15StringPrimitiveEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  2.81M|  static bool doit(const From &Val) {
  123|  2.81M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.81M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.81M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.81M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15StringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  2.81M|  static bool doit(const FromTy &Val) {
  133|  2.81M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.81M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15StringPrimitiveEPKNS2_6GCCellEE4doitES6_:
  105|  2.81M|  static inline bool doit(const From *Val) {
  106|  2.81M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.81M|  }
_ZN4llvh8isa_implIN6hermes2vm15StringPrimitiveENS2_6GCCellEvE4doitERKS4_:
   58|  2.81M|  static inline bool doit(const From &Val) {
   59|  2.81M|    return To::classof(&Val);
   60|  2.81M|  }
_ZN4llvh13simplify_typeIKPN6hermes2vm6GCCellEE18getSimplifiedValueERS5_:
   48|  49.8M|  static RetType getSimplifiedValue(const From& Val) {
   49|  49.8M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  49.8M|  }
_ZN4llvh13simplify_typeIPN6hermes2vm6GCCellEE18getSimplifiedValueERS4_:
   38|  49.7M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes2vm15StringPrimitiveEPNS2_6GCCellES5_E4doitERKS5_:
  218|  2.72M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.72M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.72M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.72M|    return Res2;
  222|  2.72M|  }
_ZN4llvh4castIN6hermes2vm11HiddenClassENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  4.78M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.78M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.78M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.78M|}
_ZN4llvh3isaIN6hermes2vm11HiddenClassEPNS2_6GCCellEEEbRKT0_:
  142|  5.73M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.73M|  return isa_impl_wrap<X, const Y,
  144|  5.73M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.73M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm11HiddenClassEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  5.73M|  static bool doit(const From &Val) {
  123|  5.73M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.73M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.73M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.73M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm11HiddenClassEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  5.73M|  static bool doit(const FromTy &Val) {
  133|  5.73M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.73M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm11HiddenClassEPKNS2_6GCCellEE4doitES6_:
  105|  5.73M|  static inline bool doit(const From *Val) {
  106|  5.73M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  5.73M|  }
_ZN4llvh8isa_implIN6hermes2vm11HiddenClassENS2_6GCCellEvE4doitERKS4_:
   58|  5.73M|  static inline bool doit(const From &Val) {
   59|  5.73M|    return To::classof(&Val);
   60|  5.73M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm11HiddenClassEPNS2_6GCCellES5_E4doitERKS5_:
  218|  4.78M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.78M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.78M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.78M|    return Res2;
  222|  4.78M|  }
_ZN4llvh4castIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  3.35M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.35M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.35M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.35M|}
_ZN4llvh3isaIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPNS2_6GCCellEEEbRKT0_:
  142|  3.35M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.35M|  return isa_impl_wrap<X, const Y,
  144|  3.35M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.35M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  3.35M|  static bool doit(const From &Val) {
  123|  3.35M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.35M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.35M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.35M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  3.35M|  static bool doit(const FromTy &Val) {
  133|  3.35M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.35M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPKNS2_6GCCellEE4doitES8_:
  105|  3.35M|  static inline bool doit(const From *Val) {
  106|  3.35M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.35M|  }
_ZN4llvh8isa_implIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEvE4doitERKS6_:
   58|  3.35M|  static inline bool doit(const From &Val) {
   59|  3.35M|    return To::classof(&Val);
   60|  3.35M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|  3.35M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.35M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.35M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.35M|    return Res2;
  222|  3.35M|  }
_ZN4llvh4castIN6hermes2vm7JSArrayENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   145k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   145k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   145k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   145k|}
_ZN4llvh3isaIN6hermes2vm7JSArrayEPNS2_6GCCellEEEbRKT0_:
  142|   499k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   499k|  return isa_impl_wrap<X, const Y,
  144|   499k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   499k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSArrayEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   499k|  static bool doit(const From &Val) {
  123|   499k|    return isa_impl_wrap<To, SimpleFrom,
  124|   499k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   499k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   499k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSArrayEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   499k|  static bool doit(const FromTy &Val) {
  133|   499k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   499k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7JSArrayEPKNS2_6GCCellEE4doitES6_:
  105|   499k|  static inline bool doit(const From *Val) {
  106|   499k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   499k|  }
_ZN4llvh8isa_implIN6hermes2vm7JSArrayENS2_6GCCellEvE4doitERKS4_:
   58|   499k|  static inline bool doit(const From &Val) {
   59|   499k|    return To::classof(&Val);
   60|   499k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm7JSArrayEPNS2_6GCCellES5_E4doitERKS5_:
  218|   145k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   145k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   145k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   145k|    return Res2;
  222|   145k|  }
_ZN4llvh4castIN6hermes2vm8JSObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.56M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.56M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.56M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.56M|}
_ZN4llvh3isaIN6hermes2vm8JSObjectEPNS2_6GCCellEEEbRKT0_:
  142|  1.56M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.56M|  return isa_impl_wrap<X, const Y,
  144|  1.56M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.56M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSObjectEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  1.56M|  static bool doit(const From &Val) {
  123|  1.56M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.56M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.56M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.56M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSObjectEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  1.56M|  static bool doit(const FromTy &Val) {
  133|  1.56M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.56M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSObjectEPKNS2_6GCCellEE4doitES6_:
  105|  1.56M|  static inline bool doit(const From *Val) {
  106|  1.56M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.56M|  }
_ZN4llvh8isa_implIN6hermes2vm8JSObjectENS2_6GCCellEvE4doitERKS4_:
   58|  1.56M|  static inline bool doit(const From &Val) {
   59|  1.56M|    return To::classof(&Val);
   60|  1.56M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8JSObjectEPNS2_6GCCellES5_E4doitERKS5_:
  218|  1.56M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.56M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.56M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.56M|    return Res2;
  222|  1.56M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm11EnvironmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  2.34k|cast_or_null(Y *Val) {
  298|  2.34k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 465, False: 1.88k]
  ------------------
  299|  1.88k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  2.34k|}
_ZN4llvh3isaIN6hermes2vm11EnvironmentEPNS2_6GCCellEEEbRKT0_:
  142|  13.1k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  13.1k|  return isa_impl_wrap<X, const Y,
  144|  13.1k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  13.1k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm11EnvironmentEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  13.1k|  static bool doit(const From &Val) {
  123|  13.1k|    return isa_impl_wrap<To, SimpleFrom,
  124|  13.1k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  13.1k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  13.1k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm11EnvironmentEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  13.1k|  static bool doit(const FromTy &Val) {
  133|  13.1k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  13.1k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm11EnvironmentEPKNS2_6GCCellEE4doitES6_:
  105|  13.1k|  static inline bool doit(const From *Val) {
  106|  13.1k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  13.1k|  }
_ZN4llvh8isa_implIN6hermes2vm11EnvironmentENS2_6GCCellEvE4doitERKS4_:
   58|  13.1k|  static inline bool doit(const From &Val) {
   59|  13.1k|    return To::classof(&Val);
   60|  13.1k|  }
_ZN4llvh4castIN6hermes2vm11EnvironmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  11.2k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.2k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  11.2k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.2k|}
_ZN4llvh16cast_convert_valIN6hermes2vm11EnvironmentEPNS2_6GCCellES5_E4doitERKS5_:
  218|  11.2k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.2k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.2k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.2k|    return Res2;
  222|  11.2k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  1.43k|  static bool doit(const FromTy &Val) {
  133|  1.43k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.43k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23ExternalStringPrimitiveIcEEPKNS2_6GCCellEE4doitES7_:
  105|  1.43k|  static inline bool doit(const From *Val) {
  106|  1.43k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.43k|  }
_ZN4llvh8isa_implIN6hermes2vm23ExternalStringPrimitiveIcEENS2_6GCCellEvE4doitERKS5_:
   58|  1.43k|  static inline bool doit(const From &Val) {
   59|  1.43k|    return To::classof(&Val);
   60|  1.43k|  }
_ZN4llvh13simplify_typeIKPKN6hermes2vm6GCCellEE18getSimplifiedValueERS6_:
   48|  4.73M|  static RetType getSimplifiedValue(const From& Val) {
   49|  4.73M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  4.73M|  }
_ZN4llvh13simplify_typeIPKN6hermes2vm6GCCellEE18getSimplifiedValueERS5_:
   38|  4.73M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellEEEbRKT0_:
  142|  2.26M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.26M|  return isa_impl_wrap<X, const Y,
  144|  2.26M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.26M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|  2.26M|  static bool doit(const From &Val) {
  123|  2.26M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.26M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.26M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.26M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  2.31M|  static bool doit(const FromTy &Val) {
  133|  2.31M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.31M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellEE4doitES7_:
  105|  2.31M|  static inline bool doit(const From *Val) {
  106|  2.31M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.31M|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS2_6GCCellEvE4doitERKS5_:
   58|  2.31M|  static inline bool doit(const From &Val) {
   59|  2.31M|    return To::classof(&Val);
   60|  2.31M|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   919k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   919k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   919k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   919k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   919k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   919k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   919k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   919k|    return Res2;
  222|   919k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellEEEbRKT0_:
  142|   844k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   844k|  return isa_impl_wrap<X, const Y,
  144|   844k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   844k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|   844k|  static bool doit(const From &Val) {
  123|   844k|    return isa_impl_wrap<To, SimpleFrom,
  124|   844k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   844k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   844k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|   893k|  static bool doit(const FromTy &Val) {
  133|   893k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   893k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellEE4doitES7_:
  105|   893k|  static inline bool doit(const From *Val) {
  106|   893k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   893k|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS2_6GCCellEvE4doitERKS5_:
   58|   893k|  static inline bool doit(const From &Val) {
   59|   893k|    return To::classof(&Val);
   60|   893k|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   422k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   422k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   422k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   422k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   422k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   422k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   422k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   422k|    return Res2;
  222|   422k|  }
_ZN4llvh4castIN6hermes2vm23BufferedStringPrimitiveIcEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes2vm23BufferedStringPrimitiveIcEEPKNS2_6GCCellEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIcEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIcEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  2.01k|  static bool doit(const FromTy &Val) {
  133|  2.01k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.01k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23BufferedStringPrimitiveIcEEPKNS2_6GCCellEE4doitES7_:
  105|  2.01k|  static inline bool doit(const From *Val) {
  106|  2.01k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.01k|  }
_ZN4llvh8isa_implIN6hermes2vm23BufferedStringPrimitiveIcEENS2_6GCCellEvE4doitERKS5_:
   58|  2.01k|  static inline bool doit(const From &Val) {
   59|  2.01k|    return To::classof(&Val);
   60|  2.01k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23BufferedStringPrimitiveIcEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIcEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  1.43k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.43k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.43k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.43k|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIcEEPNS2_6GCCellEEEbRKT0_:
  142|  1.43k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.43k|  return isa_impl_wrap<X, const Y,
  144|  1.43k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.43k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIcEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  1.43k|  static bool doit(const From &Val) {
  123|  1.43k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.43k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.43k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.43k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIcEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  1.43k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.43k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.43k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.43k|    return Res2;
  222|  1.43k|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIDsEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   985k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   985k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   985k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   985k|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellEEEbRKT0_:
  142|   985k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   985k|  return isa_impl_wrap<X, const Y,
  144|   985k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   985k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|   985k|  static bool doit(const From &Val) {
  123|   985k|    return isa_impl_wrap<To, SimpleFrom,
  124|   985k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   985k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   985k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|  1.28M|  static bool doit(const FromTy &Val) {
  133|  1.28M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.28M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellEE4doitES7_:
  105|  1.28M|  static inline bool doit(const From *Val) {
  106|  1.28M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.28M|  }
_ZN4llvh8isa_implIN6hermes2vm23ExternalStringPrimitiveIDsEENS2_6GCCellEvE4doitERKS5_:
   58|  1.28M|  static inline bool doit(const From &Val) {
   59|  1.28M|    return To::classof(&Val);
   60|  1.28M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   985k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   985k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   985k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   985k|    return Res2;
  222|   985k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellEEEbRKT0_:
  142|   207k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   207k|  return isa_impl_wrap<X, const Y,
  144|   207k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   207k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|   207k|  static bool doit(const From &Val) {
  123|   207k|    return isa_impl_wrap<To, SimpleFrom,
  124|   207k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   207k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   207k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|   752k|  static bool doit(const FromTy &Val) {
  133|   752k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   752k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellEE4doitES7_:
  105|   752k|  static inline bool doit(const From *Val) {
  106|   752k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   752k|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS2_6GCCellEvE4doitERKS5_:
   58|   752k|  static inline bool doit(const From &Val) {
   59|   752k|    return To::classof(&Val);
   60|   752k|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  20.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  20.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  20.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  20.9k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|  20.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  20.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  20.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  20.9k|    return Res2;
  222|  20.9k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellEEEbRKT0_:
  142|   330k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   330k|  return isa_impl_wrap<X, const Y,
  144|   330k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   330k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKPKNS2_6GCCellES7_E4doitERS8_:
  122|   330k|  static bool doit(const From &Val) {
  123|   330k|    return isa_impl_wrap<To, SimpleFrom,
  124|   330k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   330k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   330k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|   875k|  static bool doit(const FromTy &Val) {
  133|   875k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   875k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellEE4doitES7_:
  105|   875k|  static inline bool doit(const From *Val) {
  106|   875k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   875k|  }
_ZN4llvh8isa_implIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS2_6GCCellEvE4doitERKS5_:
   58|   875k|  static inline bool doit(const From &Val) {
   59|   875k|    return To::classof(&Val);
   60|   875k|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   165k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   165k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   165k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   165k|}
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPKNS2_6GCCellES7_E4doitERKS7_:
  218|   165k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   165k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   165k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   165k|    return Res2;
  222|   165k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIDsEEPKNS2_6GCCellES7_E4doitERKS7_:
  132|    466|  static bool doit(const FromTy &Val) {
  133|    466|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    466|  }
_ZN4llvh11isa_impl_clIN6hermes2vm23BufferedStringPrimitiveIDsEEPKNS2_6GCCellEE4doitES7_:
  105|    466|  static inline bool doit(const From *Val) {
  106|    466|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    466|  }
_ZN4llvh8isa_implIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEvE4doitERKS5_:
   58|    466|  static inline bool doit(const From &Val) {
   59|    466|    return To::classof(&Val);
   60|    466|  }
_ZN4llvh4castIN6hermes2vm23ExternalStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|   302k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   302k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   302k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   302k|}
_ZN4llvh3isaIN6hermes2vm23ExternalStringPrimitiveIDsEEPNS2_6GCCellEEEbRKT0_:
  142|   302k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   302k|  return isa_impl_wrap<X, const Y,
  144|   302k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   302k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23ExternalStringPrimitiveIDsEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|   302k|  static bool doit(const From &Val) {
  123|   302k|    return isa_impl_wrap<To, SimpleFrom,
  124|   302k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   302k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   302k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm23ExternalStringPrimitiveIDsEEPNS2_6GCCellES6_E4doitERKS6_:
  218|   302k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   302k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   302k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   302k|    return Res2;
  222|   302k|  }
_ZN4llvh3isaIN6hermes2vm8CallableEPNS2_6GCCellEEEbRKT0_:
  142|   414k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   414k|  return isa_impl_wrap<X, const Y,
  144|   414k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   414k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8CallableEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   414k|  static bool doit(const From &Val) {
  123|   414k|    return isa_impl_wrap<To, SimpleFrom,
  124|   414k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   414k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   414k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8CallableEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   414k|  static bool doit(const FromTy &Val) {
  133|   414k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   414k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8CallableEPKNS2_6GCCellEE4doitES6_:
  105|   414k|  static inline bool doit(const From *Val) {
  106|   414k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   414k|  }
_ZN4llvh8isa_implIN6hermes2vm8CallableENS2_6GCCellEvE4doitERKS4_:
   58|   414k|  static inline bool doit(const From &Val) {
   59|   414k|    return To::classof(&Val);
   60|   414k|  }
_ZN4llvh4castIN6hermes2vm8CallableENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  4.78k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.78k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.78k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.78k|}
_ZN4llvh16cast_convert_valIN6hermes2vm8CallableEPNS2_6GCCellES5_E4doitERKS5_:
  218|  4.78k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.78k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.78k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.78k|    return Res2;
  222|  4.78k|  }
_ZN4llvh4castIN6hermes9ScopeDescENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   812k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   812k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   812k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   812k|}
_ZN4llvh3isaIN6hermes9ScopeDescEPNS1_5ValueEEEbRKT0_:
  142|   812k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   812k|  return isa_impl_wrap<X, const Y,
  144|   812k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   812k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ScopeDescEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   812k|  static bool doit(const From &Val) {
  123|   812k|    return isa_impl_wrap<To, SimpleFrom,
  124|   812k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   812k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   812k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ScopeDescEPKNS1_5ValueES5_E4doitERKS5_:
  132|   812k|  static bool doit(const FromTy &Val) {
  133|   812k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   812k|  }
_ZN4llvh11isa_impl_clIN6hermes9ScopeDescEPKNS1_5ValueEE4doitES5_:
  105|   812k|  static inline bool doit(const From *Val) {
  106|   812k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   812k|  }
_ZN4llvh8isa_implIN6hermes9ScopeDescENS1_5ValueEvE4doitERKS3_:
   58|   812k|  static inline bool doit(const From &Val) {
   59|   812k|    return To::classof(&Val);
   60|   812k|  }
_ZN4llvh13simplify_typeIKPN6hermes5ValueEE18getSimplifiedValueERS4_:
   48|  27.6M|  static RetType getSimplifiedValue(const From& Val) {
   49|  27.6M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  27.6M|  }
_ZN4llvh13simplify_typeIPN6hermes5ValueEE18getSimplifiedValueERS3_:
   38|  27.6M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes9ScopeDescEPNS1_5ValueES4_E4doitERKS4_:
  218|   812k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   812k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   812k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   812k|    return Res2;
  222|   812k|  }
_ZN4llvh4castIN6hermes10BasicBlockENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   738k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   738k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   738k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   738k|}
_ZN4llvh3isaIN6hermes10BasicBlockEPNS1_5ValueEEEbRKT0_:
  142|   738k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   738k|  return isa_impl_wrap<X, const Y,
  144|   738k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   738k|}
_ZN4llvh13isa_impl_wrapIN6hermes10BasicBlockEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   738k|  static bool doit(const From &Val) {
  123|   738k|    return isa_impl_wrap<To, SimpleFrom,
  124|   738k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   738k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   738k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BasicBlockEPKNS1_5ValueES5_E4doitERKS5_:
  132|   738k|  static bool doit(const FromTy &Val) {
  133|   738k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   738k|  }
_ZN4llvh11isa_impl_clIN6hermes10BasicBlockEPKNS1_5ValueEE4doitES5_:
  105|   738k|  static inline bool doit(const From *Val) {
  106|   738k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   738k|  }
_ZN4llvh8isa_implIN6hermes10BasicBlockENS1_5ValueEvE4doitERKS3_:
   58|   738k|  static inline bool doit(const From &Val) {
   59|   738k|    return To::classof(&Val);
   60|   738k|  }
_ZN4llvh16cast_convert_valIN6hermes10BasicBlockEPNS1_5ValueES4_E4doitERKS4_:
  218|   738k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   738k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   738k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   738k|    return Res2;
  222|   738k|  }
_ZN4llvh4castIN6hermes14AllocStackInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   128k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   128k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   128k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   128k|}
_ZN4llvh3isaIN6hermes14AllocStackInstEPNS1_5ValueEEEbRKT0_:
  142|   128k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   128k|  return isa_impl_wrap<X, const Y,
  144|   128k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   128k|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   128k|  static bool doit(const From &Val) {
  123|   128k|    return isa_impl_wrap<To, SimpleFrom,
  124|   128k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   128k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   128k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   128k|  static bool doit(const FromTy &Val) {
  133|   128k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   128k|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocStackInstEPKNS1_5ValueEE4doitES5_:
  105|   128k|  static inline bool doit(const From *Val) {
  106|   128k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   128k|  }
_ZN4llvh8isa_implIN6hermes14AllocStackInstENS1_5ValueEvE4doitERKS3_:
   58|   128k|  static inline bool doit(const From &Val) {
   59|   128k|    return To::classof(&Val);
   60|   128k|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocStackInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   128k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   128k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   128k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   128k|    return Res2;
  222|   128k|  }
_ZN4llvh4castIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   618k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   618k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   618k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   618k|}
_ZN4llvh3isaIN6hermes8VariableEPNS1_5ValueEEEbRKT0_:
  142|  1.01M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.01M|  return isa_impl_wrap<X, const Y,
  144|  1.01M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.01M|}
_ZN4llvh13isa_impl_wrapIN6hermes8VariableEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.01M|  static bool doit(const From &Val) {
  123|  1.01M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.01M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.01M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.01M|  }
_ZN4llvh13isa_impl_wrapIN6hermes8VariableEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.01M|  static bool doit(const FromTy &Val) {
  133|  1.01M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.01M|  }
_ZN4llvh11isa_impl_clIN6hermes8VariableEPKNS1_5ValueEE4doitES5_:
  105|  1.01M|  static inline bool doit(const From *Val) {
  106|  1.01M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.01M|  }
_ZN4llvh8isa_implIN6hermes8VariableENS1_5ValueEvE4doitERKS3_:
   58|  1.01M|  static inline bool doit(const From &Val) {
   59|  1.01M|    return To::classof(&Val);
   60|  1.01M|  }
_ZN4llvh16cast_convert_valIN6hermes8VariableEPNS1_5ValueES4_E4doitERKS4_:
  218|   618k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   618k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   618k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   618k|    return Res2;
  222|   618k|  }
_ZN4llvh4castIN6hermes17ScopeCreationInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   125k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   125k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   125k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   125k|}
_ZN4llvh3isaIN6hermes17ScopeCreationInstEPNS1_5ValueEEEbRKT0_:
  142|   125k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   125k|  return isa_impl_wrap<X, const Y,
  144|   125k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   125k|}
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   125k|  static bool doit(const From &Val) {
  123|   125k|    return isa_impl_wrap<To, SimpleFrom,
  124|   125k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   125k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   125k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   125k|  static bool doit(const FromTy &Val) {
  133|   125k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   125k|  }
_ZN4llvh11isa_impl_clIN6hermes17ScopeCreationInstEPKNS1_5ValueEE4doitES5_:
  105|   125k|  static inline bool doit(const From *Val) {
  106|   125k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   125k|  }
_ZN4llvh8isa_implIN6hermes17ScopeCreationInstENS1_5ValueEvE4doitERKS3_:
   58|   125k|  static inline bool doit(const From &Val) {
   59|   125k|    return To::classof(&Val);
   60|   125k|  }
_ZN4llvh16cast_convert_valIN6hermes17ScopeCreationInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   125k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   125k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   125k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   125k|    return Res2;
  222|   125k|  }
_ZN4llvh4castIN6hermes8FunctionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   574k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   574k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   574k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   574k|}
_ZN4llvh3isaIN6hermes8FunctionEPNS1_5ValueEEEbRKT0_:
  142|   574k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   574k|  return isa_impl_wrap<X, const Y,
  144|   574k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   574k|}
_ZN4llvh13isa_impl_wrapIN6hermes8FunctionEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   574k|  static bool doit(const From &Val) {
  123|   574k|    return isa_impl_wrap<To, SimpleFrom,
  124|   574k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   574k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   574k|  }
_ZN4llvh13isa_impl_wrapIN6hermes8FunctionEPKNS1_5ValueES5_E4doitERKS5_:
  132|   574k|  static bool doit(const FromTy &Val) {
  133|   574k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   574k|  }
_ZN4llvh11isa_impl_clIN6hermes8FunctionEPKNS1_5ValueEE4doitES5_:
  105|   574k|  static inline bool doit(const From *Val) {
  106|   574k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   574k|  }
_ZN4llvh8isa_implIN6hermes8FunctionENS1_5ValueEvE4doitERKS3_:
   58|   574k|  static inline bool doit(const From &Val) {
   59|   574k|    return To::classof(&Val);
   60|   574k|  }
_ZN4llvh16cast_convert_valIN6hermes8FunctionEPNS1_5ValueES4_E4doitERKS4_:
  218|   574k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   574k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   574k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   574k|    return Res2;
  222|   574k|  }
_ZN4llvh4castIN6hermes13LiteralNumberENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   829k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   829k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   829k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   829k|}
_ZN4llvh3isaIN6hermes13LiteralNumberEPNS1_5ValueEEEbRKT0_:
  142|  1.30M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.30M|  return isa_impl_wrap<X, const Y,
  144|  1.30M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.30M|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  1.30M|  static bool doit(const From &Val) {
  123|  1.30M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.30M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.30M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.30M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEPKNS1_5ValueES5_E4doitERKS5_:
  132|  1.30M|  static bool doit(const FromTy &Val) {
  133|  1.30M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.30M|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralNumberEPKNS1_5ValueEE4doitES5_:
  105|  1.30M|  static inline bool doit(const From *Val) {
  106|  1.30M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.30M|  }
_ZN4llvh8isa_implIN6hermes13LiteralNumberENS1_5ValueEvE4doitERKS3_:
   58|  1.30M|  static inline bool doit(const From &Val) {
   59|  1.30M|    return To::classof(&Val);
   60|  1.30M|  }
_ZN4llvh16cast_convert_valIN6hermes13LiteralNumberEPNS1_5ValueES4_E4doitERKS4_:
  218|   829k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   829k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   829k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   829k|    return Res2;
  222|   829k|  }
_ZN4llvh4castIN6hermes13LiteralStringENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   496k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   496k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   496k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   496k|}
_ZN4llvh3isaIN6hermes13LiteralStringEPNS1_5ValueEEEbRKT0_:
  142|  4.48M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.48M|  return isa_impl_wrap<X, const Y,
  144|  4.48M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.48M|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.48M|  static bool doit(const From &Val) {
  123|  4.48M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.48M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.48M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.48M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.48M|  static bool doit(const FromTy &Val) {
  133|  4.48M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.48M|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKNS1_5ValueEE4doitES5_:
  105|  4.48M|  static inline bool doit(const From *Val) {
  106|  4.48M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.48M|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringENS1_5ValueEvE4doitERKS3_:
   58|  4.48M|  static inline bool doit(const From &Val) {
   59|  4.48M|    return To::classof(&Val);
   60|  4.48M|  }
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPNS1_5ValueES4_E4doitERKS4_:
  218|   496k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   496k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   496k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   496k|    return Res2;
  222|   496k|  }
_ZN4llvh3isaIN6hermes12GlobalObjectEPNS1_5ValueEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEPKNS1_5ValueES5_E4doitERKS5_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes12GlobalObjectEPKNS1_5ValueEE4doitES5_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes12GlobalObjectENS1_5ValueEvE4doitERKS3_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh3isaIN6hermes22HBCGetGlobalObjectInstEPNS1_5ValueEEEbRKT0_:
  142|  62.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  62.5k|  return isa_impl_wrap<X, const Y,
  144|  62.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  62.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  62.5k|  static bool doit(const From &Val) {
  123|  62.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  62.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  62.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  62.5k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  62.5k|  static bool doit(const FromTy &Val) {
  133|  62.5k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  62.5k|  }
_ZN4llvh11isa_impl_clIN6hermes22HBCGetGlobalObjectInstEPKNS1_5ValueEE4doitES5_:
  105|  62.5k|  static inline bool doit(const From *Val) {
  106|  62.5k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  62.5k|  }
_ZN4llvh8isa_implIN6hermes22HBCGetGlobalObjectInstENS1_5ValueEvE4doitERKS3_:
   58|  62.5k|  static inline bool doit(const From &Val) {
   59|  62.5k|    return To::classof(&Val);
   60|  62.5k|  }
_ZN4llvh4castIN6hermes11LiteralBoolENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   465k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   465k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   465k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   465k|}
_ZN4llvh3isaIN6hermes11LiteralBoolEPNS1_5ValueEEEbRKT0_:
  142|   473k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   473k|  return isa_impl_wrap<X, const Y,
  144|   473k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   473k|}
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   473k|  static bool doit(const From &Val) {
  123|   473k|    return isa_impl_wrap<To, SimpleFrom,
  124|   473k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   473k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   473k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEPKNS1_5ValueES5_E4doitERKS5_:
  132|   473k|  static bool doit(const FromTy &Val) {
  133|   473k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   473k|  }
_ZN4llvh11isa_impl_clIN6hermes11LiteralBoolEPKNS1_5ValueEE4doitES5_:
  105|   473k|  static inline bool doit(const From *Val) {
  106|   473k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   473k|  }
_ZN4llvh8isa_implIN6hermes11LiteralBoolENS1_5ValueEvE4doitERKS3_:
   58|   473k|  static inline bool doit(const From &Val) {
   59|   473k|    return To::classof(&Val);
   60|   473k|  }
_ZN4llvh16cast_convert_valIN6hermes11LiteralBoolEPNS1_5ValueES4_E4doitERKS4_:
  218|   465k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   465k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   465k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   465k|    return Res2;
  222|   465k|  }
_ZN4llvh3isaIN6hermes13LiteralStringEPNS1_7LiteralEEEbRKT0_:
  142|  9.82k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  9.82k|  return isa_impl_wrap<X, const Y,
  144|  9.82k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  9.82k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|  9.82k|  static bool doit(const From &Val) {
  123|  9.82k|    return isa_impl_wrap<To, SimpleFrom,
  124|  9.82k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  9.82k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  9.82k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEPKNS1_7LiteralES5_E4doitERKS5_:
  132|  9.82k|  static bool doit(const FromTy &Val) {
  133|  9.82k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  9.82k|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKNS1_7LiteralEE4doitES5_:
  105|  9.82k|  static inline bool doit(const From *Val) {
  106|  9.82k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  9.82k|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringENS1_7LiteralEvE4doitERKS3_:
   58|  9.82k|  static inline bool doit(const From &Val) {
   59|  9.82k|    return To::classof(&Val);
   60|  9.82k|  }
_ZN4llvh13simplify_typeIKPN6hermes7LiteralEE18getSimplifiedValueERS4_:
   48|  1.14M|  static RetType getSimplifiedValue(const From& Val) {
   49|  1.14M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  1.14M|  }
_ZN4llvh13simplify_typeIPN6hermes7LiteralEE18getSimplifiedValueERS3_:
   38|  1.14M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes13LiteralNumberEPNS1_7LiteralEEEbRKT0_:
  142|   951k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   951k|  return isa_impl_wrap<X, const Y,
  144|   951k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   951k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|   951k|  static bool doit(const From &Val) {
  123|   951k|    return isa_impl_wrap<To, SimpleFrom,
  124|   951k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   951k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   951k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralNumberEPKNS1_7LiteralES5_E4doitERKS5_:
  132|   951k|  static bool doit(const FromTy &Val) {
  133|   951k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   951k|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralNumberEPKNS1_7LiteralEE4doitES5_:
  105|   951k|  static inline bool doit(const From *Val) {
  106|   951k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   951k|  }
_ZN4llvh8isa_implIN6hermes13LiteralNumberENS1_7LiteralEvE4doitERKS3_:
   58|   951k|  static inline bool doit(const From &Val) {
   59|   951k|    return To::classof(&Val);
   60|   951k|  }
_ZN4llvh4castIN6hermes7LiteralENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.22M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.22M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.22M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.22M|}
_ZN4llvh16cast_convert_valIN6hermes7LiteralEPNS1_5ValueES4_E4doitERKS4_:
  218|  1.22M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.22M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.22M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.22M|    return Res2;
  222|  1.22M|  }
_ZN4llvh3isaIN6hermes7LiteralEPNS1_5ValueEEEbRKT0_:
  142|  4.20M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.20M|  return isa_impl_wrap<X, const Y,
  144|  4.20M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.20M|}
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.20M|  static bool doit(const From &Val) {
  123|  4.20M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.20M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.20M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.20M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.20M|  static bool doit(const FromTy &Val) {
  133|  4.20M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.20M|  }
_ZN4llvh11isa_impl_clIN6hermes7LiteralEPKNS1_5ValueEE4doitES5_:
  105|  4.20M|  static inline bool doit(const From *Val) {
  106|  4.20M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.20M|  }
_ZN4llvh8isa_implIN6hermes7LiteralENS1_5ValueEvE4doitERKS3_:
   58|  4.20M|  static inline bool doit(const From &Val) {
   59|  4.20M|    return To::classof(&Val);
   60|  4.20M|  }
_ZN4llvh4castIN6hermes11InstructionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  3.21M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.21M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.21M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.21M|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_5ValueEEEbRKT0_:
  142|  10.5M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.5M|  return isa_impl_wrap<X, const Y,
  144|  10.5M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.5M|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  10.5M|  static bool doit(const From &Val) {
  123|  10.5M|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.5M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.5M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.5M|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_5ValueES5_E4doitERKS5_:
  132|  10.5M|  static bool doit(const FromTy &Val) {
  133|  10.5M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.5M|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_5ValueEE4doitES5_:
  105|  10.5M|  static inline bool doit(const From *Val) {
  106|  10.5M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  10.5M|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_5ValueEvE4doitERKS3_:
   58|  10.5M|  static inline bool doit(const From &Val) {
   59|  10.5M|    return To::classof(&Val);
   60|  10.5M|  }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_5ValueES4_E4doitERKS4_:
  218|  3.21M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.21M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.21M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.21M|    return Res2;
  222|  3.21M|  }
_ZN4llvh3isaIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellEEEbRKT0_:
  142|   105k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   105k|  return isa_impl_wrap<X, const Y,
  144|   105k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   105k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm21SymbolStringPrimitiveEKPKNS2_6GCCellES6_E4doitERS7_:
  122|   105k|  static bool doit(const From &Val) {
  123|   105k|    return isa_impl_wrap<To, SimpleFrom,
  124|   105k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   105k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   105k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   210k|  static bool doit(const FromTy &Val) {
  133|   210k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   210k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellEE4doitES6_:
  105|   210k|  static inline bool doit(const From *Val) {
  106|   210k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   210k|  }
_ZN4llvh8isa_implIN6hermes2vm21SymbolStringPrimitiveENS2_6GCCellEvE4doitERKS4_:
   58|   210k|  static inline bool doit(const From &Val) {
   59|   210k|    return To::classof(&Val);
   60|   210k|  }
_ZN4llvh4castIN6hermes2vm21SymbolStringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   105k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   105k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   105k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   105k|}
_ZN4llvh3isaIN6hermes2vm21SymbolStringPrimitiveEPNS2_6GCCellEEEbRKT0_:
  142|   105k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   105k|  return isa_impl_wrap<X, const Y,
  144|   105k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   105k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm21SymbolStringPrimitiveEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   105k|  static bool doit(const From &Val) {
  123|   105k|    return isa_impl_wrap<To, SimpleFrom,
  124|   105k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   105k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   105k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm21SymbolStringPrimitiveEPNS2_6GCCellES5_E4doitERKS5_:
  218|   105k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   105k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   105k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   105k|    return Res2;
  222|   105k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEPNS2_6GCCellEEEbRKT0_:
  142|  49.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  49.5k|  return isa_impl_wrap<X, const Y,
  144|  49.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  49.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  49.5k|  static bool doit(const From &Val) {
  123|  49.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  49.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  49.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  49.5k|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  49.5k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  49.5k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  49.5k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  49.5k|}
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPNS2_6GCCellEEEbRKT0_:
  142|  49.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  49.5k|  return isa_impl_wrap<X, const Y,
  144|  49.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  49.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  49.5k|  static bool doit(const From &Val) {
  123|  49.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  49.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  49.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  49.5k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  49.5k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  49.5k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  49.5k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  49.5k|    return Res2;
  222|  49.5k|  }
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEPNS2_6GCCellEEEbRKT0_:
  142|   544k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   544k|  return isa_impl_wrap<X, const Y,
  144|   544k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   544k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|   544k|  static bool doit(const From &Val) {
  123|   544k|    return isa_impl_wrap<To, SimpleFrom,
  124|   544k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   544k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   544k|  }
_ZN4llvh4castIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|   544k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   544k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   544k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   544k|}
_ZN4llvh3isaIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPNS2_6GCCellEEEbRKT0_:
  142|   544k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   544k|  return isa_impl_wrap<X, const Y,
  144|   544k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   544k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|   544k|  static bool doit(const From &Val) {
  123|   544k|    return isa_impl_wrap<To, SimpleFrom,
  124|   544k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   544k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   544k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEPNS2_6GCCellES6_E4doitERKS6_:
  218|   544k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   544k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   544k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   544k|    return Res2;
  222|   544k|  }
_ZN4llvh4castIN6hermes2vm21SymbolStringPrimitiveEKNS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|    288|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    288|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    288|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    288|}
_ZN4llvh16cast_convert_valIN6hermes2vm21SymbolStringPrimitiveEPKNS2_6GCCellES6_E4doitERKS6_:
  218|    288|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    288|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    288|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    288|    return Res2;
  222|    288|  }
_ZN4llvh4castIN6hermes2vm15DictPropertyMapENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.83M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.83M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.83M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.83M|}
_ZN4llvh3isaIN6hermes2vm15DictPropertyMapEPNS2_6GCCellEEEbRKT0_:
  142|  3.21M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.21M|  return isa_impl_wrap<X, const Y,
  144|  3.21M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.21M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DictPropertyMapEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  3.21M|  static bool doit(const From &Val) {
  123|  3.21M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.21M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.21M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.21M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DictPropertyMapEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  3.21M|  static bool doit(const FromTy &Val) {
  133|  3.21M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.21M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15DictPropertyMapEPKNS2_6GCCellEE4doitES6_:
  105|  3.21M|  static inline bool doit(const From *Val) {
  106|  3.21M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.21M|  }
_ZN4llvh8isa_implIN6hermes2vm15DictPropertyMapENS2_6GCCellEvE4doitERKS4_:
   58|  3.21M|  static inline bool doit(const From &Val) {
   59|  3.21M|    return To::classof(&Val);
   60|  3.21M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm15DictPropertyMapEPNS2_6GCCellES5_E4doitERKS5_:
  218|  2.83M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.83M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.83M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.83M|    return Res2;
  222|  2.83M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm8JSObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  1.26M|cast_or_null(Y *Val) {
  298|  1.26M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 1.26M, False: 4.55k]
  ------------------
  299|  4.55k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  1.26M|}
_ZN4llvh12cast_or_nullIN6hermes2vm11HiddenClassENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  1.05M|cast_or_null(Y *Val) {
  298|  1.05M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 104k, False: 949k]
  ------------------
  299|   949k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  1.05M|}
_ZN4llvh4castIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh3isaIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPKNS2_6GCCellEE4doitES8_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEENS2_6GCCellEvE4doitERKS6_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEPNS2_6GCCellES7_E4doitERKS7_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh3isaIN6hermes2vm6DomainEPNS2_6GCCellEEEbRKT0_:
  142|    353|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    353|  return isa_impl_wrap<X, const Y,
  144|    353|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    353|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm6DomainEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|    353|  static bool doit(const From &Val) {
  123|    353|    return isa_impl_wrap<To, SimpleFrom,
  124|    353|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    353|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    353|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm6DomainEPKNS2_6GCCellES6_E4doitERKS6_:
  132|    353|  static bool doit(const FromTy &Val) {
  133|    353|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    353|  }
_ZN4llvh11isa_impl_clIN6hermes2vm6DomainEPKNS2_6GCCellEE4doitES6_:
  105|    353|  static inline bool doit(const From *Val) {
  106|    353|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    353|  }
_ZN4llvh8isa_implIN6hermes2vm6DomainENS2_6GCCellEvE4doitERKS4_:
   58|    353|  static inline bool doit(const From &Val) {
   59|    353|    return To::classof(&Val);
   60|    353|  }
_ZN4llvh4castIN6hermes2vm6DomainENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    353|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    353|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    353|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    353|}
_ZN4llvh16cast_convert_valIN6hermes2vm6DomainEPNS2_6GCCellES5_E4doitERKS5_:
  218|    353|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    353|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    353|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    353|    return Res2;
  222|    353|  }
_ZN4llvh12cast_or_nullIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  34.5k|cast_or_null(Y *Val) {
  298|  34.5k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 34.3k, False: 234]
  ------------------
  299|    234|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  34.5k|}
_ZN4llvh12cast_or_nullIN6hermes2vm8CallableENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|  1.92k|cast_or_null(Y *Val) {
  298|  1.92k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 24, False: 1.90k]
  ------------------
  299|  1.90k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  1.92k|}
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESB_:
  254|  6.77M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  6.77M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  6.77M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  6.77M|}
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPNS2_6GCCellEEEbRKT0_:
  142|  6.77M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.77M|  return isa_impl_wrap<X, const Y,
  144|  6.77M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.77M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEKPNS2_6GCCellEPKS7_E4doitERS9_:
  122|  6.77M|  static bool doit(const From &Val) {
  123|  6.77M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.77M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.77M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.77M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPKNS2_6GCCellES9_E4doitERKS9_:
  132|  6.77M|  static bool doit(const FromTy &Val) {
  133|  6.77M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.77M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPKNS2_6GCCellEE4doitES9_:
  105|  6.77M|  static inline bool doit(const From *Val) {
  106|  6.77M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  6.77M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentENS2_6GCCellEvE4doitERKS7_:
   58|  6.77M|  static inline bool doit(const From &Val) {
   59|  6.77M|    return To::classof(&Val);
   60|  6.77M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EE7SegmentEPNS2_6GCCellES8_E4doitERKS8_:
  218|  6.77M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  6.77M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  6.77M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  6.77M|    return Res2;
  222|  6.77M|  }
_ZN4llvh12cast_or_nullIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  297|  3.47M|cast_or_null(Y *Val) {
  298|  3.47M|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 7, False: 3.47M]
  ------------------
  299|  3.47M|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  3.47M|}
_ZN4llvh3isaIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPNS2_6GCCellEEEbRKT0_:
  142|  6.94M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.94M|  return isa_impl_wrap<X, const Y,
  144|  6.94M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.94M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  6.94M|  static bool doit(const From &Val) {
  123|  6.94M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.94M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.94M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.94M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  6.94M|  static bool doit(const FromTy &Val) {
  133|  6.94M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.94M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPKNS2_6GCCellEE4doitES8_:
  105|  6.94M|  static inline bool doit(const From *Val) {
  106|  6.94M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  6.94M|  }
_ZN4llvh8isa_implIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEvE4doitERKS6_:
   58|  6.94M|  static inline bool doit(const From &Val) {
   59|  6.94M|    return To::classof(&Val);
   60|  6.94M|  }
_ZN4llvh4castIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|  3.47M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.47M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.47M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.47M|}
_ZN4llvh16cast_convert_valIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|  3.47M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.47M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.47M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.47M|    return Res2;
  222|  3.47M|  }
_ZN4llvh3isaIN6hermes2vm10JSFunctionEPNS2_6GCCellEEEbRKT0_:
  142|  4.13k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.13k|  return isa_impl_wrap<X, const Y,
  144|  4.13k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.13k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm10JSFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  4.13k|  static bool doit(const From &Val) {
  123|  4.13k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.13k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.13k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.13k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm10JSFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  4.13k|  static bool doit(const FromTy &Val) {
  133|  4.13k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.13k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm10JSFunctionEPKNS2_6GCCellEE4doitES6_:
  105|  4.13k|  static inline bool doit(const From *Val) {
  106|  4.13k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.13k|  }
_ZN4llvh8isa_implIN6hermes2vm10JSFunctionENS2_6GCCellEvE4doitERKS4_:
   58|  4.13k|  static inline bool doit(const From &Val) {
   59|  4.13k|    return To::classof(&Val);
   60|  4.13k|  }
_ZN4llvh4castIN6hermes2vm10JSFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.61k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.61k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.61k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.61k|}
_ZN4llvh16cast_convert_valIN6hermes2vm10JSFunctionEPNS2_6GCCellES5_E4doitERKS5_:
  218|  1.61k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.61k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.61k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.61k|    return Res2;
  222|  1.61k|  }
_ZN4llvh3isaIN6hermes2vm19JSGeneratorFunctionEPNS2_6GCCellEEEbRKT0_:
  142|  4.40k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.40k|  return isa_impl_wrap<X, const Y,
  144|  4.40k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.40k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm19JSGeneratorFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  4.40k|  static bool doit(const From &Val) {
  123|  4.40k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.40k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.40k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.40k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm19JSGeneratorFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  4.40k|  static bool doit(const FromTy &Val) {
  133|  4.40k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.40k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm19JSGeneratorFunctionEPKNS2_6GCCellEE4doitES6_:
  105|  4.40k|  static inline bool doit(const From *Val) {
  106|  4.40k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.40k|  }
_ZN4llvh8isa_implIN6hermes2vm19JSGeneratorFunctionENS2_6GCCellEvE4doitERKS4_:
   58|  4.40k|  static inline bool doit(const From &Val) {
   59|  4.40k|    return To::classof(&Val);
   60|  4.40k|  }
_ZN4llvh3isaIN6hermes2vm13BoundFunctionEPNS2_6GCCellEEEbRKT0_:
  142|      4|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      4|  return isa_impl_wrap<X, const Y,
  144|      4|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      4|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm13BoundFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|      4|  static bool doit(const From &Val) {
  123|      4|    return isa_impl_wrap<To, SimpleFrom,
  124|      4|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      4|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      4|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm13BoundFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes2vm13BoundFunctionEPKNS2_6GCCellEE4doitES6_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes2vm13BoundFunctionENS2_6GCCellEvE4doitERKS4_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh4castIN6hermes2vm16PropertyAccessorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  6.38k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  6.38k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  6.38k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  6.38k|}
_ZN4llvh3isaIN6hermes2vm16PropertyAccessorEPNS2_6GCCellEEEbRKT0_:
  142|  6.38k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.38k|  return isa_impl_wrap<X, const Y,
  144|  6.38k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.38k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm16PropertyAccessorEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  6.38k|  static bool doit(const From &Val) {
  123|  6.38k|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.38k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.38k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.38k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm16PropertyAccessorEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  6.38k|  static bool doit(const FromTy &Val) {
  133|  6.38k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.38k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm16PropertyAccessorEPKNS2_6GCCellEE4doitES6_:
  105|  6.38k|  static inline bool doit(const From *Val) {
  106|  6.38k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  6.38k|  }
_ZN4llvh8isa_implIN6hermes2vm16PropertyAccessorENS2_6GCCellEvE4doitERKS4_:
   58|  6.38k|  static inline bool doit(const From &Val) {
   59|  6.38k|    return To::classof(&Val);
   60|  6.38k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm16PropertyAccessorEPNS2_6GCCellES5_E4doitERKS5_:
  218|  6.38k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  6.38k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  6.38k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  6.38k|    return Res2;
  222|  6.38k|  }
_ZN4llvh3isaIN6hermes2vm9ArrayImplEPNS2_6GCCellEEEbRKT0_:
  142|  3.22M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.22M|  return isa_impl_wrap<X, const Y,
  144|  3.22M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.22M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArrayImplEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|  3.22M|  static bool doit(const From &Val) {
  123|  3.22M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.22M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.22M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.22M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm9ArrayImplEPKNS2_6GCCellES6_E4doitERKS6_:
  132|  3.22M|  static bool doit(const FromTy &Val) {
  133|  3.22M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.22M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm9ArrayImplEPKNS2_6GCCellEE4doitES6_:
  105|  3.22M|  static inline bool doit(const From *Val) {
  106|  3.22M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.22M|  }
_ZN4llvh8isa_implIN6hermes2vm9ArrayImplENS2_6GCCellEvE4doitERKS4_:
   58|  3.22M|  static inline bool doit(const From &Val) {
   59|  3.22M|    return To::classof(&Val);
   60|  3.22M|  }
_ZN4llvh4castIN6hermes2vm9ArrayImplENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.22M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.22M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.22M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.22M|}
_ZN4llvh16cast_convert_valIN6hermes2vm9ArrayImplEPNS2_6GCCellES5_E4doitERKS5_:
  218|  3.22M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.22M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.22M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.22M|    return Res2;
  222|  3.22M|  }
_ZN4llvh8dyn_castIN6hermes2vm13BoundFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|      4|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|      4|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 4]
  ------------------
  335|      4|}
_ZN4llvh4castIN6hermes2vm14NativeFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   412k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   412k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   412k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   412k|}
_ZN4llvh3isaIN6hermes2vm14NativeFunctionEPNS2_6GCCellEEEbRKT0_:
  142|   416k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   416k|  return isa_impl_wrap<X, const Y,
  144|   416k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   416k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm14NativeFunctionEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   416k|  static bool doit(const From &Val) {
  123|   416k|    return isa_impl_wrap<To, SimpleFrom,
  124|   416k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   416k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   416k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm14NativeFunctionEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   416k|  static bool doit(const FromTy &Val) {
  133|   416k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   416k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm14NativeFunctionEPKNS2_6GCCellEE4doitES6_:
  105|   416k|  static inline bool doit(const From *Val) {
  106|   416k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   416k|  }
_ZN4llvh8isa_implIN6hermes2vm14NativeFunctionENS2_6GCCellEvE4doitERKS4_:
   58|   416k|  static inline bool doit(const From &Val) {
   59|   416k|    return To::classof(&Val);
   60|   416k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm14NativeFunctionEPNS2_6GCCellES5_E4doitERKS5_:
  218|   412k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   412k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   412k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   412k|    return Res2;
  222|   412k|  }
_ZN4llvh4castIN6hermes5regex14Width1LoopInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     15|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     15|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes5regex14Width1LoopInsnEPNS2_4InsnEEEbRKT0_:
  142|     15|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     15|  return isa_impl_wrap<X, const Y,
  144|     15|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     15|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex14Width1LoopInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|     15|  static bool doit(const From &Val) {
  123|     15|    return isa_impl_wrap<To, SimpleFrom,
  124|     15|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     15|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     15|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes5regex14Width1LoopInsnEPKNS2_4InsnEE4doitES6_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh13simplify_typeIKPN6hermes5regex4InsnEE18getSimplifiedValueERS5_:
   48|  15.7k|  static RetType getSimplifiedValue(const From& Val) {
   49|  15.7k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  15.7k|  }
_ZN4llvh13simplify_typeIPN6hermes5regex4InsnEE18getSimplifiedValueERS4_:
   38|  15.7k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5regex14Width1LoopInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|     15|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     15|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     15|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     15|    return Res2;
  222|     15|  }
_ZN4llvh4castIN6hermes5regex15AlternationInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    828|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    828|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    828|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    828|}
_ZN4llvh3isaIN6hermes5regex15AlternationInsnEPNS2_4InsnEEEbRKT0_:
  142|    828|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    828|  return isa_impl_wrap<X, const Y,
  144|    828|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    828|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15AlternationInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    828|  static bool doit(const From &Val) {
  123|    828|    return isa_impl_wrap<To, SimpleFrom,
  124|    828|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    828|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    828|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15AlternationInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    828|  static bool doit(const FromTy &Val) {
  133|    828|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    828|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15AlternationInsnEPKNS2_4InsnEE4doitES6_:
  105|    828|  static inline bool doit(const From *Val) {
  106|    828|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    828|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15AlternationInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    828|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    828|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    828|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    828|    return Res2;
  222|    828|  }
_ZN4llvh4castIN6hermes5regex10Jump32InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    276|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    276|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    276|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    276|}
_ZN4llvh3isaIN6hermes5regex10Jump32InsnEPNS2_4InsnEEEbRKT0_:
  142|    276|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    276|  return isa_impl_wrap<X, const Y,
  144|    276|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    276|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex10Jump32InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|    276|  static bool doit(const From &Val) {
  123|    276|    return isa_impl_wrap<To, SimpleFrom,
  124|    276|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    276|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    276|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex10Jump32InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|    276|  static bool doit(const FromTy &Val) {
  133|    276|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    276|  }
_ZN4llvh11isa_impl_clIN6hermes5regex10Jump32InsnEPKNS2_4InsnEE4doitES6_:
  105|    276|  static inline bool doit(const From *Val) {
  106|    276|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    276|  }
_ZN4llvh16cast_convert_valIN6hermes5regex10Jump32InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|    276|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    276|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    276|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    276|    return Res2;
  222|    276|  }
_ZN4llvh4castIN6hermes5regex15MatchNChar8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.42k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.42k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.42k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.42k|}
_ZN4llvh3isaIN6hermes5regex15MatchNChar8InsnEPNS2_4InsnEEEbRKT0_:
  142|  3.42k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.42k|  return isa_impl_wrap<X, const Y,
  144|  3.42k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.42k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchNChar8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  3.42k|  static bool doit(const From &Val) {
  123|  3.42k|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.42k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.42k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.42k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  3.42k|  static bool doit(const FromTy &Val) {
  133|  3.42k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.42k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15MatchNChar8InsnEPKNS2_4InsnEE4doitES6_:
  105|  3.42k|  static inline bool doit(const From *Val) {
  106|  3.42k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.42k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15MatchNChar8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  3.42k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.42k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.42k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.42k|    return Res2;
  222|  3.42k|  }
_ZN4llvh4castIN6hermes5regex14MatchChar8InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  11.2k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.2k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  11.2k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.2k|}
_ZN4llvh3isaIN6hermes5regex14MatchChar8InsnEPNS2_4InsnEEEbRKT0_:
  142|  11.2k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  11.2k|  return isa_impl_wrap<X, const Y,
  144|  11.2k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  11.2k|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex14MatchChar8InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|  11.2k|  static bool doit(const From &Val) {
  123|  11.2k|    return isa_impl_wrap<To, SimpleFrom,
  124|  11.2k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  11.2k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  11.2k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex14MatchChar8InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|  11.2k|  static bool doit(const FromTy &Val) {
  133|  11.2k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  11.2k|  }
_ZN4llvh11isa_impl_clIN6hermes5regex14MatchChar8InsnEPKNS2_4InsnEE4doitES6_:
  105|  11.2k|  static inline bool doit(const From *Val) {
  106|  11.2k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  11.2k|  }
_ZN4llvh16cast_convert_valIN6hermes5regex14MatchChar8InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|  11.2k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.2k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.2k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.2k|    return Res2;
  222|  11.2k|  }
_ZN4llvh4castIN6hermes5regex15MatchChar16InsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     15|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     15|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     15|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     15|}
_ZN4llvh3isaIN6hermes5regex15MatchChar16InsnEPNS2_4InsnEEEbRKT0_:
  142|     15|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     15|  return isa_impl_wrap<X, const Y,
  144|     15|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     15|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchChar16InsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|     15|  static bool doit(const From &Val) {
  123|     15|    return isa_impl_wrap<To, SimpleFrom,
  124|     15|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     15|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     15|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex15MatchChar16InsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|     15|  static bool doit(const FromTy &Val) {
  133|     15|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     15|  }
_ZN4llvh11isa_impl_clIN6hermes5regex15MatchChar16InsnEPKNS2_4InsnEE4doitES6_:
  105|     15|  static inline bool doit(const From *Val) {
  106|     15|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     15|  }
_ZN4llvh16cast_convert_valIN6hermes5regex15MatchChar16InsnEPNS2_4InsnES5_E4doitERKS5_:
  218|     15|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     15|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     15|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     15|    return Res2;
  222|     15|  }
_ZN4llvh8dyn_castIN6hermes2vm15StringPrimitiveENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     24|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     24|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 24, False: 0]
  ------------------
  335|     24|}
_ZN4llvh12cast_or_nullIN6hermes2vm15DictPropertyMapENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|   378k|cast_or_null(Y *Val) {
  298|   378k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 0, False: 378k]
  ------------------
  299|   378k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|   378k|}
_ZN4llvh8dyn_castIN6hermes2vm14NativeFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    786|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    786|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 782, False: 4]
  ------------------
  335|    786|}
_ZN4llvh8dyn_castIN6hermes2vm10JSFunctionENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.29k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.29k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.51k, False: 786]
  ------------------
  335|  2.29k|}
_ZN4llvh4castIN6hermes2vm8JSRegExpENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   406k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   406k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   406k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   406k|}
_ZN4llvh3isaIN6hermes2vm8JSRegExpEPNS2_6GCCellEEEbRKT0_:
  142|   812k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   812k|  return isa_impl_wrap<X, const Y,
  144|   812k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   812k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSRegExpEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|   812k|  static bool doit(const From &Val) {
  123|   812k|    return isa_impl_wrap<To, SimpleFrom,
  124|   812k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   812k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   812k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSRegExpEPKNS2_6GCCellES6_E4doitERKS6_:
  132|   812k|  static bool doit(const FromTy &Val) {
  133|   812k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   812k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSRegExpEPKNS2_6GCCellEE4doitES6_:
  105|   812k|  static inline bool doit(const From *Val) {
  106|   812k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   812k|  }
_ZN4llvh8isa_implIN6hermes2vm8JSRegExpENS2_6GCCellEvE4doitERKS4_:
   58|   812k|  static inline bool doit(const From &Val) {
   59|   812k|    return To::classof(&Val);
   60|   812k|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8JSRegExpEPNS2_6GCCellES5_E4doitERKS5_:
  218|   406k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   406k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   406k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   406k|    return Res2;
  222|   406k|  }
_ZN4llvh8dyn_castIN6hermes2vm7JSErrorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     24|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     24|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 24, False: 0]
  ------------------
  335|     24|}
_ZN4llvh3isaIN6hermes2vm7JSErrorEPNS2_6GCCellEEEbRKT0_:
  142|    144|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    144|  return isa_impl_wrap<X, const Y,
  144|    144|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    144|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSErrorEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|    144|  static bool doit(const From &Val) {
  123|    144|    return isa_impl_wrap<To, SimpleFrom,
  124|    144|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    144|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    144|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7JSErrorEPKNS2_6GCCellES6_E4doitERKS6_:
  132|    144|  static bool doit(const FromTy &Val) {
  133|    144|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    144|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7JSErrorEPKNS2_6GCCellEE4doitES6_:
  105|    144|  static inline bool doit(const From *Val) {
  106|    144|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    144|  }
_ZN4llvh8isa_implIN6hermes2vm7JSErrorENS2_6GCCellEvE4doitERKS4_:
   58|    144|  static inline bool doit(const From &Val) {
   59|    144|    return To::classof(&Val);
   60|    144|  }
_ZN4llvh4castIN6hermes2vm7JSErrorENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     96|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     96|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     96|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     96|}
_ZN4llvh16cast_convert_valIN6hermes2vm7JSErrorEPNS2_6GCCellES5_E4doitERKS5_:
  218|     96|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     96|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     96|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     96|    return Res2;
  222|     96|  }
_ZN4llvh12cast_or_nullIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  297|  5.76k|cast_or_null(Y *Val) {
  298|  5.76k|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 0, False: 5.76k]
  ------------------
  299|  5.76k|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|  5.76k|}
_ZN4llvh12cast_or_nullIN6hermes2vm7JSArrayENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|      4|cast_or_null(Y *Val) {
  298|      4|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 4, False: 0]
  ------------------
  299|      0|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|      4|}
_ZN4llvh4castIN6hermes2vm15DecoratedObjectENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh3isaIN6hermes2vm15DecoratedObjectEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DecoratedObjectEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm15DecoratedObjectEPKNS2_6GCCellES6_E4doitERKS6_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm15DecoratedObjectEPKNS2_6GCCellEE4doitES6_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm15DecoratedObjectENS2_6GCCellEvE4doitERKS4_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh16cast_convert_valIN6hermes2vm15DecoratedObjectEPNS2_6GCCellES5_E4doitERKS5_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh4castIN6hermes2vm8JSStringENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh3isaIN6hermes2vm8JSStringEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSStringEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSStringEPKNS2_6GCCellES6_E4doitERKS6_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSStringEPKNS2_6GCCellEE4doitES6_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm8JSStringENS2_6GCCellEvE4doitERKS4_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh16cast_convert_valIN6hermes2vm8JSStringEPNS2_6GCCellES5_E4doitERKS5_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh8dyn_castIN6hermes2vm23BufferedStringPrimitiveIcEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|    711|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    711|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 651, False: 60]
  ------------------
  335|    711|}
_ZN4llvh3isaIN6hermes2vm23BufferedStringPrimitiveIcEEPNS2_6GCCellEEEbRKT0_:
  142|  2.01k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.01k|  return isa_impl_wrap<X, const Y,
  144|  2.01k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.01k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIcEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|  2.01k|  static bool doit(const From &Val) {
  123|  2.01k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.01k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.01k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.01k|  }
_ZN4llvh4castIN6hermes2vm23BufferedStringPrimitiveIcEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|  1.30k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.30k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.30k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.30k|}
_ZN4llvh16cast_convert_valIN6hermes2vm23BufferedStringPrimitiveIcEEPNS2_6GCCellES6_E4doitERKS6_:
  218|  1.30k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.30k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.30k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.30k|    return Res2;
  222|  1.30k|  }
_ZN4llvh8dyn_castIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|    162|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    162|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 152, False: 10]
  ------------------
  335|    162|}
_ZN4llvh3isaIN6hermes2vm23BufferedStringPrimitiveIDsEEPNS2_6GCCellEEEbRKT0_:
  142|    466|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    466|  return isa_impl_wrap<X, const Y,
  144|    466|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    466|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm23BufferedStringPrimitiveIDsEEKPNS2_6GCCellEPKS5_E4doitERS7_:
  122|    466|  static bool doit(const From &Val) {
  123|    466|    return isa_impl_wrap<To, SimpleFrom,
  124|    466|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    466|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    466|  }
_ZN4llvh4castIN6hermes2vm23BufferedStringPrimitiveIDsEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|    304|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    304|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    304|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    304|}
_ZN4llvh16cast_convert_valIN6hermes2vm23BufferedStringPrimitiveIDsEEPNS2_6GCCellES6_E4doitERKS6_:
  218|    304|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    304|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    304|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    304|    return Res2;
  222|    304|  }
_ZN4llvh3isaIN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEEPNS2_6GCCellEEEbRKT0_:
  142|   802k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   802k|  return isa_impl_wrap<X, const Y,
  144|   802k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   802k|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|   802k|  static bool doit(const From &Val) {
  123|   802k|    return isa_impl_wrap<To, SimpleFrom,
  124|   802k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   802k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   802k|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|   802k|  static bool doit(const FromTy &Val) {
  133|   802k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   802k|  }
_ZN4llvh11isa_impl_clIN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEEPKNS2_6GCCellEE4doitES8_:
  105|   802k|  static inline bool doit(const From *Val) {
  106|   802k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   802k|  }
_ZN4llvh8isa_implIN6hermes2vm13JSWeakMapImplILNS2_8CellKindE51EEENS2_6GCCellEvE4doitERKS6_:
   58|   802k|  static inline bool doit(const From &Val) {
   59|   802k|    return To::classof(&Val);
   60|   802k|  }
_ZN4llvh4castIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh3isaIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPKNS2_6GCCellEE4doitES8_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEENS2_6GCCellEvE4doitERKS6_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh16cast_convert_valIN6hermes2vm12SingleObjectILNS2_8CellKindE60EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh4castIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh3isaIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPKNS2_6GCCellES8_E4doitERKS8_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPKNS2_6GCCellEE4doitES8_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEENS2_6GCCellEvE4doitERKS6_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh16cast_convert_valIN6hermes2vm12SingleObjectILNS2_8CellKindE59EEEPNS2_6GCCellES7_E4doitERKS7_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh3isaIN6hermes2vm8JSNumberEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSNumberEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm8JSNumberEPKNS2_6GCCellES6_E4doitERKS6_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm8JSNumberEPKNS2_6GCCellEE4doitES6_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm8JSNumberENS2_6GCCellEvE4doitERKS4_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh3isaIN6hermes2vm9JSBooleanEPNS2_6GCCellEEEbRKT0_:
  142|     99|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     99|  return isa_impl_wrap<X, const Y,
  144|     99|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     99|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm9JSBooleanEKPNS2_6GCCellEPKS4_E4doitERS6_:
  122|     99|  static bool doit(const From &Val) {
  123|     99|    return isa_impl_wrap<To, SimpleFrom,
  124|     99|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     99|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     99|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm9JSBooleanEPKNS2_6GCCellES6_E4doitERKS6_:
  132|     99|  static bool doit(const FromTy &Val) {
  133|     99|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     99|  }
_ZN4llvh11isa_impl_clIN6hermes2vm9JSBooleanEPKNS2_6GCCellEE4doitES6_:
  105|     99|  static inline bool doit(const From *Val) {
  106|     99|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     99|  }
_ZN4llvh8isa_implIN6hermes2vm9JSBooleanENS2_6GCCellEvE4doitERKS4_:
   58|     99|  static inline bool doit(const From &Val) {
   59|     99|    return To::classof(&Val);
   60|     99|  }
_ZN4llvh4castIN6hermes2vm9JSBooleanENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh16cast_convert_valIN6hermes2vm9JSBooleanEPNS2_6GCCellES5_E4doitERKS5_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh4castIN6hermes2vm8JSNumberENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     99|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     99|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     99|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     99|}
_ZN4llvh16cast_convert_valIN6hermes2vm8JSNumberEPNS2_6GCCellES5_E4doitERKS5_:
  218|     99|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     99|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     99|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     99|    return Res2;
  222|     99|  }
_ZN4llvh4castIN6hermes2vm7HadesGC6OldGen12FreelistCellENS2_6GCCellEEENS_10cast_rettyIT_PT0_E8ret_typeESA_:
  254|   616k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   616k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   616k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   616k|}
_ZN4llvh3isaIN6hermes2vm7HadesGC6OldGen12FreelistCellEPNS2_6GCCellEEEbRKT0_:
  142|  11.7M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  11.7M|  return isa_impl_wrap<X, const Y,
  144|  11.7M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  11.7M|}
_ZN4llvh13isa_impl_wrapIN6hermes2vm7HadesGC6OldGen12FreelistCellEKPNS2_6GCCellEPKS6_E4doitERS8_:
  122|  11.7M|  static bool doit(const From &Val) {
  123|  11.7M|    return isa_impl_wrap<To, SimpleFrom,
  124|  11.7M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  11.7M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  11.7M|  }
_ZN4llvh13isa_impl_wrapIN6hermes2vm7HadesGC6OldGen12FreelistCellEPKNS2_6GCCellES8_E4doitERKS8_:
  132|  11.7M|  static bool doit(const FromTy &Val) {
  133|  11.7M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  11.7M|  }
_ZN4llvh11isa_impl_clIN6hermes2vm7HadesGC6OldGen12FreelistCellEPKNS2_6GCCellEE4doitES8_:
  105|  11.7M|  static inline bool doit(const From *Val) {
  106|  11.7M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  11.7M|  }
_ZN4llvh8isa_implIN6hermes2vm7HadesGC6OldGen12FreelistCellENS2_6GCCellEvE4doitERKS6_:
   58|  11.7M|  static inline bool doit(const From &Val) {
   59|  11.7M|    return To::classof(&Val);
   60|  11.7M|  }
_ZN4llvh16cast_convert_valIN6hermes2vm7HadesGC6OldGen12FreelistCellEPNS2_6GCCellES7_E4doitERKS7_:
  218|   616k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   616k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   616k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   616k|    return Res2;
  222|   616k|  }
_ZN4llvh8dyn_castIN6hermes14AllocArrayInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  2.77M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.77M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 66.9k, False: 2.70M]
  ------------------
  335|  2.77M|}
_ZN4llvh3isaIN6hermes14AllocArrayInstEPNS1_11InstructionEEEbRKT0_:
  142|  6.13M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  6.13M|  return isa_impl_wrap<X, const Y,
  144|  6.13M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  6.13M|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  6.13M|  static bool doit(const From &Val) {
  123|  6.13M|    return isa_impl_wrap<To, SimpleFrom,
  124|  6.13M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  6.13M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  6.13M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  6.13M|  static bool doit(const FromTy &Val) {
  133|  6.13M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  6.13M|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocArrayInstEPKNS1_11InstructionEE4doitES5_:
  105|  6.13M|  static inline bool doit(const From *Val) {
  106|  6.13M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  6.13M|  }
_ZN4llvh8isa_implIN6hermes14AllocArrayInstENS1_11InstructionEvE4doitERKS3_:
   58|  6.13M|  static inline bool doit(const From &Val) {
   59|  6.13M|    return To::classof(&Val);
   60|  6.13M|  }
_ZN4llvh13simplify_typeIKPN6hermes11InstructionEE18getSimplifiedValueERS4_:
   48|  75.0M|  static RetType getSimplifiedValue(const From& Val) {
   49|  75.0M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  75.0M|  }
_ZN4llvh13simplify_typeIPN6hermes11InstructionEE18getSimplifiedValueERS3_:
   38|  75.0M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes14AllocArrayInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   100k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   100k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   100k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   100k|}
_ZN4llvh16cast_convert_valIN6hermes14AllocArrayInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   100k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   100k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   100k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   100k|    return Res2;
  222|   100k|  }
_ZN4llvh8dyn_castIN6hermes28HBCAllocObjectFromBufferInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.49M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.49M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 880, False: 1.49M]
  ------------------
  335|  1.49M|}
_ZN4llvh3isaIN6hermes28HBCAllocObjectFromBufferInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.76M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.76M|  return isa_impl_wrap<X, const Y,
  144|  4.76M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.76M|}
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.76M|  static bool doit(const From &Val) {
  123|  4.76M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.76M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.76M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.76M|  }
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.76M|  static bool doit(const FromTy &Val) {
  133|  4.76M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.76M|  }
_ZN4llvh11isa_impl_clIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.76M|  static inline bool doit(const From *Val) {
  106|  4.76M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.76M|  }
_ZN4llvh8isa_implIN6hermes28HBCAllocObjectFromBufferInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.76M|  static inline bool doit(const From &Val) {
   59|  4.76M|    return To::classof(&Val);
   60|  4.76M|  }
_ZN4llvh4castIN6hermes28HBCAllocObjectFromBufferInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.76k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.76k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.76k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.76k|}
_ZN4llvh16cast_convert_valIN6hermes28HBCAllocObjectFromBufferInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.76k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.76k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.76k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.76k|    return Res2;
  222|  1.76k|  }
_ZN4llvh4castIN6hermes7LiteralES2_EENS_10cast_rettyIT_PT0_E8ret_typeES6_:
  254|  3.63k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.63k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.63k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.63k|}
_ZN4llvh3isaIN6hermes7LiteralEPS2_EEbRKT0_:
  142|  3.63k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.63k|  return isa_impl_wrap<X, const Y,
  144|  3.63k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.63k|}
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEKPS2_PKS2_E4doitERS4_:
  122|  3.63k|  static bool doit(const From &Val) {
  123|  3.63k|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.63k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.63k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.63k|  }
_ZN4llvh13isa_impl_wrapIN6hermes7LiteralEPKS2_S4_E4doitERKS4_:
  132|  3.63k|  static bool doit(const FromTy &Val) {
  133|  3.63k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.63k|  }
_ZN4llvh11isa_impl_clIN6hermes7LiteralEPKS2_E4doitES4_:
  105|  3.63k|  static inline bool doit(const From *Val) {
  106|  3.63k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.63k|  }
_ZN4llvh8isa_implIN6hermes7LiteralES2_vE4doitERKS2_:
   67|  3.63k|  static inline bool doit(const From &) { return true; }
_ZN4llvh16cast_convert_valIN6hermes7LiteralEPS2_S3_E4doitERKS3_:
  218|  3.63k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.63k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.63k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.63k|    return Res2;
  222|  3.63k|  }
_ZN4llvh8dyn_castIN6hermes14TerminatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.30M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.30M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.30M, False: 0]
  ------------------
  335|  1.30M|}
_ZN4llvh3isaIN6hermes14TerminatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.76M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.76M|  return isa_impl_wrap<X, const Y,
  144|  2.76M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.76M|}
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.76M|  static bool doit(const From &Val) {
  123|  2.76M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.76M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.76M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.76M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.37M|  static bool doit(const FromTy &Val) {
  133|  3.37M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.37M|  }
_ZN4llvh11isa_impl_clIN6hermes14TerminatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.37M|  static inline bool doit(const From *Val) {
  106|  3.37M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.37M|  }
_ZN4llvh8isa_implIN6hermes14TerminatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.37M|  static inline bool doit(const From &Val) {
   59|  3.37M|    return To::classof(&Val);
   60|  3.37M|  }
_ZN4llvh4castIN6hermes14TerminatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.30M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.30M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.30M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.30M|}
_ZN4llvh16cast_convert_valIN6hermes14TerminatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.30M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.30M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.30M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.30M|    return Res2;
  222|  1.30M|  }
_ZN4llvh8dyn_castIN6hermes8CallInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  4.51M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.51M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.72k, False: 4.50M]
  ------------------
  335|  4.51M|}
_ZN4llvh3isaIN6hermes8CallInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.51M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.51M|  return isa_impl_wrap<X, const Y,
  144|  4.51M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.51M|}
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.51M|  static bool doit(const From &Val) {
  123|  4.51M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.51M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.51M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.51M|  }
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.51M|  static bool doit(const FromTy &Val) {
  133|  4.51M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.51M|  }
_ZN4llvh11isa_impl_clIN6hermes8CallInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.51M|  static inline bool doit(const From *Val) {
  106|  4.51M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.51M|  }
_ZN4llvh8isa_implIN6hermes8CallInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.51M|  static inline bool doit(const From &Val) {
   59|  4.51M|    return To::classof(&Val);
   60|  4.51M|  }
_ZN4llvh8dyn_castIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   388k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   388k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 251k, False: 136k]
  ------------------
  335|   388k|}
_ZN4llvh4castIN6hermes9CatchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     48|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     48|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     48|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     48|}
_ZN4llvh3isaIN6hermes9CatchInstEPNS1_5ValueEEEbRKT0_:
  142|     48|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     48|  return isa_impl_wrap<X, const Y,
  144|     48|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     48|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     48|  static bool doit(const From &Val) {
  123|     48|    return isa_impl_wrap<To, SimpleFrom,
  124|     48|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     48|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     48|  }
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     48|  static bool doit(const FromTy &Val) {
  133|     48|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     48|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEPKNS1_5ValueEE4doitES5_:
  105|     48|  static inline bool doit(const From *Val) {
  106|     48|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     48|  }
_ZN4llvh8isa_implIN6hermes9CatchInstENS1_5ValueEvE4doitERKS3_:
   58|     48|  static inline bool doit(const From &Val) {
   59|     48|    return To::classof(&Val);
   60|     48|  }
_ZN4llvh16cast_convert_valIN6hermes9CatchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     48|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     48|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     48|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     48|    return Res2;
  222|     48|  }
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_8CallInstEEEbRKT0_:
  142|  1.14k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.14k|  return isa_impl_wrap<X, const Y,
  144|  1.14k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.14k|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_8CallInstEPKS3_E4doitERS5_:
  122|  1.14k|  static bool doit(const From &Val) {
  123|  1.14k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.14k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.14k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.14k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_8CallInstES5_E4doitERKS5_:
  132|  1.14k|  static bool doit(const FromTy &Val) {
  133|  1.14k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.14k|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_8CallInstEE4doitES5_:
  105|  1.14k|  static inline bool doit(const From *Val) {
  106|  1.14k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.14k|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_8CallInstEvE4doitERKS3_:
   58|  1.14k|  static inline bool doit(const From &Val) {
   59|  1.14k|    return To::classof(&Val);
   60|  1.14k|  }
_ZN4llvh13simplify_typeIKPN6hermes8CallInstEE18getSimplifiedValueERS4_:
   48|   137k|  static RetType getSimplifiedValue(const From& Val) {
   49|   137k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   137k|  }
_ZN4llvh13simplify_typeIPN6hermes8CallInstEE18getSimplifiedValueERS3_:
   38|   137k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes12HBCCallNInstEPNS1_8CallInstEEEbRKT0_:
  142|   136k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   136k|  return isa_impl_wrap<X, const Y,
  144|   136k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   136k|}
_ZN4llvh13isa_impl_wrapIN6hermes12HBCCallNInstEKPNS1_8CallInstEPKS3_E4doitERS5_:
  122|   136k|  static bool doit(const From &Val) {
  123|   136k|    return isa_impl_wrap<To, SimpleFrom,
  124|   136k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   136k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   136k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12HBCCallNInstEPKNS1_8CallInstES5_E4doitERKS5_:
  132|   136k|  static bool doit(const FromTy &Val) {
  133|   136k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   136k|  }
_ZN4llvh11isa_impl_clIN6hermes12HBCCallNInstEPKNS1_8CallInstEE4doitES5_:
  105|   136k|  static inline bool doit(const From *Val) {
  106|   136k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   136k|  }
_ZN4llvh8isa_implIN6hermes12HBCCallNInstENS1_8CallInstEvE4doitERKS3_:
   58|   136k|  static inline bool doit(const From &Val) {
   59|   136k|    return To::classof(&Val);
   60|   136k|  }
_ZN4llvh3isaIN6hermes16LiteralUndefinedEPNS1_5ValueEEEbRKT0_:
  142|    283|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    283|  return isa_impl_wrap<X, const Y,
  144|    283|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    283|}
_ZN4llvh13isa_impl_wrapIN6hermes16LiteralUndefinedEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    283|  static bool doit(const From &Val) {
  123|    283|    return isa_impl_wrap<To, SimpleFrom,
  124|    283|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    283|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    283|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LiteralUndefinedEPKNS1_5ValueES5_E4doitERKS5_:
  132|    283|  static bool doit(const FromTy &Val) {
  133|    283|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    283|  }
_ZN4llvh11isa_impl_clIN6hermes16LiteralUndefinedEPKNS1_5ValueEE4doitES5_:
  105|    283|  static inline bool doit(const From *Val) {
  106|    283|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    283|  }
_ZN4llvh8isa_implIN6hermes16LiteralUndefinedENS1_5ValueEvE4doitERKS3_:
   58|    283|  static inline bool doit(const From &Val) {
   59|    283|    return To::classof(&Val);
   60|    283|  }
_ZN4llvh8dyn_castIN6hermes13LiteralStringENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.85M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.85M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 310k, False: 3.54M]
  ------------------
  335|  3.85M|}
_ZN4llvh4castIN6hermes13LiteralStringES2_EENS_10cast_rettyIT_PT0_E8ret_typeES6_:
  254|   131k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   131k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   131k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   131k|}
_ZN4llvh3isaIN6hermes13LiteralStringEPS2_EEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEKPS2_PKS2_E4doitERS4_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LiteralStringEPKS2_S4_E4doitERKS4_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes13LiteralStringEPKS2_E4doitES4_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes13LiteralStringES2_vE4doitERKS2_:
   67|   131k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes13LiteralStringEE18getSimplifiedValueERS4_:
   48|   131k|  static RetType getSimplifiedValue(const From& Val) {
   49|   131k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   131k|  }
_ZN4llvh13simplify_typeIPN6hermes13LiteralStringEE18getSimplifiedValueERS3_:
   38|   131k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPS2_S3_E4doitERKS3_:
  218|   131k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   131k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   131k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   131k|    return Res2;
  222|   131k|  }
_ZN4llvh8dyn_castIN6hermes13LiteralNumberENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   465k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   465k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 461k, False: 4.16k]
  ------------------
  335|   465k|}
_ZN4llvh3isaIN6hermes13EmptySentinelEPNS1_5ValueEEEbRKT0_:
  142|  8.32k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  8.32k|  return isa_impl_wrap<X, const Y,
  144|  8.32k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  8.32k|}
_ZN4llvh13isa_impl_wrapIN6hermes13EmptySentinelEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  8.32k|  static bool doit(const From &Val) {
  123|  8.32k|    return isa_impl_wrap<To, SimpleFrom,
  124|  8.32k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  8.32k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  8.32k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13EmptySentinelEPKNS1_5ValueES5_E4doitERKS5_:
  132|  8.32k|  static bool doit(const FromTy &Val) {
  133|  8.32k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  8.32k|  }
_ZN4llvh11isa_impl_clIN6hermes13EmptySentinelEPKNS1_5ValueEE4doitES5_:
  105|  8.32k|  static inline bool doit(const From *Val) {
  106|  8.32k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  8.32k|  }
_ZN4llvh8isa_implIN6hermes13EmptySentinelENS1_5ValueEvE4doitERKS3_:
   58|  8.32k|  static inline bool doit(const From &Val) {
   59|  8.32k|    return To::classof(&Val);
   60|  8.32k|  }
_ZN4llvh3isaIN6hermes17GeneratorFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes17GeneratorFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17GeneratorFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes17GeneratorFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes17GeneratorFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh13simplify_typeIKPN6hermes8FunctionEE18getSimplifiedValueERS4_:
   48|   916k|  static RetType getSimplifiedValue(const From& Val) {
   49|   916k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   916k|  }
_ZN4llvh13simplify_typeIPN6hermes8FunctionEE18getSimplifiedValueERS3_:
   38|   916k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes13AsyncFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   458k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   458k|  return isa_impl_wrap<X, const Y,
  144|   458k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   458k|}
_ZN4llvh13isa_impl_wrapIN6hermes13AsyncFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   458k|  static bool doit(const From &Val) {
  123|   458k|    return isa_impl_wrap<To, SimpleFrom,
  124|   458k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   458k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   458k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13AsyncFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   458k|  static bool doit(const FromTy &Val) {
  133|   458k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   458k|  }
_ZN4llvh11isa_impl_clIN6hermes13AsyncFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   458k|  static inline bool doit(const From *Val) {
  106|   458k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   458k|  }
_ZN4llvh8isa_implIN6hermes13AsyncFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   458k|  static inline bool doit(const From &Val) {
   59|   458k|    return To::classof(&Val);
   60|   458k|  }
_ZN4llvh3isaIN6hermes22GeneratorInnerFunctionEPNS1_8FunctionEEEbRKT0_:
  142|   342k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   342k|  return isa_impl_wrap<X, const Y,
  144|   342k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   342k|}
_ZN4llvh13isa_impl_wrapIN6hermes22GeneratorInnerFunctionEKPNS1_8FunctionEPKS3_E4doitERS5_:
  122|   342k|  static bool doit(const From &Val) {
  123|   342k|    return isa_impl_wrap<To, SimpleFrom,
  124|   342k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   342k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   342k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22GeneratorInnerFunctionEPKNS1_8FunctionES5_E4doitERKS5_:
  132|   342k|  static bool doit(const FromTy &Val) {
  133|   342k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   342k|  }
_ZN4llvh11isa_impl_clIN6hermes22GeneratorInnerFunctionEPKNS1_8FunctionEE4doitES5_:
  105|   342k|  static inline bool doit(const From *Val) {
  106|   342k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   342k|  }
_ZN4llvh8isa_implIN6hermes22GeneratorInnerFunctionENS1_8FunctionEvE4doitERKS3_:
   58|   342k|  static inline bool doit(const From &Val) {
   59|   342k|    return To::classof(&Val);
   60|   342k|  }
_ZN4llvh4castIN6hermes11LiteralBoolENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.03k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.03k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.03k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.03k|}
_ZN4llvh3isaIN6hermes11LiteralBoolEPNS1_7LiteralEEEbRKT0_:
  142|  2.03k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.03k|  return isa_impl_wrap<X, const Y,
  144|  2.03k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.03k|}
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|  2.03k|  static bool doit(const From &Val) {
  123|  2.03k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.03k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.03k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.03k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralBoolEPKNS1_7LiteralES5_E4doitERKS5_:
  132|  2.03k|  static bool doit(const FromTy &Val) {
  133|  2.03k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.03k|  }
_ZN4llvh11isa_impl_clIN6hermes11LiteralBoolEPKNS1_7LiteralEE4doitES5_:
  105|  2.03k|  static inline bool doit(const From *Val) {
  106|  2.03k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.03k|  }
_ZN4llvh8isa_implIN6hermes11LiteralBoolENS1_7LiteralEvE4doitERKS3_:
   58|  2.03k|  static inline bool doit(const From &Val) {
   59|  2.03k|    return To::classof(&Val);
   60|  2.03k|  }
_ZN4llvh16cast_convert_valIN6hermes11LiteralBoolEPNS1_7LiteralES4_E4doitERKS4_:
  218|  2.03k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.03k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.03k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.03k|    return Res2;
  222|  2.03k|  }
_ZN4llvh4castIN6hermes13LiteralNumberENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   949k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   949k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   949k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   949k|}
_ZN4llvh16cast_convert_valIN6hermes13LiteralNumberEPNS1_7LiteralES4_E4doitERKS4_:
  218|   949k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   949k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   949k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   949k|    return Res2;
  222|   949k|  }
_ZN4llvh4castIN6hermes13LiteralStringENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  5.66k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.66k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  5.66k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.66k|}
_ZN4llvh16cast_convert_valIN6hermes13LiteralStringEPNS1_7LiteralES4_E4doitERKS4_:
  218|  5.66k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.66k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.66k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.66k|    return Res2;
  222|  5.66k|  }
_ZN4llvh4castIN6hermes17ScopeCreationInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes17ScopeCreationInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17ScopeCreationInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes17ScopeCreationInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes17ScopeCreationInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh16cast_convert_valIN6hermes17ScopeCreationInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes15CreateScopeInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes15CreateScopeInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.33M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.33M|  return isa_impl_wrap<X, const Y,
  144|  1.33M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.33M|}
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.33M|  static bool doit(const From &Val) {
  123|  1.33M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.33M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.33M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.33M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.33M|  static bool doit(const FromTy &Val) {
  133|  1.33M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.33M|  }
_ZN4llvh11isa_impl_clIN6hermes15CreateScopeInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.33M|  static inline bool doit(const From *Val) {
  106|  1.33M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.33M|  }
_ZN4llvh8isa_implIN6hermes15CreateScopeInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.33M|  static inline bool doit(const From &Val) {
   59|  1.33M|    return To::classof(&Val);
   60|  1.33M|  }
_ZN4llvh16cast_convert_valIN6hermes15CreateScopeInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|   799k|  static inline bool doit(const From &Val) {
   59|   799k|    return To::classof(&Val);
   60|   799k|  }
_ZN4llvh16cast_convert_valIN6hermes24HBCCreateEnvironmentInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh8isa_implIN6hermes21HBCResolveEnvironmentENS1_11InstructionEvE4doitERKS3_:
   58|  1.53M|  static inline bool doit(const From &Val) {
   59|  1.53M|    return To::classof(&Val);
   60|  1.53M|  }
_ZN4llvh4castIN6hermes12AsNumberInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      4|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      4|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes12AsNumberInstEPNS1_11InstructionEEEbRKT0_:
  142|      4|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      4|  return isa_impl_wrap<X, const Y,
  144|      4|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      4|}
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      4|  static bool doit(const From &Val) {
  123|      4|    return isa_impl_wrap<To, SimpleFrom,
  124|      4|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      4|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      4|  }
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes12AsNumberInstEPKNS1_11InstructionEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes12AsNumberInstENS1_11InstructionEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes12AsNumberInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      4|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      4|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      4|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      4|    return Res2;
  222|      4|  }
_ZN4llvh4castIN6hermes13AsNumericInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes13AsNumericInstEPNS1_11InstructionEEEbRKT0_:
  142|      2|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      2|  return isa_impl_wrap<X, const Y,
  144|      2|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      2|}
_ZN4llvh13isa_impl_wrapIN6hermes13AsNumericInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      2|  static bool doit(const From &Val) {
  123|      2|    return isa_impl_wrap<To, SimpleFrom,
  124|      2|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      2|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      2|  }
_ZN4llvh13isa_impl_wrapIN6hermes13AsNumericInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes13AsNumericInstEPKNS1_11InstructionEE4doitES5_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh8isa_implIN6hermes13AsNumericInstENS1_11InstructionEvE4doitERKS3_:
   58|      2|  static inline bool doit(const From &Val) {
   59|      2|    return To::classof(&Val);
   60|      2|  }
_ZN4llvh16cast_convert_valIN6hermes13AsNumericInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }
_ZN4llvh4castIN6hermes13LoadStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    105|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    105|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    105|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    105|}
_ZN4llvh3isaIN6hermes13LoadStackInstEPNS1_11InstructionEEEbRKT0_:
  142|    105|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    105|  return isa_impl_wrap<X, const Y,
  144|    105|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    105|}
_ZN4llvh13isa_impl_wrapIN6hermes13LoadStackInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|    105|  static bool doit(const From &Val) {
  123|    105|    return isa_impl_wrap<To, SimpleFrom,
  124|    105|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    105|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    105|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LoadStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|    105|  static bool doit(const FromTy &Val) {
  133|    105|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    105|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadStackInstEPKNS1_11InstructionEE4doitES5_:
  105|    105|  static inline bool doit(const From *Val) {
  106|    105|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    105|  }
_ZN4llvh8isa_implIN6hermes13LoadStackInstENS1_11InstructionEvE4doitERKS3_:
   58|    105|  static inline bool doit(const From &Val) {
   59|    105|    return To::classof(&Val);
   60|    105|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadStackInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    105|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    105|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    105|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    105|    return Res2;
  222|    105|  }
_ZN4llvh4castIN6hermes7MovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   264k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   264k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   264k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   264k|}
_ZN4llvh3isaIN6hermes7MovInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.35M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.35M|  return isa_impl_wrap<X, const Y,
  144|  1.35M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.35M|}
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.35M|  static bool doit(const From &Val) {
  123|  1.35M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.35M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.35M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.35M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.35M|  static bool doit(const FromTy &Val) {
  133|  1.35M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.35M|  }
_ZN4llvh11isa_impl_clIN6hermes7MovInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.35M|  static inline bool doit(const From *Val) {
  106|  1.35M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.35M|  }
_ZN4llvh8isa_implIN6hermes7MovInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.35M|  static inline bool doit(const From &Val) {
   59|  1.35M|    return To::classof(&Val);
   60|  1.35M|  }
_ZN4llvh16cast_convert_valIN6hermes7MovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   264k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   264k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   264k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   264k|    return Res2;
  222|   264k|  }
_ZN4llvh4castIN6hermes15ImplicitMovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    283|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    283|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    283|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    283|}
_ZN4llvh3isaIN6hermes15ImplicitMovInstEPNS1_11InstructionEEEbRKT0_:
  142|    283|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    283|  return isa_impl_wrap<X, const Y,
  144|    283|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    283|}
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|    283|  static bool doit(const From &Val) {
  123|    283|    return isa_impl_wrap<To, SimpleFrom,
  124|    283|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    283|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    283|  }
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|    283|  static bool doit(const FromTy &Val) {
  133|    283|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    283|  }
_ZN4llvh11isa_impl_clIN6hermes15ImplicitMovInstEPKNS1_11InstructionEE4doitES5_:
  105|    283|  static inline bool doit(const From *Val) {
  106|    283|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    283|  }
_ZN4llvh8isa_implIN6hermes15ImplicitMovInstENS1_11InstructionEvE4doitERKS3_:
   58|    283|  static inline bool doit(const From &Val) {
   59|    283|    return To::classof(&Val);
   60|    283|  }
_ZN4llvh16cast_convert_valIN6hermes15ImplicitMovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    283|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    283|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    283|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    283|    return Res2;
  222|    283|  }
_ZN4llvh4castIN6hermes17UnaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.02k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.02k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.02k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.02k|}
_ZN4llvh3isaIN6hermes17UnaryOperatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.02k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.02k|  return isa_impl_wrap<X, const Y,
  144|  4.02k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.02k|}
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.02k|  static bool doit(const From &Val) {
  123|  4.02k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.02k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.02k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.02k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.02k|  static bool doit(const FromTy &Val) {
  133|  4.02k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.02k|  }
_ZN4llvh11isa_impl_clIN6hermes17UnaryOperatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.02k|  static inline bool doit(const From *Val) {
  106|  4.02k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.02k|  }
_ZN4llvh8isa_implIN6hermes17UnaryOperatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.02k|  static inline bool doit(const From &Val) {
   59|  4.02k|    return To::classof(&Val);
   60|  4.02k|  }
_ZN4llvh16cast_convert_valIN6hermes17UnaryOperatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  4.02k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.02k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.02k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.02k|    return Res2;
  222|  4.02k|  }
_ZN4llvh4castIN6hermes16HBCLoadConstInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes16HBCLoadConstInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.37M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.37M|  return isa_impl_wrap<X, const Y,
  144|  3.37M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.37M|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.37M|  static bool doit(const From &Val) {
  123|  3.37M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.37M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.37M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.37M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.37M|  static bool doit(const FromTy &Val) {
  133|  3.37M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.37M|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadConstInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.37M|  static inline bool doit(const From *Val) {
  106|  3.37M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.37M|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadConstInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.37M|  static inline bool doit(const From &Val) {
   59|  3.37M|    return To::classof(&Val);
   60|  3.37M|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadConstInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes16HBCLoadParamInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes16HBCLoadParamInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.37M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.37M|  return isa_impl_wrap<X, const Y,
  144|  3.37M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.37M|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.37M|  static bool doit(const From &Val) {
  123|  3.37M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.37M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.37M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.37M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.37M|  static bool doit(const FromTy &Val) {
  133|  3.37M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.37M|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadParamInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.37M|  static inline bool doit(const From *Val) {
  106|  3.37M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.37M|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadParamInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.37M|  static inline bool doit(const From &Val) {
   59|  3.37M|    return To::classof(&Val);
   60|  3.37M|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadParamInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      4|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      4|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes21HBCReifyArgumentsInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.24M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.24M|  return isa_impl_wrap<X, const Y,
  144|  1.24M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.24M|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.24M|  static bool doit(const From &Val) {
  123|  1.24M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.24M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.24M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.24M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.24M|  static bool doit(const FromTy &Val) {
  133|  1.24M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.24M|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCReifyArgumentsInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.24M|  static inline bool doit(const From *Val) {
  106|  1.24M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.24M|  }
_ZN4llvh8isa_implIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.24M|  static inline bool doit(const From &Val) {
   59|  1.24M|    return To::classof(&Val);
   60|  1.24M|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCReifyArgumentsInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      4|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      4|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      4|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      4|    return Res2;
  222|      4|  }
_ZN4llvh4castIN6hermes15HBCSpillMovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.87k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.87k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.87k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.87k|}
_ZN4llvh3isaIN6hermes15HBCSpillMovInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.87k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.87k|  return isa_impl_wrap<X, const Y,
  144|  2.87k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.87k|}
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.87k|  static bool doit(const From &Val) {
  123|  2.87k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.87k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.87k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.87k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.87k|  static bool doit(const FromTy &Val) {
  133|  2.87k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.87k|  }
_ZN4llvh11isa_impl_clIN6hermes15HBCSpillMovInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.87k|  static inline bool doit(const From *Val) {
  106|  2.87k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.87k|  }
_ZN4llvh8isa_implIN6hermes15HBCSpillMovInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.87k|  static inline bool doit(const From &Val) {
   59|  2.87k|    return To::classof(&Val);
   60|  2.87k|  }
_ZN4llvh16cast_convert_valIN6hermes15HBCSpillMovInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  2.87k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.87k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.87k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.87k|    return Res2;
  222|  2.87k|  }
_ZN4llvh4castIN6hermes7PhiInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    102|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    102|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    102|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    102|}
_ZN4llvh3isaIN6hermes7PhiInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.93M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.93M|  return isa_impl_wrap<X, const Y,
  144|  3.93M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.93M|}
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.93M|  static bool doit(const From &Val) {
  123|  3.93M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.93M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.93M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.93M|  }
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.93M|  static bool doit(const FromTy &Val) {
  133|  3.93M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.93M|  }
_ZN4llvh11isa_impl_clIN6hermes7PhiInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.93M|  static inline bool doit(const From *Val) {
  106|  3.93M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.93M|  }
_ZN4llvh8isa_implIN6hermes7PhiInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.93M|  static inline bool doit(const From &Val) {
   59|  3.93M|    return To::classof(&Val);
   60|  3.93M|  }
_ZN4llvh16cast_convert_valIN6hermes7PhiInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    102|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    102|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    102|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    102|    return Res2;
  222|    102|  }
_ZN4llvh4castIN6hermes18BinaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   130k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   130k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   130k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   130k|}
_ZN4llvh3isaIN6hermes18BinaryOperatorInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.34M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.34M|  return isa_impl_wrap<X, const Y,
  144|  1.34M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.34M|}
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.34M|  static bool doit(const From &Val) {
  123|  1.34M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.34M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.34M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.34M|  }
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.34M|  static bool doit(const FromTy &Val) {
  133|  1.34M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.34M|  }
_ZN4llvh11isa_impl_clIN6hermes18BinaryOperatorInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.34M|  static inline bool doit(const From *Val) {
  106|  1.34M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.34M|  }
_ZN4llvh8isa_implIN6hermes18BinaryOperatorInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.34M|  static inline bool doit(const From &Val) {
   59|  1.34M|    return To::classof(&Val);
   60|  1.34M|  }
_ZN4llvh16cast_convert_valIN6hermes18BinaryOperatorInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   130k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   130k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   130k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   130k|    return Res2;
  222|   130k|  }
_ZN4llvh4castIN6hermes17StorePropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  3.78k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.78k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.78k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.78k|}
_ZN4llvh3isaIN6hermes17StorePropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.89M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.89M|  return isa_impl_wrap<X, const Y,
  144|  2.89M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.89M|}
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.89M|  static bool doit(const From &Val) {
  123|  2.89M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.89M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.89M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.89M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.89M|  static bool doit(const FromTy &Val) {
  133|  2.89M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.89M|  }
_ZN4llvh11isa_impl_clIN6hermes17StorePropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.89M|  static inline bool doit(const From *Val) {
  106|  2.89M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.89M|  }
_ZN4llvh8isa_implIN6hermes17StorePropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.89M|  static inline bool doit(const From &Val) {
   59|  2.89M|    return To::classof(&Val);
   60|  2.89M|  }
_ZN4llvh16cast_convert_valIN6hermes17StorePropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  3.78k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.78k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.78k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.78k|    return Res2;
  222|  3.78k|  }
_ZN4llvh4castIN6hermes20StoreOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  1.16M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.16M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.16M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.16M|}
_ZN4llvh3isaIN6hermes20StoreOwnPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  4.99M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.99M|  return isa_impl_wrap<X, const Y,
  144|  4.99M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.99M|}
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  4.99M|  static bool doit(const From &Val) {
  123|  4.99M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.99M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.99M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.99M|  }
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  4.99M|  static bool doit(const FromTy &Val) {
  133|  4.99M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.99M|  }
_ZN4llvh11isa_impl_clIN6hermes20StoreOwnPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  4.99M|  static inline bool doit(const From *Val) {
  106|  4.99M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.99M|  }
_ZN4llvh8isa_implIN6hermes20StoreOwnPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  4.99M|  static inline bool doit(const From &Val) {
   59|  4.99M|    return To::classof(&Val);
   60|  4.99M|  }
_ZN4llvh16cast_convert_valIN6hermes20StoreOwnPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  1.16M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.16M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.16M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.16M|    return Res2;
  222|  1.16M|  }
_ZN4llvh4castIN6hermes23StoreNewOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.16k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.16k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.16k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.16k|}
_ZN4llvh3isaIN6hermes23StoreNewOwnPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|   238k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   238k|  return isa_impl_wrap<X, const Y,
  144|   238k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   238k|}
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   238k|  static bool doit(const From &Val) {
  123|   238k|    return isa_impl_wrap<To, SimpleFrom,
  124|   238k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   238k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   238k|  }
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   238k|  static bool doit(const FromTy &Val) {
  133|   238k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   238k|  }
_ZN4llvh11isa_impl_clIN6hermes23StoreNewOwnPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|   238k|  static inline bool doit(const From *Val) {
  106|   238k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   238k|  }
_ZN4llvh8isa_implIN6hermes23StoreNewOwnPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|   238k|  static inline bool doit(const From &Val) {
   59|   238k|    return To::classof(&Val);
   60|   238k|  }
_ZN4llvh16cast_convert_valIN6hermes23StoreNewOwnPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  4.16k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.16k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.16k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.16k|    return Res2;
  222|  4.16k|  }
_ZN4llvh3isaIN6hermes21StoreGetterSetterInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.54M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.54M|  return isa_impl_wrap<X, const Y,
  144|  2.54M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.54M|}
_ZN4llvh13isa_impl_wrapIN6hermes21StoreGetterSetterInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.54M|  static bool doit(const From &Val) {
  123|  2.54M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.54M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.54M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.54M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21StoreGetterSetterInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.54M|  static bool doit(const FromTy &Val) {
  133|  2.54M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.54M|  }
_ZN4llvh11isa_impl_clIN6hermes21StoreGetterSetterInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.54M|  static inline bool doit(const From *Val) {
  106|  2.54M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.54M|  }
_ZN4llvh8isa_implIN6hermes21StoreGetterSetterInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.54M|  static inline bool doit(const From &Val) {
   59|  2.54M|    return To::classof(&Val);
   60|  2.54M|  }
_ZN4llvh3isaIN6hermes18DeletePropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.54M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.54M|  return isa_impl_wrap<X, const Y,
  144|  2.54M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.54M|}
_ZN4llvh13isa_impl_wrapIN6hermes18DeletePropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.54M|  static bool doit(const From &Val) {
  123|  2.54M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.54M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.54M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.54M|  }
_ZN4llvh13isa_impl_wrapIN6hermes18DeletePropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.54M|  static bool doit(const FromTy &Val) {
  133|  2.54M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.54M|  }
_ZN4llvh11isa_impl_clIN6hermes18DeletePropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.54M|  static inline bool doit(const From *Val) {
  106|  2.54M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.54M|  }
_ZN4llvh8isa_implIN6hermes18DeletePropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.54M|  static inline bool doit(const From &Val) {
   59|  2.54M|    return To::classof(&Val);
   60|  2.54M|  }
_ZN4llvh4castIN6hermes16LoadPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     22|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     22|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     22|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     22|}
_ZN4llvh3isaIN6hermes16LoadPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|  3.01M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.01M|  return isa_impl_wrap<X, const Y,
  144|  3.01M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.01M|}
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  3.01M|  static bool doit(const From &Val) {
  123|  3.01M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.01M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.01M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.01M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  3.01M|  static bool doit(const FromTy &Val) {
  133|  3.01M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.01M|  }
_ZN4llvh11isa_impl_clIN6hermes16LoadPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|  3.01M|  static inline bool doit(const From *Val) {
  106|  3.01M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.01M|  }
_ZN4llvh8isa_implIN6hermes16LoadPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|  3.01M|  static inline bool doit(const From &Val) {
   59|  3.01M|    return To::classof(&Val);
   60|  3.01M|  }
_ZN4llvh16cast_convert_valIN6hermes16LoadPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     22|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     22|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     22|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     22|    return Res2;
  222|     22|  }
_ZN4llvh4castIN6hermes25TryLoadGlobalPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   131k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   131k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   131k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   131k|}
_ZN4llvh3isaIN6hermes25TryLoadGlobalPropertyInstEPNS1_11InstructionEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes25TryLoadGlobalPropertyInstEPKNS1_11InstructionEE4doitES5_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes25TryLoadGlobalPropertyInstENS1_11InstructionEvE4doitERKS3_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh16cast_convert_valIN6hermes25TryLoadGlobalPropertyInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   131k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   131k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   131k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   131k|    return Res2;
  222|   131k|  }
_ZN4llvh4castIN6hermes13LoadFrameInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  10.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  10.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.8k|}
_ZN4llvh3isaIN6hermes13LoadFrameInstEPNS1_11InstructionEEEbRKT0_:
  142|  10.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.8k|  return isa_impl_wrap<X, const Y,
  144|  10.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LoadFrameInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  10.8k|  static bool doit(const From &Val) {
  123|  10.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LoadFrameInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  10.8k|  static bool doit(const FromTy &Val) {
  133|  10.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.8k|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadFrameInstEPKNS1_11InstructionEE4doitES5_:
  105|  10.8k|  static inline bool doit(const From *Val) {
  106|  10.8k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  10.8k|  }
_ZN4llvh8isa_implIN6hermes13LoadFrameInstENS1_11InstructionEvE4doitERKS3_:
   58|  10.8k|  static inline bool doit(const From &Val) {
   59|  10.8k|    return To::classof(&Val);
   60|  10.8k|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadFrameInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  10.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.8k|    return Res2;
  222|  10.8k|  }
_ZN4llvh4castIN6hermes14StoreStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   128k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   128k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   128k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   128k|}
_ZN4llvh3isaIN6hermes14StoreStackInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.54M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.54M|  return isa_impl_wrap<X, const Y,
  144|  1.54M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.54M|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.54M|  static bool doit(const From &Val) {
  123|  1.54M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.54M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.54M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.54M|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.54M|  static bool doit(const FromTy &Val) {
  133|  1.54M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.54M|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreStackInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.54M|  static inline bool doit(const From *Val) {
  106|  1.54M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.54M|  }
_ZN4llvh8isa_implIN6hermes14StoreStackInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.54M|  static inline bool doit(const From &Val) {
   59|  1.54M|    return To::classof(&Val);
   60|  1.54M|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreStackInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   128k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   128k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   128k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   128k|    return Res2;
  222|   128k|  }
_ZN4llvh4castIN6hermes14StoreFrameInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes14StoreFrameInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreFrameInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes14StoreFrameInstENS1_11InstructionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreFrameInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes14AllocStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    123|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    123|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    123|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    123|}
_ZN4llvh3isaIN6hermes14AllocStackInstEPNS1_11InstructionEEEbRKT0_:
  142|    123|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    123|  return isa_impl_wrap<X, const Y,
  144|    123|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    123|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|    123|  static bool doit(const From &Val) {
  123|    123|    return isa_impl_wrap<To, SimpleFrom,
  124|    123|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    123|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    123|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocStackInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|    123|  static bool doit(const FromTy &Val) {
  133|    123|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    123|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocStackInstEPKNS1_11InstructionEE4doitES5_:
  105|    123|  static inline bool doit(const From *Val) {
  106|    123|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    123|  }
_ZN4llvh8isa_implIN6hermes14AllocStackInstENS1_11InstructionEvE4doitERKS3_:
   58|    123|  static inline bool doit(const From &Val) {
   59|    123|    return To::classof(&Val);
   60|    123|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocStackInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    123|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    123|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    123|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    123|    return Res2;
  222|    123|  }
_ZN4llvh4castIN6hermes15AllocObjectInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.16k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.16k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.16k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.16k|}
_ZN4llvh3isaIN6hermes15AllocObjectInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.75M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.75M|  return isa_impl_wrap<X, const Y,
  144|  2.75M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.75M|}
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.75M|  static bool doit(const From &Val) {
  123|  2.75M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.75M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.75M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.75M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.75M|  static bool doit(const FromTy &Val) {
  133|  2.75M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.75M|  }
_ZN4llvh11isa_impl_clIN6hermes15AllocObjectInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.75M|  static inline bool doit(const From *Val) {
  106|  2.75M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.75M|  }
_ZN4llvh8isa_implIN6hermes15AllocObjectInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.75M|  static inline bool doit(const From &Val) {
   59|  2.75M|    return To::classof(&Val);
   60|  2.75M|  }
_ZN4llvh16cast_convert_valIN6hermes15AllocObjectInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  4.16k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.16k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.16k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.16k|    return Res2;
  222|  4.16k|  }
_ZN4llvh4castIN6hermes22AllocObjectLiteralInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  10.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  10.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.0k|}
_ZN4llvh3isaIN6hermes22AllocObjectLiteralInstEPNS1_11InstructionEEEbRKT0_:
  142|  2.09M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.09M|  return isa_impl_wrap<X, const Y,
  144|  2.09M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.09M|}
_ZN4llvh13isa_impl_wrapIN6hermes22AllocObjectLiteralInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  2.09M|  static bool doit(const From &Val) {
  123|  2.09M|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.09M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.09M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.09M|  }
_ZN4llvh13isa_impl_wrapIN6hermes22AllocObjectLiteralInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  2.09M|  static bool doit(const FromTy &Val) {
  133|  2.09M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.09M|  }
_ZN4llvh11isa_impl_clIN6hermes22AllocObjectLiteralInstEPKNS1_11InstructionEE4doitES5_:
  105|  2.09M|  static inline bool doit(const From *Val) {
  106|  2.09M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.09M|  }
_ZN4llvh8isa_implIN6hermes22AllocObjectLiteralInstENS1_11InstructionEvE4doitERKS3_:
   58|  2.09M|  static inline bool doit(const From &Val) {
   59|  2.09M|    return To::classof(&Val);
   60|  2.09M|  }
_ZN4llvh16cast_convert_valIN6hermes22AllocObjectLiteralInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  10.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.0k|    return Res2;
  222|  10.0k|  }
_ZN4llvh4castIN6hermes19CreateArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes19CreateArgumentsInstEPNS1_11InstructionEEEbRKT0_:
  142|   947k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   947k|  return isa_impl_wrap<X, const Y,
  144|   947k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   947k|}
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   947k|  static bool doit(const From &Val) {
  123|   947k|    return isa_impl_wrap<To, SimpleFrom,
  124|   947k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   947k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   947k|  }
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   947k|  static bool doit(const FromTy &Val) {
  133|   947k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   947k|  }
_ZN4llvh11isa_impl_clIN6hermes19CreateArgumentsInstEPKNS1_11InstructionEE4doitES5_:
  105|   947k|  static inline bool doit(const From *Val) {
  106|   947k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   947k|  }
_ZN4llvh8isa_implIN6hermes19CreateArgumentsInstENS1_11InstructionEvE4doitERKS3_:
   58|   947k|  static inline bool doit(const From &Val) {
   59|   947k|    return To::classof(&Val);
   60|   947k|  }
_ZN4llvh16cast_convert_valIN6hermes19CreateArgumentsInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }
_ZN4llvh4castIN6hermes9CatchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     24|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     24|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     24|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     24|}
_ZN4llvh3isaIN6hermes9CatchInstEPNS1_11InstructionEEEbRKT0_:
  142|     24|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     24|  return isa_impl_wrap<X, const Y,
  144|     24|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     24|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|     24|  static bool doit(const From &Val) {
  123|     24|    return isa_impl_wrap<To, SimpleFrom,
  124|     24|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     24|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     24|  }
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     24|  static bool doit(const FromTy &Val) {
  133|     24|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     24|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEPKNS1_11InstructionEE4doitES5_:
  105|     24|  static inline bool doit(const From *Val) {
  106|     24|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     24|  }
_ZN4llvh8isa_implIN6hermes9CatchInstENS1_11InstructionEvE4doitERKS3_:
   58|     38|  static inline bool doit(const From &Val) {
   59|     38|    return To::classof(&Val);
   60|     38|  }
_ZN4llvh16cast_convert_valIN6hermes9CatchInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     24|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     24|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     24|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     24|    return Res2;
  222|     24|  }
_ZN4llvh4castIN6hermes16CreateRegExpInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  11.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  11.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.4k|}
_ZN4llvh3isaIN6hermes16CreateRegExpInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.68M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.68M|  return isa_impl_wrap<X, const Y,
  144|  1.68M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.68M|}
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.68M|  static bool doit(const From &Val) {
  123|  1.68M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.68M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.68M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.68M|  }
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.68M|  static bool doit(const FromTy &Val) {
  133|  1.68M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.68M|  }
_ZN4llvh11isa_impl_clIN6hermes16CreateRegExpInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.68M|  static inline bool doit(const From *Val) {
  106|  1.68M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.68M|  }
_ZN4llvh8isa_implIN6hermes16CreateRegExpInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.68M|  static inline bool doit(const From &Val) {
   59|  1.68M|    return To::classof(&Val);
   60|  1.68M|  }
_ZN4llvh16cast_convert_valIN6hermes16CreateRegExpInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  11.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.4k|    return Res2;
  222|  11.4k|  }
_ZN4llvh4castIN6hermes10TryEndInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes10TryEndInstEPNS1_11InstructionEEEbRKT0_:
  142|  39.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  39.3k|  return isa_impl_wrap<X, const Y,
  144|  39.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  39.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  39.3k|  static bool doit(const From &Val) {
  123|  39.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  39.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  39.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  39.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  39.3k|  static bool doit(const FromTy &Val) {
  133|  39.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  39.3k|  }
_ZN4llvh11isa_impl_clIN6hermes10TryEndInstEPKNS1_11InstructionEE4doitES5_:
  105|  39.3k|  static inline bool doit(const From *Val) {
  106|  39.3k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  39.3k|  }
_ZN4llvh8isa_implIN6hermes10TryEndInstENS1_11InstructionEvE4doitERKS3_:
   58|  39.3k|  static inline bool doit(const From &Val) {
   59|  39.3k|    return To::classof(&Val);
   60|  39.3k|  }
_ZN4llvh16cast_convert_valIN6hermes10TryEndInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes16GetNewTargetInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes16GetNewTargetInstEPNS1_11InstructionEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNewTargetInstEPKNS1_11InstructionEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes16GetNewTargetInstENS1_11InstructionEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNewTargetInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh4castIN6hermes17IteratorBeginInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes17IteratorBeginInstEPNS1_11InstructionEEEbRKT0_:
  142|     12|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     12|  return isa_impl_wrap<X, const Y,
  144|     12|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     12|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|     12|  static bool doit(const From &Val) {
  123|     12|    return isa_impl_wrap<To, SimpleFrom,
  124|     12|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     12|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     12|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     12|  static bool doit(const FromTy &Val) {
  133|     12|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     12|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorBeginInstEPKNS1_11InstructionEE4doitES5_:
  105|     12|  static inline bool doit(const From *Val) {
  106|     12|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     12|  }
_ZN4llvh8isa_implIN6hermes17IteratorBeginInstENS1_11InstructionEvE4doitERKS3_:
   58|     12|  static inline bool doit(const From &Val) {
   59|     12|    return To::classof(&Val);
   60|     12|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorBeginInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes16IteratorNextInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      6|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      6|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      6|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      6|}
_ZN4llvh3isaIN6hermes16IteratorNextInstEPNS1_11InstructionEEEbRKT0_:
  142|      6|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      6|  return isa_impl_wrap<X, const Y,
  144|      6|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      6|}
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      6|  static bool doit(const From &Val) {
  123|      6|    return isa_impl_wrap<To, SimpleFrom,
  124|      6|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      6|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      6|  }
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      6|  static bool doit(const FromTy &Val) {
  133|      6|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      6|  }
_ZN4llvh11isa_impl_clIN6hermes16IteratorNextInstEPKNS1_11InstructionEE4doitES5_:
  105|      6|  static inline bool doit(const From *Val) {
  106|      6|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      6|  }
_ZN4llvh8isa_implIN6hermes16IteratorNextInstENS1_11InstructionEvE4doitERKS3_:
   58|      6|  static inline bool doit(const From &Val) {
   59|      6|    return To::classof(&Val);
   60|      6|  }
_ZN4llvh16cast_convert_valIN6hermes16IteratorNextInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      6|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      6|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      6|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      6|    return Res2;
  222|      6|  }
_ZN4llvh4castIN6hermes17IteratorCloseInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     18|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     18|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     18|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     18|}
_ZN4llvh3isaIN6hermes17IteratorCloseInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorCloseInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes17IteratorCloseInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorCloseInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     18|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     18|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     18|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     18|    return Res2;
  222|     18|  }
_ZN4llvh4castIN6hermes25HBCStoreToEnvironmentInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes25HBCStoreToEnvironmentInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes25HBCStoreToEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes25HBCStoreToEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes25HBCStoreToEnvironmentInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes26HBCLoadFromEnvironmentInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  10.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  10.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.8k|}
_ZN4llvh3isaIN6hermes26HBCLoadFromEnvironmentInstEPNS1_11InstructionEEEbRKT0_:
  142|  10.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.8k|  return isa_impl_wrap<X, const Y,
  144|  10.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes26HBCLoadFromEnvironmentInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  10.8k|  static bool doit(const From &Val) {
  123|  10.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  10.8k|  static bool doit(const FromTy &Val) {
  133|  10.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.8k|  }
_ZN4llvh11isa_impl_clIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_11InstructionEE4doitES5_:
  105|  10.8k|  static inline bool doit(const From *Val) {
  106|  10.8k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  10.8k|  }
_ZN4llvh8isa_implIN6hermes26HBCLoadFromEnvironmentInstENS1_11InstructionEvE4doitERKS3_:
   58|  10.8k|  static inline bool doit(const From &Val) {
   59|  10.8k|    return To::classof(&Val);
   60|  10.8k|  }
_ZN4llvh16cast_convert_valIN6hermes26HBCLoadFromEnvironmentInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  10.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.8k|    return Res2;
  222|  10.8k|  }
_ZN4llvh4castIN6hermes18CreateFunctionInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes18CreateFunctionInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes18CreateFunctionInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes18CreateFunctionInstENS1_11InstructionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes18CreateFunctionInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes21HBCCreateFunctionInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes21HBCCreateFunctionInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCCreateFunctionInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes21HBCCreateFunctionInstENS1_11InstructionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCCreateFunctionInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes10BranchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  39.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  39.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  39.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  39.4k|}
_ZN4llvh3isaIN6hermes10BranchInstEPNS1_11InstructionEEEbRKT0_:
  142|  39.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  39.4k|  return isa_impl_wrap<X, const Y,
  144|  39.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  39.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  39.4k|  static bool doit(const From &Val) {
  123|  39.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  39.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  39.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  39.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  39.4k|  static bool doit(const FromTy &Val) {
  133|  39.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  39.4k|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_11InstructionEE4doitES5_:
  105|  39.4k|  static inline bool doit(const From *Val) {
  106|  39.4k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  39.4k|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_11InstructionEvE4doitERKS3_:
   58|  39.4k|  static inline bool doit(const From &Val) {
   59|  39.4k|    return To::classof(&Val);
   60|  39.4k|  }
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  39.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  39.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  39.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  39.4k|    return Res2;
  222|  39.4k|  }
_ZN4llvh4castIN6hermes10ReturnInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes10ReturnInstEPNS1_11InstructionEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_11InstructionEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_11InstructionEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes9ThrowInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      6|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      6|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      6|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      6|}
_ZN4llvh3isaIN6hermes9ThrowInstEPNS1_11InstructionEEEbRKT0_:
  142|      6|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      6|  return isa_impl_wrap<X, const Y,
  144|      6|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      6|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      6|  static bool doit(const From &Val) {
  123|      6|    return isa_impl_wrap<To, SimpleFrom,
  124|      6|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      6|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      6|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      6|  static bool doit(const FromTy &Val) {
  133|      6|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      6|  }
_ZN4llvh11isa_impl_clIN6hermes9ThrowInstEPKNS1_11InstructionEE4doitES5_:
  105|      6|  static inline bool doit(const From *Val) {
  106|      6|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      6|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_11InstructionEvE4doitERKS3_:
   58|      6|  static inline bool doit(const From &Val) {
   59|      6|    return To::classof(&Val);
   60|      6|  }
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      6|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      6|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      6|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      6|    return Res2;
  222|      6|  }
_ZN4llvh3isaIN6hermes10SwitchInstEPNS1_11InstructionEEEbRKT0_:
  142|  5.22M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.22M|  return isa_impl_wrap<X, const Y,
  144|  5.22M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.22M|}
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  5.22M|  static bool doit(const From &Val) {
  123|  5.22M|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.22M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.22M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.22M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  5.22M|  static bool doit(const FromTy &Val) {
  133|  5.22M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.22M|  }
_ZN4llvh11isa_impl_clIN6hermes10SwitchInstEPKNS1_11InstructionEE4doitES5_:
  105|  5.22M|  static inline bool doit(const From *Val) {
  106|  5.22M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  5.22M|  }
_ZN4llvh8isa_implIN6hermes10SwitchInstENS1_11InstructionEvE4doitERKS3_:
   58|  5.22M|  static inline bool doit(const From &Val) {
   59|  5.22M|    return To::classof(&Val);
   60|  5.22M|  }
_ZN4llvh4castIN6hermes14CondBranchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     71|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     71|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     71|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     71|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPNS1_11InstructionEEEbRKT0_:
  142|     71|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     71|  return isa_impl_wrap<X, const Y,
  144|     71|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     71|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|     71|  static bool doit(const From &Val) {
  123|     71|    return isa_impl_wrap<To, SimpleFrom,
  124|     71|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     71|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     71|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     71|  static bool doit(const FromTy &Val) {
  133|     71|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     71|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_11InstructionEE4doitES5_:
  105|     71|  static inline bool doit(const From *Val) {
  106|     71|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     71|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_11InstructionEvE4doitERKS3_:
   58|     71|  static inline bool doit(const From &Val) {
   59|     71|    return To::classof(&Val);
   60|     71|  }
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     71|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     71|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     71|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     71|    return Res2;
  222|     71|  }
_ZN4llvh4castIN6hermes12TryStartInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_11InstructionEEEbRKT0_:
  142|     12|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     12|  return isa_impl_wrap<X, const Y,
  144|     12|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     12|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|     12|  static bool doit(const From &Val) {
  123|     12|    return isa_impl_wrap<To, SimpleFrom,
  124|     12|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     12|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     12|  }
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|     12|  static bool doit(const FromTy &Val) {
  133|     12|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     12|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_11InstructionEE4doitES5_:
  105|     12|  static inline bool doit(const From *Val) {
  106|     12|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     12|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_11InstructionEvE4doitERKS3_:
   58|     12|  static inline bool doit(const From &Val) {
   59|     12|    return To::classof(&Val);
   60|     12|  }
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh3isaIN6hermes13SwitchImmInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes13SwitchImmInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13SwitchImmInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes13SwitchImmInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes13SwitchImmInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh4castIN6hermes8CallInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.30k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.30k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.30k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.30k|}
_ZN4llvh16cast_convert_valIN6hermes8CallInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  2.30k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.30k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.30k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.30k|    return Res2;
  222|  2.30k|  }
_ZN4llvh3isaIN6hermes13ConstructInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.22M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.22M|  return isa_impl_wrap<X, const Y,
  144|  1.22M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.22M|}
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.22M|  static bool doit(const From &Val) {
  123|  1.22M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.22M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.22M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.22M|  }
_ZN4llvh13isa_impl_wrapIN6hermes13ConstructInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.22M|  static bool doit(const FromTy &Val) {
  133|  1.22M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.22M|  }
_ZN4llvh11isa_impl_clIN6hermes13ConstructInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.22M|  static inline bool doit(const From *Val) {
  106|  1.22M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.22M|  }
_ZN4llvh8isa_implIN6hermes13ConstructInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.22M|  static inline bool doit(const From &Val) {
   59|  1.22M|    return To::classof(&Val);
   60|  1.22M|  }
_ZN4llvh4castIN6hermes15CallBuiltinInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    283|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    283|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    283|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    283|}
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh16cast_convert_valIN6hermes15CallBuiltinInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|    283|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    283|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    283|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    283|    return Res2;
  222|    283|  }
_ZN4llvh3isaIN6hermes21GetBuiltinClosureInstEPNS1_11InstructionEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes21GetBuiltinClosureInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes21GetBuiltinClosureInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes21GetBuiltinClosureInstEPKNS1_11InstructionEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes21GetBuiltinClosureInstENS1_11InstructionEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh4castIN6hermes22HBCGetGlobalObjectInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  62.5k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  62.5k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  62.5k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  62.5k|}
_ZN4llvh3isaIN6hermes22HBCGetGlobalObjectInstEPNS1_11InstructionEEEbRKT0_:
  142|  62.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  62.5k|  return isa_impl_wrap<X, const Y,
  144|  62.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  62.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|  62.5k|  static bool doit(const From &Val) {
  123|  62.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  62.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  62.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  62.5k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22HBCGetGlobalObjectInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|  62.5k|  static bool doit(const FromTy &Val) {
  133|  62.5k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  62.5k|  }
_ZN4llvh11isa_impl_clIN6hermes22HBCGetGlobalObjectInstEPKNS1_11InstructionEE4doitES5_:
  105|  62.5k|  static inline bool doit(const From *Val) {
  106|  62.5k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  62.5k|  }
_ZN4llvh8isa_implIN6hermes22HBCGetGlobalObjectInstENS1_11InstructionEvE4doitERKS3_:
   58|  62.5k|  static inline bool doit(const From &Val) {
   59|  62.5k|    return To::classof(&Val);
   60|  62.5k|  }
_ZN4llvh16cast_convert_valIN6hermes22HBCGetGlobalObjectInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|  62.5k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  62.5k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  62.5k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  62.5k|    return Res2;
  222|  62.5k|  }
_ZN4llvh4castIN6hermes16HBCGetThisNSInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes16HBCGetThisNSInstEPNS1_11InstructionEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEKPNS1_11InstructionEPKS3_E4doitERS5_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEPKNS1_11InstructionES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCGetThisNSInstEPKNS1_11InstructionEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes16HBCGetThisNSInstENS1_11InstructionEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCGetThisNSInstEPNS1_11InstructionES4_E4doitERKS4_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh8dyn_castIN6hermes6ESTree11ProgramNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    112|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    112|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 112, False: 0]
  ------------------
  335|    112|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPNS2_4NodeEEEbRKT0_:
  142|    289|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    289|  return isa_impl_wrap<X, const Y,
  144|    289|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    289|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|    289|  static bool doit(const From &Val) {
  123|    289|    return isa_impl_wrap<To, SimpleFrom,
  124|    289|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    289|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    289|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|    289|  static bool doit(const FromTy &Val) {
  133|    289|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    289|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKNS2_4NodeEE4doitES6_:
  105|    289|  static inline bool doit(const From *Val) {
  106|    289|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    289|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeENS2_4NodeEvE4doitERKS4_:
   58|    289|  static inline bool doit(const From &Val) {
   59|    289|    return To::classof(&Val);
   60|    289|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree4NodeEE18getSimplifiedValueERS5_:
   48|  33.8M|  static RetType getSimplifiedValue(const From& Val) {
   49|  33.8M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  33.8M|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree4NodeEE18getSimplifiedValueERS4_:
   38|  33.8M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    177|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    177|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    177|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    177|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    177|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    177|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    177|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    177|    return Res2;
  222|    177|  }
_ZN4llvh8dyn_castIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   530k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   530k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 130k, False: 399k]
  ------------------
  335|   530k|}
_ZN4llvh3isaIN6hermes6ESTree23ExpressionStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   947k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   947k|  return isa_impl_wrap<X, const Y,
  144|   947k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   947k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23ExpressionStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   947k|  static bool doit(const From &Val) {
  123|   947k|    return isa_impl_wrap<To, SimpleFrom,
  124|   947k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   947k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   947k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23ExpressionStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   947k|  static bool doit(const FromTy &Val) {
  133|   947k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   947k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23ExpressionStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   947k|  static inline bool doit(const From *Val) {
  106|   947k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   947k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   947k|  static inline bool doit(const From &Val) {
   59|   947k|    return To::classof(&Val);
   60|   947k|  }
_ZN4llvh4castIN6hermes6ESTree23ExpressionStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   417k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   417k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   417k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   417k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree23ExpressionStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   417k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   417k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   417k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   417k|    return Res2;
  222|   417k|  }
_ZN4llvh3isaIN6hermes6ESTree22FunctionExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   159k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   159k|  return isa_impl_wrap<X, const Y,
  144|   159k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   159k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   159k|  static bool doit(const From &Val) {
  123|   159k|    return isa_impl_wrap<To, SimpleFrom,
  124|   159k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   159k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   159k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   159k|  static bool doit(const FromTy &Val) {
  133|   159k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   159k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22FunctionExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   159k|  static inline bool doit(const From *Val) {
  106|   159k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   159k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22FunctionExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   159k|  static inline bool doit(const From &Val) {
   59|   159k|    return To::classof(&Val);
   60|   159k|  }
_ZN4llvh3isaIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   387k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   387k|  return isa_impl_wrap<X, const Y,
  144|   387k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   387k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   387k|  static bool doit(const From &Val) {
  123|   387k|    return isa_impl_wrap<To, SimpleFrom,
  124|   387k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   387k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   387k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   387k|  static bool doit(const FromTy &Val) {
  133|   387k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   387k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   387k|  static inline bool doit(const From *Val) {
  106|   387k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   387k|  }
_ZN4llvh8isa_implIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   387k|  static inline bool doit(const From &Val) {
   59|   387k|    return To::classof(&Val);
   60|   387k|  }
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstENS1_11InstructionEEEbRKT0_:
  142|   685k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   685k|  return isa_impl_wrap<X, const Y,
  144|   685k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   685k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKNS1_11InstructionES4_E4doitERS4_:
  132|   685k|  static bool doit(const FromTy &Val) {
  133|   685k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   685k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEKNS1_11InstructionEE4doitERS4_:
   77|   685k|  static inline bool doit(const From &Val) {
   78|   685k|    return isa_impl<To, From>::doit(Val);
   79|   685k|  }
_ZN4llvh3isaIN6hermes12GlobalObjectEPNS1_7LiteralEEEbRKT0_:
  142|   177k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   177k|  return isa_impl_wrap<X, const Y,
  144|   177k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   177k|}
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEKPNS1_7LiteralEPKS3_E4doitERS5_:
  122|   177k|  static bool doit(const From &Val) {
  123|   177k|    return isa_impl_wrap<To, SimpleFrom,
  124|   177k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   177k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   177k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12GlobalObjectEPKNS1_7LiteralES5_E4doitERKS5_:
  132|   177k|  static bool doit(const FromTy &Val) {
  133|   177k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   177k|  }
_ZN4llvh11isa_impl_clIN6hermes12GlobalObjectEPKNS1_7LiteralEE4doitES5_:
  105|   177k|  static inline bool doit(const From *Val) {
  106|   177k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   177k|  }
_ZN4llvh8isa_implIN6hermes12GlobalObjectENS1_7LiteralEvE4doitERKS3_:
   58|   177k|  static inline bool doit(const From &Val) {
   59|   177k|    return To::classof(&Val);
   60|   177k|  }
_ZN4llvh4castIN6hermes11InstructionENS1_22HBCGetGlobalObjectInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  62.5k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  62.5k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  62.5k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  62.5k|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_22HBCGetGlobalObjectInstEEEbRKT0_:
  142|  62.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  62.5k|  return isa_impl_wrap<X, const Y,
  144|  62.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  62.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_22HBCGetGlobalObjectInstEPKS3_E4doitERS5_:
  122|  62.5k|  static bool doit(const From &Val) {
  123|  62.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  62.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  62.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  62.5k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_22HBCGetGlobalObjectInstES5_E4doitERKS5_:
  132|  62.5k|  static bool doit(const FromTy &Val) {
  133|  62.5k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  62.5k|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_22HBCGetGlobalObjectInstEE4doitES5_:
  105|  62.5k|  static inline bool doit(const From *Val) {
  106|  62.5k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  62.5k|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_22HBCGetGlobalObjectInstEvE4doitERKS3_:
   67|  62.5k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes22HBCGetGlobalObjectInstEE18getSimplifiedValueERS4_:
   48|  62.5k|  static RetType getSimplifiedValue(const From& Val) {
   49|  62.5k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  62.5k|  }
_ZN4llvh13simplify_typeIPN6hermes22HBCGetGlobalObjectInstEE18getSimplifiedValueERS3_:
   38|  62.5k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_22HBCGetGlobalObjectInstES4_E4doitERKS4_:
  218|  62.5k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  62.5k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  62.5k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  62.5k|    return Res2;
  222|  62.5k|  }
_ZN4llvh4castIN6hermes11InstructionENS1_16HBCLoadConstInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes11InstructionEPNS1_16HBCLoadConstInstEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEKPNS1_16HBCLoadConstInstEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11InstructionEPKNS1_16HBCLoadConstInstES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes11InstructionEPKNS1_16HBCLoadConstInstEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes11InstructionENS1_16HBCLoadConstInstEvE4doitERKS3_:
   67|   114k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes16HBCLoadConstInstEE18getSimplifiedValueERS4_:
   48|   114k|  static RetType getSimplifiedValue(const From& Val) {
   49|   114k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   114k|  }
_ZN4llvh13simplify_typeIPN6hermes16HBCLoadConstInstEE18getSimplifiedValueERS3_:
   38|   114k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes11InstructionEPNS1_16HBCLoadConstInstES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh8dyn_castIN6hermes7PhiInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  3.93M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  3.93M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 68, False: 3.93M]
  ------------------
  335|  3.93M|}
_ZN4llvh8dyn_castIN6hermes20StoreOwnPropertyInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  2.74M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.74M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 938k, False: 1.80M]
  ------------------
  335|  2.74M|}
_ZN4llvh8dyn_castIN6hermes7LiteralENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  2.11M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.11M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 622k, False: 1.49M]
  ------------------
  335|  2.11M|}
_ZN4llvh4castIN6hermes5ValueENS1_16HBCGetThisNSInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes5ValueEPNS1_16HBCGetThisNSInstEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEKPNS1_16HBCGetThisNSInstEPKS3_E4doitERS5_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEPKNS1_16HBCGetThisNSInstES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes5ValueEPKNS1_16HBCGetThisNSInstEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes5ValueENS1_16HBCGetThisNSInstEvE4doitERKS3_:
   67|      5|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes16HBCGetThisNSInstEE18getSimplifiedValueERS4_:
   48|      5|  static RetType getSimplifiedValue(const From& Val) {
   49|      5|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|      5|  }
_ZN4llvh13simplify_typeIPN6hermes16HBCGetThisNSInstEE18getSimplifiedValueERS3_:
   38|      5|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5ValueEPNS1_16HBCGetThisNSInstES4_E4doitERKS4_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh8dyn_castIN6hermes15CreateScopeInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.21M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.21M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 114k, False: 1.10M]
  ------------------
  335|  1.21M|}
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstEPNS1_17ScopeCreationInstEEEbRKT0_:
  142|   125k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   125k|  return isa_impl_wrap<X, const Y,
  144|   125k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   125k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKPNS1_17ScopeCreationInstEPKS3_E4doitERS5_:
  122|   125k|  static bool doit(const From &Val) {
  123|   125k|    return isa_impl_wrap<To, SimpleFrom,
  124|   125k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   125k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   125k|  }
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEPKNS1_17ScopeCreationInstES5_E4doitERKS5_:
  132|   125k|  static bool doit(const FromTy &Val) {
  133|   125k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   125k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEPKNS1_17ScopeCreationInstEE4doitES5_:
  105|   125k|  static inline bool doit(const From *Val) {
  106|   125k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   125k|  }
_ZN4llvh8isa_implIN6hermes24HBCCreateEnvironmentInstENS1_17ScopeCreationInstEvE4doitERKS3_:
   58|   125k|  static inline bool doit(const From &Val) {
   59|   125k|    return To::classof(&Val);
   60|   125k|  }
_ZN4llvh13simplify_typeIKPN6hermes17ScopeCreationInstEE18getSimplifiedValueERS4_:
   48|   125k|  static RetType getSimplifiedValue(const From& Val) {
   49|   125k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   125k|  }
_ZN4llvh13simplify_typeIPN6hermes17ScopeCreationInstEE18getSimplifiedValueERS3_:
   38|   125k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes24HBCCreateEnvironmentInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   229k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   229k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   229k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   229k|}
_ZN4llvh3isaIN6hermes24HBCCreateEnvironmentInstEPNS1_5ValueEEEbRKT0_:
  142|   229k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   229k|  return isa_impl_wrap<X, const Y,
  144|   229k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   229k|}
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   229k|  static bool doit(const From &Val) {
  123|   229k|    return isa_impl_wrap<To, SimpleFrom,
  124|   229k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   229k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   229k|  }
_ZN4llvh13isa_impl_wrapIN6hermes24HBCCreateEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   229k|  static bool doit(const FromTy &Val) {
  133|   229k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   229k|  }
_ZN4llvh11isa_impl_clIN6hermes24HBCCreateEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|   229k|  static inline bool doit(const From *Val) {
  106|   229k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   229k|  }
_ZN4llvh8isa_implIN6hermes24HBCCreateEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|   229k|  static inline bool doit(const From &Val) {
   59|   229k|    return To::classof(&Val);
   60|   229k|  }
_ZN4llvh16cast_convert_valIN6hermes24HBCCreateEnvironmentInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   229k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   229k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   229k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   229k|    return Res2;
  222|   229k|  }
_ZN4llvh8dyn_castIN6hermes19CreateArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   947k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   947k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2, False: 947k]
  ------------------
  335|   947k|}
_ZN4llvh8dyn_castIN6hermes16LoadPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|    580|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    580|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 287, False: 293]
  ------------------
  335|    580|}
_ZN4llvh3isaIN6hermes16LoadPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|    889|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    889|  return isa_impl_wrap<X, const Y,
  144|    889|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    889|}
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    889|  static bool doit(const From &Val) {
  123|    889|    return isa_impl_wrap<To, SimpleFrom,
  124|    889|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    889|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    889|  }
_ZN4llvh13isa_impl_wrapIN6hermes16LoadPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    889|  static bool doit(const FromTy &Val) {
  133|    889|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    889|  }
_ZN4llvh11isa_impl_clIN6hermes16LoadPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|    889|  static inline bool doit(const From *Val) {
  106|    889|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    889|  }
_ZN4llvh8isa_implIN6hermes16LoadPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|    889|  static inline bool doit(const From &Val) {
   59|    889|    return To::classof(&Val);
   60|    889|  }
_ZN4llvh4castIN6hermes16LoadPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    309|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    309|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    309|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    309|}
_ZN4llvh16cast_convert_valIN6hermes16LoadPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    309|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    309|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    309|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    309|    return Res2;
  222|    309|  }
_ZN4llvh8dyn_castIN6hermes7PhiInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|      2|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|      2|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 2]
  ------------------
  335|      2|}
_ZN4llvh3isaIN6hermes7PhiInstEPNS1_5ValueEEEbRKT0_:
  142|     36|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     36|  return isa_impl_wrap<X, const Y,
  144|     36|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     36|}
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     36|  static bool doit(const From &Val) {
  123|     36|    return isa_impl_wrap<To, SimpleFrom,
  124|     36|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     36|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     36|  }
_ZN4llvh13isa_impl_wrapIN6hermes7PhiInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     36|  static bool doit(const FromTy &Val) {
  133|     36|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     36|  }
_ZN4llvh11isa_impl_clIN6hermes7PhiInstEPKNS1_5ValueEE4doitES5_:
  105|     36|  static inline bool doit(const From *Val) {
  106|     36|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     36|  }
_ZN4llvh8isa_implIN6hermes7PhiInstENS1_5ValueEvE4doitERKS3_:
   58|     36|  static inline bool doit(const From &Val) {
   59|     36|    return To::classof(&Val);
   60|     36|  }
_ZN4llvh4castIN6hermes7PhiInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     34|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     34|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     34|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     34|}
_ZN4llvh16cast_convert_valIN6hermes7PhiInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     34|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     34|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     34|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     34|    return Res2;
  222|     34|  }
_ZN4llvh8dyn_castIN6hermes11InstructionENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  4.55M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.55M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.31M, False: 2.23M]
  ------------------
  335|  4.55M|}
_ZN4llvh8dyn_castIN6hermes21HBCReifyArgumentsInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  4.01k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  4.01k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2, False: 4.01k]
  ------------------
  335|  4.01k|}
_ZN4llvh8dyn_castIN6hermes13ConstructInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.22M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.22M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1.22M]
  ------------------
  335|  1.22M|}
_ZN4llvh8dyn_castIN6hermes7MovInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.09M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.09M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1.09M]
  ------------------
  335|  1.09M|}
_ZN4llvh3isaIN6hermes16HBCLoadConstInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadConstInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadConstInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadConstInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh4castIN6hermes16HBCLoadConstInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadConstInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh8dyn_castIN6hermes10SwitchInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  2.48M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.48M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 2.48M]
  ------------------
  335|  2.48M|}
_ZN4llvh8dyn_castIN6hermes13LiteralNumberENS1_7LiteralEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.81k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.81k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1.81k]
  ------------------
  335|  1.81k|}
_ZN4llvh3isaIN6hermes9CatchInstENS1_11InstructionEEEbRKT0_:
  142|     14|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     14|  return isa_impl_wrap<X, const Y,
  144|     14|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     14|}
_ZN4llvh13isa_impl_wrapIN6hermes9CatchInstEKNS1_11InstructionES4_E4doitERS4_:
  132|     14|  static bool doit(const FromTy &Val) {
  133|     14|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     14|  }
_ZN4llvh11isa_impl_clIN6hermes9CatchInstEKNS1_11InstructionEE4doitERS4_:
   77|     14|  static inline bool doit(const From &Val) {
   78|     14|    return isa_impl<To, From>::doit(Val);
   79|     14|  }
_ZN4llvh4castIN6hermes7MovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   264k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   264k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   264k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   264k|}
_ZN4llvh3isaIN6hermes7MovInstEPNS1_5ValueEEEbRKT0_:
  142|   264k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   264k|  return isa_impl_wrap<X, const Y,
  144|   264k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   264k|}
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   264k|  static bool doit(const From &Val) {
  123|   264k|    return isa_impl_wrap<To, SimpleFrom,
  124|   264k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   264k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   264k|  }
_ZN4llvh13isa_impl_wrapIN6hermes7MovInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   264k|  static bool doit(const FromTy &Val) {
  133|   264k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   264k|  }
_ZN4llvh11isa_impl_clIN6hermes7MovInstEPKNS1_5ValueEE4doitES5_:
  105|   264k|  static inline bool doit(const From *Val) {
  106|   264k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   264k|  }
_ZN4llvh8isa_implIN6hermes7MovInstENS1_5ValueEvE4doitERKS3_:
   58|   264k|  static inline bool doit(const From &Val) {
   59|   264k|    return To::classof(&Val);
   60|   264k|  }
_ZN4llvh16cast_convert_valIN6hermes7MovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   264k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   264k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   264k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   264k|    return Res2;
  222|   264k|  }
_ZN4llvh3isaIN6hermes21HBCResolveEnvironmentENS1_11InstructionEEEbRKT0_:
  142|  1.53M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.53M|  return isa_impl_wrap<X, const Y,
  144|  1.53M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.53M|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCResolveEnvironmentEKNS1_11InstructionES4_E4doitERS4_:
  132|  1.53M|  static bool doit(const FromTy &Val) {
  133|  1.53M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.53M|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCResolveEnvironmentEKNS1_11InstructionEE4doitERS4_:
   77|  1.53M|  static inline bool doit(const From &Val) {
   78|  1.53M|    return isa_impl<To, From>::doit(Val);
   79|  1.53M|  }
_ZN4llvh8dyn_castIN6hermes17ScopeCreationInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.53M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.53M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 114k, False: 1.41M]
  ------------------
  335|  1.53M|}
_ZN4llvh3isaIN6hermes11LiteralNullEPNS1_5ValueEEEbRKT0_:
  142|  7.79k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.79k|  return isa_impl_wrap<X, const Y,
  144|  7.79k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.79k|}
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralNullEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  7.79k|  static bool doit(const From &Val) {
  123|  7.79k|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.79k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.79k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.79k|  }
_ZN4llvh13isa_impl_wrapIN6hermes11LiteralNullEPKNS1_5ValueES5_E4doitERKS5_:
  132|  7.79k|  static bool doit(const FromTy &Val) {
  133|  7.79k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.79k|  }
_ZN4llvh11isa_impl_clIN6hermes11LiteralNullEPKNS1_5ValueEE4doitES5_:
  105|  7.79k|  static inline bool doit(const From *Val) {
  106|  7.79k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  7.79k|  }
_ZN4llvh8isa_implIN6hermes11LiteralNullENS1_5ValueEvE4doitERKS3_:
   58|  7.79k|  static inline bool doit(const From &Val) {
   59|  7.79k|    return To::classof(&Val);
   60|  7.79k|  }
_ZN4llvh8dyn_castIN6hermes22AllocObjectLiteralInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.21M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.21M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 5.04k, False: 1.21M]
  ------------------
  335|  1.21M|}
_ZN4llvh8dyn_castIN6hermes14StoreStackInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.41M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.41M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 128k, False: 1.29M]
  ------------------
  335|  1.41M|}
_ZN4llvh3isaIN6hermes18BinaryOperatorInstEPNS1_5ValueEEEbRKT0_:
  142|  65.0k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  65.0k|  return isa_impl_wrap<X, const Y,
  144|  65.0k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  65.0k|}
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  65.0k|  static bool doit(const From &Val) {
  123|  65.0k|    return isa_impl_wrap<To, SimpleFrom,
  124|  65.0k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  65.0k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  65.0k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18BinaryOperatorInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  65.0k|  static bool doit(const FromTy &Val) {
  133|  65.0k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  65.0k|  }
_ZN4llvh11isa_impl_clIN6hermes18BinaryOperatorInstEPKNS1_5ValueEE4doitES5_:
  105|  65.0k|  static inline bool doit(const From *Val) {
  106|  65.0k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  65.0k|  }
_ZN4llvh8isa_implIN6hermes18BinaryOperatorInstENS1_5ValueEvE4doitERKS3_:
   58|  65.0k|  static inline bool doit(const From &Val) {
   59|  65.0k|    return To::classof(&Val);
   60|  65.0k|  }
_ZN4llvh4castIN6hermes18BinaryOperatorInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  65.0k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  65.0k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  65.0k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  65.0k|}
_ZN4llvh16cast_convert_valIN6hermes18BinaryOperatorInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  65.0k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  65.0k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  65.0k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  65.0k|    return Res2;
  222|  65.0k|  }
_ZN4llvh8dyn_castIN6hermes18BinaryOperatorInstENS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  1.21M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.21M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 65.0k, False: 1.15M]
  ------------------
  335|  1.21M|}
_ZN4llvh8dyn_castIN6hermes12TryStartInstENS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|  39.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  39.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 12, False: 39.3k]
  ------------------
  335|  39.3k|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_14TerminatorInstEEEbRKT0_:
  142|  39.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  39.3k|  return isa_impl_wrap<X, const Y,
  144|  39.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  39.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPNS1_14TerminatorInstEPKS3_E4doitERS5_:
  122|  39.3k|  static bool doit(const From &Val) {
  123|  39.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  39.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  39.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  39.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  39.8k|  static bool doit(const FromTy &Val) {
  133|  39.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  39.8k|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  39.8k|  static inline bool doit(const From *Val) {
  106|  39.8k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  39.8k|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  39.8k|  static inline bool doit(const From &Val) {
   59|  39.8k|    return To::classof(&Val);
   60|  39.8k|  }
_ZN4llvh13simplify_typeIKPN6hermes14TerminatorInstEE18getSimplifiedValueERS4_:
   48|  39.3k|  static RetType getSimplifiedValue(const From& Val) {
   49|  39.3k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  39.3k|  }
_ZN4llvh13simplify_typeIPN6hermes14TerminatorInstEE18getSimplifiedValueERS3_:
   38|  39.3k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes12TryStartInstENS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_14TerminatorInstES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes6ESTree14IdentifierNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|   640k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   640k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   640k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   640k|}
_ZN4llvh3isaIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeEEEbRKT0_:
  142|   644k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   644k|  return isa_impl_wrap<X, const Y,
  144|   644k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   644k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|   644k|  static bool doit(const From &Val) {
  123|   644k|    return isa_impl_wrap<To, SimpleFrom,
  124|   644k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   644k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   644k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  3.82M|  static bool doit(const FromTy &Val) {
  133|  3.82M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.82M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeEE4doitES6_:
  105|  3.82M|  static inline bool doit(const From *Val) {
  106|  3.82M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.82M|  }
_ZN4llvh8isa_implIN6hermes6ESTree14IdentifierNodeENS2_4NodeEvE4doitERKS4_:
   58|  3.82M|  static inline bool doit(const From &Val) {
   59|  3.82M|    return To::classof(&Val);
   60|  3.82M|  }
_ZN4llvh13simplify_typeIKPKN6hermes6ESTree4NodeEE18getSimplifiedValueERS6_:
   48|   653k|  static RetType getSimplifiedValue(const From& Val) {
   49|   653k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   653k|  }
_ZN4llvh13simplify_typeIPKN6hermes6ESTree4NodeEE18getSimplifiedValueERS5_:
   38|   653k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes6ESTree14IdentifierNodeEPKNS2_4NodeES6_E4doitERKS6_:
  218|   640k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   640k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   640k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   640k|    return Res2;
  222|   640k|  }
_ZN4llvh16dyn_cast_or_nullIN6hermes8VariableENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|  3.84k|dyn_cast_or_null(Y *Val) {
  359|  3.84k|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 3.84k, False: 0]
  |  Branch (359:18): [True: 836, False: 3.00k]
  ------------------
  360|  3.84k|}
_ZN4llvh16dyn_cast_or_nullIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|  6.46k|dyn_cast_or_null(Y *Val) {
  359|  6.46k|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 3.06k, False: 3.40k]
  |  Branch (359:18): [True: 3.06k, False: 0]
  ------------------
  360|  6.46k|}
_ZN4llvh4castIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   142k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   142k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   142k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   142k|}
_ZN4llvh16cast_convert_valIN6hermes20GlobalObjectPropertyEPNS1_5ValueES4_E4doitERKS4_:
  218|   142k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   142k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   142k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   142k|    return Res2;
  222|   142k|  }
_ZN4llvh3isaIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|   456k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   456k|  return isa_impl_wrap<X, const Y,
  144|   456k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   456k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|   456k|  static bool doit(const From &Val) {
  123|   456k|    return isa_impl_wrap<To, SimpleFrom,
  124|   456k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   456k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   456k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|   456k|  static bool doit(const FromTy &Val) {
  133|   456k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   456k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree27ArrowFunctionExpressionNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|   456k|  static inline bool doit(const From *Val) {
  106|   456k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   456k|  }
_ZN4llvh8isa_implIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|   456k|  static inline bool doit(const From &Val) {
   59|   456k|    return To::classof(&Val);
   60|   456k|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree16FunctionLikeNodeEE18getSimplifiedValueERS5_:
   48|   464k|  static RetType getSimplifiedValue(const From& Val) {
   49|   464k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   464k|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree16FunctionLikeNodeEE18getSimplifiedValueERS4_:
   38|   464k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh3isaIN6hermes20GlobalObjectPropertyEPNS1_5ValueEEEbRKT0_:
  142|   424k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   424k|  return isa_impl_wrap<X, const Y,
  144|   424k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   424k|}
_ZN4llvh13isa_impl_wrapIN6hermes20GlobalObjectPropertyEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   424k|  static bool doit(const From &Val) {
  123|   424k|    return isa_impl_wrap<To, SimpleFrom,
  124|   424k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   424k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   424k|  }
_ZN4llvh13isa_impl_wrapIN6hermes20GlobalObjectPropertyEPKNS1_5ValueES5_E4doitERKS5_:
  132|   424k|  static bool doit(const FromTy &Val) {
  133|   424k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   424k|  }
_ZN4llvh11isa_impl_clIN6hermes20GlobalObjectPropertyEPKNS1_5ValueEE4doitES5_:
  105|   424k|  static inline bool doit(const From *Val) {
  106|   424k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   424k|  }
_ZN4llvh8isa_implIN6hermes20GlobalObjectPropertyENS1_5ValueEvE4doitERKS3_:
   58|   424k|  static inline bool doit(const From &Val) {
   59|   424k|    return To::classof(&Val);
   60|   424k|  }
_ZN4llvh16dyn_cast_or_nullIN6hermes6ESTree11ProgramNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  358|     56|dyn_cast_or_null(Y *Val) {
  359|     56|  return (Val && isa<X>(Val)) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (359:11): [True: 56, False: 0]
  |  Branch (359:18): [True: 56, False: 0]
  ------------------
  360|     56|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPS3_EEbRKT0_:
  142|    112|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    112|  return isa_impl_wrap<X, const Y,
  144|    112|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    112|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPS3_PKS3_E4doitERS5_:
  122|    112|  static bool doit(const From &Val) {
  123|    112|    return isa_impl_wrap<To, SimpleFrom,
  124|    112|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    112|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    112|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKS3_S5_E4doitERKS5_:
  132|    112|  static bool doit(const FromTy &Val) {
  133|    112|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    112|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKS3_E4doitES5_:
  105|    112|  static inline bool doit(const From *Val) {
  106|    112|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    112|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeES3_vE4doitERKS3_:
   67|    112|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree11ProgramNodeEE18getSimplifiedValueERS5_:
   48|    112|  static RetType getSimplifiedValue(const From& Val) {
   49|    112|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|    112|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree11ProgramNodeEE18getSimplifiedValueERS4_:
   38|    112|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     56|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     56|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     56|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     56|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPS3_S4_E4doitERKS4_:
  218|     56|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     56|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     56|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     56|    return Res2;
  222|     56|  }
_ZN4llvh8dyn_castIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  5.99k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  5.99k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.34k, False: 4.64k]
  ------------------
  335|  5.99k|}
_ZN4llvh3isaIN6hermes6ESTree22VariableDeclaratorNodeEPNS2_4NodeEEEbRKT0_:
  142|  11.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  11.7k|  return isa_impl_wrap<X, const Y,
  144|  11.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  11.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22VariableDeclaratorNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  11.7k|  static bool doit(const From &Val) {
  123|  11.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  11.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  11.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  11.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22VariableDeclaratorNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  11.7k|  static bool doit(const FromTy &Val) {
  133|  11.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  11.7k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22VariableDeclaratorNodeEPKNS2_4NodeEE4doitES6_:
  105|  11.7k|  static inline bool doit(const From *Val) {
  106|  11.7k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  11.7k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEvE4doitERKS4_:
   58|  11.7k|  static inline bool doit(const From &Val) {
   59|  11.7k|    return To::classof(&Val);
   60|  11.7k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   535k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   535k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.67k, False: 532k]
  ------------------
  335|   535k|}
_ZN4llvh4castIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  5.34k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.34k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  5.34k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.34k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  5.34k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.34k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.34k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.34k|    return Res2;
  222|  5.34k|  }
_ZN4llvh3isaIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   546k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   546k|  return isa_impl_wrap<X, const Y,
  144|   546k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   546k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   546k|  static bool doit(const From &Val) {
  123|   546k|    return isa_impl_wrap<To, SimpleFrom,
  124|   546k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   546k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   546k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   546k|  static bool doit(const FromTy &Val) {
  133|   546k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   546k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   546k|  static inline bool doit(const From *Val) {
  106|   546k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   546k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23FunctionDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   546k|  static inline bool doit(const From &Val) {
   59|   546k|    return To::classof(&Val);
   60|   546k|  }
_ZN4llvh4castIN6hermes6ESTree9EmptyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     24|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     24|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     24|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     24|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree9EmptyNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     24|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     24|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     24|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     24|    return Res2;
  222|     24|  }
_ZN4llvh4castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   228k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   228k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   228k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   228k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   228k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   228k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   228k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   228k|    return Res2;
  222|   228k|  }
_ZN4llvh4castIN6hermes6ESTree18WhileStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes6ESTree18WhileStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18WhileStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18WhileStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18WhileStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18WhileStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18WhileStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }
_ZN4llvh3isaIN6hermes6ESTree20DoWhileStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20DoWhileStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20DoWhileStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20DoWhileStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20DoWhileStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh3isaIN6hermes6ESTree18ForInStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   529k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   529k|  return isa_impl_wrap<X, const Y,
  144|   529k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   529k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForInStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   529k|  static bool doit(const From &Val) {
  123|   529k|    return isa_impl_wrap<To, SimpleFrom,
  124|   529k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   529k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   529k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForInStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   529k|  static bool doit(const FromTy &Val) {
  133|   529k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   529k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ForInStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   529k|  static inline bool doit(const From *Val) {
  106|   529k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   529k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ForInStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   529k|  static inline bool doit(const From &Val) {
   59|   529k|    return To::classof(&Val);
   60|   529k|  }
_ZN4llvh3isaIN6hermes6ESTree18ForOfStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   529k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   529k|  return isa_impl_wrap<X, const Y,
  144|   529k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   529k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForOfStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   529k|  static bool doit(const From &Val) {
  123|   529k|    return isa_impl_wrap<To, SimpleFrom,
  124|   529k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   529k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   529k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ForOfStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   529k|  static bool doit(const FromTy &Val) {
  133|   529k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   529k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ForOfStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   529k|  static inline bool doit(const From *Val) {
  106|   529k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   529k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ForOfStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   529k|  static inline bool doit(const From &Val) {
   59|   529k|    return To::classof(&Val);
   60|   529k|  }
_ZN4llvh3isaIN6hermes6ESTree16ForStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ForStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ForStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ForStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ForStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh4castIN6hermes6ESTree18EmptyStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   263k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   263k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   263k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   263k|}
_ZN4llvh3isaIN6hermes6ESTree18EmptyStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   394k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   394k|  return isa_impl_wrap<X, const Y,
  144|   394k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   394k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18EmptyStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   394k|  static bool doit(const From &Val) {
  123|   394k|    return isa_impl_wrap<To, SimpleFrom,
  124|   394k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   394k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   394k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18EmptyStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   394k|  static bool doit(const FromTy &Val) {
  133|   394k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   394k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18EmptyStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   394k|  static inline bool doit(const From *Val) {
  106|   394k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   394k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18EmptyStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   394k|  static inline bool doit(const From &Val) {
   59|   394k|    return To::classof(&Val);
   60|   394k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18EmptyStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   263k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   263k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   263k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   263k|    return Res2;
  222|   263k|  }
_ZN4llvh4castIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   461k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   461k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   461k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   461k|}
_ZN4llvh3isaIN6hermes6ESTree18BlockStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   862k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   862k|  return isa_impl_wrap<X, const Y,
  144|   862k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   862k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   862k|  static bool doit(const From &Val) {
  123|   862k|    return isa_impl_wrap<To, SimpleFrom,
  124|   862k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   862k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   862k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   862k|  static bool doit(const FromTy &Val) {
  133|   862k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   862k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BlockStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   862k|  static inline bool doit(const From *Val) {
  106|   862k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   862k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   862k|  static inline bool doit(const From &Val) {
   59|   862k|    return To::classof(&Val);
   60|   862k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18BlockStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   461k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   461k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   461k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   461k|    return Res2;
  222|   461k|  }
_ZN4llvh3isaIN6hermes6ESTree18BreakStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BreakStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BreakStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BreakStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BreakStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh4castIN6hermes6ESTree21ContinueStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      3|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      3|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      3|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      3|}
_ZN4llvh3isaIN6hermes6ESTree21ContinueStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ContinueStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ContinueStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21ContinueStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21ContinueStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree21ContinueStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|      3|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      3|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      3|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      3|    return Res2;
  222|      3|  }
_ZN4llvh3isaIN6hermes6ESTree18ThrowStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThrowStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThrowStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ThrowStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ThrowStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh4castIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   228k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   228k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   228k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   228k|}
_ZN4llvh3isaIN6hermes6ESTree19ReturnStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   758k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   758k|  return isa_impl_wrap<X, const Y,
  144|   758k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   758k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ReturnStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   758k|  static bool doit(const From &Val) {
  123|   758k|    return isa_impl_wrap<To, SimpleFrom,
  124|   758k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   758k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   758k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ReturnStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   758k|  static bool doit(const FromTy &Val) {
  133|   758k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   758k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19ReturnStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   758k|  static inline bool doit(const From *Val) {
  106|   758k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   758k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   758k|  static inline bool doit(const From &Val) {
   59|   758k|    return To::classof(&Val);
   60|   758k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19ReturnStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   228k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   228k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   228k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   228k|    return Res2;
  222|   228k|  }
_ZN4llvh3isaIN6hermes6ESTree19SwitchStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   285k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   285k|  return isa_impl_wrap<X, const Y,
  144|   285k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   285k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19SwitchStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   285k|  static bool doit(const From &Val) {
  123|   285k|    return isa_impl_wrap<To, SimpleFrom,
  124|   285k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   285k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   285k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19SwitchStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   285k|  static bool doit(const FromTy &Val) {
  133|   285k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   285k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19SwitchStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   285k|  static inline bool doit(const From *Val) {
  106|   285k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   285k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19SwitchStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   285k|  static inline bool doit(const From &Val) {
   59|   285k|    return To::classof(&Val);
   60|   285k|  }
_ZN4llvh4castIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  82.6k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  82.6k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  82.6k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  82.6k|}
_ZN4llvh3isaIN6hermes6ESTree20LabeledStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   296k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   296k|  return isa_impl_wrap<X, const Y,
  144|   296k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   296k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20LabeledStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   296k|  static bool doit(const From &Val) {
  123|   296k|    return isa_impl_wrap<To, SimpleFrom,
  124|   296k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   296k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   296k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20LabeledStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   296k|  static bool doit(const FromTy &Val) {
  133|   296k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   296k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20LabeledStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   296k|  static inline bool doit(const From *Val) {
  106|   296k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   296k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   296k|  static inline bool doit(const From &Val) {
   59|   296k|    return To::classof(&Val);
   60|   296k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20LabeledStatementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  82.6k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  82.6k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  82.6k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  82.6k|    return Res2;
  222|  82.6k|  }
_ZN4llvh3isaIN6hermes6ESTree16TryStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16TryStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16TryStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16TryStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16TryStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh3isaIN6hermes6ESTree15IfStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|   529k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   529k|  return isa_impl_wrap<X, const Y,
  144|   529k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   529k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15IfStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   529k|  static bool doit(const From &Val) {
  123|   529k|    return isa_impl_wrap<To, SimpleFrom,
  124|   529k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   529k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   529k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15IfStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   529k|  static bool doit(const FromTy &Val) {
  133|   529k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   529k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15IfStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|   529k|  static inline bool doit(const From *Val) {
  106|   529k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   529k|  }
_ZN4llvh8isa_implIN6hermes6ESTree15IfStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|   529k|  static inline bool doit(const From &Val) {
   59|   529k|    return To::classof(&Val);
   60|   529k|  }
_ZN4llvh3isaIN6hermes6ESTree15NullLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|   977k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   977k|  return isa_impl_wrap<X, const Y,
  144|   977k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   977k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15NullLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   977k|  static bool doit(const From &Val) {
  123|   977k|    return isa_impl_wrap<To, SimpleFrom,
  124|   977k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   977k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   977k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15NullLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   977k|  static bool doit(const FromTy &Val) {
  133|   977k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   977k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15NullLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|   977k|  static inline bool doit(const From *Val) {
  106|   977k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   977k|  }
_ZN4llvh8isa_implIN6hermes6ESTree15NullLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|   977k|  static inline bool doit(const From &Val) {
   59|   977k|    return To::classof(&Val);
   60|   977k|  }
_ZN4llvh4castIN6hermes6ESTree18BooleanLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  6.04k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  6.04k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  6.04k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  6.04k|}
_ZN4llvh3isaIN6hermes6ESTree18BooleanLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|   971k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   971k|  return isa_impl_wrap<X, const Y,
  144|   971k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   971k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BooleanLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   971k|  static bool doit(const From &Val) {
  123|   971k|    return isa_impl_wrap<To, SimpleFrom,
  124|   971k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   971k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   971k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BooleanLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   971k|  static bool doit(const FromTy &Val) {
  133|   971k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   971k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BooleanLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|   971k|  static inline bool doit(const From *Val) {
  106|   971k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   971k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BooleanLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|   971k|  static inline bool doit(const From &Val) {
   59|   971k|    return To::classof(&Val);
   60|   971k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18BooleanLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  6.04k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  6.04k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  6.04k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  6.04k|    return Res2;
  222|  6.04k|  }
_ZN4llvh4castIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  23.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  23.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  23.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  23.9k|}
_ZN4llvh3isaIN6hermes6ESTree17StringLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.01M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.01M|  return isa_impl_wrap<X, const Y,
  144|  1.01M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.01M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17StringLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.01M|  static bool doit(const From &Val) {
  123|  1.01M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.01M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.01M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.01M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17StringLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.01M|  static bool doit(const FromTy &Val) {
  133|  1.01M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.01M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17StringLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.01M|  static inline bool doit(const From *Val) {
  106|  1.01M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.01M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.01M|  static inline bool doit(const From &Val) {
   59|  1.01M|    return To::classof(&Val);
   60|  1.01M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17StringLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  23.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  23.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  23.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  23.9k|    return Res2;
  222|  23.9k|  }
_ZN4llvh4castIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  2.21M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.21M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.21M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.21M|}
_ZN4llvh3isaIN6hermes6ESTree18NumericLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  3.17M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.17M|  return isa_impl_wrap<X, const Y,
  144|  3.17M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.17M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18NumericLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  3.17M|  static bool doit(const From &Val) {
  123|  3.17M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.17M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.17M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.17M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18NumericLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  3.17M|  static bool doit(const FromTy &Val) {
  133|  3.17M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.17M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18NumericLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  3.17M|  static inline bool doit(const From *Val) {
  106|  3.17M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.17M|  }
_ZN4llvh8isa_implIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  3.17M|  static inline bool doit(const From &Val) {
   59|  3.17M|    return To::classof(&Val);
   60|  3.17M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18NumericLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  2.21M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.21M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.21M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.21M|    return Res2;
  222|  2.21M|  }
_ZN4llvh4castIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  22.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  22.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  22.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  22.9k|}
_ZN4llvh3isaIN6hermes6ESTree17RegExpLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.00M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.00M|  return isa_impl_wrap<X, const Y,
  144|  1.00M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.00M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17RegExpLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.00M|  static bool doit(const From &Val) {
  123|  1.00M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.00M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.00M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.00M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17RegExpLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.00M|  static bool doit(const FromTy &Val) {
  133|  1.00M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.00M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17RegExpLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.00M|  static inline bool doit(const From *Val) {
  106|  1.00M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.00M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.00M|  static inline bool doit(const From &Val) {
   59|  1.00M|    return To::classof(&Val);
   60|  1.00M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17RegExpLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  22.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  22.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  22.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  22.9k|    return Res2;
  222|  22.9k|  }
_ZN4llvh4castIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     22|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     22|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     22|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     22|}
_ZN4llvh3isaIN6hermes6ESTree17BigIntLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|   225k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   225k|  return isa_impl_wrap<X, const Y,
  144|   225k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   225k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17BigIntLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   225k|  static bool doit(const From &Val) {
  123|   225k|    return isa_impl_wrap<To, SimpleFrom,
  124|   225k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   225k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   225k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17BigIntLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   225k|  static bool doit(const FromTy &Val) {
  133|   225k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   225k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17BigIntLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|   225k|  static inline bool doit(const From *Val) {
  106|   225k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   225k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|   225k|  static inline bool doit(const From &Val) {
   59|   225k|    return To::classof(&Val);
   60|   225k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree17BigIntLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     22|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     22|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     22|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     22|    return Res2;
  222|     22|  }
_ZN4llvh3isaIN6hermes6ESTree18ThisExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   155k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   155k|  return isa_impl_wrap<X, const Y,
  144|   155k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   155k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThisExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   155k|  static bool doit(const From &Val) {
  123|   155k|    return isa_impl_wrap<To, SimpleFrom,
  124|   155k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   155k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   155k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18ThisExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   155k|  static bool doit(const FromTy &Val) {
  133|   155k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   155k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18ThisExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   155k|  static inline bool doit(const From *Val) {
  106|   155k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   155k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18ThisExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   155k|  static inline bool doit(const From &Val) {
   59|   155k|    return To::classof(&Val);
   60|   155k|  }
_ZN4llvh3isaIN6hermes6ESTree9SuperNodeEPNS2_4NodeEEEbRKT0_:
  142|    643|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    643|  return isa_impl_wrap<X, const Y,
  144|    643|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    643|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9SuperNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|    643|  static bool doit(const From &Val) {
  123|    643|    return isa_impl_wrap<To, SimpleFrom,
  124|    643|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    643|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    643|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9SuperNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|    643|  static bool doit(const FromTy &Val) {
  133|    643|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    643|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree9SuperNodeEPKNS2_4NodeEE4doitES6_:
  105|    643|  static inline bool doit(const From *Val) {
  106|    643|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    643|  }
_ZN4llvh8isa_implIN6hermes6ESTree9SuperNodeENS2_4NodeEvE4doitERKS4_:
   58|    643|  static inline bool doit(const From &Val) {
   59|    643|    return To::classof(&Val);
   60|    643|  }
_ZN4llvh4castIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    403|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    403|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    403|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    403|}
_ZN4llvh3isaIN6hermes6ESTree22SequenceExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  41.7k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  41.7k|  return isa_impl_wrap<X, const Y,
  144|  41.7k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  41.7k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22SequenceExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  41.7k|  static bool doit(const From &Val) {
  123|  41.7k|    return isa_impl_wrap<To, SimpleFrom,
  124|  41.7k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  41.7k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  41.7k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree22SequenceExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  41.7k|  static bool doit(const FromTy &Val) {
  133|  41.7k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  41.7k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree22SequenceExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  41.7k|  static inline bool doit(const From *Val) {
  106|  41.7k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  41.7k|  }
_ZN4llvh8isa_implIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  41.7k|  static inline bool doit(const From &Val) {
   59|  41.7k|    return To::classof(&Val);
   60|  41.7k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree22SequenceExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    403|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    403|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    403|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    403|    return Res2;
  222|    403|  }
_ZN4llvh4castIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  15.2k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  15.2k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  15.2k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  15.2k|}
_ZN4llvh3isaIN6hermes6ESTree20ObjectExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   212k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   212k|  return isa_impl_wrap<X, const Y,
  144|   212k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   212k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20ObjectExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   212k|  static bool doit(const From &Val) {
  123|   212k|    return isa_impl_wrap<To, SimpleFrom,
  124|   212k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   212k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   212k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20ObjectExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   212k|  static bool doit(const FromTy &Val) {
  133|   212k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   212k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20ObjectExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   212k|  static inline bool doit(const From *Val) {
  106|   212k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   212k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   212k|  static inline bool doit(const From &Val) {
   59|   212k|    return To::classof(&Val);
   60|   212k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20ObjectExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  15.2k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  15.2k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  15.2k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  15.2k|    return Res2;
  222|  15.2k|  }
_ZN4llvh4castIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   100k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   100k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   100k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   100k|}
_ZN4llvh3isaIN6hermes6ESTree19ArrayExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   331k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   331k|  return isa_impl_wrap<X, const Y,
  144|   331k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   331k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ArrayExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   331k|  static bool doit(const From &Val) {
  123|   331k|    return isa_impl_wrap<To, SimpleFrom,
  124|   331k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   331k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   331k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19ArrayExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   331k|  static bool doit(const FromTy &Val) {
  133|   331k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   331k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19ArrayExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   331k|  static inline bool doit(const From *Val) {
  106|   331k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   331k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   331k|  static inline bool doit(const From &Val) {
   59|   331k|    return To::classof(&Val);
   60|   331k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19ArrayExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   100k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   100k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   100k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   100k|    return Res2;
  222|   100k|  }
_ZN4llvh3isaIN6hermes6ESTree17SpreadElementNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.41M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.41M|  return isa_impl_wrap<X, const Y,
  144|  1.41M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.41M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17SpreadElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.41M|  static bool doit(const From &Val) {
  123|  1.41M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.41M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.41M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.41M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17SpreadElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.41M|  static bool doit(const FromTy &Val) {
  133|  1.41M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.41M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17SpreadElementNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.41M|  static inline bool doit(const From *Val) {
  106|  1.41M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.41M|  }
_ZN4llvh8isa_implIN6hermes6ESTree17SpreadElementNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.41M|  static inline bool doit(const From &Val) {
   59|  1.41M|    return To::classof(&Val);
   60|  1.41M|  }
_ZN4llvh3isaIN6hermes6ESTree17NewExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   221k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   221k|  return isa_impl_wrap<X, const Y,
  144|   221k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   221k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17NewExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   221k|  static bool doit(const From &Val) {
  123|   221k|    return isa_impl_wrap<To, SimpleFrom,
  124|   221k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   221k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   221k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17NewExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   221k|  static bool doit(const FromTy &Val) {
  133|   221k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   221k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17NewExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   221k|  static inline bool doit(const From *Val) {
  106|   221k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   221k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17NewExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   221k|  static inline bool doit(const From &Val) {
   59|   221k|    return To::classof(&Val);
   60|   221k|  }
_ZN4llvh4castIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     24|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     24|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     24|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     24|}
_ZN4llvh3isaIN6hermes6ESTree18CallExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   353k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   353k|  return isa_impl_wrap<X, const Y,
  144|   353k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   353k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   353k|  static bool doit(const From &Val) {
  123|   353k|    return isa_impl_wrap<To, SimpleFrom,
  124|   353k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   353k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   353k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   353k|  static bool doit(const FromTy &Val) {
  133|   353k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   353k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CallExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   353k|  static inline bool doit(const From *Val) {
  106|   353k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   353k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   353k|  static inline bool doit(const From &Val) {
   59|   353k|    return To::classof(&Val);
   60|   353k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree18CallExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     24|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     24|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     24|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     24|    return Res2;
  222|     24|  }
_ZN4llvh3isaIN6hermes6ESTree26OptionalCallExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  4.17M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.17M|  return isa_impl_wrap<X, const Y,
  144|  4.17M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.17M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  4.17M|  static bool doit(const From &Val) {
  123|  4.17M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.17M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.17M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.17M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  4.17M|  static bool doit(const FromTy &Val) {
  133|  4.17M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.17M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree26OptionalCallExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  4.17M|  static inline bool doit(const From *Val) {
  106|  4.17M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.17M|  }
_ZN4llvh8isa_implIN6hermes6ESTree26OptionalCallExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  4.17M|  static inline bool doit(const From &Val) {
   59|  4.17M|    return To::classof(&Val);
   60|  4.17M|  }
_ZN4llvh4castIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  8.05k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.05k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  8.05k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.05k|}
_ZN4llvh3isaIN6hermes6ESTree24AssignmentExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   241k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   241k|  return isa_impl_wrap<X, const Y,
  144|   241k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   241k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree24AssignmentExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   241k|  static bool doit(const From &Val) {
  123|   241k|    return isa_impl_wrap<To, SimpleFrom,
  124|   241k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   241k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   241k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree24AssignmentExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   241k|  static bool doit(const FromTy &Val) {
  133|   241k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   241k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree24AssignmentExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   241k|  static inline bool doit(const From *Val) {
  106|   241k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   241k|  }
_ZN4llvh8isa_implIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   241k|  static inline bool doit(const From &Val) {
   59|   241k|    return To::classof(&Val);
   60|   241k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree24AssignmentExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  8.05k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.05k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.05k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.05k|    return Res2;
  222|  8.05k|  }
_ZN4llvh4castIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  8.09k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.09k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  8.09k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.09k|}
_ZN4llvh3isaIN6hermes6ESTree19UnaryExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   167k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   167k|  return isa_impl_wrap<X, const Y,
  144|   167k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   167k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19UnaryExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   167k|  static bool doit(const From &Val) {
  123|   167k|    return isa_impl_wrap<To, SimpleFrom,
  124|   167k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   167k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   167k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19UnaryExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   167k|  static bool doit(const FromTy &Val) {
  133|   167k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   167k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19UnaryExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   167k|  static inline bool doit(const From *Val) {
  106|   167k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   167k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   167k|  static inline bool doit(const From &Val) {
   59|   167k|    return To::classof(&Val);
   60|   167k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19UnaryExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  8.09k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.09k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.09k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.09k|    return Res2;
  222|  8.09k|  }
_ZN4llvh4castIN6hermes6ESTree20UpdateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     30|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     30|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     30|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     30|}
_ZN4llvh3isaIN6hermes6ESTree20UpdateExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  41.3k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  41.3k|  return isa_impl_wrap<X, const Y,
  144|  41.3k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  41.3k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20UpdateExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  41.3k|  static bool doit(const From &Val) {
  123|  41.3k|    return isa_impl_wrap<To, SimpleFrom,
  124|  41.3k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  41.3k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  41.3k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20UpdateExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  41.3k|  static bool doit(const FromTy &Val) {
  133|  41.3k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  41.3k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20UpdateExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  41.3k|  static inline bool doit(const From *Val) {
  106|  41.3k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  41.3k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20UpdateExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  41.3k|  static inline bool doit(const From &Val) {
   59|  41.3k|    return To::classof(&Val);
   60|  41.3k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20UpdateExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     30|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     30|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     30|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     30|    return Res2;
  222|     30|  }
_ZN4llvh4castIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.31k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.31k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.31k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.31k|}
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   343k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   343k|  return isa_impl_wrap<X, const Y,
  144|   343k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   343k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   343k|  static bool doit(const From &Val) {
  123|   343k|    return isa_impl_wrap<To, SimpleFrom,
  124|   343k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   343k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   343k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   347k|  static bool doit(const FromTy &Val) {
  133|   347k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   347k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   347k|  static inline bool doit(const From *Val) {
  106|   347k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   347k|  }
_ZN4llvh8isa_implIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   347k|  static inline bool doit(const From &Val) {
   59|   347k|    return To::classof(&Val);
   60|   347k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20MemberExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  3.31k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.31k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.31k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.31k|    return Res2;
  222|  3.31k|  }
_ZN4llvh4castIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  3.51k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.51k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.51k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.51k|}
_ZN4llvh3isaIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  4.17M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.17M|  return isa_impl_wrap<X, const Y,
  144|  4.17M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.17M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  4.17M|  static bool doit(const From &Val) {
  123|  4.17M|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.17M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.17M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.17M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  4.17M|  static bool doit(const FromTy &Val) {
  133|  4.17M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.17M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree28OptionalMemberExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  4.17M|  static inline bool doit(const From *Val) {
  106|  4.17M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.17M|  }
_ZN4llvh8isa_implIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  4.17M|  static inline bool doit(const From &Val) {
   59|  4.17M|    return To::classof(&Val);
   60|  4.17M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree28OptionalMemberExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  3.51k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.51k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.51k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.51k|    return Res2;
  222|  3.51k|  }
_ZN4llvh4castIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  8.61k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  8.61k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  8.61k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  8.61k|}
_ZN4llvh3isaIN6hermes6ESTree21LogicalExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|   191k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   191k|  return isa_impl_wrap<X, const Y,
  144|   191k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   191k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21LogicalExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   191k|  static bool doit(const From &Val) {
  123|   191k|    return isa_impl_wrap<To, SimpleFrom,
  124|   191k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   191k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   191k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21LogicalExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   191k|  static bool doit(const FromTy &Val) {
  133|   191k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   191k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21LogicalExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|   191k|  static inline bool doit(const From *Val) {
  106|   191k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   191k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|   191k|  static inline bool doit(const From &Val) {
   59|   191k|    return To::classof(&Val);
   60|   191k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree21LogicalExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  8.61k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  8.61k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  8.61k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  8.61k|    return Res2;
  222|  8.61k|  }
_ZN4llvh4castIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    214|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    214|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    214|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    214|}
_ZN4llvh3isaIN6hermes6ESTree25ConditionalExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  41.5k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  41.5k|  return isa_impl_wrap<X, const Y,
  144|  41.5k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  41.5k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree25ConditionalExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  41.5k|  static bool doit(const From &Val) {
  123|  41.5k|    return isa_impl_wrap<To, SimpleFrom,
  124|  41.5k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  41.5k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  41.5k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree25ConditionalExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  41.5k|  static bool doit(const FromTy &Val) {
  133|  41.5k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  41.5k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree25ConditionalExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  41.5k|  static inline bool doit(const From *Val) {
  106|  41.5k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  41.5k|  }
_ZN4llvh8isa_implIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  41.5k|  static inline bool doit(const From &Val) {
   59|  41.5k|    return To::classof(&Val);
   60|  41.5k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree25ConditionalExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    214|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    214|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    214|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    214|    return Res2;
  222|    214|  }
_ZN4llvh4castIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   435k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   435k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   435k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   435k|}
_ZN4llvh3isaIN6hermes6ESTree20BinaryExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.00M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.00M|  return isa_impl_wrap<X, const Y,
  144|  1.00M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.00M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20BinaryExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.00M|  static bool doit(const From &Val) {
  123|  1.00M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.00M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.00M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.00M|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20BinaryExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.00M|  static bool doit(const FromTy &Val) {
  133|  1.00M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.00M|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20BinaryExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.00M|  static inline bool doit(const From *Val) {
  106|  1.00M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.00M|  }
_ZN4llvh8isa_implIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.00M|  static inline bool doit(const From &Val) {
   59|  1.00M|    return To::classof(&Val);
   60|  1.00M|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20BinaryExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   435k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   435k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   435k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   435k|    return Res2;
  222|   435k|  }
_ZN4llvh3isaIN6hermes6ESTree16MetaPropertyNodeEPNS2_4NodeEEEbRKT0_:
  142|   155k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   155k|  return isa_impl_wrap<X, const Y,
  144|   155k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   155k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16MetaPropertyNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   155k|  static bool doit(const From &Val) {
  123|   155k|    return isa_impl_wrap<To, SimpleFrom,
  124|   155k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   155k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   155k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16MetaPropertyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   155k|  static bool doit(const FromTy &Val) {
  133|   155k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   155k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16MetaPropertyNodeEPKNS2_4NodeEE4doitES6_:
  105|   155k|  static inline bool doit(const From *Val) {
  106|   155k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   155k|  }
_ZN4llvh8isa_implIN6hermes6ESTree16MetaPropertyNodeENS2_4NodeEvE4doitERKS4_:
   58|   155k|  static inline bool doit(const From &Val) {
   59|   155k|    return To::classof(&Val);
   60|   155k|  }
_ZN4llvh4castIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.37k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.37k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.37k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.37k|}
_ZN4llvh3isaIN6hermes6ESTree23VariableDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   287k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   287k|  return isa_impl_wrap<X, const Y,
  144|   287k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   287k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23VariableDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   287k|  static bool doit(const From &Val) {
  123|   287k|    return isa_impl_wrap<To, SimpleFrom,
  124|   287k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   287k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   287k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23VariableDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   287k|  static bool doit(const FromTy &Val) {
  133|   287k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   287k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23VariableDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   287k|  static inline bool doit(const From *Val) {
  106|   287k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   287k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   287k|  static inline bool doit(const From &Val) {
   59|   287k|    return To::classof(&Val);
   60|   287k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree23VariableDeclarationNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  1.37k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.37k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.37k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.37k|    return Res2;
  222|  1.37k|  }
_ZN4llvh4castIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   171k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   171k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   171k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   171k|}
_ZN4llvh3isaIN6hermes6ESTree19TemplateLiteralNodeEPNS2_4NodeEEEbRKT0_:
  142|   212k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   212k|  return isa_impl_wrap<X, const Y,
  144|   212k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   212k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateLiteralNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   212k|  static bool doit(const From &Val) {
  123|   212k|    return isa_impl_wrap<To, SimpleFrom,
  124|   212k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   212k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   212k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateLiteralNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   212k|  static bool doit(const FromTy &Val) {
  133|   212k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   212k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19TemplateLiteralNodeEPKNS2_4NodeEE4doitES6_:
  105|   212k|  static inline bool doit(const From *Val) {
  106|   212k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   212k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEvE4doitERKS4_:
   58|   212k|  static inline bool doit(const From &Val) {
   59|   212k|    return To::classof(&Val);
   60|   212k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19TemplateLiteralNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   171k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   171k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   171k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   171k|    return Res2;
  222|   171k|  }
_ZN4llvh4castIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    853|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    853|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    853|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    853|}
_ZN4llvh3isaIN6hermes6ESTree28TaggedTemplateExpressionNodeEPNS2_4NodeEEEbRKT0_:
  142|  1.13k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.13k|  return isa_impl_wrap<X, const Y,
  144|  1.13k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.13k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28TaggedTemplateExpressionNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  1.13k|  static bool doit(const From &Val) {
  123|  1.13k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.13k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.13k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.13k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree28TaggedTemplateExpressionNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  1.13k|  static bool doit(const FromTy &Val) {
  133|  1.13k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.13k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree28TaggedTemplateExpressionNodeEPKNS2_4NodeEE4doitES6_:
  105|  1.13k|  static inline bool doit(const From *Val) {
  106|  1.13k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.13k|  }
_ZN4llvh8isa_implIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEvE4doitERKS4_:
   58|  1.13k|  static inline bool doit(const From &Val) {
   59|  1.13k|    return To::classof(&Val);
   60|  1.13k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree28TaggedTemplateExpressionNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|    853|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    853|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    853|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    853|    return Res2;
  222|    853|  }
_ZN4llvh4castIN6hermes6ESTree19TemplateElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   439k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   439k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   439k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   439k|}
_ZN4llvh3isaIN6hermes6ESTree19TemplateElementNodeEPNS2_4NodeEEEbRKT0_:
  142|   439k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   439k|  return isa_impl_wrap<X, const Y,
  144|   439k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   439k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   439k|  static bool doit(const From &Val) {
  123|   439k|    return isa_impl_wrap<To, SimpleFrom,
  124|   439k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   439k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   439k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree19TemplateElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   439k|  static bool doit(const FromTy &Val) {
  133|   439k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   439k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree19TemplateElementNodeEPKNS2_4NodeEE4doitES6_:
  105|   439k|  static inline bool doit(const From *Val) {
  106|   439k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   439k|  }
_ZN4llvh8isa_implIN6hermes6ESTree19TemplateElementNodeENS2_4NodeEvE4doitERKS4_:
   58|   439k|  static inline bool doit(const From &Val) {
   59|   439k|    return To::classof(&Val);
   60|   439k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree19TemplateElementNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|   439k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   439k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   439k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   439k|    return Res2;
  222|   439k|  }
_ZN4llvh3isaIN6hermes6ESTree21ImportDeclarationNodeEPNS2_4NodeEEEbRKT0_:
  142|   529k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   529k|  return isa_impl_wrap<X, const Y,
  144|   529k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   529k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ImportDeclarationNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   529k|  static bool doit(const From &Val) {
  123|   529k|    return isa_impl_wrap<To, SimpleFrom,
  124|   529k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   529k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   529k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21ImportDeclarationNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   529k|  static bool doit(const FromTy &Val) {
  133|   529k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   529k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21ImportDeclarationNodeEPKNS2_4NodeEE4doitES6_:
  105|   529k|  static inline bool doit(const From *Val) {
  106|   529k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   529k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21ImportDeclarationNodeENS2_4NodeEvE4doitERKS4_:
   58|   529k|  static inline bool doit(const From &Val) {
   59|   529k|    return To::classof(&Val);
   60|   529k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17ObjectPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|      1|  static bool doit(const FromTy &Val) {
  133|      1|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      1|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17ObjectPatternNodeEPKNS2_4NodeEE4doitES6_:
  105|      1|  static inline bool doit(const From *Val) {
  106|      1|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      1|  }
_ZN4llvh8isa_implIN6hermes6ESTree17ObjectPatternNodeENS2_4NodeEvE4doitERKS4_:
   58|      1|  static inline bool doit(const From &Val) {
   59|      1|    return To::classof(&Val);
   60|      1|  }
_ZN4llvh4castIN6hermes6ESTree16ArrayPatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     96|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     96|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     96|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     96|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPNS2_4NodeEEEbRKT0_:
  142|     96|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     96|  return isa_impl_wrap<X, const Y,
  144|     96|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     96|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|     96|  static bool doit(const From &Val) {
  123|     96|    return isa_impl_wrap<To, SimpleFrom,
  124|     96|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     96|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     96|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|    289|  static bool doit(const FromTy &Val) {
  133|    289|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    289|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeEE4doitES6_:
  105|    289|  static inline bool doit(const From *Val) {
  106|    289|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    289|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ArrayPatternNodeENS2_4NodeEvE4doitERKS4_:
   58|    289|  static inline bool doit(const From &Val) {
   59|    289|    return To::classof(&Val);
   60|    289|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     96|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     96|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     96|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     96|    return Res2;
  222|     96|  }
_ZN4llvh3isaIN6hermes6ESTree15RestElementNodeEPNS2_4NodeEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15RestElementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15RestElementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree15RestElementNodeEPKNS2_4NodeEE4doitES6_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes6ESTree15RestElementNodeENS2_4NodeEvE4doitERKS4_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeEPNS2_4NodeEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeEE4doitES6_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEvE4doitERKS4_:
   58|   229k|  static inline bool doit(const From &Val) {
   59|   229k|    return To::classof(&Val);
   60|   229k|  }
_ZN4llvh3isaIN6hermes6ESTree18CoverEmptyArgsNodeEPNS2_4NodeEEEbRKT0_:
  142|   228k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   228k|  return isa_impl_wrap<X, const Y,
  144|   228k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   228k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CoverEmptyArgsNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   228k|  static bool doit(const From &Val) {
  123|   228k|    return isa_impl_wrap<To, SimpleFrom,
  124|   228k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   228k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   228k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CoverEmptyArgsNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   228k|  static bool doit(const FromTy &Val) {
  133|   228k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   228k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CoverEmptyArgsNodeEPKNS2_4NodeEE4doitES6_:
  105|   228k|  static inline bool doit(const From *Val) {
  106|   228k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   228k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CoverEmptyArgsNodeENS2_4NodeEvE4doitERKS4_:
   58|   228k|  static inline bool doit(const From &Val) {
   59|   228k|    return To::classof(&Val);
   60|   228k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree18NumericLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   963k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   963k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 738k, False: 225k]
  ------------------
  335|   963k|}
_ZN4llvh4castIN6hermes6ESTree14IdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.06M|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.06M|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.06M|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.06M|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree14IdentifierNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  1.06M|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.06M|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.06M|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.06M|    return Res2;
  222|  1.06M|  }
_ZN4llvh8dyn_castIN6hermes6ESTree14IdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.35M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.35M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 376k, False: 977k]
  ------------------
  335|  1.35M|}
_ZN4llvh3isaIN6hermes6ESTree9EmptyNodeEPNS2_4NodeEEEbRKT0_:
  142|   844k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   844k|  return isa_impl_wrap<X, const Y,
  144|   844k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   844k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|   844k|  static bool doit(const From &Val) {
  123|   844k|    return isa_impl_wrap<To, SimpleFrom,
  124|   844k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   844k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   844k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|   848k|  static bool doit(const FromTy &Val) {
  133|   848k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   848k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeEE4doitES6_:
  105|   848k|  static inline bool doit(const From *Val) {
  106|   848k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   848k|  }
_ZN4llvh8isa_implIN6hermes6ESTree9EmptyNodeENS2_4NodeEvE4doitERKS4_:
   58|   848k|  static inline bool doit(const From &Val) {
   59|   848k|    return To::classof(&Val);
   60|   848k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree20MemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   340k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   340k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 24, False: 340k]
  ------------------
  335|   340k|}
_ZN4llvh8dyn_castIN6hermes6ESTree23VariableDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   285k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   285k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 7, False: 285k]
  ------------------
  335|   285k|}
_ZN4llvh4castIN6hermes6ESTree22VariableDeclaratorNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  5.76k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.76k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  5.76k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.76k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree22VariableDeclaratorNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  5.76k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.76k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.76k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.76k|    return Res2;
  222|  5.76k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree11PatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     12|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     12|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 12, False: 0]
  ------------------
  335|     12|}
_ZN4llvh3isaIN6hermes6ESTree11PatternNodeEPNS2_4NodeEEEbRKT0_:
  142|  3.08k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.08k|  return isa_impl_wrap<X, const Y,
  144|  3.08k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.08k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  3.08k|  static bool doit(const From &Val) {
  123|  3.08k|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.08k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.08k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.08k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  3.08k|  static bool doit(const FromTy &Val) {
  133|  3.08k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.08k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11PatternNodeEPKNS2_4NodeEE4doitES6_:
  105|  3.08k|  static inline bool doit(const From *Val) {
  106|  3.08k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.08k|  }
_ZN4llvh8isa_implIN6hermes6ESTree11PatternNodeENS2_4NodeEvE4doitERKS4_:
   58|   117k|  static inline bool doit(const From &Val) {
   59|   117k|    return To::classof(&Val);
   60|   117k|  }
_ZN4llvh4castIN6hermes6ESTree11PatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree11PatternNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh8dyn_castIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|     12|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     12|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 12, False: 0]
  ------------------
  335|     12|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPNS2_11PatternNodeEEEbRKT0_:
  142|     24|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     24|  return isa_impl_wrap<X, const Y,
  144|     24|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     24|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPNS2_11PatternNodeEPKS4_E4doitERS6_:
  122|     24|  static bool doit(const From &Val) {
  123|     24|    return isa_impl_wrap<To, SimpleFrom,
  124|     24|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     24|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     24|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEPKNS2_11PatternNodeES6_E4doitERKS6_:
  132|     24|  static bool doit(const FromTy &Val) {
  133|     24|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     24|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree16ArrayPatternNodeEPKNS2_11PatternNodeEE4doitES6_:
  105|     24|  static inline bool doit(const From *Val) {
  106|     24|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     24|  }
_ZN4llvh8isa_implIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEvE4doitERKS4_:
   58|     24|  static inline bool doit(const From &Val) {
   59|     24|    return To::classof(&Val);
   60|     24|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree11PatternNodeEE18getSimplifiedValueERS5_:
   48|     24|  static RetType getSimplifiedValue(const From& Val) {
   49|     24|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|     24|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree11PatternNodeEE18getSimplifiedValueERS4_:
   38|     24|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree16ArrayPatternNodeENS2_11PatternNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPNS2_11PatternNodeES5_E4doitERKS5_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh8dyn_castIN6hermes6ESTree15RestElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   114k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   114k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 114k]
  ------------------
  335|   114k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   114k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   114k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 114k]
  ------------------
  335|   114k|}
_ZN4llvh3isaIN6hermes6ESTree14IdentifierNodeEPNS2_4NodeEEEbRKT0_:
  142|  3.18M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.18M|  return isa_impl_wrap<X, const Y,
  144|  3.18M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.18M|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree14IdentifierNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  3.18M|  static bool doit(const From &Val) {
  123|  3.18M|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.18M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.18M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.18M|  }
_ZN4llvh4castIN6hermes6ESTree12PropertyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  23.9k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  23.9k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  23.9k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  23.9k|}
_ZN4llvh3isaIN6hermes6ESTree12PropertyNodeEPNS2_4NodeEEEbRKT0_:
  142|  23.9k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  23.9k|  return isa_impl_wrap<X, const Y,
  144|  23.9k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  23.9k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree12PropertyNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  23.9k|  static bool doit(const From &Val) {
  123|  23.9k|    return isa_impl_wrap<To, SimpleFrom,
  124|  23.9k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  23.9k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  23.9k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree12PropertyNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  23.9k|  static bool doit(const FromTy &Val) {
  133|  23.9k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  23.9k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree12PropertyNodeEPKNS2_4NodeEE4doitES6_:
  105|  23.9k|  static inline bool doit(const From *Val) {
  106|  23.9k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  23.9k|  }
_ZN4llvh8isa_implIN6hermes6ESTree12PropertyNodeENS2_4NodeEvE4doitERKS4_:
   58|  23.9k|  static inline bool doit(const From &Val) {
   59|  23.9k|    return To::classof(&Val);
   60|  23.9k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree12PropertyNodeEPNS2_4NodeES5_E4doitERKS5_:
  218|  23.9k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  23.9k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  23.9k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  23.9k|    return Res2;
  222|  23.9k|  }
_ZN4llvh8dyn_castIN6hermes20GlobalObjectPropertyENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   135k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   135k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 135k, False: 0]
  ------------------
  335|   135k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18CallExpressionNodeENS2_22CallExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|      8|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|      8|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 8, False: 0]
  ------------------
  335|      8|}
_ZN4llvh3isaIN6hermes6ESTree18CallExpressionNodeEPNS2_22CallExpressionLikeNodeEEEbRKT0_:
  142|     32|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     32|  return isa_impl_wrap<X, const Y,
  144|     32|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     32|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEKPNS2_22CallExpressionLikeNodeEPKS4_E4doitERS6_:
  122|     32|  static bool doit(const From &Val) {
  123|     32|    return isa_impl_wrap<To, SimpleFrom,
  124|     32|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     32|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     32|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18CallExpressionNodeEPKNS2_22CallExpressionLikeNodeES6_E4doitERKS6_:
  132|     32|  static bool doit(const FromTy &Val) {
  133|     32|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     32|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18CallExpressionNodeEPKNS2_22CallExpressionLikeNodeEE4doitES6_:
  105|     32|  static inline bool doit(const From *Val) {
  106|     32|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     32|  }
_ZN4llvh8isa_implIN6hermes6ESTree18CallExpressionNodeENS2_22CallExpressionLikeNodeEvE4doitERKS4_:
   58|     32|  static inline bool doit(const From &Val) {
   59|     32|    return To::classof(&Val);
   60|     32|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree22CallExpressionLikeNodeEE18getSimplifiedValueERS5_:
   48|     32|  static RetType getSimplifiedValue(const From& Val) {
   49|     32|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|     32|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree22CallExpressionLikeNodeEE18getSimplifiedValueERS4_:
   38|     32|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree18CallExpressionNodeENS2_22CallExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     24|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     24|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     24|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     24|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree18CallExpressionNodeEPNS2_22CallExpressionLikeNodeES5_E4doitERKS5_:
  218|     24|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     24|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     24|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     24|    return Res2;
  222|     24|  }
_ZN4llvh8dyn_castIN6hermes6ESTree17StringLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   989k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   989k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 11.9k, False: 977k]
  ------------------
  335|   989k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17RegExpLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   977k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   977k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 11.4k, False: 965k]
  ------------------
  335|   977k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BooleanLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   965k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   965k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2.01k, False: 963k]
  ------------------
  335|   965k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17BigIntLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   225k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   225k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 225k]
  ------------------
  335|   225k|}
_ZN4llvh8dyn_castIN6hermes6ESTree24AssignmentExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   233k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   233k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 3.90k, False: 229k]
  ------------------
  335|   233k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18CallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   353k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   353k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 8, False: 353k]
  ------------------
  335|   353k|}
_ZN4llvh8dyn_castIN6hermes6ESTree26OptionalCallExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   221k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   221k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 221k]
  ------------------
  335|   221k|}
_ZN4llvh8dyn_castIN6hermes6ESTree17NewExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   221k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   221k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 221k]
  ------------------
  335|   221k|}
_ZN4llvh8dyn_castIN6hermes6ESTree28OptionalMemberExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   221k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   221k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 221k]
  ------------------
  335|   221k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19ArrayExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   222k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   222k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 33.6k, False: 188k]
  ------------------
  335|   222k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20ObjectExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   188k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   188k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 5.04k, False: 183k]
  ------------------
  335|   188k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21LogicalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   183k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   183k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 11, False: 183k]
  ------------------
  335|   183k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20BinaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   569k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   569k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 409k, False: 159k]
  ------------------
  335|   569k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19UnaryExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   159k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   159k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 4.00k, False: 155k]
  ------------------
  335|   159k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16MetaPropertyNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   155k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   155k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 155k]
  ------------------
  335|   155k|}
_ZN4llvh8dyn_castIN6hermes6ESTree22FunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   155k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   155k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 155k]
  ------------------
  335|   155k|}
_ZN4llvh8dyn_castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   155k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   155k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 114k, False: 41.3k]
  ------------------
  335|   155k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20UpdateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  41.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  41.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 2, False: 41.3k]
  ------------------
  335|  41.3k|}
_ZN4llvh8dyn_castIN6hermes6ESTree25ConditionalExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  41.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  41.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 34, False: 41.3k]
  ------------------
  335|  41.3k|}
_ZN4llvh8dyn_castIN6hermes6ESTree22SequenceExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  41.3k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  41.3k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 25, False: 41.2k]
  ------------------
  335|  41.3k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19TemplateLiteralNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  41.2k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  41.2k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 41.0k, False: 283]
  ------------------
  335|  41.2k|}
_ZN4llvh8dyn_castIN6hermes6ESTree28TaggedTemplateExpressionNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    283|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    283|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 283, False: 0]
  ------------------
  335|    283|}
_ZN4llvh8dyn_castIN6hermes6ESTree17SpreadElementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   705k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   705k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 705k]
  ------------------
  335|   705k|}
_ZN4llvh4castIN6hermes5ValueENS1_13LiteralNumberEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   210k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   210k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   210k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   210k|}
_ZN4llvh3isaIN6hermes5ValueEPNS1_13LiteralNumberEEEbRKT0_:
  142|   210k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   210k|  return isa_impl_wrap<X, const Y,
  144|   210k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   210k|}
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEKPNS1_13LiteralNumberEPKS3_E4doitERS5_:
  122|   210k|  static bool doit(const From &Val) {
  123|   210k|    return isa_impl_wrap<To, SimpleFrom,
  124|   210k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   210k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   210k|  }
_ZN4llvh13isa_impl_wrapIN6hermes5ValueEPKNS1_13LiteralNumberES5_E4doitERKS5_:
  132|   210k|  static bool doit(const FromTy &Val) {
  133|   210k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   210k|  }
_ZN4llvh11isa_impl_clIN6hermes5ValueEPKNS1_13LiteralNumberEE4doitES5_:
  105|   210k|  static inline bool doit(const From *Val) {
  106|   210k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   210k|  }
_ZN4llvh8isa_implIN6hermes5ValueENS1_13LiteralNumberEvE4doitERKS3_:
   67|   210k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes13LiteralNumberEE18getSimplifiedValueERS4_:
   48|   210k|  static RetType getSimplifiedValue(const From& Val) {
   49|   210k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   210k|  }
_ZN4llvh13simplify_typeIPN6hermes13LiteralNumberEE18getSimplifiedValueERS3_:
   38|   210k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes5ValueEPNS1_13LiteralNumberES4_E4doitERKS4_:
  218|   210k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   210k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   210k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   210k|    return Res2;
  222|   210k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree21ImportDeclarationNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   529k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   529k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 529k]
  ------------------
  335|   529k|}
_ZN4llvh8dyn_castIN6hermes6ESTree15IfStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   529k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   529k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 529k]
  ------------------
  335|   529k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ForInStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   529k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   529k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 529k]
  ------------------
  335|   529k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ForOfStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   529k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   529k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 529k]
  ------------------
  335|   529k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19ReturnStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   529k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   529k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 114k, False: 415k]
  ------------------
  335|   529k|}
_ZN4llvh8dyn_castIN6hermes6ESTree19SwitchStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   285k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   285k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 285k]
  ------------------
  335|   285k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BlockStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   400k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   400k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 229k, False: 170k]
  ------------------
  335|   400k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20LabeledStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   214k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   214k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 39.8k, False: 174k]
  ------------------
  335|   214k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18WhileStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16ForStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree20DoWhileStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BreakStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree21ContinueStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree16TryStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18ThrowStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   131k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   131k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 131k]
  ------------------
  335|   131k|}
_ZN4llvh8dyn_castIN6hermes6ESTree18BlockStatementNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|    768|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    768|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 768, False: 0]
  ------------------
  335|    768|}
_ZN4llvh3isaIN6hermes6ESTree18BlockStatementNodeEPS3_EEbRKT0_:
  142|  1.53k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.53k|  return isa_impl_wrap<X, const Y,
  144|  1.53k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.53k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEKPS3_PKS3_E4doitERS5_:
  122|  1.53k|  static bool doit(const From &Val) {
  123|  1.53k|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.53k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.53k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.53k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree18BlockStatementNodeEPKS3_S5_E4doitERKS5_:
  132|  1.53k|  static bool doit(const FromTy &Val) {
  133|  1.53k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.53k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree18BlockStatementNodeEPKS3_E4doitES5_:
  105|  1.53k|  static inline bool doit(const From *Val) {
  106|  1.53k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.53k|  }
_ZN4llvh8isa_implIN6hermes6ESTree18BlockStatementNodeES3_vE4doitERKS3_:
   67|  1.53k|  static inline bool doit(const From &) { return true; }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree18BlockStatementNodeEE18getSimplifiedValueERS5_:
   48|  1.53k|  static RetType getSimplifiedValue(const From& Val) {
   49|  1.53k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  1.53k|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree18BlockStatementNodeEE18getSimplifiedValueERS4_:
   38|  1.53k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes6ESTree18BlockStatementNodeES3_EENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    768|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    768|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    768|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    768|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree18BlockStatementNodeEPS3_S4_E4doitERKS4_:
  218|    768|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    768|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    768|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    768|    return Res2;
  222|    768|  }
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeENS2_4NodeEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeES5_E4doitERS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeEE4doitERS5_:
   77|   114k|  static inline bool doit(const From &Val) {
   78|   114k|    return isa_impl<To, From>::doit(Val);
   79|   114k|  }
_ZN4llvh4castIN6hermes15CreateScopeInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes15CreateScopeInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CreateScopeInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes15CreateScopeInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes15CreateScopeInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes15CreateScopeInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes12AsNumberInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      4|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      4|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      4|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      4|}
_ZN4llvh3isaIN6hermes12AsNumberInstEPNS1_5ValueEEEbRKT0_:
  142|      4|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      4|  return isa_impl_wrap<X, const Y,
  144|      4|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      4|}
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      4|  static bool doit(const From &Val) {
  123|      4|    return isa_impl_wrap<To, SimpleFrom,
  124|      4|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      4|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      4|  }
_ZN4llvh13isa_impl_wrapIN6hermes12AsNumberInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      4|  static bool doit(const FromTy &Val) {
  133|      4|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      4|  }
_ZN4llvh11isa_impl_clIN6hermes12AsNumberInstEPKNS1_5ValueEE4doitES5_:
  105|      4|  static inline bool doit(const From *Val) {
  106|      4|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      4|  }
_ZN4llvh8isa_implIN6hermes12AsNumberInstENS1_5ValueEvE4doitERKS3_:
   58|      4|  static inline bool doit(const From &Val) {
   59|      4|    return To::classof(&Val);
   60|      4|  }
_ZN4llvh16cast_convert_valIN6hermes12AsNumberInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      4|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      4|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      4|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      4|    return Res2;
  222|      4|  }
_ZN4llvh4castIN6hermes13AsNumericInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes13AsNumericInstEPNS1_5ValueEEEbRKT0_:
  142|      2|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      2|  return isa_impl_wrap<X, const Y,
  144|      2|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      2|}
_ZN4llvh13isa_impl_wrapIN6hermes13AsNumericInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      2|  static bool doit(const From &Val) {
  123|      2|    return isa_impl_wrap<To, SimpleFrom,
  124|      2|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      2|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      2|  }
_ZN4llvh13isa_impl_wrapIN6hermes13AsNumericInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes13AsNumericInstEPKNS1_5ValueEE4doitES5_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh8isa_implIN6hermes13AsNumericInstENS1_5ValueEvE4doitERKS3_:
   58|      2|  static inline bool doit(const From &Val) {
   59|      2|    return To::classof(&Val);
   60|      2|  }
_ZN4llvh16cast_convert_valIN6hermes13AsNumericInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }
_ZN4llvh4castIN6hermes13LoadStackInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    105|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    105|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    105|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    105|}
_ZN4llvh3isaIN6hermes13LoadStackInstEPNS1_5ValueEEEbRKT0_:
  142|    105|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    105|  return isa_impl_wrap<X, const Y,
  144|    105|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    105|}
_ZN4llvh13isa_impl_wrapIN6hermes13LoadStackInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    105|  static bool doit(const From &Val) {
  123|    105|    return isa_impl_wrap<To, SimpleFrom,
  124|    105|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    105|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    105|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LoadStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    105|  static bool doit(const FromTy &Val) {
  133|    105|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    105|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadStackInstEPKNS1_5ValueEE4doitES5_:
  105|    105|  static inline bool doit(const From *Val) {
  106|    105|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    105|  }
_ZN4llvh8isa_implIN6hermes13LoadStackInstENS1_5ValueEvE4doitERKS3_:
   58|    105|  static inline bool doit(const From &Val) {
   59|    105|    return To::classof(&Val);
   60|    105|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadStackInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    105|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    105|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    105|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    105|    return Res2;
  222|    105|  }
_ZN4llvh4castIN6hermes15ImplicitMovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    283|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    283|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    283|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    283|}
_ZN4llvh3isaIN6hermes15ImplicitMovInstEPNS1_5ValueEEEbRKT0_:
  142|    283|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    283|  return isa_impl_wrap<X, const Y,
  144|    283|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    283|}
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    283|  static bool doit(const From &Val) {
  123|    283|    return isa_impl_wrap<To, SimpleFrom,
  124|    283|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    283|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    283|  }
_ZN4llvh13isa_impl_wrapIN6hermes15ImplicitMovInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    283|  static bool doit(const FromTy &Val) {
  133|    283|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    283|  }
_ZN4llvh11isa_impl_clIN6hermes15ImplicitMovInstEPKNS1_5ValueEE4doitES5_:
  105|    283|  static inline bool doit(const From *Val) {
  106|    283|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    283|  }
_ZN4llvh8isa_implIN6hermes15ImplicitMovInstENS1_5ValueEvE4doitERKS3_:
   58|    283|  static inline bool doit(const From &Val) {
   59|    283|    return To::classof(&Val);
   60|    283|  }
_ZN4llvh16cast_convert_valIN6hermes15ImplicitMovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    283|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    283|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    283|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    283|    return Res2;
  222|    283|  }
_ZN4llvh4castIN6hermes17UnaryOperatorInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.00k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.00k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.00k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.00k|}
_ZN4llvh3isaIN6hermes17UnaryOperatorInstEPNS1_5ValueEEEbRKT0_:
  142|  4.00k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.00k|  return isa_impl_wrap<X, const Y,
  144|  4.00k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.00k|}
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.00k|  static bool doit(const From &Val) {
  123|  4.00k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.00k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.00k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.00k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17UnaryOperatorInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.00k|  static bool doit(const FromTy &Val) {
  133|  4.00k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.00k|  }
_ZN4llvh11isa_impl_clIN6hermes17UnaryOperatorInstEPKNS1_5ValueEE4doitES5_:
  105|  4.00k|  static inline bool doit(const From *Val) {
  106|  4.00k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.00k|  }
_ZN4llvh8isa_implIN6hermes17UnaryOperatorInstENS1_5ValueEvE4doitERKS3_:
   58|  4.00k|  static inline bool doit(const From &Val) {
   59|  4.00k|    return To::classof(&Val);
   60|  4.00k|  }
_ZN4llvh16cast_convert_valIN6hermes17UnaryOperatorInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  4.00k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.00k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.00k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.00k|    return Res2;
  222|  4.00k|  }
_ZN4llvh4castIN6hermes16HBCLoadParamInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes16HBCLoadParamInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCLoadParamInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCLoadParamInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes16HBCLoadParamInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCLoadParamInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes21HBCReifyArgumentsInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes21HBCReifyArgumentsInstEPNS1_5ValueEEEbRKT0_:
  142|      2|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      2|  return isa_impl_wrap<X, const Y,
  144|      2|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      2|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      2|  static bool doit(const From &Val) {
  123|      2|    return isa_impl_wrap<To, SimpleFrom,
  124|      2|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      2|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      2|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCReifyArgumentsInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCReifyArgumentsInstEPKNS1_5ValueEE4doitES5_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh8isa_implIN6hermes21HBCReifyArgumentsInstENS1_5ValueEvE4doitERKS3_:
   58|      2|  static inline bool doit(const From &Val) {
   59|      2|    return To::classof(&Val);
   60|      2|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCReifyArgumentsInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }
_ZN4llvh4castIN6hermes15HBCSpillMovInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  2.87k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  2.87k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  2.87k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  2.87k|}
_ZN4llvh3isaIN6hermes15HBCSpillMovInstEPNS1_5ValueEEEbRKT0_:
  142|  2.87k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.87k|  return isa_impl_wrap<X, const Y,
  144|  2.87k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.87k|}
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  2.87k|  static bool doit(const From &Val) {
  123|  2.87k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.87k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.87k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.87k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15HBCSpillMovInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  2.87k|  static bool doit(const FromTy &Val) {
  133|  2.87k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.87k|  }
_ZN4llvh11isa_impl_clIN6hermes15HBCSpillMovInstEPKNS1_5ValueEE4doitES5_:
  105|  2.87k|  static inline bool doit(const From *Val) {
  106|  2.87k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.87k|  }
_ZN4llvh8isa_implIN6hermes15HBCSpillMovInstENS1_5ValueEvE4doitERKS3_:
   58|  2.87k|  static inline bool doit(const From &Val) {
   59|  2.87k|    return To::classof(&Val);
   60|  2.87k|  }
_ZN4llvh16cast_convert_valIN6hermes15HBCSpillMovInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  2.87k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  2.87k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  2.87k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  2.87k|    return Res2;
  222|  2.87k|  }
_ZN4llvh4castIN6hermes17StorePropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  3.78k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  3.78k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  3.78k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  3.78k|}
_ZN4llvh3isaIN6hermes17StorePropertyInstEPNS1_5ValueEEEbRKT0_:
  142|  3.78k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.78k|  return isa_impl_wrap<X, const Y,
  144|  3.78k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.78k|}
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  3.78k|  static bool doit(const From &Val) {
  123|  3.78k|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.78k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.78k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.78k|  }
_ZN4llvh13isa_impl_wrapIN6hermes17StorePropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  3.78k|  static bool doit(const FromTy &Val) {
  133|  3.78k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.78k|  }
_ZN4llvh11isa_impl_clIN6hermes17StorePropertyInstEPKNS1_5ValueEE4doitES5_:
  105|  3.78k|  static inline bool doit(const From *Val) {
  106|  3.78k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.78k|  }
_ZN4llvh8isa_implIN6hermes17StorePropertyInstENS1_5ValueEvE4doitERKS3_:
   58|  3.78k|  static inline bool doit(const From &Val) {
   59|  3.78k|    return To::classof(&Val);
   60|  3.78k|  }
_ZN4llvh16cast_convert_valIN6hermes17StorePropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  3.78k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  3.78k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  3.78k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  3.78k|    return Res2;
  222|  3.78k|  }
_ZN4llvh4castIN6hermes20StoreOwnPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   230k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   230k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   230k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   230k|}
_ZN4llvh3isaIN6hermes20StoreOwnPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|   230k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   230k|  return isa_impl_wrap<X, const Y,
  144|   230k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   230k|}
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   230k|  static bool doit(const From &Val) {
  123|   230k|    return isa_impl_wrap<To, SimpleFrom,
  124|   230k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   230k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   230k|  }
_ZN4llvh13isa_impl_wrapIN6hermes20StoreOwnPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   230k|  static bool doit(const FromTy &Val) {
  133|   230k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   230k|  }
_ZN4llvh11isa_impl_clIN6hermes20StoreOwnPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|   230k|  static inline bool doit(const From *Val) {
  106|   230k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   230k|  }
_ZN4llvh8isa_implIN6hermes20StoreOwnPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|   230k|  static inline bool doit(const From &Val) {
   59|   230k|    return To::classof(&Val);
   60|   230k|  }
_ZN4llvh16cast_convert_valIN6hermes20StoreOwnPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   230k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   230k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   230k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   230k|    return Res2;
  222|   230k|  }
_ZN4llvh4castIN6hermes23StoreNewOwnPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.16k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.16k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.16k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.16k|}
_ZN4llvh3isaIN6hermes23StoreNewOwnPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|  4.16k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.16k|  return isa_impl_wrap<X, const Y,
  144|  4.16k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.16k|}
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.16k|  static bool doit(const From &Val) {
  123|  4.16k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.16k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.16k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.16k|  }
_ZN4llvh13isa_impl_wrapIN6hermes23StoreNewOwnPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.16k|  static bool doit(const FromTy &Val) {
  133|  4.16k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.16k|  }
_ZN4llvh11isa_impl_clIN6hermes23StoreNewOwnPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|  4.16k|  static inline bool doit(const From *Val) {
  106|  4.16k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.16k|  }
_ZN4llvh8isa_implIN6hermes23StoreNewOwnPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|  4.16k|  static inline bool doit(const From &Val) {
   59|  4.16k|    return To::classof(&Val);
   60|  4.16k|  }
_ZN4llvh16cast_convert_valIN6hermes23StoreNewOwnPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  4.16k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.16k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.16k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.16k|    return Res2;
  222|  4.16k|  }
_ZN4llvh4castIN6hermes25TryLoadGlobalPropertyInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   131k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   131k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   131k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   131k|}
_ZN4llvh3isaIN6hermes25TryLoadGlobalPropertyInstEPNS1_5ValueEEEbRKT0_:
  142|   131k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   131k|  return isa_impl_wrap<X, const Y,
  144|   131k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   131k|}
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   131k|  static bool doit(const From &Val) {
  123|   131k|    return isa_impl_wrap<To, SimpleFrom,
  124|   131k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   131k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   131k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25TryLoadGlobalPropertyInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   131k|  static bool doit(const FromTy &Val) {
  133|   131k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   131k|  }
_ZN4llvh11isa_impl_clIN6hermes25TryLoadGlobalPropertyInstEPKNS1_5ValueEE4doitES5_:
  105|   131k|  static inline bool doit(const From *Val) {
  106|   131k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   131k|  }
_ZN4llvh8isa_implIN6hermes25TryLoadGlobalPropertyInstENS1_5ValueEvE4doitERKS3_:
   58|   131k|  static inline bool doit(const From &Val) {
   59|   131k|    return To::classof(&Val);
   60|   131k|  }
_ZN4llvh16cast_convert_valIN6hermes25TryLoadGlobalPropertyInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   131k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   131k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   131k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   131k|    return Res2;
  222|   131k|  }
_ZN4llvh4castIN6hermes13LoadFrameInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  10.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  10.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.8k|}
_ZN4llvh3isaIN6hermes13LoadFrameInstEPNS1_5ValueEEEbRKT0_:
  142|  10.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.8k|  return isa_impl_wrap<X, const Y,
  144|  10.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes13LoadFrameInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  10.8k|  static bool doit(const From &Val) {
  123|  10.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes13LoadFrameInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  10.8k|  static bool doit(const FromTy &Val) {
  133|  10.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.8k|  }
_ZN4llvh11isa_impl_clIN6hermes13LoadFrameInstEPKNS1_5ValueEE4doitES5_:
  105|  10.8k|  static inline bool doit(const From *Val) {
  106|  10.8k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  10.8k|  }
_ZN4llvh8isa_implIN6hermes13LoadFrameInstENS1_5ValueEvE4doitERKS3_:
   58|  10.8k|  static inline bool doit(const From &Val) {
   59|  10.8k|    return To::classof(&Val);
   60|  10.8k|  }
_ZN4llvh16cast_convert_valIN6hermes13LoadFrameInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  10.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.8k|    return Res2;
  222|  10.8k|  }
_ZN4llvh4castIN6hermes14StoreStackInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   128k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   128k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   128k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   128k|}
_ZN4llvh3isaIN6hermes14StoreStackInstEPNS1_5ValueEEEbRKT0_:
  142|   128k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   128k|  return isa_impl_wrap<X, const Y,
  144|   128k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   128k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   128k|  static bool doit(const From &Val) {
  123|   128k|    return isa_impl_wrap<To, SimpleFrom,
  124|   128k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   128k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   128k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreStackInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   128k|  static bool doit(const FromTy &Val) {
  133|   128k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   128k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreStackInstEPKNS1_5ValueEE4doitES5_:
  105|   128k|  static inline bool doit(const From *Val) {
  106|   128k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   128k|  }
_ZN4llvh8isa_implIN6hermes14StoreStackInstENS1_5ValueEvE4doitERKS3_:
   58|   128k|  static inline bool doit(const From &Val) {
   59|   128k|    return To::classof(&Val);
   60|   128k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreStackInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   128k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   128k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   128k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   128k|    return Res2;
  222|   128k|  }
_ZN4llvh4castIN6hermes14StoreFrameInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes14StoreFrameInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14StoreFrameInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes14StoreFrameInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes14StoreFrameInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes14StoreFrameInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes15AllocObjectInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  4.16k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  4.16k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  4.16k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  4.16k|}
_ZN4llvh3isaIN6hermes15AllocObjectInstEPNS1_5ValueEEEbRKT0_:
  142|  4.16k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.16k|  return isa_impl_wrap<X, const Y,
  144|  4.16k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.16k|}
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  4.16k|  static bool doit(const From &Val) {
  123|  4.16k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.16k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.16k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.16k|  }
_ZN4llvh13isa_impl_wrapIN6hermes15AllocObjectInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  4.16k|  static bool doit(const FromTy &Val) {
  133|  4.16k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  4.16k|  }
_ZN4llvh11isa_impl_clIN6hermes15AllocObjectInstEPKNS1_5ValueEE4doitES5_:
  105|  4.16k|  static inline bool doit(const From *Val) {
  106|  4.16k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  4.16k|  }
_ZN4llvh8isa_implIN6hermes15AllocObjectInstENS1_5ValueEvE4doitERKS3_:
   58|  4.16k|  static inline bool doit(const From &Val) {
   59|  4.16k|    return To::classof(&Val);
   60|  4.16k|  }
_ZN4llvh16cast_convert_valIN6hermes15AllocObjectInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  4.16k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  4.16k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  4.16k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  4.16k|    return Res2;
  222|  4.16k|  }
_ZN4llvh4castIN6hermes14AllocArrayInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  33.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  33.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  33.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  33.4k|}
_ZN4llvh3isaIN6hermes14AllocArrayInstEPNS1_5ValueEEEbRKT0_:
  142|  33.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  33.4k|  return isa_impl_wrap<X, const Y,
  144|  33.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  33.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  33.4k|  static bool doit(const From &Val) {
  123|  33.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  33.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  33.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  33.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14AllocArrayInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  33.4k|  static bool doit(const FromTy &Val) {
  133|  33.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  33.4k|  }
_ZN4llvh11isa_impl_clIN6hermes14AllocArrayInstEPKNS1_5ValueEE4doitES5_:
  105|  33.4k|  static inline bool doit(const From *Val) {
  106|  33.4k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  33.4k|  }
_ZN4llvh8isa_implIN6hermes14AllocArrayInstENS1_5ValueEvE4doitERKS3_:
   58|  33.4k|  static inline bool doit(const From &Val) {
   59|  33.4k|    return To::classof(&Val);
   60|  33.4k|  }
_ZN4llvh16cast_convert_valIN6hermes14AllocArrayInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  33.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  33.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  33.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  33.4k|    return Res2;
  222|  33.4k|  }
_ZN4llvh4castIN6hermes22AllocObjectLiteralInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  5.04k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  5.04k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  5.04k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  5.04k|}
_ZN4llvh3isaIN6hermes22AllocObjectLiteralInstEPNS1_5ValueEEEbRKT0_:
  142|  5.04k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  5.04k|  return isa_impl_wrap<X, const Y,
  144|  5.04k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  5.04k|}
_ZN4llvh13isa_impl_wrapIN6hermes22AllocObjectLiteralInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  5.04k|  static bool doit(const From &Val) {
  123|  5.04k|    return isa_impl_wrap<To, SimpleFrom,
  124|  5.04k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  5.04k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  5.04k|  }
_ZN4llvh13isa_impl_wrapIN6hermes22AllocObjectLiteralInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  5.04k|  static bool doit(const FromTy &Val) {
  133|  5.04k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  5.04k|  }
_ZN4llvh11isa_impl_clIN6hermes22AllocObjectLiteralInstEPKNS1_5ValueEE4doitES5_:
  105|  5.04k|  static inline bool doit(const From *Val) {
  106|  5.04k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  5.04k|  }
_ZN4llvh8isa_implIN6hermes22AllocObjectLiteralInstENS1_5ValueEvE4doitERKS3_:
   58|  5.04k|  static inline bool doit(const From &Val) {
   59|  5.04k|    return To::classof(&Val);
   60|  5.04k|  }
_ZN4llvh16cast_convert_valIN6hermes22AllocObjectLiteralInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  5.04k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  5.04k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  5.04k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  5.04k|    return Res2;
  222|  5.04k|  }
_ZN4llvh4castIN6hermes19CreateArgumentsInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes19CreateArgumentsInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes19CreateArgumentsInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes19CreateArgumentsInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes19CreateArgumentsInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes19CreateArgumentsInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes16CreateRegExpInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  11.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  11.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  11.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  11.4k|}
_ZN4llvh3isaIN6hermes16CreateRegExpInstEPNS1_5ValueEEEbRKT0_:
  142|  11.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  11.4k|  return isa_impl_wrap<X, const Y,
  144|  11.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  11.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  11.4k|  static bool doit(const From &Val) {
  123|  11.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  11.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  11.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  11.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes16CreateRegExpInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  11.4k|  static bool doit(const FromTy &Val) {
  133|  11.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  11.4k|  }
_ZN4llvh11isa_impl_clIN6hermes16CreateRegExpInstEPKNS1_5ValueEE4doitES5_:
  105|  11.4k|  static inline bool doit(const From *Val) {
  106|  11.4k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  11.4k|  }
_ZN4llvh8isa_implIN6hermes16CreateRegExpInstENS1_5ValueEvE4doitERKS3_:
   58|  11.4k|  static inline bool doit(const From &Val) {
   59|  11.4k|    return To::classof(&Val);
   60|  11.4k|  }
_ZN4llvh16cast_convert_valIN6hermes16CreateRegExpInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  11.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  11.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  11.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  11.4k|    return Res2;
  222|  11.4k|  }
_ZN4llvh4castIN6hermes10TryEndInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes10TryEndInstEPNS1_5ValueEEEbRKT0_:
  142|     12|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     12|  return isa_impl_wrap<X, const Y,
  144|     12|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     12|}
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     12|  static bool doit(const From &Val) {
  123|     12|    return isa_impl_wrap<To, SimpleFrom,
  124|     12|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     12|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     12|  }
_ZN4llvh13isa_impl_wrapIN6hermes10TryEndInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     12|  static bool doit(const FromTy &Val) {
  133|     12|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     12|  }
_ZN4llvh11isa_impl_clIN6hermes10TryEndInstEPKNS1_5ValueEE4doitES5_:
  105|     12|  static inline bool doit(const From *Val) {
  106|     12|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     12|  }
_ZN4llvh8isa_implIN6hermes10TryEndInstENS1_5ValueEvE4doitERKS3_:
   58|     12|  static inline bool doit(const From &Val) {
   59|     12|    return To::classof(&Val);
   60|     12|  }
_ZN4llvh16cast_convert_valIN6hermes10TryEndInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes16GetNewTargetInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes16GetNewTargetInstEPNS1_5ValueEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNewTargetInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNewTargetInstEPKNS1_5ValueEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes16GetNewTargetInstENS1_5ValueEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes16GetNewTargetInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh4castIN6hermes17IteratorBeginInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes17IteratorBeginInstEPNS1_5ValueEEEbRKT0_:
  142|     12|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     12|  return isa_impl_wrap<X, const Y,
  144|     12|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     12|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     12|  static bool doit(const From &Val) {
  123|     12|    return isa_impl_wrap<To, SimpleFrom,
  124|     12|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     12|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     12|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorBeginInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     12|  static bool doit(const FromTy &Val) {
  133|     12|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     12|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorBeginInstEPKNS1_5ValueEE4doitES5_:
  105|     12|  static inline bool doit(const From *Val) {
  106|     12|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     12|  }
_ZN4llvh8isa_implIN6hermes17IteratorBeginInstENS1_5ValueEvE4doitERKS3_:
   58|     12|  static inline bool doit(const From &Val) {
   59|     12|    return To::classof(&Val);
   60|     12|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorBeginInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes16IteratorNextInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      6|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      6|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      6|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      6|}
_ZN4llvh3isaIN6hermes16IteratorNextInstEPNS1_5ValueEEEbRKT0_:
  142|      6|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      6|  return isa_impl_wrap<X, const Y,
  144|      6|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      6|}
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      6|  static bool doit(const From &Val) {
  123|      6|    return isa_impl_wrap<To, SimpleFrom,
  124|      6|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      6|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      6|  }
_ZN4llvh13isa_impl_wrapIN6hermes16IteratorNextInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      6|  static bool doit(const FromTy &Val) {
  133|      6|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      6|  }
_ZN4llvh11isa_impl_clIN6hermes16IteratorNextInstEPKNS1_5ValueEE4doitES5_:
  105|      6|  static inline bool doit(const From *Val) {
  106|      6|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      6|  }
_ZN4llvh8isa_implIN6hermes16IteratorNextInstENS1_5ValueEvE4doitERKS3_:
   58|      6|  static inline bool doit(const From &Val) {
   59|      6|    return To::classof(&Val);
   60|      6|  }
_ZN4llvh16cast_convert_valIN6hermes16IteratorNextInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      6|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      6|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      6|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      6|    return Res2;
  222|      6|  }
_ZN4llvh4castIN6hermes17IteratorCloseInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     18|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     18|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     18|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     18|}
_ZN4llvh3isaIN6hermes17IteratorCloseInstEPNS1_5ValueEEEbRKT0_:
  142|     18|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     18|  return isa_impl_wrap<X, const Y,
  144|     18|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     18|}
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     18|  static bool doit(const From &Val) {
  123|     18|    return isa_impl_wrap<To, SimpleFrom,
  124|     18|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     18|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     18|  }
_ZN4llvh13isa_impl_wrapIN6hermes17IteratorCloseInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     18|  static bool doit(const FromTy &Val) {
  133|     18|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     18|  }
_ZN4llvh11isa_impl_clIN6hermes17IteratorCloseInstEPKNS1_5ValueEE4doitES5_:
  105|     18|  static inline bool doit(const From *Val) {
  106|     18|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     18|  }
_ZN4llvh8isa_implIN6hermes17IteratorCloseInstENS1_5ValueEvE4doitERKS3_:
   58|     18|  static inline bool doit(const From &Val) {
   59|     18|    return To::classof(&Val);
   60|     18|  }
_ZN4llvh16cast_convert_valIN6hermes17IteratorCloseInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     18|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     18|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     18|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     18|    return Res2;
  222|     18|  }
_ZN4llvh4castIN6hermes25HBCStoreToEnvironmentInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes25HBCStoreToEnvironmentInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes25HBCStoreToEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes25HBCStoreToEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes25HBCStoreToEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes25HBCStoreToEnvironmentInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes26HBCLoadFromEnvironmentInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  10.8k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  10.8k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  10.8k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  10.8k|}
_ZN4llvh3isaIN6hermes26HBCLoadFromEnvironmentInstEPNS1_5ValueEEEbRKT0_:
  142|  10.8k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  10.8k|  return isa_impl_wrap<X, const Y,
  144|  10.8k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  10.8k|}
_ZN4llvh13isa_impl_wrapIN6hermes26HBCLoadFromEnvironmentInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  10.8k|  static bool doit(const From &Val) {
  123|  10.8k|    return isa_impl_wrap<To, SimpleFrom,
  124|  10.8k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  10.8k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  10.8k|  }
_ZN4llvh13isa_impl_wrapIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  10.8k|  static bool doit(const FromTy &Val) {
  133|  10.8k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  10.8k|  }
_ZN4llvh11isa_impl_clIN6hermes26HBCLoadFromEnvironmentInstEPKNS1_5ValueEE4doitES5_:
  105|  10.8k|  static inline bool doit(const From *Val) {
  106|  10.8k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  10.8k|  }
_ZN4llvh8isa_implIN6hermes26HBCLoadFromEnvironmentInstENS1_5ValueEvE4doitERKS3_:
   58|  10.8k|  static inline bool doit(const From &Val) {
   59|  10.8k|    return To::classof(&Val);
   60|  10.8k|  }
_ZN4llvh16cast_convert_valIN6hermes26HBCLoadFromEnvironmentInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  10.8k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  10.8k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  10.8k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  10.8k|    return Res2;
  222|  10.8k|  }
_ZN4llvh4castIN6hermes18CreateFunctionInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes18CreateFunctionInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes18CreateFunctionInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes18CreateFunctionInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes18CreateFunctionInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes18CreateFunctionInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes21HBCCreateFunctionInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   114k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   114k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   114k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   114k|}
_ZN4llvh3isaIN6hermes21HBCCreateFunctionInstEPNS1_5ValueEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   114k|  static bool doit(const From &Val) {
  123|   114k|    return isa_impl_wrap<To, SimpleFrom,
  124|   114k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   114k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   114k|  }
_ZN4llvh13isa_impl_wrapIN6hermes21HBCCreateFunctionInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes21HBCCreateFunctionInstEPKNS1_5ValueEE4doitES5_:
  105|   114k|  static inline bool doit(const From *Val) {
  106|   114k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   114k|  }
_ZN4llvh8isa_implIN6hermes21HBCCreateFunctionInstENS1_5ValueEvE4doitERKS3_:
   58|   114k|  static inline bool doit(const From &Val) {
   59|   114k|    return To::classof(&Val);
   60|   114k|  }
_ZN4llvh16cast_convert_valIN6hermes21HBCCreateFunctionInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   114k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   114k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   114k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   114k|    return Res2;
  222|   114k|  }
_ZN4llvh4castIN6hermes10BranchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  39.4k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  39.4k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  39.4k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  39.4k|}
_ZN4llvh3isaIN6hermes10BranchInstEPNS1_5ValueEEEbRKT0_:
  142|  39.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  39.4k|  return isa_impl_wrap<X, const Y,
  144|  39.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  39.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|  39.4k|  static bool doit(const From &Val) {
  123|  39.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  39.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  39.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  39.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|  39.4k|  static bool doit(const FromTy &Val) {
  133|  39.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  39.4k|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_5ValueEE4doitES5_:
  105|  39.4k|  static inline bool doit(const From *Val) {
  106|  39.4k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  39.4k|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_5ValueEvE4doitERKS3_:
   58|  39.4k|  static inline bool doit(const From &Val) {
   59|  39.4k|    return To::classof(&Val);
   60|  39.4k|  }
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  39.4k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  39.4k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  39.4k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  39.4k|    return Res2;
  222|  39.4k|  }
_ZN4llvh4castIN6hermes10ReturnInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   228k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   228k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   228k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   228k|}
_ZN4llvh3isaIN6hermes10ReturnInstEPNS1_5ValueEEEbRKT0_:
  142|   228k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   228k|  return isa_impl_wrap<X, const Y,
  144|   228k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   228k|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   228k|  static bool doit(const From &Val) {
  123|   228k|    return isa_impl_wrap<To, SimpleFrom,
  124|   228k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   228k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   228k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|   228k|  static bool doit(const FromTy &Val) {
  133|   228k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   228k|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_5ValueEE4doitES5_:
  105|   228k|  static inline bool doit(const From *Val) {
  106|   228k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   228k|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_5ValueEvE4doitERKS3_:
   58|   228k|  static inline bool doit(const From &Val) {
   59|   228k|    return To::classof(&Val);
   60|   228k|  }
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPNS1_5ValueES4_E4doitERKS4_:
  218|   228k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   228k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   228k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   228k|    return Res2;
  222|   228k|  }
_ZN4llvh4castIN6hermes9ThrowInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      6|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      6|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      6|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      6|}
_ZN4llvh3isaIN6hermes9ThrowInstEPNS1_5ValueEEEbRKT0_:
  142|      6|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      6|  return isa_impl_wrap<X, const Y,
  144|      6|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      6|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      6|  static bool doit(const From &Val) {
  123|      6|    return isa_impl_wrap<To, SimpleFrom,
  124|      6|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      6|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      6|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      6|  static bool doit(const FromTy &Val) {
  133|      6|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      6|  }
_ZN4llvh11isa_impl_clIN6hermes9ThrowInstEPKNS1_5ValueEE4doitES5_:
  105|      6|  static inline bool doit(const From *Val) {
  106|      6|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      6|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_5ValueEvE4doitERKS3_:
   58|      6|  static inline bool doit(const From &Val) {
   59|      6|    return To::classof(&Val);
   60|      6|  }
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      6|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      6|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      6|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      6|    return Res2;
  222|      6|  }
_ZN4llvh4castIN6hermes14CondBranchInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     71|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     71|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     71|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     71|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPNS1_5ValueEEEbRKT0_:
  142|     71|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     71|  return isa_impl_wrap<X, const Y,
  144|     71|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     71|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     71|  static bool doit(const From &Val) {
  123|     71|    return isa_impl_wrap<To, SimpleFrom,
  124|     71|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     71|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     71|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     71|  static bool doit(const FromTy &Val) {
  133|     71|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     71|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_5ValueEE4doitES5_:
  105|     71|  static inline bool doit(const From *Val) {
  106|     71|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     71|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_5ValueEvE4doitERKS3_:
   58|     71|  static inline bool doit(const From &Val) {
   59|     71|    return To::classof(&Val);
   60|     71|  }
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     71|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     71|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     71|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     71|    return Res2;
  222|     71|  }
_ZN4llvh4castIN6hermes12TryStartInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|     12|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     12|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     12|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     12|}
_ZN4llvh3isaIN6hermes12TryStartInstEPNS1_5ValueEEEbRKT0_:
  142|     12|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     12|  return isa_impl_wrap<X, const Y,
  144|     12|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     12|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|     12|  static bool doit(const From &Val) {
  123|     12|    return isa_impl_wrap<To, SimpleFrom,
  124|     12|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     12|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     12|  }
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|     12|  static bool doit(const FromTy &Val) {
  133|     12|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     12|  }
_ZN4llvh11isa_impl_clIN6hermes12TryStartInstEPKNS1_5ValueEE4doitES5_:
  105|     12|  static inline bool doit(const From *Val) {
  106|     12|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     12|  }
_ZN4llvh8isa_implIN6hermes12TryStartInstENS1_5ValueEvE4doitERKS3_:
   58|     12|  static inline bool doit(const From &Val) {
   59|     12|    return To::classof(&Val);
   60|     12|  }
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPNS1_5ValueES4_E4doitERKS4_:
  218|     12|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     12|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     12|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     12|    return Res2;
  222|     12|  }
_ZN4llvh4castIN6hermes8CallInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    291|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    291|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    291|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    291|}
_ZN4llvh3isaIN6hermes8CallInstEPNS1_5ValueEEEbRKT0_:
  142|    291|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    291|  return isa_impl_wrap<X, const Y,
  144|    291|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    291|}
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    291|  static bool doit(const From &Val) {
  123|    291|    return isa_impl_wrap<To, SimpleFrom,
  124|    291|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    291|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    291|  }
_ZN4llvh13isa_impl_wrapIN6hermes8CallInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    291|  static bool doit(const FromTy &Val) {
  133|    291|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    291|  }
_ZN4llvh11isa_impl_clIN6hermes8CallInstEPKNS1_5ValueEE4doitES5_:
  105|    291|  static inline bool doit(const From *Val) {
  106|    291|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    291|  }
_ZN4llvh8isa_implIN6hermes8CallInstENS1_5ValueEvE4doitERKS3_:
   58|    291|  static inline bool doit(const From &Val) {
   59|    291|    return To::classof(&Val);
   60|    291|  }
_ZN4llvh16cast_convert_valIN6hermes8CallInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    291|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    291|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    291|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    291|    return Res2;
  222|    291|  }
_ZN4llvh4castIN6hermes15CallBuiltinInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    283|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    283|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    283|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    283|}
_ZN4llvh3isaIN6hermes15CallBuiltinInstEPNS1_5ValueEEEbRKT0_:
  142|    283|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    283|  return isa_impl_wrap<X, const Y,
  144|    283|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    283|}
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    283|  static bool doit(const From &Val) {
  123|    283|    return isa_impl_wrap<To, SimpleFrom,
  124|    283|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    283|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    283|  }
_ZN4llvh13isa_impl_wrapIN6hermes15CallBuiltinInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    283|  static bool doit(const FromTy &Val) {
  133|    283|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    283|  }
_ZN4llvh11isa_impl_clIN6hermes15CallBuiltinInstEPKNS1_5ValueEE4doitES5_:
  105|    283|  static inline bool doit(const From *Val) {
  106|    283|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    283|  }
_ZN4llvh8isa_implIN6hermes15CallBuiltinInstENS1_5ValueEvE4doitERKS3_:
   58|    283|  static inline bool doit(const From &Val) {
   59|    283|    return To::classof(&Val);
   60|    283|  }
_ZN4llvh16cast_convert_valIN6hermes15CallBuiltinInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    283|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    283|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    283|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    283|    return Res2;
  222|    283|  }
_ZN4llvh4castIN6hermes22HBCGetGlobalObjectInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|  62.5k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  62.5k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  62.5k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  62.5k|}
_ZN4llvh16cast_convert_valIN6hermes22HBCGetGlobalObjectInstEPNS1_5ValueES4_E4doitERKS4_:
  218|  62.5k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  62.5k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  62.5k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  62.5k|    return Res2;
  222|  62.5k|  }
_ZN4llvh4castIN6hermes16HBCGetThisNSInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|      5|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      5|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      5|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      5|}
_ZN4llvh3isaIN6hermes16HBCGetThisNSInstEPNS1_5ValueEEEbRKT0_:
  142|      5|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      5|  return isa_impl_wrap<X, const Y,
  144|      5|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      5|}
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|      5|  static bool doit(const From &Val) {
  123|      5|    return isa_impl_wrap<To, SimpleFrom,
  124|      5|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      5|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      5|  }
_ZN4llvh13isa_impl_wrapIN6hermes16HBCGetThisNSInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|      5|  static bool doit(const FromTy &Val) {
  133|      5|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      5|  }
_ZN4llvh11isa_impl_clIN6hermes16HBCGetThisNSInstEPKNS1_5ValueEE4doitES5_:
  105|      5|  static inline bool doit(const From *Val) {
  106|      5|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      5|  }
_ZN4llvh8isa_implIN6hermes16HBCGetThisNSInstENS1_5ValueEvE4doitERKS3_:
   58|      5|  static inline bool doit(const From &Val) {
   59|      5|    return To::classof(&Val);
   60|      5|  }
_ZN4llvh16cast_convert_valIN6hermes16HBCGetThisNSInstEPNS1_5ValueES4_E4doitERKS4_:
  218|      5|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      5|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      5|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      5|    return Res2;
  222|      5|  }
_ZN4llvh4castIN6hermes28HBCAllocObjectFromBufferInstENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|    880|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    880|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    880|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    880|}
_ZN4llvh3isaIN6hermes28HBCAllocObjectFromBufferInstEPNS1_5ValueEEEbRKT0_:
  142|    880|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    880|  return isa_impl_wrap<X, const Y,
  144|    880|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    880|}
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|    880|  static bool doit(const From &Val) {
  123|    880|    return isa_impl_wrap<To, SimpleFrom,
  124|    880|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    880|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    880|  }
_ZN4llvh13isa_impl_wrapIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_5ValueES5_E4doitERKS5_:
  132|    880|  static bool doit(const FromTy &Val) {
  133|    880|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    880|  }
_ZN4llvh11isa_impl_clIN6hermes28HBCAllocObjectFromBufferInstEPKNS1_5ValueEE4doitES5_:
  105|    880|  static inline bool doit(const From *Val) {
  106|    880|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    880|  }
_ZN4llvh8isa_implIN6hermes28HBCAllocObjectFromBufferInstENS1_5ValueEvE4doitERKS3_:
   58|    880|  static inline bool doit(const From &Val) {
   59|    880|    return To::classof(&Val);
   60|    880|  }
_ZN4llvh16cast_convert_valIN6hermes28HBCAllocObjectFromBufferInstEPNS1_5ValueES4_E4doitERKS4_:
  218|    880|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    880|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    880|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    880|    return Res2;
  222|    880|  }
_ZN4llvh4castIN6hermes9ParameterENS1_5ValueEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   228k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   228k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   228k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   228k|}
_ZN4llvh3isaIN6hermes9ParameterEPNS1_5ValueEEEbRKT0_:
  142|   228k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   228k|  return isa_impl_wrap<X, const Y,
  144|   228k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   228k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ParameterEKPNS1_5ValueEPKS3_E4doitERS5_:
  122|   228k|  static bool doit(const From &Val) {
  123|   228k|    return isa_impl_wrap<To, SimpleFrom,
  124|   228k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   228k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   228k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ParameterEPKNS1_5ValueES5_E4doitERKS5_:
  132|   228k|  static bool doit(const FromTy &Val) {
  133|   228k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   228k|  }
_ZN4llvh11isa_impl_clIN6hermes9ParameterEPKNS1_5ValueEE4doitES5_:
  105|   228k|  static inline bool doit(const From *Val) {
  106|   228k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   228k|  }
_ZN4llvh8isa_implIN6hermes9ParameterENS1_5ValueEvE4doitERKS3_:
   58|   228k|  static inline bool doit(const From &Val) {
   59|   228k|    return To::classof(&Val);
   60|   228k|  }
_ZN4llvh16cast_convert_valIN6hermes9ParameterEPNS1_5ValueES4_E4doitERKS4_:
  218|   228k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   228k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   228k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   228k|    return Res2;
  222|   228k|  }
_ZN4llvh8dyn_castIN6hermes14TerminatorInstEKNS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   307k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   307k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 307k, False: 0]
  ------------------
  335|   307k|}
_ZN4llvh3isaIN6hermes14TerminatorInstEPKNS1_11InstructionEEEbRKT0_:
  142|   614k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   614k|  return isa_impl_wrap<X, const Y,
  144|   614k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   614k|}
_ZN4llvh13isa_impl_wrapIN6hermes14TerminatorInstEKPKNS1_11InstructionES5_E4doitERS6_:
  122|   614k|  static bool doit(const From &Val) {
  123|   614k|    return isa_impl_wrap<To, SimpleFrom,
  124|   614k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   614k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   614k|  }
_ZN4llvh13simplify_typeIKPKN6hermes11InstructionEE18getSimplifiedValueERS5_:
   48|   614k|  static RetType getSimplifiedValue(const From& Val) {
   49|   614k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   614k|  }
_ZN4llvh13simplify_typeIPKN6hermes11InstructionEE18getSimplifiedValueERS4_:
   38|   614k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes14TerminatorInstEKNS1_11InstructionEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   307k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   307k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   307k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   307k|}
_ZN4llvh16cast_convert_valIN6hermes14TerminatorInstEPKNS1_11InstructionES5_E4doitERKS5_:
  218|   307k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   307k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   307k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   307k|    return Res2;
  222|   307k|  }
_ZN4llvh8dyn_castIN6hermes10BranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  1.05M|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  1.05M|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 592k, False: 458k]
  ------------------
  335|  1.05M|}
_ZN4llvh3isaIN6hermes10BranchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  1.64M|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  1.64M|  return isa_impl_wrap<X, const Y,
  144|  1.64M|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  1.64M|}
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  1.64M|  static bool doit(const From &Val) {
  123|  1.64M|    return isa_impl_wrap<To, SimpleFrom,
  124|  1.64M|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  1.64M|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  1.64M|  }
_ZN4llvh13isa_impl_wrapIN6hermes10BranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  1.64M|  static bool doit(const FromTy &Val) {
  133|  1.64M|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  1.64M|  }
_ZN4llvh11isa_impl_clIN6hermes10BranchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  1.64M|  static inline bool doit(const From *Val) {
  106|  1.64M|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  1.64M|  }
_ZN4llvh8isa_implIN6hermes10BranchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  1.64M|  static inline bool doit(const From &Val) {
   59|  1.64M|    return To::classof(&Val);
   60|  1.64M|  }
_ZN4llvh13simplify_typeIKPKN6hermes14TerminatorInstEE18getSimplifiedValueERS5_:
   48|  2.56M|  static RetType getSimplifiedValue(const From& Val) {
   49|  2.56M|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|  2.56M|  }
_ZN4llvh13simplify_typeIPKN6hermes14TerminatorInstEE18getSimplifiedValueERS4_:
   38|  2.56M|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh4castIN6hermes10BranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   592k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   592k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   592k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   592k|}
_ZN4llvh16cast_convert_valIN6hermes10BranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|   592k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   592k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   592k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   592k|    return Res2;
  222|   592k|  }
_ZN4llvh8dyn_castIN6hermes10ReturnInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|   458k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   458k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 456k, False: 2.04k]
  ------------------
  335|   458k|}
_ZN4llvh3isaIN6hermes10ReturnInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|   915k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   915k|  return isa_impl_wrap<X, const Y,
  144|   915k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   915k|}
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|   915k|  static bool doit(const From &Val) {
  123|   915k|    return isa_impl_wrap<To, SimpleFrom,
  124|   915k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   915k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   915k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10ReturnInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|   915k|  static bool doit(const FromTy &Val) {
  133|   915k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   915k|  }
_ZN4llvh11isa_impl_clIN6hermes10ReturnInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|   915k|  static inline bool doit(const From *Val) {
  106|   915k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   915k|  }
_ZN4llvh8isa_implIN6hermes10ReturnInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|   915k|  static inline bool doit(const From &Val) {
   59|   915k|    return To::classof(&Val);
   60|   915k|  }
_ZN4llvh4castIN6hermes10ReturnInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   456k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   456k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   456k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   456k|}
_ZN4llvh16cast_convert_valIN6hermes10ReturnInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|   456k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   456k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   456k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   456k|    return Res2;
  222|   456k|  }
_ZN4llvh8dyn_castIN6hermes9ThrowInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.04k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.04k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 30, False: 2.01k]
  ------------------
  335|  2.04k|}
_ZN4llvh3isaIN6hermes9ThrowInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  2.07k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.07k|  return isa_impl_wrap<X, const Y,
  144|  2.07k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.07k|}
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  2.07k|  static bool doit(const From &Val) {
  123|  2.07k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.07k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.07k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.07k|  }
_ZN4llvh13isa_impl_wrapIN6hermes9ThrowInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  2.07k|  static bool doit(const FromTy &Val) {
  133|  2.07k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.07k|  }
_ZN4llvh11isa_impl_clIN6hermes9ThrowInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  2.07k|  static inline bool doit(const From *Val) {
  106|  2.07k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.07k|  }
_ZN4llvh8isa_implIN6hermes9ThrowInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  2.07k|  static inline bool doit(const From &Val) {
   59|  2.07k|    return To::classof(&Val);
   60|  2.07k|  }
_ZN4llvh4castIN6hermes9ThrowInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     30|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     30|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     30|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     30|}
_ZN4llvh16cast_convert_valIN6hermes9ThrowInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|     30|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     30|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     30|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     30|    return Res2;
  222|     30|  }
_ZN4llvh8dyn_castIN6hermes10SwitchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.01k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.01k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 2.01k]
  ------------------
  335|  2.01k|}
_ZN4llvh3isaIN6hermes10SwitchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  2.01k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  2.01k|  return isa_impl_wrap<X, const Y,
  144|  2.01k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  2.01k|}
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  2.01k|  static bool doit(const From &Val) {
  123|  2.01k|    return isa_impl_wrap<To, SimpleFrom,
  124|  2.01k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  2.01k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  2.01k|  }
_ZN4llvh13isa_impl_wrapIN6hermes10SwitchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  2.01k|  static bool doit(const FromTy &Val) {
  133|  2.01k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  2.01k|  }
_ZN4llvh11isa_impl_clIN6hermes10SwitchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  2.01k|  static inline bool doit(const From *Val) {
  106|  2.01k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  2.01k|  }
_ZN4llvh8isa_implIN6hermes10SwitchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  2.01k|  static inline bool doit(const From &Val) {
   59|  2.01k|    return To::classof(&Val);
   60|  2.01k|  }
_ZN4llvh8dyn_castIN6hermes14CondBranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  2.01k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  2.01k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 1.77k, False: 240]
  ------------------
  335|  2.01k|}
_ZN4llvh3isaIN6hermes14CondBranchInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|  3.78k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  3.78k|  return isa_impl_wrap<X, const Y,
  144|  3.78k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  3.78k|}
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|  3.78k|  static bool doit(const From &Val) {
  123|  3.78k|    return isa_impl_wrap<To, SimpleFrom,
  124|  3.78k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  3.78k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  3.78k|  }
_ZN4llvh13isa_impl_wrapIN6hermes14CondBranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|  3.78k|  static bool doit(const FromTy &Val) {
  133|  3.78k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  3.78k|  }
_ZN4llvh11isa_impl_clIN6hermes14CondBranchInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|  3.78k|  static inline bool doit(const From *Val) {
  106|  3.78k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  3.78k|  }
_ZN4llvh8isa_implIN6hermes14CondBranchInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|  3.78k|  static inline bool doit(const From &Val) {
   59|  3.78k|    return To::classof(&Val);
   60|  3.78k|  }
_ZN4llvh4castIN6hermes14CondBranchInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  1.77k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  1.77k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  1.77k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  1.77k|}
_ZN4llvh16cast_convert_valIN6hermes14CondBranchInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|  1.77k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  1.77k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  1.77k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  1.77k|    return Res2;
  222|  1.77k|  }
_ZN4llvh8dyn_castIN6hermes13GetPNamesInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    240|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    240|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 240]
  ------------------
  335|    240|}
_ZN4llvh3isaIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|    240|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    240|  return isa_impl_wrap<X, const Y,
  144|    240|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    240|}
_ZN4llvh13isa_impl_wrapIN6hermes13GetPNamesInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|    240|  static bool doit(const From &Val) {
  123|    240|    return isa_impl_wrap<To, SimpleFrom,
  124|    240|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    240|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    240|  }
_ZN4llvh13isa_impl_wrapIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|    240|  static bool doit(const FromTy &Val) {
  133|    240|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    240|  }
_ZN4llvh11isa_impl_clIN6hermes13GetPNamesInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|    240|  static inline bool doit(const From *Val) {
  106|    240|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    240|  }
_ZN4llvh8isa_implIN6hermes13GetPNamesInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|    240|  static inline bool doit(const From &Val) {
   59|    240|    return To::classof(&Val);
   60|    240|  }
_ZN4llvh8dyn_castIN6hermes16GetNextPNameInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    240|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    240|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 240]
  ------------------
  335|    240|}
_ZN4llvh3isaIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|    240|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    240|  return isa_impl_wrap<X, const Y,
  144|    240|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    240|}
_ZN4llvh13isa_impl_wrapIN6hermes16GetNextPNameInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|    240|  static bool doit(const From &Val) {
  123|    240|    return isa_impl_wrap<To, SimpleFrom,
  124|    240|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    240|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    240|  }
_ZN4llvh13isa_impl_wrapIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|    240|  static bool doit(const FromTy &Val) {
  133|    240|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    240|  }
_ZN4llvh11isa_impl_clIN6hermes16GetNextPNameInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|    240|  static inline bool doit(const From *Val) {
  106|    240|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    240|  }
_ZN4llvh8isa_implIN6hermes16GetNextPNameInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|    240|  static inline bool doit(const From &Val) {
   59|    240|    return To::classof(&Val);
   60|    240|  }
_ZN4llvh8dyn_castIN6hermes20CheckHasInstanceInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    240|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    240|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 240]
  ------------------
  335|    240|}
_ZN4llvh3isaIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|    240|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    240|  return isa_impl_wrap<X, const Y,
  144|    240|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    240|}
_ZN4llvh13isa_impl_wrapIN6hermes20CheckHasInstanceInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|    240|  static bool doit(const From &Val) {
  123|    240|    return isa_impl_wrap<To, SimpleFrom,
  124|    240|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    240|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    240|  }
_ZN4llvh13isa_impl_wrapIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  132|    240|  static bool doit(const FromTy &Val) {
  133|    240|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    240|  }
_ZN4llvh11isa_impl_clIN6hermes20CheckHasInstanceInstEPKNS1_14TerminatorInstEE4doitES5_:
  105|    240|  static inline bool doit(const From *Val) {
  106|    240|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    240|  }
_ZN4llvh8isa_implIN6hermes20CheckHasInstanceInstENS1_14TerminatorInstEvE4doitERKS3_:
   58|    240|  static inline bool doit(const From &Val) {
   59|    240|    return To::classof(&Val);
   60|    240|  }
_ZN4llvh8dyn_castIN6hermes12TryStartInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|    240|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|    240|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 240, False: 0]
  ------------------
  335|    240|}
_ZN4llvh3isaIN6hermes12TryStartInstEPKNS1_14TerminatorInstEEEbRKT0_:
  142|    480|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    480|  return isa_impl_wrap<X, const Y,
  144|    480|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    480|}
_ZN4llvh13isa_impl_wrapIN6hermes12TryStartInstEKPKNS1_14TerminatorInstES5_E4doitERS6_:
  122|    480|  static bool doit(const From &Val) {
  123|    480|    return isa_impl_wrap<To, SimpleFrom,
  124|    480|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    480|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    480|  }
_ZN4llvh4castIN6hermes12TryStartInstEKNS1_14TerminatorInstEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    240|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    240|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    240|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    240|}
_ZN4llvh16cast_convert_valIN6hermes12TryStartInstEPKNS1_14TerminatorInstES5_E4doitERKS5_:
  218|    240|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    240|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    240|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    240|    return Res2;
  222|    240|  }
_ZN4llvh13simplify_typeIKPN6hermes4PassEE18getSimplifiedValueERS4_:
   48|   686k|  static RetType getSimplifiedValue(const From& Val) {
   49|   686k|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|   686k|  }
_ZN4llvh13simplify_typeIPN6hermes4PassEE18getSimplifiedValueERS3_:
   38|   686k|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh8dyn_castIN6hermes12FunctionPassENS1_4PassEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   343k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   343k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 343k, False: 0]
  ------------------
  335|   343k|}
_ZN4llvh3isaIN6hermes12FunctionPassEPNS1_4PassEEEbRKT0_:
  142|   686k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   686k|  return isa_impl_wrap<X, const Y,
  144|   686k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   686k|}
_ZN4llvh13isa_impl_wrapIN6hermes12FunctionPassEKPNS1_4PassEPKS3_E4doitERS5_:
  122|   686k|  static bool doit(const From &Val) {
  123|   686k|    return isa_impl_wrap<To, SimpleFrom,
  124|   686k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|   686k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|   686k|  }
_ZN4llvh13isa_impl_wrapIN6hermes12FunctionPassEPKNS1_4PassES5_E4doitERKS5_:
  132|   686k|  static bool doit(const FromTy &Val) {
  133|   686k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   686k|  }
_ZN4llvh11isa_impl_clIN6hermes12FunctionPassEPKNS1_4PassEE4doitES5_:
  105|   686k|  static inline bool doit(const From *Val) {
  106|   686k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|   686k|  }
_ZN4llvh8isa_implIN6hermes12FunctionPassENS1_4PassEvE4doitERKS3_:
   58|   686k|  static inline bool doit(const From &Val) {
   59|   686k|    return To::classof(&Val);
   60|   686k|  }
_ZN4llvh4castIN6hermes12FunctionPassENS1_4PassEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  254|   343k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   343k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   343k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   343k|}
_ZN4llvh16cast_convert_valIN6hermes12FunctionPassEPNS1_4PassES4_E4doitERKS4_:
  218|   343k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   343k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   343k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   343k|    return Res2;
  222|   343k|  }
_ZN4llvh8dyn_castIN6hermes22GeneratorInnerFunctionENS1_8FunctionEEENS_10cast_rettyIT_PT0_E8ret_typeES7_:
  333|   114k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|   114k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 114k]
  ------------------
  335|   114k|}
_ZN4llvh4castIN6hermes6ESTree23FunctionDeclarationNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|  7.31k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|  7.31k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|  7.31k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|  7.31k|}
_ZN4llvh3isaIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|  7.31k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  7.31k|  return isa_impl_wrap<X, const Y,
  144|  7.31k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  7.31k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|  7.31k|  static bool doit(const From &Val) {
  123|  7.31k|    return isa_impl_wrap<To, SimpleFrom,
  124|  7.31k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  7.31k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  7.31k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|  7.31k|  static bool doit(const FromTy &Val) {
  133|  7.31k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  7.31k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree23FunctionDeclarationNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|  7.31k|  static inline bool doit(const From *Val) {
  106|  7.31k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  7.31k|  }
_ZN4llvh8isa_implIN6hermes6ESTree23FunctionDeclarationNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|  7.31k|  static inline bool doit(const From &Val) {
   59|  7.31k|    return To::classof(&Val);
   60|  7.31k|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree23FunctionDeclarationNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|  7.31k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|  7.31k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|  7.31k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|  7.31k|    return Res2;
  222|  7.31k|  }
_ZN4llvh4castIN6hermes6ESTree11ProgramNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|    112|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|    112|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|    112|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|    112|}
_ZN4llvh3isaIN6hermes6ESTree11ProgramNodeEPNS2_16FunctionLikeNodeEEEbRKT0_:
  142|    112|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    112|  return isa_impl_wrap<X, const Y,
  144|    112|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    112|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEKPNS2_16FunctionLikeNodeEPKS4_E4doitERS6_:
  122|    112|  static bool doit(const From &Val) {
  123|    112|    return isa_impl_wrap<To, SimpleFrom,
  124|    112|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    112|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    112|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11ProgramNodeEPKNS2_16FunctionLikeNodeES6_E4doitERKS6_:
  132|    112|  static bool doit(const FromTy &Val) {
  133|    112|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|    112|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11ProgramNodeEPKNS2_16FunctionLikeNodeEE4doitES6_:
  105|    112|  static inline bool doit(const From *Val) {
  106|    112|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|    112|  }
_ZN4llvh8isa_implIN6hermes6ESTree11ProgramNodeENS2_16FunctionLikeNodeEvE4doitERKS4_:
   58|    112|  static inline bool doit(const From &Val) {
   59|    112|    return To::classof(&Val);
   60|    112|  }
_ZN4llvh16cast_convert_valIN6hermes6ESTree11ProgramNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|    112|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|    112|    typename cast_retty<To, FromTy>::ret_type Res2
  220|    112|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|    112|    return Res2;
  222|    112|  }
_ZN4llvh4castIN6hermes6ESTree27ArrowFunctionExpressionNodeENS2_16FunctionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|   342k|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|   342k|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|   342k|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|   342k|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree27ArrowFunctionExpressionNodeEPNS2_16FunctionLikeNodeES5_E4doitERKS5_:
  218|   342k|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|   342k|    typename cast_retty<To, FromTy>::ret_type Res2
  220|   342k|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|   342k|    return Res2;
  222|   342k|  }
_ZN4llvh4castIN6hermes6ESTree20MemberExpressionNodeENS2_24MemberExpressionLikeNodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|     70|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     70|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     70|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     70|}
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPNS2_24MemberExpressionLikeNodeEEEbRKT0_:
  142|     70|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     70|  return isa_impl_wrap<X, const Y,
  144|     70|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     70|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPNS2_24MemberExpressionLikeNodeEPKS4_E4doitERS6_:
  122|     70|  static bool doit(const From &Val) {
  123|     70|    return isa_impl_wrap<To, SimpleFrom,
  124|     70|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     70|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     70|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeES6_E4doitERKS6_:
  132|     70|  static bool doit(const FromTy &Val) {
  133|     70|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|     70|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree20MemberExpressionNodeEPKNS2_24MemberExpressionLikeNodeEE4doitES6_:
  105|     70|  static inline bool doit(const From *Val) {
  106|     70|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|     70|  }
_ZN4llvh8isa_implIN6hermes6ESTree20MemberExpressionNodeENS2_24MemberExpressionLikeNodeEvE4doitERKS4_:
   58|     70|  static inline bool doit(const From &Val) {
   59|     70|    return To::classof(&Val);
   60|     70|  }
_ZN4llvh13simplify_typeIKPN6hermes6ESTree24MemberExpressionLikeNodeEE18getSimplifiedValueERS5_:
   48|     70|  static RetType getSimplifiedValue(const From& Val) {
   49|     70|    return simplify_type<From>::getSimplifiedValue(const_cast<From&>(Val));
   50|     70|  }
_ZN4llvh13simplify_typeIPN6hermes6ESTree24MemberExpressionLikeNodeEE18getSimplifiedValueERS4_:
   38|     70|  static SimpleType &getSimplifiedValue(From &Val) { return Val; }
_ZN4llvh16cast_convert_valIN6hermes6ESTree20MemberExpressionNodeEPNS2_24MemberExpressionLikeNodeES5_E4doitERKS5_:
  218|     70|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     70|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     70|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     70|    return Res2;
  222|     70|  }
_ZN4llvh3isaIN6hermes6ESTree11PatternNodeENS2_4NodeEEEbRKT0_:
  142|   114k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|   114k|  return isa_impl_wrap<X, const Y,
  144|   114k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|   114k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree11PatternNodeEKNS2_4NodeES5_E4doitERS5_:
  132|   114k|  static bool doit(const FromTy &Val) {
  133|   114k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|   114k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree11PatternNodeEKNS2_4NodeEE4doitERS5_:
   77|   114k|  static inline bool doit(const From &Val) {
   78|   114k|    return isa_impl<To, From>::doit(Val);
   79|   114k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree17LoopStatementNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  333|  43.4k|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|  43.4k|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 43.4k]
  ------------------
  335|  43.4k|}
_ZN4llvh3isaIN6hermes6ESTree17LoopStatementNodeEPNS2_4NodeEEEbRKT0_:
  142|  43.4k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  43.4k|  return isa_impl_wrap<X, const Y,
  144|  43.4k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  43.4k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17LoopStatementNodeEKPNS2_4NodeEPKS4_E4doitERS6_:
  122|  43.4k|  static bool doit(const From &Val) {
  123|  43.4k|    return isa_impl_wrap<To, SimpleFrom,
  124|  43.4k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  43.4k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  43.4k|  }
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17LoopStatementNodeEPKNS2_4NodeES6_E4doitERKS6_:
  132|  43.4k|  static bool doit(const FromTy &Val) {
  133|  43.4k|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|  43.4k|  }
_ZN4llvh11isa_impl_clIN6hermes6ESTree17LoopStatementNodeEPKNS2_4NodeEE4doitES6_:
  105|  43.4k|  static inline bool doit(const From *Val) {
  106|  43.4k|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|  43.4k|  }
_ZN4llvh8isa_implIN6hermes6ESTree17LoopStatementNodeENS2_4NodeEvE4doitERKS4_:
   58|  43.4k|  static inline bool doit(const From &Val) {
   59|  43.4k|    return To::classof(&Val);
   60|  43.4k|  }
_ZN4llvh12cast_or_nullIN6hermes6ESTree14IdentifierNodeENS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  297|      3|cast_or_null(Y *Val) {
  298|      3|  if (!Val) return nullptr;
  ------------------
  |  Branch (298:7): [True: 3, False: 0]
  ------------------
  299|      0|  assert(isa<X>(Val) && "cast_or_null<Ty>() argument of incompatible type!");
  300|      0|  return cast<X>(Val);
  301|      3|}
_ZN4llvh3isaIN6hermes6ESTree20MemberExpressionNodeEPKNS2_4NodeEEEbRKT0_:
  142|  4.29k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.29k|  return isa_impl_wrap<X, const Y,
  144|  4.29k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.29k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree20MemberExpressionNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  4.29k|  static bool doit(const From &Val) {
  123|  4.29k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.29k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.29k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.29k|  }
_ZN4llvh3isaIN6hermes6ESTree9EmptyNodeEPKNS2_4NodeEEEbRKT0_:
  142|  4.26k|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|  4.26k|  return isa_impl_wrap<X, const Y,
  144|  4.26k|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|  4.26k|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree9EmptyNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|  4.26k|  static bool doit(const From &Val) {
  123|  4.26k|    return isa_impl_wrap<To, SimpleFrom,
  124|  4.26k|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|  4.26k|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|  4.26k|  }
_ZN4llvh8dyn_castIN6hermes6ESTree21AssignmentPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|     97|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     97|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 97]
  ------------------
  335|     97|}
_ZN4llvh3isaIN6hermes6ESTree21AssignmentPatternNodeEPKNS2_4NodeEEEbRKT0_:
  142|     97|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|     97|  return isa_impl_wrap<X, const Y,
  144|     97|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|     97|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree21AssignmentPatternNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|     97|  static bool doit(const From &Val) {
  123|     97|    return isa_impl_wrap<To, SimpleFrom,
  124|     97|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|     97|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|     97|  }
_ZN4llvh8dyn_castIN6hermes6ESTree16ArrayPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|     97|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|     97|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 96, False: 1]
  ------------------
  335|     97|}
_ZN4llvh3isaIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeEEEbRKT0_:
  142|    193|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|    193|  return isa_impl_wrap<X, const Y,
  144|    193|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|    193|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree16ArrayPatternNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|    193|  static bool doit(const From &Val) {
  123|    193|    return isa_impl_wrap<To, SimpleFrom,
  124|    193|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|    193|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|    193|  }
_ZN4llvh4castIN6hermes6ESTree16ArrayPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  254|     96|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|     96|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|     96|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|     96|}
_ZN4llvh16cast_convert_valIN6hermes6ESTree16ArrayPatternNodeEPKNS2_4NodeES6_E4doitERKS6_:
  218|     96|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|     96|    typename cast_retty<To, FromTy>::ret_type Res2
  220|     96|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|     96|    return Res2;
  222|     96|  }
_ZN4llvh8dyn_castIN6hermes6ESTree15RestElementNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|      1|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|      1|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1]
  ------------------
  335|      1|}
_ZN4llvh3isaIN6hermes6ESTree15RestElementNodeEPKNS2_4NodeEEEbRKT0_:
  142|      1|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      1|  return isa_impl_wrap<X, const Y,
  144|      1|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      1|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree15RestElementNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|      1|  static bool doit(const From &Val) {
  123|      1|    return isa_impl_wrap<To, SimpleFrom,
  124|      1|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      1|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      1|  }
_ZN4llvh8dyn_castIN6hermes6ESTree17ObjectPatternNodeEKNS2_4NodeEEENS_10cast_rettyIT_PT0_E8ret_typeES9_:
  333|      1|LLVM_NODISCARD inline typename cast_retty<X, Y *>::ret_type dyn_cast(Y *Val) {
  334|      1|  return isa<X>(Val) ? cast<X>(Val) : nullptr;
  ------------------
  |  Branch (334:10): [True: 0, False: 1]
  ------------------
  335|      1|}
_ZN4llvh3isaIN6hermes6ESTree17ObjectPatternNodeEPKNS2_4NodeEEEbRKT0_:
  142|      1|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      1|  return isa_impl_wrap<X, const Y,
  144|      1|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      1|}
_ZN4llvh13isa_impl_wrapIN6hermes6ESTree17ObjectPatternNodeEKPKNS2_4NodeES6_E4doitERS7_:
  122|      1|  static bool doit(const From &Val) {
  123|      1|    return isa_impl_wrap<To, SimpleFrom,
  124|      1|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      1|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      1|  }
_ZN4llvh4castIN6hermes5regex11BracketInsnENS2_4InsnEEENS_10cast_rettyIT_PT0_E8ret_typeES8_:
  254|      2|inline typename cast_retty<X, Y *>::ret_type cast(Y *Val) {
  255|      2|  assert(isa<X>(Val) && "cast<Ty>() argument of incompatible type!");
  256|      0|  return cast_convert_val<X, Y*,
  257|      2|                          typename simplify_type<Y*>::SimpleType>::doit(Val);
  258|      2|}
_ZN4llvh3isaIN6hermes5regex11BracketInsnEPNS2_4InsnEEEbRKT0_:
  142|      2|template <class X, class Y> LLVM_NODISCARD inline bool isa(const Y &Val) {
  143|      2|  return isa_impl_wrap<X, const Y,
  144|      2|                       typename simplify_type<const Y>::SimpleType>::doit(Val);
  145|      2|}
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BracketInsnEKPNS2_4InsnEPKS4_E4doitERS6_:
  122|      2|  static bool doit(const From &Val) {
  123|      2|    return isa_impl_wrap<To, SimpleFrom,
  124|      2|      typename simplify_type<SimpleFrom>::SimpleType>::doit(
  125|      2|                          simplify_type<const From>::getSimplifiedValue(Val));
  126|      2|  }
_ZN4llvh13isa_impl_wrapIN6hermes5regex11BracketInsnEPKNS2_4InsnES6_E4doitERKS6_:
  132|      2|  static bool doit(const FromTy &Val) {
  133|      2|    return isa_impl_cl<To,FromTy>::doit(Val);
  134|      2|  }
_ZN4llvh11isa_impl_clIN6hermes5regex11BracketInsnEPKNS2_4InsnEE4doitES6_:
  105|      2|  static inline bool doit(const From *Val) {
  106|      2|    assert(Val && "isa<> used on a null pointer");
  107|      0|    return isa_impl<To, From>::doit(*Val);
  108|      2|  }
_ZN4llvh16cast_convert_valIN6hermes5regex11BracketInsnEPNS2_4InsnES5_E4doitERKS5_:
  218|      2|  static typename cast_retty<To, FromTy>::ret_type doit(const FromTy &Val) {
  219|      2|    typename cast_retty<To, FromTy>::ret_type Res2
  220|      2|     = (typename cast_retty<To, FromTy>::ret_type)const_cast<FromTy&>(Val);
  221|      2|    return Res2;
  222|      2|  }

_ZN4llvh2cl14OptionCategoryC2ENS_9StringRefES2_:
  181|      4|      : Name(Name), Description(Description) {
  182|      4|    registerCategory();
  183|      4|  }
_ZNK4llvh2cl14OptionCategory7getNameEv:
  185|      4|  StringRef getName() const { return Name; }
_ZNK4llvh2cl10SubCommand7getNameEv:
  215|      2|  StringRef getName() const { return Name; }
_ZNK4llvh2cl6Option21getNumOccurrencesFlagEv:
  272|     42|  inline enum NumOccurrencesFlag getNumOccurrencesFlag() const {
  273|     42|    return (enum NumOccurrencesFlag)Occurrences;
  274|     42|  }
_ZNK4llvh2cl6Option17getFormattingFlagEv:
  284|     42|  inline enum FormattingFlags getFormattingFlag() const {
  285|     42|    return (enum FormattingFlags)Formatting;
  286|     42|  }
_ZNK4llvh2cl6Option12getMiscFlagsEv:
  288|     42|  inline unsigned getMiscFlags() const { return Misc; }
_ZNK4llvh2cl6Option9hasArgStrEv:
  293|     42|  bool hasArgStr() const { return !ArgStr.empty(); }
_ZN4llvh2cl6Option14setDescriptionENS_9StringRefE:
  311|     30|  void setDescription(StringRef S) { HelpStr = S; }
_ZN4llvh2cl6Option11setValueStrENS_9StringRefE:
  312|      4|  void setValueStr(StringRef S) { ValueStr = S; }
_ZN4llvh2cl6Option21setNumOccurrencesFlagENS0_18NumOccurrencesFlagE:
  313|      2|  void setNumOccurrencesFlag(enum NumOccurrencesFlag Val) { Occurrences = Val; }
_ZN4llvh2cl6Option20setValueExpectedFlagENS0_13ValueExpectedE:
  314|     12|  void setValueExpectedFlag(enum ValueExpected Val) { Value = Val; }
_ZN4llvh2cl6Option13setHiddenFlagENS0_12OptionHiddenE:
  315|     26|  void setHiddenFlag(enum OptionHidden Val) { HiddenFlag = Val; }
_ZN4llvh2cl6Option11setCategoryERNS0_14OptionCategoryE:
  319|     14|  void setCategory(OptionCategory &C) { Category = &C; }
_ZN4llvh2cl6Option13addSubCommandERNS0_10SubCommandE:
  320|     12|  void addSubCommand(SubCommand &S) { Subs.insert(&S); }
_ZN4llvh2cl6OptionC2ENS0_18NumOccurrencesFlagENS0_12OptionHiddenE:
  326|     30|        Formatting(NormalFormatting), Misc(0), Category(&GeneralCategory) {}
_ZN4llvh2cl4descC2ENS_9StringRefE:
  384|     30|  desc(StringRef Str) : Desc(Str) {}
_ZNK4llvh2cl4desc5applyERNS0_6OptionE:
  386|     30|  void apply(Option &O) const { O.setDescription(Desc); }
_ZN4llvh2cl10value_descC2ENS_9StringRefE:
  394|      4|  value_desc(StringRef Str) : Desc(Str) {}
_ZNK4llvh2cl10value_desc5applyERNS0_6OptionE:
  396|      4|  void apply(Option &O) const { O.setValueStr(Desc); }
_ZN4llvh2cl3catC2ERNS0_14OptionCategoryE:
  435|     14|  cat(OptionCategory &c) : Category(c) {}
_ZN4llvh2cl3subC2ERNS0_10SubCommandE:
  444|     12|  sub(SubCommand &S) : Sub(S) {}
_ZN4llvh2cl11OptionValueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEaSERKS8_:
  583|      2|  OptionValue<std::string> &operator=(const std::string &V) {
  584|      2|    setValue(V);
  585|      2|    return *this;
  586|      2|  }
_ZN4llvh2cl17basic_parser_implC2ERNS0_6OptionE:
  811|     30|  basic_parser_impl(Option &) {}
_ZN4llvh2cl17basic_parser_impl10initializeEv:
  819|      6|  void initialize() {}
_ZN4llvh2cl6parserIbEC2ERNS0_6OptionE:
  865|     24|  parser(Option &O) : basic_parser(O) {}
_ZN4llvh2cl6parserIbE10initializeEv:
  870|     24|  void initialize() {}
_ZN4llvh2cl6parserIjEC2ERNS0_6OptionE:
  941|      2|  parser(Option &O) : basic_parser(O) {}
_ZN4llvh2cl6parserINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEC2ERNS0_6OptionE:
 1032|      4|  parser(Option &O) : basic_parser(O) {}
_ZN4llvh2cl10applicatorINS0_18NumOccurrencesFlagEE3optES2_RNS0_6OptionE:
 1150|      2|  static void opt(NumOccurrencesFlag N, Option &O) {
 1151|      2|    O.setNumOccurrencesFlag(N);
 1152|      2|  }
_ZN4llvh2cl10applicatorINS0_13ValueExpectedEE3optES2_RNS0_6OptionE:
 1156|     12|  static void opt(ValueExpected VE, Option &O) { O.setValueExpectedFlag(VE); }
_ZN4llvh2cl10applicatorINS0_12OptionHiddenEE3optES2_RNS0_6OptionE:
 1160|     26|  static void opt(OptionHidden OH, Option &O) { O.setHiddenFlag(OH); }
_ZN4llvh2cl15OptionValueCopyINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE8setValueERKS8_:
  512|      2|  void setValue(const DataType &V) {
  513|      2|    Valid = true;
  514|      2|    Value = V;
  515|      2|  }
_ZN4llvh2cl8locationIbEENS0_13LocationClassIT_EERS3_:
  426|      2|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      2|  return LocationClass<Ty>(L);
  428|      2|}
_ZN4llvh2cl13LocationClassIbEC2ERb:
  421|      2|  LocationClass(Ty &L) : Loc(L) {}
_ZN4llvh2cl3optIbLb1ENS0_6parserIbEEEC2IJA6_cNS0_4descENS0_12OptionHiddenENS0_13LocationClassIbEEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl11opt_storageIbLb1ELb0EEC2Ev:
 1201|      2|  opt_storage() = default;
_ZN4llvh2cl11OptionValueIbEC2Ev:
  544|      2|  OptionValue() = default;
_ZN4llvh2cl15OptionValueBaseIbLb0EEC2Ev:
  534|     14|  OptionValueBase() = default;
_ZN4llvh2cl15OptionValueCopyIbEC2Ev:
  503|     14|  OptionValueCopy() = default;
_ZN4llvh2cl18GenericOptionValueC2Ev:
  457|     30|  GenericOptionValue() = default;
_ZN4llvh2cl12basic_parserIbEC2ERNS0_6OptionE:
  854|     24|  basic_parser(Option &O) : basic_parser_impl(O) {}
_ZN4llvh2cl5applyINS0_3optIbLb1ENS0_6parserIbEEEEA6_cJNS0_4descENS0_12OptionHiddenENS0_13LocationClassIbEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA6_cE3optINS0_3optIbLb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb1ENS0_6parserIbEEEENS0_4descEJNS0_12OptionHiddenENS0_13LocationClassIbEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIbLb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZN4llvh2cl5applyINS0_3optIbLb1ENS0_6parserIbEEEENS0_12OptionHiddenEJNS0_13LocationClassIbEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl5applyINS0_3optIbLb1ENS0_6parserIbEEEENS0_13LocationClassIbEEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
_ZN4llvh2cl10applicatorINS0_13LocationClassIbEEE3optINS0_3optIbLb1ENS0_6parserIbEEEEEEvRKS3_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl13LocationClassIbE5applyINS0_3optIbLb1ENS0_6parserIbEEEEEEvRT_:
  423|      2|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
_ZN4llvh2cl11opt_storageIbLb1ELb0EE11setLocationERNS0_6OptionERb:
 1203|      2|  bool setLocation(Option &O, DataType &L) {
 1204|      2|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 2]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      2|    Location = &L;
 1207|      2|    Default = L;
 1208|      2|    return false;
 1209|      2|  }
_ZN4llvh2cl11OptionValueIbEaSIbEERS2_RKT_:
  549|      6|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      6|    this->setValue(V);
  551|      6|    return *this;
  552|      6|  }
_ZN4llvh2cl15OptionValueCopyIbE8setValueERKb:
  512|     18|  void setValue(const DataType &V) {
  513|     18|    Valid = true;
  514|     18|    Value = V;
  515|     18|  }
_ZN4llvh2cl3optIbLb1ENS0_6parserIbEEE4doneEv:
 1341|      2|  void done() {
 1342|      2|    addArgument();
 1343|      2|    Parser.initialize();
 1344|      2|  }
_ZN4llvh2cl4initIiEENS0_11initializerIT_EERKS3_:
  410|      2|template <class Ty> initializer<Ty> init(const Ty &Val) {
  411|      2|  return initializer<Ty>(Val);
  412|      2|}
_ZN4llvh2cl11initializerIiEC2ERKi:
  405|      2|  initializer(const Ty &Val) : Init(Val) {}
_ZN4llvh2cl3optIjLb0ENS0_6parserIjEEEC2IJA18_cNS0_4descENS0_12OptionHiddenENS0_11initializerIiEEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl11opt_storageIjLb0ELb0EEC2Ev:
 1264|      2|  opt_storage() : Value(DataType()), Default(DataType()) {}
_ZN4llvh2cl11OptionValueIjEC2ERKj:
  546|      2|  OptionValue(const DataType &V) { this->setValue(V); }
_ZN4llvh2cl15OptionValueBaseIjLb0EEC2Ev:
  534|      2|  OptionValueBase() = default;
_ZN4llvh2cl15OptionValueCopyIjEC2Ev:
  503|      2|  OptionValueCopy() = default;
_ZN4llvh2cl15OptionValueCopyIjE8setValueERKj:
  512|      4|  void setValue(const DataType &V) {
  513|      4|    Valid = true;
  514|      4|    Value = V;
  515|      4|  }
_ZN4llvh2cl12basic_parserIjEC2ERNS0_6OptionE:
  854|      2|  basic_parser(Option &O) : basic_parser_impl(O) {}
_ZN4llvh2cl5applyINS0_3optIjLb0ENS0_6parserIjEEEEA18_cJNS0_4descENS0_12OptionHiddenENS0_11initializerIiEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA18_cE3optINS0_3optIjLb0ENS0_6parserIjEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optIjLb0ENS0_6parserIjEEEENS0_4descEJNS0_12OptionHiddenENS0_11initializerIiEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIjLb0ENS0_6parserIjEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZN4llvh2cl5applyINS0_3optIjLb0ENS0_6parserIjEEEENS0_12OptionHiddenEJNS0_11initializerIiEEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl5applyINS0_3optIjLb0ENS0_6parserIjEEEENS0_11initializerIiEEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
_ZN4llvh2cl10applicatorINS0_11initializerIiEEE3optINS0_3optIjLb0ENS0_6parserIjEEEEEEvRKS3_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl11initializerIiE5applyINS0_3optIjLb0ENS0_6parserIjEEEEEEvRT_:
  407|      2|  template <class Opt> void apply(Opt &O) const { O.setInitialValue(Init); }
_ZN4llvh2cl3optIjLb0ENS0_6parserIjEEE15setInitialValueERKj:
 1352|      2|  void setInitialValue(const DataType &V) { this->setValue(V, true); }
_ZN4llvh2cl11opt_storageIjLb0ELb0EE8setValueIjEEvRKT_b:
 1266|      2|  template <class T> void setValue(const T &V, bool initial = false) {
 1267|      2|    Value = V;
 1268|      2|    if (initial)
  ------------------
  |  Branch (1268:9): [True: 2, False: 0]
  ------------------
 1269|      2|      Default = V;
 1270|      2|  }
_ZN4llvh2cl11OptionValueIjEaSIjEERS2_RKT_:
  549|      2|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      2|    this->setValue(V);
  551|      2|    return *this;
  552|      2|  }
_ZN4llvh2cl3optIjLb0ENS0_6parserIjEEE4doneEv:
 1341|      2|  void done() {
 1342|      2|    addArgument();
 1343|      2|    Parser.initialize();
 1344|      2|  }
Debug.cpp:_ZN4llvh2cl8locationIN12_GLOBAL__N_112DebugOnlyOptEEENS0_13LocationClassIT_EERS5_:
  426|      2|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      2|  return LocationClass<Ty>(L);
  428|      2|}
Debug.cpp:_ZN4llvh2cl13LocationClassIN12_GLOBAL__N_112DebugOnlyOptEEC2ERS3_:
  421|      2|  LocationClass(Ty &L) : Loc(L) {}
Debug.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEC2IJA11_cNS0_4descENS0_12OptionHiddenENS0_18NumOccurrencesFlagENS0_10value_descENS0_13LocationClassIS3_EENS0_13ValueExpectedEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
Debug.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_112DebugOnlyOptELb1ELb1EEC2Ev:
 1201|      2|  opt_storage() = default;
Debug.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_112DebugOnlyOptEEC2Ev:
  544|      2|  OptionValue() = default;
_ZN4llvh2cl12basic_parserINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEC2ERNS0_6OptionE:
  854|      4|  basic_parser(Option &O) : basic_parser_impl(O) {}
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEEA11_cJNS0_4descENS0_12OptionHiddenENS0_18NumOccurrencesFlagENS0_10value_descENS0_13LocationClassIS4_EENS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl10applicatorIA11_cE3optINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEEEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_4descEJNS0_12OptionHiddenENS0_18NumOccurrencesFlagENS0_10value_descENS0_13LocationClassIS4_EENS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEEEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_12OptionHiddenEJNS0_18NumOccurrencesFlagENS0_10value_descENS0_13LocationClassIS4_EENS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_18NumOccurrencesFlagEJNS0_10value_descENS0_13LocationClassIS4_EENS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_10value_descEJNS0_13LocationClassIS4_EENS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl10applicatorINS0_10value_descEE3optINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS9_11char_traitsIcEENS9_9allocatorIcEEEEEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_13LocationClassIS4_EEJNS0_13ValueExpectedEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
Debug.cpp:_ZN4llvh2cl10applicatorINS0_13LocationClassIN12_GLOBAL__N_112DebugOnlyOptEEEE3optINS0_3optIS4_Lb1ENS0_6parserINSt3__112basic_stringIcNSA_11char_traitsIcEENSA_9allocatorIcEEEEEEEEEEvRKS5_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
Debug.cpp:_ZNK4llvh2cl13LocationClassIN12_GLOBAL__N_112DebugOnlyOptEE5applyINS0_3optIS3_Lb1ENS0_6parserINSt3__112basic_stringIcNS8_11char_traitsIcEENS8_9allocatorIcEEEEEEEEEEvRT_:
  423|      2|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
Debug.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_112DebugOnlyOptELb1ELb1EE11setLocationERNS0_6OptionERS3_:
 1203|      2|  bool setLocation(Option &O, DataType &L) {
 1204|      2|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 2]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      2|    Location = &L;
 1207|      2|    Default = L;
 1208|      2|    return false;
 1209|      2|  }
Debug.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_112DebugOnlyOptEEaSIS3_EERS4_RKT_:
  549|      2|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      2|    this->setValue(V);
  551|      2|    return *this;
  552|      2|  }
Debug.cpp:_ZN4llvh2cl15OptionValueBaseIN12_GLOBAL__N_112DebugOnlyOptELb1EE8setValueIS3_EEvRKT_:
  480|      2|  template <class DT> void setValue(const DT & /*V*/) {}
Debug.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEEEEEENS0_13ValueExpectedEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
Debug.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_112DebugOnlyOptELb1ENS0_6parserINSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEE4doneEv:
 1341|      2|  void done() {
 1342|      2|    addArgument();
 1343|      2|    Parser.initialize();
 1344|      2|  }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA16_cNS0_12OptionHiddenENS0_4descEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl11opt_storageIbLb0ELb0EEC2Ev:
 1264|     12|  opt_storage() : Value(DataType()), Default(DataType()) {}
_ZN4llvh2cl11OptionValueIbEC2ERKb:
  546|     12|  OptionValue(const DataType &V) { this->setValue(V); }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA16_cJNS0_12OptionHiddenENS0_4descEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA16_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_12OptionHiddenEJNS0_4descEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_4descEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|     12|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEE4doneEv:
 1341|     12|  void done() {
 1342|     12|    addArgument();
 1343|     12|    Parser.initialize();
 1344|     12|  }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA6_cNS0_4descENS0_12OptionHiddenEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA6_cJNS0_4descENS0_12OptionHiddenEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA6_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_4descEJNS0_12OptionHiddenEEEEvPT_RKT0_DpRKT1_:
 1173|      6|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      6|  applicator<Mod>::opt(M, *O);
 1175|      6|  apply(O, Ms...);
 1176|      6|}
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_12OptionHiddenEEEvPT_RKT0_:
 1178|      6|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      6|  applicator<Mod>::opt(M, *O);
 1180|      6|}
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA11_cNS0_4descENS0_12OptionHiddenEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA11_cJNS0_4descENS0_12OptionHiddenEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA11_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZNK4llvh2cl11opt_storageIbLb0ELb0EEcvbEv:
 1276|    355|  operator DataType() const { return getValue(); }
_ZNK4llvh2cl11opt_storageIbLb0ELb0EE8getValueEv:
 1272|    355|  DataType getValue() const { return Value; }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA13_cNS0_4descENS0_12OptionHiddenEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA13_cJNS0_4descENS0_12OptionHiddenEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA13_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl8locationINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEENS0_13LocationClassIT_EERSA_:
  426|      2|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      2|  return LocationClass<Ty>(L);
  428|      2|}
_ZN4llvh2cl13LocationClassINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEC2ERS8_:
  421|      2|  LocationClass(Ty &L) : Loc(L) {}
_ZN4llvh2cl3optINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEELb1ENS0_6parserIS8_EEEC2IJA17_cNS0_10value_descENS0_4descENS0_12OptionHiddenENS0_13LocationClassIS8_EEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl11opt_storageINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEELb1ELb1EEC2Ev:
 1201|      2|  opt_storage() = default;
_ZN4llvh2cl11OptionValueINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEC2Ev:
  579|      2|  OptionValue() = default;
_ZN4llvh2cl15OptionValueCopyINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEEC2Ev:
  503|      2|  OptionValueCopy() = default;
_ZN4llvh2cl5applyINS0_3optINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELb1ENS0_6parserIS9_EEEEA17_cJNS0_10value_descENS0_4descENS0_12OptionHiddenENS0_13LocationClassIS9_EEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA17_cE3optINS0_3optINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEELb1ENS0_6parserISC_EEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELb1ENS0_6parserIS9_EEEENS0_10value_descEJNS0_4descENS0_12OptionHiddenENS0_13LocationClassIS9_EEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorINS0_10value_descEE3optINS0_3optINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEELb1ENS0_6parserISC_EEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZN4llvh2cl5applyINS0_3optINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELb1ENS0_6parserIS9_EEEENS0_4descEJNS0_12OptionHiddenENS0_13LocationClassIS9_EEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optINSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEELb1ENS0_6parserISC_EEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZN4llvh2cl5applyINS0_3optINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELb1ENS0_6parserIS9_EEEENS0_12OptionHiddenEJNS0_13LocationClassIS9_EEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl5applyINS0_3optINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEELb1ENS0_6parserIS9_EEEENS0_13LocationClassIS9_EEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
_ZN4llvh2cl10applicatorINS0_13LocationClassINSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEEEE3optINS0_3optIS9_Lb1ENS0_6parserIS9_EEEEEEvRKSA_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl13LocationClassINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEE5applyINS0_3optIS8_Lb1ENS0_6parserIS8_EEEEEEvRT_:
  423|      2|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
_ZN4llvh2cl11opt_storageINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEELb1ELb1EE11setLocationERNS0_6OptionERS8_:
 1203|      2|  bool setLocation(Option &O, DataType &L) {
 1204|      2|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 2]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      2|    Location = &L;
 1207|      2|    Default = L;
 1208|      2|    return false;
 1209|      2|  }
_ZN4llvh2cl3optINSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEELb1ENS0_6parserIS8_EEE4doneEv:
 1341|      2|  void done() {
 1342|      2|    addArgument();
 1343|      2|    Parser.initialize();
 1344|      2|  }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEE15setInitialValueERKb:
 1352|      4|  void setInitialValue(const DataType &V) { this->setValue(V, true); }
_ZN4llvh2cl10SubCommandC2Ev:
  209|      4|  SubCommand() = default;
_ZN4llvh2cl11opt_storageIbLb0ELb0EE8setValueIbEEvRKT_b:
 1266|      4|  template <class T> void setValue(const T &V, bool initial = false) {
 1267|      4|    Value = V;
 1268|      4|    if (initial)
  ------------------
  |  Branch (1268:9): [True: 4, False: 0]
  ------------------
 1269|      4|      Default = V;
 1270|      4|  }
CommandLine.cpp:_ZN4llvh2cl8locationIN12_GLOBAL__N_111HelpPrinterEEENS0_13LocationClassIT_EERS5_:
  426|      4|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      4|  return LocationClass<Ty>(L);
  428|      4|}
CommandLine.cpp:_ZN4llvh2cl13LocationClassIN12_GLOBAL__N_111HelpPrinterEEC2ERS3_:
  421|      4|  LocationClass(Ty &L) : Loc(L) {}
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEC2IJA10_cNS0_4descENS0_13LocationClassIS3_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_111HelpPrinterELb1ELb1EEC2Ev:
 1201|      4|  opt_storage() = default;
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_111HelpPrinterEEC2Ev:
  544|      4|  OptionValue() = default;
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEA10_cJNS0_4descENS0_13LocationClassIS4_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorIA10_cE3optINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_4descEJNS0_13LocationClassIS4_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_13LocationClassIS4_EEJNS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_13LocationClassIN12_GLOBAL__N_111HelpPrinterEEEE3optINS0_3optIS4_Lb1ENS0_6parserIbEEEEEEvRKS5_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl13LocationClassIN12_GLOBAL__N_111HelpPrinterEE5applyINS0_3optIS3_Lb1ENS0_6parserIbEEEEEEvRT_:
  423|      4|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_111HelpPrinterELb1ELb1EE11setLocationERNS0_6OptionERS3_:
 1203|      4|  bool setLocation(Option &O, DataType &L) {
 1204|      4|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 4]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      4|    Location = &L;
 1207|      4|    Default = L;
 1208|      4|    return false;
 1209|      4|  }
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_111HelpPrinterEEaSIS3_EERS4_RKT_:
  549|      4|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      4|    this->setValue(V);
  551|      4|    return *this;
  552|      4|  }
CommandLine.cpp:_ZN4llvh2cl15OptionValueBaseIN12_GLOBAL__N_111HelpPrinterELb1EE8setValueIS3_EEvRKT_:
  480|      4|  template <class DT> void setValue(const DT & /*V*/) {}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_12OptionHiddenEJNS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_13ValueExpectedEJNS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_3catEJNS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_3catEE3optINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl3cat5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvRT_:
  437|      4|  template <class Opt> void apply(Opt &O) const { O.setCategory(Category); }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEENS0_3subEEEvPT_RKT0_:
 1178|      4|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      4|  applicator<Mod>::opt(M, *O);
 1180|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_3subEE3optINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl3sub5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvRT_:
  446|      4|  template <class Opt> void apply(Opt &O) const { O.addSubCommand(Sub); }
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEE4doneEv:
 1341|      4|  void done() {
 1342|      4|    addArgument();
 1343|      4|    Parser.initialize();
 1344|      4|  }
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEC2IJA17_cNS0_4descENS0_13LocationClassIS3_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEA17_cJNS0_4descENS0_13LocationClassIS4_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorIA17_cE3optINS0_3optIN12_GLOBAL__N_111HelpPrinterELb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl8locationIN12_GLOBAL__N_118HelpPrinterWrapperEEENS0_13LocationClassIT_EERS5_:
  426|      4|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      4|  return LocationClass<Ty>(L);
  428|      4|}
CommandLine.cpp:_ZN4llvh2cl13LocationClassIN12_GLOBAL__N_118HelpPrinterWrapperEEC2ERS3_:
  421|      4|  LocationClass(Ty &L) : Loc(L) {}
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEC2IJA5_cNS0_4descENS0_13LocationClassIS3_EENS0_13ValueExpectedENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_118HelpPrinterWrapperELb1ELb1EEC2Ev:
 1201|      4|  opt_storage() = default;
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_118HelpPrinterWrapperEEC2Ev:
  544|      4|  OptionValue() = default;
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEA5_cJNS0_4descENS0_13LocationClassIS4_EENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorIA5_cE3optINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_4descEJNS0_13LocationClassIS4_EENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_13LocationClassIS4_EEJNS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_13LocationClassIN12_GLOBAL__N_118HelpPrinterWrapperEEEE3optINS0_3optIS4_Lb1ENS0_6parserIbEEEEEEvRKS5_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl13LocationClassIN12_GLOBAL__N_118HelpPrinterWrapperEE5applyINS0_3optIS3_Lb1ENS0_6parserIbEEEEEEvRT_:
  423|      4|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_118HelpPrinterWrapperELb1ELb1EE11setLocationERNS0_6OptionERS3_:
 1203|      4|  bool setLocation(Option &O, DataType &L) {
 1204|      4|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 4]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      4|    Location = &L;
 1207|      4|    Default = L;
 1208|      4|    return false;
 1209|      4|  }
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_118HelpPrinterWrapperEEaSIS3_EERS4_RKT_:
  549|      4|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      4|    this->setValue(V);
  551|      4|    return *this;
  552|      4|  }
CommandLine.cpp:_ZN4llvh2cl15OptionValueBaseIN12_GLOBAL__N_118HelpPrinterWrapperELb1EE8setValueIS3_EEvRKT_:
  480|      4|  template <class DT> void setValue(const DT & /*V*/) {}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_13ValueExpectedEJNS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_3catEJNS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_3catEE3optINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl3cat5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvRT_:
  437|      4|  template <class Opt> void apply(Opt &O) const { O.setCategory(Category); }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_3subEEEvPT_RKT0_:
 1178|      4|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      4|  applicator<Mod>::opt(M, *O);
 1180|      4|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_3subEE3optINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl3sub5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvRT_:
  446|      4|  template <class Opt> void apply(Opt &O) const { O.addSubCommand(Sub); }
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEE4doneEv:
 1341|      4|  void done() {
 1342|      4|    addArgument();
 1343|      4|    Parser.initialize();
 1344|      4|  }
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEC2IJA12_cNS0_4descENS0_13LocationClassIS3_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEA12_cJNS0_4descENS0_13LocationClassIS4_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorIA12_cE3optINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_4descEJNS0_13LocationClassIS4_EENS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_13LocationClassIS4_EEJNS0_12OptionHiddenENS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_118HelpPrinterWrapperELb1ENS0_6parserIbEEEENS0_12OptionHiddenEJNS0_13ValueExpectedENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl4initIbEENS0_11initializerIT_EERKS3_:
  410|      4|template <class Ty> initializer<Ty> init(const Ty &Val) {
  411|      4|  return initializer<Ty>(Val);
  412|      4|}
_ZN4llvh2cl11initializerIbEC2ERKb:
  405|      4|  initializer(const Ty &Val) : Init(Val) {}
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA14_cNS0_4descENS0_12OptionHiddenENS0_11initializerIbEENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA14_cJNS0_4descENS0_12OptionHiddenENS0_11initializerIbEENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA14_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_4descEJNS0_12OptionHiddenENS0_11initializerIbEENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_12OptionHiddenEJNS0_11initializerIbEENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_11initializerIbEEJNS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
_ZN4llvh2cl10applicatorINS0_11initializerIbEEE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvRKS3_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl11initializerIbE5applyINS0_3optIbLb0ENS0_6parserIbEEEEEEvRT_:
  407|      4|  template <class Opt> void apply(Opt &O) const { O.setInitialValue(Init); }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_3catEJNS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      4|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      4|  applicator<Mod>::opt(M, *O);
 1175|      4|  apply(O, Ms...);
 1176|      4|}
_ZN4llvh2cl10applicatorINS0_3catEE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl3cat5applyINS0_3optIbLb0ENS0_6parserIbEEEEEEvRT_:
  437|      4|  template <class Opt> void apply(Opt &O) const { O.setCategory(Category); }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEENS0_3subEEEvPT_RKT0_:
 1178|      4|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      4|  applicator<Mod>::opt(M, *O);
 1180|      4|}
_ZN4llvh2cl10applicatorINS0_3subEE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      4|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
_ZNK4llvh2cl3sub5applyINS0_3optIbLb0ENS0_6parserIbEEEEEEvRT_:
  446|      4|  template <class Opt> void apply(Opt &O) const { O.addSubCommand(Sub); }
_ZN4llvh2cl3optIbLb0ENS0_6parserIbEEEC2IJA18_cNS0_4descENS0_12OptionHiddenENS0_11initializerIbEENS0_3catENS0_3subEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
_ZN4llvh2cl5applyINS0_3optIbLb0ENS0_6parserIbEEEEA18_cJNS0_4descENS0_12OptionHiddenENS0_11initializerIbEENS0_3catENS0_3subEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
_ZN4llvh2cl10applicatorIA18_cE3optINS0_3optIbLb0ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl8locationIN12_GLOBAL__N_114VersionPrinterEEENS0_13LocationClassIT_EERS5_:
  426|      2|template <class Ty> LocationClass<Ty> location(Ty &L) {
  427|      2|  return LocationClass<Ty>(L);
  428|      2|}
CommandLine.cpp:_ZN4llvh2cl13LocationClassIN12_GLOBAL__N_114VersionPrinterEEC2ERS3_:
  421|      2|  LocationClass(Ty &L) : Loc(L) {}
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEC2IJA8_cNS0_4descENS0_13LocationClassIS3_EENS0_13ValueExpectedENS0_3catEEEEDpRKT_:
 1363|      2|      : Option(Optional, NotHidden), Parser(*this) {
 1364|      2|    apply(this, Ms...);
 1365|      2|    done();
 1366|      2|  }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_114VersionPrinterELb1ELb1EEC2Ev:
 1201|      2|  opt_storage() = default;
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_114VersionPrinterEEC2Ev:
  544|      2|  OptionValue() = default;
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEEA8_cJNS0_4descENS0_13LocationClassIS4_EENS0_13ValueExpectedENS0_3catEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorIA8_cE3optINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEEEEvNS_9StringRefERT_:
 1134|      2|  template <class Opt> static void opt(StringRef Str, Opt &O) {
 1135|      2|    O.setArgStr(Str);
 1136|      2|  }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEENS0_4descEJNS0_13LocationClassIS4_EENS0_13ValueExpectedENS0_3catEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_4descEE3optINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEENS0_13LocationClassIS4_EEJNS0_13ValueExpectedENS0_3catEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_13LocationClassIN12_GLOBAL__N_114VersionPrinterEEEE3optINS0_3optIS4_Lb1ENS0_6parserIbEEEEEEvRKS5_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl13LocationClassIN12_GLOBAL__N_114VersionPrinterEE5applyINS0_3optIS3_Lb1ENS0_6parserIbEEEEEEvRT_:
  423|      2|  template <class Opt> void apply(Opt &O) const { O.setLocation(O, Loc); }
CommandLine.cpp:_ZN4llvh2cl11opt_storageIN12_GLOBAL__N_114VersionPrinterELb1ELb1EE11setLocationERNS0_6OptionERS3_:
 1203|      2|  bool setLocation(Option &O, DataType &L) {
 1204|      2|    if (Location)
  ------------------
  |  Branch (1204:9): [True: 0, False: 2]
  ------------------
 1205|      0|      return O.error("cl::location(x) specified more than once!");
 1206|      2|    Location = &L;
 1207|      2|    Default = L;
 1208|      2|    return false;
 1209|      2|  }
CommandLine.cpp:_ZN4llvh2cl11OptionValueIN12_GLOBAL__N_114VersionPrinterEEaSIS3_EERS4_RKT_:
  549|      2|  template <class DT> OptionValue<DataType> &operator=(const DT &V) {
  550|      2|    this->setValue(V);
  551|      2|    return *this;
  552|      2|  }
CommandLine.cpp:_ZN4llvh2cl15OptionValueBaseIN12_GLOBAL__N_114VersionPrinterELb1EE8setValueIS3_EEvRKT_:
  480|      2|  template <class DT> void setValue(const DT & /*V*/) {}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEENS0_13ValueExpectedEJNS0_3catEEEEvPT_RKT0_DpRKT1_:
 1173|      2|void apply(Opt *O, const Mod &M, const Mods &... Ms) {
 1174|      2|  applicator<Mod>::opt(M, *O);
 1175|      2|  apply(O, Ms...);
 1176|      2|}
CommandLine.cpp:_ZN4llvh2cl5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEENS0_3catEEEvPT_RKT0_:
 1178|      2|template <class Opt, class Mod> void apply(Opt *O, const Mod &M) {
 1179|      2|  applicator<Mod>::opt(M, *O);
 1180|      2|}
CommandLine.cpp:_ZN4llvh2cl10applicatorINS0_3catEE3optINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEEEEvRKS2_RT_:
 1129|      2|  template <class Opt> static void opt(const Mod &M, Opt &O) { M.apply(O); }
CommandLine.cpp:_ZNK4llvh2cl3cat5applyINS0_3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEEEEEvRT_:
  437|      2|  template <class Opt> void apply(Opt &O) const { O.setCategory(Category); }
CommandLine.cpp:_ZN4llvh2cl3optIN12_GLOBAL__N_114VersionPrinterELb1ENS0_6parserIbEEE4doneEv:
 1341|      2|  void done() {
 1342|      2|    addArgument();
 1343|      2|    Parser.initialize();
 1344|      2|  }

_ZN4llvh7djbHashENS_9StringRefEj:
   22|  17.9k|inline uint32_t djbHash(StringRef Buffer, uint32_t H = 5381) {
   23|  17.9k|  for (unsigned char C : Buffer.bytes())
  ------------------
  |  Branch (23:24): [True: 970k, False: 17.9k]
  ------------------
   24|   970k|    H = (H << 5) + H + C;
   25|  17.9k|  return H;
   26|  17.9k|}

_ZN4llvh7support6endian17system_endiannessEv:
   47|  2.98M|constexpr endianness system_endianness() {
   48|  2.98M|  return sys::IsBigEndianHost ? big : little;
  ------------------
  |  Branch (48:10): [Folded - Ignored]
  ------------------
   49|  2.98M|}
_ZN4llvh7support6endian9byte_swapIjEET_S3_NS0_10endiannessE:
   52|   474k|inline value_type byte_swap(value_type value, endianness endian) {
   53|   474k|  if ((endian != native) && (endian != system_endianness()))
  ------------------
  |  Branch (53:7): [True: 474k, False: 0]
  |  Branch (53:29): [True: 0, False: 474k]
  ------------------
   54|      0|    sys::swapByteOrder(value);
   55|   474k|  return value;
   56|   474k|}
_ZN4llvh7support6endian5writeIjLm1EEEvPvT_NS0_10endiannessE:
  100|   474k|inline void write(void *memory, value_type value, endianness endian) {
  101|   474k|  value = byte_swap<value_type>(value, endian);
  102|   474k|  memcpy(LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|   474k|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
  103|   474k|             memory, (detail::PickAlignment<value_type, alignment>::value)),
  104|   474k|         &value, sizeof(value_type));
  105|   474k|}
_ZN4llvh7support6endian4readIhLm1EEET_PKvNS0_10endiannessE:
   66|  2.29k|inline value_type read(const void *memory, endianness endian) {
   67|  2.29k|  value_type ret;
   68|       |
   69|  2.29k|  memcpy(&ret,
   70|  2.29k|         LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|  2.29k|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
   71|  2.29k|             memory, (detail::PickAlignment<value_type, alignment>::value)),
   72|  2.29k|         sizeof(value_type));
   73|  2.29k|  return byte_swap<value_type>(ret, endian);
   74|  2.29k|}
_ZN4llvh7support6endian9byte_swapIhEET_S3_NS0_10endiannessE:
   52|  4.10k|inline value_type byte_swap(value_type value, endianness endian) {
   53|  4.10k|  if ((endian != native) && (endian != system_endianness()))
  ------------------
  |  Branch (53:7): [True: 4.10k, False: 0]
  |  Branch (53:29): [True: 0, False: 4.10k]
  ------------------
   54|      0|    sys::swapByteOrder(value);
   55|  4.10k|  return value;
   56|  4.10k|}
_ZN4llvh7support6endian4readIdLm1EEET_PKvNS0_10endiannessE:
   66|      1|inline value_type read(const void *memory, endianness endian) {
   67|      1|  value_type ret;
   68|       |
   69|      1|  memcpy(&ret,
   70|      1|         LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|      1|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
   71|      1|             memory, (detail::PickAlignment<value_type, alignment>::value)),
   72|      1|         sizeof(value_type));
   73|      1|  return byte_swap<value_type>(ret, endian);
   74|      1|}
_ZN4llvh7support6endian9byte_swapIdEET_S3_NS0_10endiannessE:
   52|      2|inline value_type byte_swap(value_type value, endianness endian) {
   53|      2|  if ((endian != native) && (endian != system_endianness()))
  ------------------
  |  Branch (53:7): [True: 2, False: 0]
  |  Branch (53:29): [True: 0, False: 2]
  ------------------
   54|      0|    sys::swapByteOrder(value);
   55|      2|  return value;
   56|      2|}
_ZN4llvh7support6endian4readIiLm1EEET_PKvNS0_10endiannessE:
   66|   457k|inline value_type read(const void *memory, endianness endian) {
   67|   457k|  value_type ret;
   68|       |
   69|   457k|  memcpy(&ret,
   70|   457k|         LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|   457k|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
   71|   457k|             memory, (detail::PickAlignment<value_type, alignment>::value)),
   72|   457k|         sizeof(value_type));
   73|   457k|  return byte_swap<value_type>(ret, endian);
   74|   457k|}
_ZN4llvh7support6endian9byte_swapIiEET_S3_NS0_10endiannessE:
   52|   457k|inline value_type byte_swap(value_type value, endianness endian) {
   53|   457k|  if ((endian != native) && (endian != system_endianness()))
  ------------------
  |  Branch (53:7): [True: 457k, False: 0]
  |  Branch (53:29): [True: 0, False: 457k]
  ------------------
   54|      0|    sys::swapByteOrder(value);
   55|   457k|  return value;
   56|   457k|}
_ZN4llvh7support6endian5writeIDsLNS0_10endiannessE1ELm0EEEvPvT_:
  110|  2.04M|inline void write(void *memory, value_type value) {
  111|  2.04M|  write<value_type, alignment>(memory, value, endian);
  112|  2.04M|}
_ZN4llvh7support6endian5writeIDsLm0EEEvPvT_NS0_10endiannessE:
  100|  2.04M|inline void write(void *memory, value_type value, endianness endian) {
  101|  2.04M|  value = byte_swap<value_type>(value, endian);
  102|  2.04M|  memcpy(LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|  2.04M|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
  103|  2.04M|             memory, (detail::PickAlignment<value_type, alignment>::value)),
  104|  2.04M|         &value, sizeof(value_type));
  105|  2.04M|}
_ZN4llvh7support6endian9byte_swapIDsEET_S3_NS0_10endiannessE:
   52|  2.04M|inline value_type byte_swap(value_type value, endianness endian) {
   53|  2.04M|  if ((endian != native) && (endian != system_endianness()))
  ------------------
  |  Branch (53:7): [True: 2.04M, False: 0]
  |  Branch (53:29): [True: 0, False: 2.04M]
  ------------------
   54|      0|    sys::swapByteOrder(value);
   55|  2.04M|  return value;
   56|  2.04M|}
_ZN4llvh7support6endian5writeIdLm1EEEvPvT_NS0_10endiannessE:
  100|      1|inline void write(void *memory, value_type value, endianness endian) {
  101|      1|  value = byte_swap<value_type>(value, endian);
  102|      1|  memcpy(LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|      1|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
  103|      1|             memory, (detail::PickAlignment<value_type, alignment>::value)),
  104|      1|         &value, sizeof(value_type));
  105|      1|}
_ZN4llvh7support6endian5writeIhLm1EEEvPvT_NS0_10endiannessE:
  100|  1.81k|inline void write(void *memory, value_type value, endianness endian) {
  101|  1.81k|  value = byte_swap<value_type>(value, endian);
  102|  1.81k|  memcpy(LLVM_ASSUME_ALIGNED(
  ------------------
  |  |  324|  1.81k|# define LLVM_ASSUME_ALIGNED(p, a) __builtin_assume_aligned(p, a)
  ------------------
  103|  1.81k|             memory, (detail::PickAlignment<value_type, alignment>::value)),
  104|  1.81k|         &value, sizeof(value_type));
  105|  1.81k|}

_ZN4llvh7ErrorOrIPvE10getStorageEv:
  243|  3.30k|  storage_type *getStorage() {
  244|  3.30k|    assert(!HasError && "Cannot get value when an error exists!");
  245|      0|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|  3.30k|  }
_ZN4llvh7ErrorOrIPvED2Ev:
  147|  1.20k|  ~ErrorOr() {
  148|  1.20k|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 1.20k, False: 0]
  ------------------
  149|  1.20k|      getStorage()->~storage_type();
  150|  1.20k|  }
_ZN4llvh7ErrorOrIPvEdeEv:
  170|    500|  reference operator *() {
  171|    500|    return *getStorage();
  172|    500|  }
_ZNK4llvh7ErrorOrIPvEcvbEv:
  153|  1.50k|  explicit operator bool() const {
  154|  1.50k|    return !HasError;
  155|  1.50k|  }
_ZN4llvh7ErrorOrIPvE3getEv:
  157|     99|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIPvEC2EOS2_:
  115|    302|  ErrorOr(ErrorOr &&Other) {
  116|    302|    moveConstruct(std::move(Other));
  117|    302|  }
_ZN4llvh7ErrorOrIPvE13moveConstructIS1_EEvONS0_IT_EE:
  210|    302|  void moveConstruct(ErrorOr<OtherT> &&Other) {
  211|    302|    if (!Other.HasError) {
  ------------------
  |  Branch (211:9): [True: 302, False: 0]
  ------------------
  212|       |      // Get the other value.
  213|    302|      HasError = false;
  214|    302|      new (getStorage()) storage_type(std::move(*Other.getStorage()));
  215|    302|    } else {
  216|       |      // Get other's error.
  217|      0|      HasError = true;
  218|      0|      new (getErrorStorage()) std::error_code(Other.getError());
  219|      0|    }
  220|    302|  }
_ZN4llvh7ErrorOrIPvEC2IS1_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS4_S1_EE5valueEvE4typeE:
   91|    802|      : HasError(false) {
   92|    802|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    802|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEEC2IS3_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS6_S3_EE5valueEvE4typeE:
   91|    203|      : HasError(false) {
   92|    203|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    203|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEE10getStorageEv:
  243|    609|  storage_type *getStorage() {
  244|    609|    assert(!HasError && "Cannot get value when an error exists!");
  245|      0|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|    609|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEED2Ev:
  147|    203|  ~ErrorOr() {
  148|    203|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 203, False: 0]
  ------------------
  149|    203|      getStorage()->~storage_type();
  150|    203|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE10getStorageEv:
  243|    817|  storage_type *getStorage() {
  244|    817|    assert(!HasError && "Cannot get value when an error exists!");
  245|      0|    return reinterpret_cast<storage_type*>(TStorage.buffer);
  246|    817|  }
_ZNK4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEcvbEv:
  153|    203|  explicit operator bool() const {
  154|    203|    return !HasError;
  155|    203|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE3getEv:
  157|    203|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEptEv:
  164|    208|  pointer operator ->() {
  165|    208|    return toPointer(getStorage());
  166|    208|  }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEE9toPointerEPS4_:
  231|    208|  pointer toPointer(pointer Val) {
  232|    208|    return Val;
  233|    208|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEED2Ev:
  147|    203|  ~ErrorOr() {
  148|    203|    if (!HasError)
  ------------------
  |  Branch (148:9): [True: 203, False: 0]
  ------------------
  149|    203|      getStorage()->~storage_type();
  150|    203|  }
_ZNK4llvh7ErrorOrIN6hermes2vm14AlignedStorageEEcvbEv:
  153|    203|  explicit operator bool() const {
  154|    203|    return !HasError;
  155|    203|  }
_ZN4llvh7ErrorOrIN6hermes2vm14AlignedStorageEE3getEv:
  157|    203|  reference get() { return *getStorage(); }
_ZN4llvh7ErrorOrIN6hermes2vm7HadesGC11HeapSegmentEEC2IS4_EEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS7_S4_EE5valueEvE4typeE:
   91|    203|      : HasError(false) {
   92|    203|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|    203|  }
_ZN4llvh7ErrorOrIPvEC2IPcEEOT_PNSt3__19enable_ifIXsr3std14is_convertibleIS5_S1_EE5valueEvE4typeE:
   91|     99|      : HasError(false) {
   92|     99|    new (getStorage()) storage_type(std::forward<OtherT>(Val));
   93|     99|  }

_ZN4llvh20format_hex_no_prefixEmjb:
  200|    688|                                            bool Upper = false) {
  201|    688|  assert(Width <= 16 && "hex width must be <= 16");
  202|      0|  return FormattedNumber(N, 0, Width, true, Upper, false);
  203|    688|}
_ZN4llvh15FormattedNumberC2Emljbbb:
  177|    688|        HexPrefix(Prefix) {}

_ZNK4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE7getNodeEPKS2_:
  329|    318|  DomTreeNodeBase<NodeT> *getNode(const NodeT *BB) const {
  330|    318|    auto I = DomTreeNodes.find(BB);
  331|    318|    if (I != DomTreeNodes.end())
  ------------------
  |  Branch (331:9): [True: 158, False: 160]
  ------------------
  332|    158|      return I->second.get();
  333|    160|    return nullptr;
  334|    318|  }
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE5resetEv:
  763|      2|  void reset() {
  764|      2|    DomTreeNodes.clear();
  765|      2|    Roots.clear();
  766|      2|    RootNode = nullptr;
  767|      2|    Parent = nullptr;
  768|      2|    DFSInfoValid = false;
  769|      2|    SlowQueries = 0;
  770|      2|  }
_ZNK4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE8getBlockEv:
   82|      2|  NodeT *getBlock() const { return TheBB; }
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EEC2Ev:
  255|      2|  DominatorTreeBase() {}
_ZN4llvh17DominatorTreeBaseIN6hermes10BasicBlockELb0EE11recalculateERNS1_8FunctionE:
  732|      2|  void recalculate(ParentType &Func) {
  733|      2|    Parent = &Func;
  734|      2|    DomTreeBuilder::Calculate(*this);
  735|      2|  }
_ZN4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEEC2EPS2_PS3_:
   71|    160|      : TheBB(BB), IDom(iDom), Level(IDom ? IDom->Level + 1 : 0) {}
_ZN4llvh15DomTreeNodeBaseIN6hermes10BasicBlockEE8addChildENSt3__110unique_ptrIS3_NS4_14default_deleteIS3_EEEE:
   89|    158|      std::unique_ptr<DomTreeNodeBase> C) {
   90|    158|    Children.push_back(C.get());
   91|    158|    return C;
   92|    158|  }

_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEEC2EPNS6_15BatchUpdateInfoE:
   97|      2|  SemiNCAInfo(BatchUpdatePtr BUI) : BatchUpdates(BUI) {}
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE14ChildrenGetterILb0EE3GetEPS4_PNS6_15BatchUpdateInfoE:
  126|    160|    static ResultTy Get(NodePtr N, BatchUpdatePtr BUI) {
  127|    160|      ResultTy Res = Get(N, Tag());
  128|       |      // If there's no batch update in progress, simply return node's children.
  129|    160|      if (!BUI) return Res;
  ------------------
  |  Branch (129:11): [True: 160, False: 0]
  ------------------
  130|       |
  131|       |      // CFG children are actually its *most current* children, and we have to
  132|       |      // reverse-apply the future updates to get the node's children at the
  133|       |      // point in time the update was performed.
  134|      0|      auto &FutureChildren = (Inverse != IsPostDom) ? BUI->FuturePredecessors
  ------------------
  |  Branch (134:30): [Folded - Ignored]
  ------------------
  135|      0|                                                    : BUI->FutureSuccessors;
  136|      0|      auto FCIt = FutureChildren.find(N);
  137|      0|      if (FCIt == FutureChildren.end()) return Res;
  ------------------
  |  Branch (137:11): [True: 0, False: 0]
  ------------------
  138|       |
  139|      0|      for (auto ChildAndKind : FCIt->second) {
  ------------------
  |  Branch (139:30): [True: 0, False: 0]
  ------------------
  140|      0|        const NodePtr Child = ChildAndKind.getPointer();
  141|      0|        const UpdateKind UK = ChildAndKind.getInt();
  142|       |
  143|       |        // Reverse-apply the future update.
  144|      0|        if (UK == UpdateKind::Insert) {
  ------------------
  |  Branch (144:13): [True: 0, False: 0]
  ------------------
  145|       |          // If there's an insertion in the future, it means that the edge must
  146|       |          // exist in the current CFG, but was not present in it before.
  147|      0|          assert(llvh::find(Res, Child) != Res.end()
  148|      0|                 && "Expected child not found in the CFG");
  149|      0|          Res.erase(std::remove(Res.begin(), Res.end(), Child), Res.end());
  150|      0|          LLVM_DEBUG(dbgs() << "\tHiding edge " << BlockNamePrinter(N) << " -> "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  151|      0|                            << BlockNamePrinter(Child) << "\n");
  152|      0|        } else {
  153|       |          // If there's an deletion in the future, it means that the edge cannot
  154|       |          // exist in the current CFG, but existed in it before.
  155|      0|          assert(llvh::find(Res, Child) == Res.end() &&
  156|      0|                 "Unexpected child found in the CFG");
  157|      0|          LLVM_DEBUG(dbgs() << "\tShowing virtual edge " << BlockNamePrinter(N)
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  158|      0|                            << " -> " << BlockNamePrinter(Child) << "\n");
  159|      0|          Res.push_back(Child);
  160|      0|        }
  161|      0|      }
  162|       |
  163|      0|      return Res;
  164|      0|    }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE14ChildrenGetterILb0EE3GetEPS4_NSt3__117integral_constantIbLb0EEE:
  110|    160|    static ResultTy Get(NodePtr N, std::integral_constant<bool, false>) {
  111|    160|      auto RChildren = reverse(children<NodePtr>(N));
  112|    160|      return ResultTy(RChildren.begin(), RChildren.end());
  113|    160|    }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE10runSemiNCAERS5_j:
  297|      2|  void runSemiNCA(DomTreeT &DT, const unsigned MinLevel = 0) {
  298|      2|    const unsigned NextDFSNum(NumToNode.size());
  299|       |    // Initialize IDoms to spanning tree parents.
  300|    162|    for (unsigned i = 1; i < NextDFSNum; ++i) {
  ------------------
  |  Branch (300:26): [True: 160, False: 2]
  ------------------
  301|    160|      const NodePtr V = NumToNode[i];
  302|    160|      auto &VInfo = NodeToInfo[V];
  303|    160|      VInfo.IDom = NumToNode[VInfo.Parent];
  304|    160|    }
  305|       |
  306|       |    // Step #1: Calculate the semidominators of all vertices.
  307|    160|    for (unsigned i = NextDFSNum - 1; i >= 2; --i) {
  ------------------
  |  Branch (307:39): [True: 158, False: 2]
  ------------------
  308|    158|      NodePtr W = NumToNode[i];
  309|    158|      auto &WInfo = NodeToInfo[W];
  310|       |
  311|       |      // Initialize the semi dominator to point to the parent node.
  312|    158|      WInfo.Semi = WInfo.Parent;
  313|    160|      for (const auto &N : WInfo.ReverseChildren) {
  ------------------
  |  Branch (313:26): [True: 160, False: 158]
  ------------------
  314|    160|        if (NodeToInfo.count(N) == 0)  // Skip unreachable predecessors.
  ------------------
  |  Branch (314:13): [True: 0, False: 160]
  ------------------
  315|      0|          continue;
  316|       |
  317|    160|        const TreeNodePtr TN = DT.getNode(N);
  318|       |        // Skip predecessors whose level is above the subtree we are processing.
  319|    160|        if (TN && TN->getLevel() < MinLevel)
  ------------------
  |  Branch (319:13): [True: 0, False: 160]
  |  Branch (319:19): [True: 0, False: 0]
  ------------------
  320|      0|          continue;
  321|       |
  322|    160|        unsigned SemiU = NodeToInfo[eval(N, i + 1)].Semi;
  323|    160|        if (SemiU < WInfo.Semi) WInfo.Semi = SemiU;
  ------------------
  |  Branch (323:13): [True: 2, False: 158]
  ------------------
  324|    160|      }
  325|    158|    }
  326|       |
  327|       |    // Step #2: Explicitly define the immediate dominator of each vertex.
  328|       |    //          IDom[i] = NCA(SDom[i], SpanningTreeParent(i)).
  329|       |    // Note that the parents were stored in IDoms and later got invalidated
  330|       |    // during path compression in Eval.
  331|    160|    for (unsigned i = 2; i < NextDFSNum; ++i) {
  ------------------
  |  Branch (331:26): [True: 158, False: 2]
  ------------------
  332|    158|      const NodePtr W = NumToNode[i];
  333|    158|      auto &WInfo = NodeToInfo[W];
  334|    158|      const unsigned SDomNum = NodeToInfo[NumToNode[WInfo.Semi]].DFSNum;
  335|    158|      NodePtr WIDomCandidate = WInfo.IDom;
  336|    160|      while (NodeToInfo[WIDomCandidate].DFSNum > SDomNum)
  ------------------
  |  Branch (336:14): [True: 2, False: 158]
  ------------------
  337|      2|        WIDomCandidate = NodeToInfo[WIDomCandidate].IDom;
  338|       |
  339|    158|      WInfo.IDom = WIDomCandidate;
  340|    158|    }
  341|      2|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE4evalEPS4_j:
  258|    160|  NodePtr eval(NodePtr VIn, unsigned LastLinked) {
  259|    160|    auto &VInInfo = NodeToInfo[VIn];
  260|    160|    if (VInInfo.DFSNum < LastLinked)
  ------------------
  |  Branch (260:9): [True: 160, False: 0]
  ------------------
  261|    160|      return VIn;
  262|       |
  263|      0|    SmallVector<NodePtr, 32> Work;
  264|      0|    SmallPtrSet<NodePtr, 32> Visited;
  265|       |
  266|      0|    if (VInInfo.Parent >= LastLinked)
  ------------------
  |  Branch (266:9): [True: 0, False: 0]
  ------------------
  267|      0|      Work.push_back(VIn);
  268|       |
  269|      0|    while (!Work.empty()) {
  ------------------
  |  Branch (269:12): [True: 0, False: 0]
  ------------------
  270|      0|      NodePtr V = Work.back();
  271|      0|      auto &VInfo = NodeToInfo[V];
  272|      0|      NodePtr VAncestor = NumToNode[VInfo.Parent];
  273|       |
  274|       |      // Process Ancestor first
  275|      0|      if (Visited.insert(VAncestor).second && VInfo.Parent >= LastLinked) {
  ------------------
  |  Branch (275:11): [True: 0, False: 0]
  |  Branch (275:11): [True: 0, False: 0]
  |  Branch (275:47): [True: 0, False: 0]
  ------------------
  276|      0|        Work.push_back(VAncestor);
  277|      0|        continue;
  278|      0|      }
  279|      0|      Work.pop_back();
  280|       |
  281|       |      // Update VInfo based on Ancestor info
  282|      0|      if (VInfo.Parent < LastLinked)
  ------------------
  |  Branch (282:11): [True: 0, False: 0]
  ------------------
  283|      0|        continue;
  284|       |
  285|      0|      auto &VAInfo = NodeToInfo[VAncestor];
  286|      0|      NodePtr VAncestorLabel = VAInfo.Label;
  287|      0|      NodePtr VLabel = VInfo.Label;
  288|      0|      if (NodeToInfo[VAncestorLabel].Semi < NodeToInfo[VLabel].Semi)
  ------------------
  |  Branch (288:11): [True: 0, False: 0]
  ------------------
  289|      0|        VInfo.Label = VAncestorLabel;
  290|      0|      VInfo.Parent = VAInfo.Parent;
  291|      0|    }
  292|       |
  293|      0|    return VInInfo.Label;
  294|    160|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE16attachNewSubtreeERS5_PNS_15DomTreeNodeBaseIS4_EE:
  586|      2|  void attachNewSubtree(DomTreeT& DT, const TreeNodePtr AttachTo) {
  587|       |    // Attach the first unreachable block to AttachTo.
  588|      2|    NodeToInfo[NumToNode[1]].IDom = AttachTo->getBlock();
  589|       |    // Loop over all of the discovered blocks in the function...
  590|    162|    for (size_t i = 1, e = NumToNode.size(); i != e; ++i) {
  ------------------
  |  Branch (590:46): [True: 160, False: 2]
  ------------------
  591|    160|      NodePtr W = NumToNode[i];
  592|    160|      LLVM_DEBUG(dbgs() << "\tdiscovered a new reachable node "
  ------------------
  |  |  123|    160|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    160|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 160]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    160|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  593|    160|                        << BlockNamePrinter(W) << "\n");
  594|       |
  595|       |      // Don't replace this with 'count', the insertion side effect is important
  596|    160|      if (DT.DomTreeNodes[W]) continue;  // Haven't calculated this node yet?
  ------------------
  |  Branch (596:11): [True: 2, False: 158]
  ------------------
  597|       |
  598|    158|      NodePtr ImmDom = getIDom(W);
  599|       |
  600|       |      // Get or calculate the node for the immediate dominator.
  601|    158|      TreeNodePtr IDomNode = getNodeForBlock(ImmDom, DT);
  602|       |
  603|       |      // Add a new tree node for this BasicBlock, and link it as a child of
  604|       |      // IDomNode.
  605|    158|      DT.DomTreeNodes[W] = IDomNode->addChild(
  606|    158|          llvh::make_unique<DomTreeNodeBase<NodeT>>(W, IDomNode));
  607|    158|    }
  608|      2|  }
_ZNK4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE7getIDomEPS4_:
  167|    158|  NodePtr getIDom(NodePtr BB) const {
  168|    158|    auto InfoIt = NodeToInfo.find(BB);
  169|    158|    if (InfoIt == NodeToInfo.end()) return nullptr;
  ------------------
  |  Branch (169:9): [True: 0, False: 158]
  ------------------
  170|       |
  171|    158|    return InfoIt->second.IDom;
  172|    158|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE15getNodeForBlockEPS4_RS5_:
  174|    158|  TreeNodePtr getNodeForBlock(NodePtr BB, DomTreeT &DT) {
  175|    158|    if (TreeNodePtr Node = DT.getNode(BB)) return Node;
  ------------------
  |  Branch (175:21): [True: 158, False: 0]
  ------------------
  176|       |
  177|       |    // Haven't calculated this node yet?  Get or calculate the node for the
  178|       |    // immediate dominator.
  179|      0|    NodePtr IDom = getIDom(BB);
  180|       |
  181|      0|    assert(IDom || DT.DomTreeNodes[nullptr]);
  182|      0|    TreeNodePtr IDomNode = getNodeForBlock(IDom, DT);
  183|       |
  184|       |    // Add a new tree node for this NodeT, and link it as a child of
  185|       |    // IDomNode
  186|      0|    return (DT.DomTreeNodes[BB] = IDomNode->addChild(
  187|      0|        llvh::make_unique<DomTreeNodeBase<NodeT>>(BB, IDomNode)))
  188|      0|        .get();
  189|    158|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE20CalculateFromScratchERS5_PNS6_15BatchUpdateInfoE:
  554|      2|  static void CalculateFromScratch(DomTreeT &DT, BatchUpdatePtr BUI) {
  555|      2|    auto *Parent = DT.Parent;
  556|      2|    DT.reset();
  557|      2|    DT.Parent = Parent;
  558|      2|    SemiNCAInfo SNCA(nullptr);  // Since we are rebuilding the whole tree,
  559|       |                                // there's no point doing it incrementally.
  560|       |
  561|       |    // Step #0: Number blocks in depth-first order and initialize variables used
  562|       |    // in later stages of the algorithm.
  563|      2|    DT.Roots = FindRoots(DT, nullptr);
  564|      2|    SNCA.doFullDFSWalk(DT, AlwaysDescend);
  565|       |
  566|      2|    SNCA.runSemiNCA(DT);
  567|      2|    if (BUI) {
  ------------------
  |  Branch (567:9): [True: 0, False: 2]
  ------------------
  568|      0|      BUI->IsRecalculated = true;
  569|      0|      LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  570|      0|          dbgs() << "DomTree recalculated, skipping future batch updates\n");
  571|      0|    }
  572|       |
  573|      2|    if (DT.Roots.empty()) return;
  ------------------
  |  Branch (573:9): [True: 0, False: 2]
  ------------------
  574|       |
  575|       |    // Add a node for the root. If the tree is a PostDominatorTree it will be
  576|       |    // the virtual exit (denoted by (BasicBlock *) nullptr) which postdominates
  577|       |    // all real exits (including multiple exit blocks, infinite loops).
  578|      2|    NodePtr Root = IsPostDom ? nullptr : DT.Roots[0];
  ------------------
  |  Branch (578:20): [Folded - Ignored]
  ------------------
  579|       |
  580|      2|    DT.RootNode = (DT.DomTreeNodes[Root] =
  581|      2|                       llvh::make_unique<DomTreeNodeBase<NodeT>>(Root, nullptr))
  582|      2|        .get();
  583|      2|    SNCA.attachNewSubtree(DT, DT.RootNode);
  584|      2|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE9FindRootsERKS5_PNS6_15BatchUpdateInfoE:
  375|      2|  static RootsT FindRoots(const DomTreeT &DT, BatchUpdatePtr BUI) {
  376|      2|    assert(DT.Parent && "Parent pointer is not set");
  377|      0|    RootsT Roots;
  378|       |
  379|       |    // For dominators, function entry CFG node is always a tree root node.
  380|      2|    if (!IsPostDom) {
  ------------------
  |  Branch (380:9): [Folded - Ignored]
  ------------------
  381|      2|      Roots.push_back(GetEntryNode(DT));
  382|      2|      return Roots;
  383|      2|    }
  384|       |
  385|      0|    SemiNCAInfo SNCA(BUI);
  386|       |
  387|       |    // PostDominatorTree always has a virtual root.
  388|      0|    SNCA.addVirtualRoot();
  389|      0|    unsigned Num = 1;
  390|       |
  391|      0|    LLVM_DEBUG(dbgs() << "\t\tLooking for trivial roots\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  392|       |
  393|       |    // Step #1: Find all the trivial roots that are going to will definitely
  394|       |    // remain tree roots.
  395|      0|    unsigned Total = 0;
  396|       |    // It may happen that there are some new nodes in the CFG that are result of
  397|       |    // the ongoing batch update, but we cannot really pretend that they don't
  398|       |    // exist -- we won't see any outgoing or incoming edges to them, so it's
  399|       |    // fine to discover them here, as they would end up appearing in the CFG at
  400|       |    // some point anyway.
  401|      0|    for (const NodePtr N : nodes(DT.Parent)) {
  ------------------
  |  Branch (401:26): [True: 0, False: 0]
  ------------------
  402|      0|      ++Total;
  403|       |      // If it has no *successors*, it is definitely a root.
  404|      0|      if (!HasForwardSuccessors(N, BUI)) {
  ------------------
  |  Branch (404:11): [True: 0, False: 0]
  ------------------
  405|      0|        Roots.push_back(N);
  406|       |        // Run DFS not to walk this part of CFG later.
  407|      0|        Num = SNCA.runDFS(N, Num, AlwaysDescend, 1);
  408|      0|        LLVM_DEBUG(dbgs() << "Found a new trivial root: " << BlockNamePrinter(N)
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  409|      0|                          << "\n");
  410|      0|        LLVM_DEBUG(dbgs() << "Last visited node: "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  411|      0|                          << BlockNamePrinter(SNCA.NumToNode[Num]) << "\n");
  412|      0|      }
  413|      0|    }
  414|       |
  415|      0|    LLVM_DEBUG(dbgs() << "\t\tLooking for non-trivial roots\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  416|       |
  417|       |    // Step #2: Find all non-trivial root candidates. Those are CFG nodes that
  418|       |    // are reverse-unreachable were not visited by previous DFS walks (i.e. CFG
  419|       |    // nodes in infinite loops).
  420|      0|    bool HasNonTrivialRoots = false;
  421|       |    // Accounting for the virtual exit, see if we had any reverse-unreachable
  422|       |    // nodes.
  423|      0|    if (Total + 1 != Num) {
  ------------------
  |  Branch (423:9): [True: 0, False: 0]
  ------------------
  424|      0|      HasNonTrivialRoots = true;
  425|       |      // Make another DFS pass over all other nodes to find the
  426|       |      // reverse-unreachable blocks, and find the furthest paths we'll be able
  427|       |      // to make.
  428|       |      // Note that this looks N^2, but it's really 2N worst case, if every node
  429|       |      // is unreachable. This is because we are still going to only visit each
  430|       |      // unreachable node once, we may just visit it in two directions,
  431|       |      // depending on how lucky we get.
  432|      0|      SmallPtrSet<NodePtr, 4> ConnectToExitBlock;
  433|      0|      for (const NodePtr I : nodes(DT.Parent)) {
  ------------------
  |  Branch (433:28): [True: 0, False: 0]
  ------------------
  434|      0|        if (SNCA.NodeToInfo.count(I) == 0) {
  ------------------
  |  Branch (434:13): [True: 0, False: 0]
  ------------------
  435|      0|          LLVM_DEBUG(dbgs()
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  436|      0|                     << "\t\t\tVisiting node " << BlockNamePrinter(I) << "\n");
  437|       |          // Find the furthest away we can get by following successors, then
  438|       |          // follow them in reverse.  This gives us some reasonable answer about
  439|       |          // the post-dom tree inside any infinite loop. In particular, it
  440|       |          // guarantees we get to the farthest away point along *some*
  441|       |          // path. This also matches the GCC's behavior.
  442|       |          // If we really wanted a totally complete picture of dominance inside
  443|       |          // this infinite loop, we could do it with SCC-like algorithms to find
  444|       |          // the lowest and highest points in the infinite loop.  In theory, it
  445|       |          // would be nice to give the canonical backedge for the loop, but it's
  446|       |          // expensive and does not always lead to a minimal set of roots.
  447|      0|          LLVM_DEBUG(dbgs() << "\t\t\tRunning forward DFS\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  448|       |
  449|      0|          const unsigned NewNum = SNCA.runDFS<true>(I, Num, AlwaysDescend, Num);
  450|      0|          const NodePtr FurthestAway = SNCA.NumToNode[NewNum];
  451|      0|          LLVM_DEBUG(dbgs() << "\t\t\tFound a new furthest away node "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  452|      0|                            << "(non-trivial root): "
  453|      0|                            << BlockNamePrinter(FurthestAway) << "\n");
  454|      0|          ConnectToExitBlock.insert(FurthestAway);
  455|      0|          Roots.push_back(FurthestAway);
  456|      0|          LLVM_DEBUG(dbgs() << "\t\t\tPrev DFSNum: " << Num << ", new DFSNum: "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  457|      0|                            << NewNum << "\n\t\t\tRemoving DFS info\n");
  458|      0|          for (unsigned i = NewNum; i > Num; --i) {
  ------------------
  |  Branch (458:37): [True: 0, False: 0]
  ------------------
  459|      0|            const NodePtr N = SNCA.NumToNode[i];
  460|      0|            LLVM_DEBUG(dbgs() << "\t\t\t\tRemoving DFS info for "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  461|      0|                              << BlockNamePrinter(N) << "\n");
  462|      0|            SNCA.NodeToInfo.erase(N);
  463|      0|            SNCA.NumToNode.pop_back();
  464|      0|          }
  465|      0|          const unsigned PrevNum = Num;
  466|      0|          LLVM_DEBUG(dbgs() << "\t\t\tRunning reverse DFS\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  467|      0|          Num = SNCA.runDFS(FurthestAway, Num, AlwaysDescend, 1);
  468|      0|          for (unsigned i = PrevNum + 1; i <= Num; ++i)
  ------------------
  |  Branch (468:42): [True: 0, False: 0]
  ------------------
  469|      0|            LLVM_DEBUG(dbgs() << "\t\t\t\tfound node "
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  470|      0|                              << BlockNamePrinter(SNCA.NumToNode[i]) << "\n");
  471|      0|        }
  472|      0|      }
  473|      0|    }
  474|       |
  475|      0|    LLVM_DEBUG(dbgs() << "Total: " << Total << ", Num: " << Num << "\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  476|      0|    LLVM_DEBUG(dbgs() << "Discovered CFG nodes:\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  477|      0|    LLVM_DEBUG(for (size_t i = 0; i <= Num; ++i) dbgs()
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:69): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|      0|               << i << ": " << BlockNamePrinter(SNCA.NumToNode[i]) << "\n");
  479|       |
  480|      0|    assert((Total + 1 == Num) && "Everything should have been visited");
  481|       |
  482|       |    // Step #3: If we found some non-trivial roots, make them non-redundant.
  483|      0|    if (HasNonTrivialRoots) RemoveRedundantRoots(DT, BUI, Roots);
  ------------------
  |  Branch (483:9): [True: 0, False: 0]
  ------------------
  484|       |
  485|      0|    LLVM_DEBUG(dbgs() << "Found roots: ");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  486|      0|    LLVM_DEBUG(for (auto *Root
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:69): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  487|      0|                    : Roots) dbgs()
  488|      0|               << BlockNamePrinter(Root) << " ");
  489|      0|    LLVM_DEBUG(dbgs() << "\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  490|       |
  491|      0|    return Roots;
  492|      2|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE12GetEntryNodeERKS5_:
  367|      2|  static NodePtr GetEntryNode(const DomTreeT &DT) {
  368|      2|    assert(DT.Parent && "Parent not set");
  369|      0|    return GraphTraits<typename DomTreeT::ParentPtr>::getEntryNode(DT.Parent);
  370|      2|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE13doFullDFSWalkIPFbPS4_S8_EEEvRKS5_T_:
  542|      2|  void doFullDFSWalk(const DomTreeT &DT, DescendCondition DC) {
  543|      2|    if (!IsPostDom) {
  ------------------
  |  Branch (543:9): [Folded - Ignored]
  ------------------
  544|      2|      assert(DT.Roots.size() == 1 && "Dominators should have a singe root");
  545|      0|      runDFS(DT.Roots[0], 0, DC, 0);
  546|      2|      return;
  547|      2|    }
  548|       |
  549|      0|    addVirtualRoot();
  550|      0|    unsigned Num = 1;
  551|      0|    for (const NodePtr Root : DT.Roots) Num = runDFS(Root, Num, DC, 0);
  ------------------
  |  Branch (551:29): [True: 0, False: 0]
  ------------------
  552|      0|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE6runDFSILb0EPFbPS4_S8_EEEjS8_jT0_j:
  218|      2|                  unsigned AttachToNum) {
  219|      2|    assert(V);
  220|      0|    SmallVector<NodePtr, 64> WorkList = {V};
  221|      2|    if (NodeToInfo.count(V) != 0) NodeToInfo[V].Parent = AttachToNum;
  ------------------
  |  Branch (221:9): [True: 0, False: 2]
  ------------------
  222|       |
  223|    164|    while (!WorkList.empty()) {
  ------------------
  |  Branch (223:12): [True: 162, False: 2]
  ------------------
  224|    162|      const NodePtr BB = WorkList.pop_back_val();
  225|    162|      auto &BBInfo = NodeToInfo[BB];
  226|       |
  227|       |      // Visited nodes always have positive DFS numbers.
  228|    162|      if (BBInfo.DFSNum != 0) continue;
  ------------------
  |  Branch (228:11): [True: 2, False: 160]
  ------------------
  229|    160|      BBInfo.DFSNum = BBInfo.Semi = ++LastNum;
  230|    160|      BBInfo.Label = BB;
  231|    160|      NumToNode.push_back(BB);
  232|       |
  233|    160|      constexpr bool Direction = IsReverse != IsPostDom;  // XOR.
  234|    160|      for (const NodePtr Succ :
  ------------------
  |  Branch (234:31): [True: 160, False: 160]
  ------------------
  235|    160|           ChildrenGetter<Direction>::Get(BB, BatchUpdates)) {
  236|    160|        const auto SIT = NodeToInfo.find(Succ);
  237|       |        // Don't visit nodes more than once but remember to collect
  238|       |        // ReverseChildren.
  239|    160|        if (SIT != NodeToInfo.end() && SIT->second.DFSNum != 0) {
  ------------------
  |  Branch (239:13): [True: 2, False: 158]
  |  Branch (239:13): [True: 0, False: 160]
  |  Branch (239:40): [True: 0, False: 2]
  ------------------
  240|      0|          if (Succ != BB) SIT->second.ReverseChildren.push_back(BB);
  ------------------
  |  Branch (240:15): [True: 0, False: 0]
  ------------------
  241|      0|          continue;
  242|      0|        }
  243|       |
  244|    160|        if (!Condition(BB, Succ)) continue;
  ------------------
  |  Branch (244:13): [True: 0, False: 160]
  ------------------
  245|       |
  246|       |        // It's fine to add Succ to the map, because we know that it will be
  247|       |        // visited later.
  248|    160|        auto &SuccInfo = NodeToInfo[Succ];
  249|    160|        WorkList.push_back(Succ);
  250|    160|        SuccInfo.Parent = LastNum;
  251|    160|        SuccInfo.ReverseChildren.push_back(BB);
  252|    160|      }
  253|    160|    }
  254|       |
  255|      2|    return LastNum;
  256|      2|  }
_ZN4llvh14DomTreeBuilder11SemiNCAInfoINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEE13AlwaysDescendEPS4_S7_:
  191|    160|  static bool AlwaysDescend(NodePtr, NodePtr) { return true; }
_ZN4llvh14DomTreeBuilder9CalculateINS_17DominatorTreeBaseIN6hermes10BasicBlockELb0EEEEEvRT_:
 1574|      2|void Calculate(DomTreeT &DT) {
 1575|      2|  SemiNCAInfo<DomTreeT>::CalculateFromScratch(DT, nullptr);
 1576|      2|}

_ZN4llvh13encodeSLEB128ElRNS_11raw_ostreamEj:
   25|  3.58M|                              unsigned PadTo = 0) {
   26|  3.58M|  bool More;
   27|  3.58M|  unsigned Count = 0;
   28|  4.18M|  do {
   29|  4.18M|    uint8_t Byte = Value & 0x7f;
   30|       |    // NOTE: this assumes that this signed shift is an arithmetic right shift.
   31|  4.18M|    Value >>= 7;
   32|  4.18M|    More = !((((Value == 0 ) && ((Byte & 0x40) == 0)) ||
  ------------------
  |  Branch (32:16): [True: 3.48M, False: 705k]
  |  Branch (32:33): [True: 3.39M, False: 89.3k]
  ------------------
   33|  4.18M|              ((Value == -1) && ((Byte & 0x40) != 0))));
  ------------------
  |  Branch (33:16): [True: 203k, False: 591k]
  |  Branch (33:33): [True: 196k, False: 6.27k]
  ------------------
   34|  4.18M|    Count++;
   35|  4.18M|    if (More || Count < PadTo)
  ------------------
  |  Branch (35:9): [True: 598k, False: 3.58M]
  |  Branch (35:17): [True: 0, False: 3.58M]
  ------------------
   36|   598k|      Byte |= 0x80; // Mark this byte to show that more bytes will follow.
   37|  4.18M|    OS << char(Byte);
   38|  4.18M|  } while (More);
  ------------------
  |  Branch (38:12): [True: 598k, False: 3.58M]
  ------------------
   39|       |
   40|       |  // Pad with 0x80 and emit a terminating byte at the end.
   41|  3.58M|  if (Count < PadTo) {
  ------------------
  |  Branch (41:7): [True: 0, False: 3.58M]
  ------------------
   42|      0|    uint8_t PadValue = Value < 0 ? 0x7f : 0x00;
  ------------------
  |  Branch (42:24): [True: 0, False: 0]
  ------------------
   43|      0|    for (; Count < PadTo - 1; ++Count)
  ------------------
  |  Branch (43:12): [True: 0, False: 0]
  ------------------
   44|      0|      OS << char(PadValue | 0x80);
   45|      0|    OS << char(PadValue);
   46|      0|    Count++;
   47|      0|  }
   48|  3.58M|  return Count;
   49|  3.58M|}
_ZN4llvh13decodeSLEB128EPKhPjS1_PPKc:
  164|  98.6k|                             const char **error = nullptr) {
  165|  98.6k|  const uint8_t *orig_p = p;
  166|  98.6k|  int64_t Value = 0;
  167|  98.6k|  unsigned Shift = 0;
  168|  98.6k|  uint8_t Byte;
  169|   144k|  do {
  170|   144k|    if (end && p == end) {
  ------------------
  |  Branch (170:9): [True: 0, False: 144k]
  |  Branch (170:16): [True: 0, False: 0]
  ------------------
  171|      0|      if (error)
  ------------------
  |  Branch (171:11): [True: 0, False: 0]
  ------------------
  172|      0|        *error = "malformed sleb128, extends past end";
  173|      0|      if (n)
  ------------------
  |  Branch (173:11): [True: 0, False: 0]
  ------------------
  174|      0|        *n = (unsigned)(p - orig_p);
  175|      0|      return 0;
  176|      0|    }
  177|   144k|    Byte = *p++;
  178|   144k|    Value |= (int64_t(Byte & 0x7f) << Shift);
  179|   144k|    Shift += 7;
  180|   144k|  } while (Byte >= 128);
  ------------------
  |  Branch (180:12): [True: 45.3k, False: 98.6k]
  ------------------
  181|       |  // Sign extend negative numbers.
  182|  98.6k|  if (Byte & 0x40)
  ------------------
  |  Branch (182:7): [True: 17.7k, False: 80.8k]
  ------------------
  183|  17.7k|    Value |= (-1ULL) << Shift;
  184|  98.6k|  if (n)
  ------------------
  |  Branch (184:7): [True: 98.6k, False: 0]
  ------------------
  185|  98.6k|    *n = (unsigned)(p - orig_p);
  186|  98.6k|  return Value;
  187|  98.6k|}

_ZN4llvh13ManagedStaticINS_2cl10SubCommandENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEdeEv:
   87|     82|  C &operator*() {
   88|     82|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     82|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 4, False: 78]
  ------------------
   90|      4|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     82|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     82|  }
_ZN4llvh14object_creatorINS_2cl10SubCommandEE4callEv:
   24|      4|  static void *call() { return new C(); }
_ZN4llvh13ManagedStaticINS_3sys10SmartMutexILb1EEENS_14object_creatorIS3_EENS_14object_deleterIS3_EEEdeEv:
   87|     19|  C &operator*() {
   88|     19|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     19|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 1, False: 18]
  ------------------
   90|      1|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     19|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     19|  }
_ZN4llvh14object_creatorINS_3sys10SmartMutexILb1EEEE4callEv:
   24|      1|  static void *call() { return new C(); }
Statistic.cpp:_ZN4llvh13ManagedStaticIN12_GLOBAL__N_113StatisticInfoENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEdeEv:
   87|     19|  C &operator*() {
   88|     19|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     19|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 1, False: 18]
  ------------------
   90|      1|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     19|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     19|  }
Statistic.cpp:_ZN4llvh14object_creatorIN12_GLOBAL__N_113StatisticInfoEE4callEv:
   24|      1|  static void *call() { return new C(); }
_ZN4llvh13ManagedStaticINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_14object_creatorIS7_EENS_14object_deleterIS7_EEEdeEv:
   87|      2|  C &operator*() {
   88|      2|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|      2|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 2, False: 0]
  ------------------
   90|      2|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|      2|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|      2|  }
_ZN4llvh14object_creatorINSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEE4callEv:
   24|      2|  static void *call() { return new C(); }
Timer.cpp:_ZN4llvh13ManagedStaticIN12_GLOBAL__N_112Name2PairMapENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEdeEv:
   87|      1|  C &operator*() {
   88|      1|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|      1|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 1, False: 0]
  ------------------
   90|      1|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|      1|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|      1|  }
Timer.cpp:_ZN4llvh14object_creatorIN12_GLOBAL__N_112Name2PairMapEE4callEv:
   24|      1|  static void *call() { return new C(); }
_ZN4llvh13ManagedStaticINS_2cl10SubCommandENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEptEv:
   95|      2|  C *operator->() { return &**this; }
CommandLine.cpp:_ZN4llvh13ManagedStaticIN12_GLOBAL__N_117CommandLineParserENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEptEv:
   95|     34|  C *operator->() { return &**this; }
CommandLine.cpp:_ZN4llvh13ManagedStaticIN12_GLOBAL__N_117CommandLineParserENS_14object_creatorIS2_EENS_14object_deleterIS2_EEEdeEv:
   87|     34|  C &operator*() {
   88|     34|    void *Tmp = Ptr.load(std::memory_order_acquire);
   89|     34|    if (!Tmp)
  ------------------
  |  Branch (89:9): [True: 2, False: 32]
  ------------------
   90|      2|      RegisterManagedStatic(Creator::call, Deleter::call);
   91|       |
   92|     34|    return *static_cast<C *>(Ptr.load(std::memory_order_relaxed));
   93|     34|  }
CommandLine.cpp:_ZN4llvh14object_creatorIN12_GLOBAL__N_117CommandLineParserEE4callEv:
   24|      2|  static void *call() { return new C(); }

_ZN4llvh12DoubleToBitsEd:
  597|  8.85M|inline uint64_t DoubleToBits(double Double) {
  598|  8.85M|  uint64_t Bits;
  599|  8.85M|  static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes");
  600|  8.85M|  memcpy(&Bits, &Double, sizeof(Double));
  601|  8.85M|  return Bits;
  602|  8.85M|}
_ZN4llvh16maskTrailingOnesIjEET_j:
  218|  74.2M|template <typename T> T maskTrailingOnes(unsigned N) {
  219|  74.2M|  static_assert(std::is_unsigned<T>::value, "Invalid type!");
  220|  74.2M|  const unsigned Bits = CHAR_BIT * sizeof(T);
  221|  74.2M|  assert(N <= Bits && "Invalid bit index");
  222|  74.2M|  return N == 0 ? 0 : (T(-1) >> (Bits - N));
  ------------------
  |  Branch (222:10): [True: 0, False: 74.2M]
  ------------------
  223|  74.2M|}
_ZN4llvh12BitsToDoubleEm:
  579|  3.15M|inline double BitsToDouble(uint64_t Bits) {
  580|  3.15M|  double D;
  581|  3.15M|  static_assert(sizeof(uint64_t) == sizeof(double), "Unexpected type sizes");
  582|  3.15M|  memcpy(&D, &Bits, sizeof(Bits));
  583|  3.15M|  return D;
  584|  3.15M|}
_ZN4llvh7alignToEmmm:
  691|  7.80M|inline uint64_t alignTo(uint64_t Value, uint64_t Align, uint64_t Skew = 0) {
  692|  7.80M|  assert(Align != 0u && "Align can't be 0.");
  693|      0|  Skew %= Align;
  694|  7.80M|  return (Value + Align - 1 - Skew) / Align * Align + Skew;
  695|  7.80M|}
_ZN4llvh7alignToILm8EEEmm:
  699|  10.1M|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|  10.1M|  static_assert(Align != 0u, "Align must be non-zero");
  701|  10.1M|  return (Value + Align - 1) / Align * Align;
  702|  10.1M|}
_ZN4llvh6isUIntILj32EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  355|  9.16M|template <> constexpr inline bool isUInt<32>(uint64_t x) {
  356|  9.16M|  return static_cast<uint32_t>(x) == x;
  357|  9.16M|}
_ZN4llvh12NextPowerOf2Em:
  646|   541k|inline uint64_t NextPowerOf2(uint64_t A) {
  647|   541k|  A |= (A >> 1);
  648|   541k|  A |= (A >> 2);
  649|   541k|  A |= (A >> 4);
  650|   541k|  A |= (A >> 8);
  651|   541k|  A |= (A >> 16);
  652|   541k|  A |= (A >> 32);
  653|   541k|  return A + 1;
  654|   541k|}
_ZN4llvh13isPowerOf2_32Ej:
  435|   511k|constexpr inline bool isPowerOf2_32(uint32_t Value) {
  436|   511k|  return Value && !(Value & (Value - 1));
  ------------------
  |  Branch (436:10): [True: 511k, False: 0]
  |  Branch (436:19): [True: 511k, False: 114]
  ------------------
  437|   511k|}
_ZN4llvh13isPowerOf2_64Em:
  440|  6.73k|constexpr inline bool isPowerOf2_64(uint64_t Value) {
  441|  6.73k|  return Value && !(Value & (Value - 1));
  ------------------
  |  Branch (441:10): [True: 6.73k, False: 0]
  |  Branch (441:19): [True: 6.73k, False: 0]
  ------------------
  442|  6.73k|}
_ZN4llvh7Log2_32Ej:
  545|  1.23M|inline unsigned Log2_32(uint32_t Value) {
  546|  1.23M|  return 31 - countLeadingZeros(Value);
  547|  1.23M|}
_ZN4llvh9alignAddrEPKvm:
  629|  6.73k|inline uintptr_t alignAddr(const void *Addr, size_t Alignment) {
  630|  6.73k|  assert(Alignment && isPowerOf2_64((uint64_t)Alignment) &&
  631|  6.73k|         "Alignment is not a power of two!");
  632|       |
  633|      0|  assert((uintptr_t)Addr + Alignment - 1 >= (uintptr_t)Addr);
  634|       |
  635|      0|  return (((uintptr_t)Addr + Alignment - 1) & ~(uintptr_t)(Alignment - 1));
  636|  6.73k|}
_ZN4llvh19alignmentAdjustmentEPKvm:
  640|    401|inline size_t alignmentAdjustment(const void *Ptr, size_t Alignment) {
  641|    401|  return alignAddr(Ptr, Alignment) - (uintptr_t)Ptr;
  642|    401|}
_ZN4llvh12PowerOf2CeilEm:
  665|  19.2k|inline uint64_t PowerOf2Ceil(uint64_t A) {
  666|  19.2k|  if (!A)
  ------------------
  |  Branch (666:7): [True: 0, False: 19.2k]
  ------------------
  667|      0|    return 0;
  668|  19.2k|  return NextPowerOf2(A - 1);
  669|  19.2k|}
_ZN4llvh6isUIntILj29EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  338|  2.08M|isUInt(uint64_t X) {
  339|  2.08M|  static_assert(N > 0, "isUInt<0> doesn't make sense");
  340|  2.08M|  return X < (UINT64_C(1) << (N));
  341|  2.08M|}
_ZN4llvh6isUIntILj28EEENSt3__19enable_ifIXltT_Li64EEbE4typeEm:
  338|  3.52M|isUInt(uint64_t X) {
  339|  3.52M|  static_assert(N > 0, "isUInt<0> doesn't make sense");
  340|  3.52M|  return X < (UINT64_C(1) << (N));
  341|  3.52M|}
_ZN4llvh12SignExtend32ILj29EEEij:
  739|  2.08M|template <unsigned B> constexpr inline int32_t SignExtend32(uint32_t X) {
  740|  2.08M|  static_assert(B > 0, "Bit width can't be 0.");
  741|  2.08M|  static_assert(B <= 32, "Bit width out of range.");
  742|  2.08M|  return int32_t(X << (32 - B)) >> (32 - B);
  743|  2.08M|}
_ZN4llvh7alignToILm4EEEmm:
  699|  1.96M|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|  1.96M|  static_assert(Align != 0u, "Align must be non-zero");
  701|  1.96M|  return (Value + Align - 1) / Align * Align;
  702|  1.96M|}
_ZN4llvh7alignToILm1024EEEmm:
  699|    610|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|    610|  static_assert(Align != 0u, "Align must be non-zero");
  701|    610|  return (Value + Align - 1) / Align * Align;
  702|    610|}
_ZN4llvh17countLeadingZerosIjEEmT_NS_12ZeroBehaviorE:
  195|  1.23M|std::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  196|  1.23M|  static_assert(std::numeric_limits<T>::is_integer &&
  197|  1.23M|                    !std::numeric_limits<T>::is_signed,
  198|  1.23M|                "Only unsigned integral types are allowed.");
  199|  1.23M|  return llvh::detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  200|  1.23M|}
_ZN4llvh6detail19LeadingZerosCounterIjLm4EE5countEjNS_12ZeroBehaviorE:
  154|  1.23M|  static std::size_t count(T Val, ZeroBehavior ZB) {
  155|  1.23M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (155:9): [True: 1.23M, False: 0]
  |  Branch (155:31): [True: 0, False: 1.23M]
  ------------------
  156|      0|      return 32;
  157|       |
  158|  1.23M|#if __has_builtin(__builtin_clz) || LLVM_GNUC_PREREQ(4, 0, 0)
  159|  1.23M|    return __builtin_clz(Val);
  160|       |#elif defined(_MSC_VER)
  161|       |    unsigned long Index;
  162|       |    _BitScanReverse(&Index, Val);
  163|       |    return Index ^ 31;
  164|       |#endif
  165|  1.23M|  }
_ZN4llvh17countLeadingZerosImEEmT_NS_12ZeroBehaviorE:
  195|    695|std::size_t countLeadingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  196|    695|  static_assert(std::numeric_limits<T>::is_integer &&
  197|    695|                    !std::numeric_limits<T>::is_signed,
  198|    695|                "Only unsigned integral types are allowed.");
  199|    695|  return llvh::detail::LeadingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  200|    695|}
_ZN4llvh6detail19LeadingZerosCounterImLm8EE5countEmNS_12ZeroBehaviorE:
  170|    695|  static std::size_t count(T Val, ZeroBehavior ZB) {
  171|    695|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (171:9): [True: 695, False: 0]
  |  Branch (171:31): [True: 52, False: 643]
  ------------------
  172|     52|      return 64;
  173|       |
  174|    643|#if __has_builtin(__builtin_clzll) || LLVM_GNUC_PREREQ(4, 0, 0)
  175|    643|    return __builtin_clzll(Val);
  176|       |#elif defined(_MSC_VER)
  177|       |    unsigned long Index;
  178|       |    _BitScanReverse64(&Index, Val);
  179|       |    return Index ^ 63;
  180|       |#endif
  181|    695|  }
_ZN4llvh17maskTrailingZerosImEET_j:
  233|   805k|template <typename T> T maskTrailingZeros(unsigned N) {
  234|   805k|  return maskLeadingOnes<T>(CHAR_BIT * sizeof(T) - N);
  235|   805k|}
_ZN4llvh16maskTrailingOnesImEET_j:
  218|  1.56M|template <typename T> T maskTrailingOnes(unsigned N) {
  219|  1.56M|  static_assert(std::is_unsigned<T>::value, "Invalid type!");
  220|  1.56M|  const unsigned Bits = CHAR_BIT * sizeof(T);
  221|  1.56M|  assert(N <= Bits && "Invalid bit index");
  222|  1.56M|  return N == 0 ? 0 : (T(-1) >> (Bits - N));
  ------------------
  |  Branch (222:10): [True: 779k, False: 783k]
  ------------------
  223|  1.56M|}
_ZN4llvh18countTrailingZerosImEEmT_NS_12ZeroBehaviorE:
  126|  1.42M|std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  127|  1.42M|  static_assert(std::numeric_limits<T>::is_integer &&
  128|  1.42M|                    !std::numeric_limits<T>::is_signed,
  129|  1.42M|                "Only unsigned integral types are allowed.");
  130|  1.42M|  return llvh::detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  131|  1.42M|}
_ZN4llvh6detail20TrailingZerosCounterImLm8EE5countEmNS_12ZeroBehaviorE:
  101|  1.42M|  static std::size_t count(T Val, ZeroBehavior ZB) {
  102|  1.42M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (102:9): [True: 1.42M, False: 0]
  |  Branch (102:31): [True: 706, False: 1.42M]
  ------------------
  103|    706|      return 64;
  104|       |
  105|  1.42M|#if __has_builtin(__builtin_ctzll) || LLVM_GNUC_PREREQ(4, 0, 0)
  106|  1.42M|    return __builtin_ctzll(Val);
  107|       |#elif defined(_MSC_VER)
  108|       |    unsigned long Index;
  109|       |    _BitScanForward64(&Index, Val);
  110|       |    return Index;
  111|       |#endif
  112|  1.42M|  }
_ZN4llvh15maskLeadingOnesImEET_j:
  227|   805k|template <typename T> T maskLeadingOnes(unsigned N) {
  228|   805k|  return ~maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N);
  229|   805k|}
_ZN4llvh17maskTrailingZerosIjEET_j:
  233|   525k|template <typename T> T maskTrailingZeros(unsigned N) {
  234|   525k|  return maskLeadingOnes<T>(CHAR_BIT * sizeof(T) - N);
  235|   525k|}
_ZN4llvh18countTrailingZerosIjEEmT_NS_12ZeroBehaviorE:
  126|  2.15M|std::size_t countTrailingZeros(T Val, ZeroBehavior ZB = ZB_Width) {
  127|  2.15M|  static_assert(std::numeric_limits<T>::is_integer &&
  128|  2.15M|                    !std::numeric_limits<T>::is_signed,
  129|  2.15M|                "Only unsigned integral types are allowed.");
  130|  2.15M|  return llvh::detail::TrailingZerosCounter<T, sizeof(T)>::count(Val, ZB);
  131|  2.15M|}
_ZN4llvh6detail20TrailingZerosCounterIjLm4EE5countEjNS_12ZeroBehaviorE:
   85|  2.15M|  static std::size_t count(T Val, ZeroBehavior ZB) {
   86|  2.15M|    if (ZB != ZB_Undefined && Val == 0)
  ------------------
  |  Branch (86:9): [True: 2.15M, False: 0]
  |  Branch (86:31): [True: 0, False: 2.15M]
  ------------------
   87|      0|      return 32;
   88|       |
   89|  2.15M|#if __has_builtin(__builtin_ctz) || LLVM_GNUC_PREREQ(4, 0, 0)
   90|  2.15M|    return __builtin_ctz(Val);
   91|       |#elif defined(_MSC_VER)
   92|       |    unsigned long Index;
   93|       |    _BitScanForward(&Index, Val);
   94|       |    return Index;
   95|       |#endif
   96|  2.15M|  }
_ZN4llvh15maskLeadingOnesIjEET_j:
  227|  12.8M|template <typename T> T maskLeadingOnes(unsigned N) {
  228|  12.8M|  return ~maskTrailingOnes<T>(CHAR_BIT * sizeof(T) - N);
  229|  12.8M|}
_ZN4llvh7alignToILm4194304EEEmm:
  699|     99|template <uint64_t Align> constexpr inline uint64_t alignTo(uint64_t Value) {
  700|     99|  static_assert(Align != 0u, "Align must be non-zero");
  701|     99|  return (Value + Align - 1) / Align * Align;
  702|     99|}

_ZN4llvh11safe_mallocEm:
   26|   579k|LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_malloc(size_t Sz) {
   27|   579k|  void *Result = std::malloc(Sz);
   28|   579k|  if (Result == nullptr)
  ------------------
  |  Branch (28:7): [True: 0, False: 579k]
  ------------------
   29|      0|    report_bad_alloc_error("Allocation failed");
   30|   579k|  return Result;
   31|   579k|}
_ZN4llvh11safe_callocEmm:
   34|  10.3k|                                                        size_t Sz) {
   35|  10.3k|  void *Result = std::calloc(Count, Sz);
   36|  10.3k|  if (Result == nullptr)
  ------------------
  |  Branch (36:7): [True: 0, False: 10.3k]
  ------------------
   37|      0|    report_bad_alloc_error("Allocation failed");
   38|  10.3k|  return Result;
   39|  10.3k|}
_ZN4llvh12safe_reallocEPvm:
   41|   124k|LLVM_ATTRIBUTE_RETURNS_NONNULL inline void *safe_realloc(void *Ptr, size_t Sz) {
   42|   124k|  void *Result = std::realloc(Ptr, Sz);
   43|   124k|  if (Result == nullptr)
  ------------------
  |  Branch (43:7): [True: 0, False: 124k]
  ------------------
   44|      0|    report_bad_alloc_error("Allocation failed");
   45|   124k|  return Result;
   46|   124k|}

_ZNK4llvh12MemoryBuffer14getBufferStartEv:
   60|   176k|  const char *getBufferStart() const { return BufferStart; }
_ZNK4llvh12MemoryBuffer12getBufferEndEv:
   61|  71.7k|  const char *getBufferEnd() const   { return BufferEnd; }
_ZNK4llvh12MemoryBuffer13getBufferSizeEv:
   62|   140k|  size_t getBufferSize() const { return BufferEnd-BufferStart; }
_ZNK4llvh12MemoryBuffer9getBufferEv:
   64|     99|  StringRef getBuffer() const {
   65|     99|    return StringRef(BufferStart, getBufferSize());
   66|     99|  }
_ZN4llvh12MemoryBufferC2Ev:
   47|    198|  MemoryBuffer() = default;

_ZN4llvh3sys10SmartMutexILb0EEC2Eb:
   98|      2|        impl(rec), acquired(0), recursive(rec) { }
_ZN4llvh3sys10SmartMutexILb0EE4lockEv:
  100|     11|      bool lock() {
  101|     11|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (101:13): [Folded - Ignored]
  |  Branch (101:25): [True: 0, False: 0]
  ------------------
  102|     11|          return impl.acquire();
  103|     11|        } else {
  104|       |          // Single-threaded debugging code.  This would be racy in
  105|       |          // multithreaded mode, but provides not sanity checks in single
  106|       |          // threaded mode.
  107|      0|          assert((recursive || acquired == 0) && "Lock already acquired!!");
  108|      0|          ++acquired;
  109|      0|          return true;
  110|      0|        }
  111|     11|      }
_ZN4llvh3sys10SmartMutexILb0EE6unlockEv:
  113|     11|      bool unlock() {
  114|     11|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (114:13): [Folded - Ignored]
  |  Branch (114:25): [True: 0, False: 0]
  ------------------
  115|     11|          return impl.release();
  116|     11|        } else {
  117|       |          // Single-threaded debugging code.  This would be racy in
  118|       |          // multithreaded mode, but provides not sanity checks in single
  119|       |          // threaded mode.
  120|      0|          assert(((recursive && acquired) || (acquired == 1)) &&
  121|      0|                 "Lock not acquired before release!");
  122|      0|          --acquired;
  123|      0|          return true;
  124|      0|        }
  125|     11|      }
_ZN4llvh3sys10SmartMutexILb1EEC2Eb:
   98|      1|        impl(rec), acquired(0), recursive(rec) { }
_ZN4llvh3sys15SmartScopedLockILb1EEC2ERNS0_10SmartMutexILb1EEE:
  146|     19|      SmartScopedLock(SmartMutex<mt_only>& m) : mtx(m) {
  147|     19|        mtx.lock();
  148|     19|      }
_ZN4llvh3sys10SmartMutexILb1EE4lockEv:
  100|     19|      bool lock() {
  101|     19|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (101:13): [Folded - Ignored]
  |  Branch (101:25): [True: 19, False: 0]
  ------------------
  102|     19|          return impl.acquire();
  103|     19|        } else {
  104|       |          // Single-threaded debugging code.  This would be racy in
  105|       |          // multithreaded mode, but provides not sanity checks in single
  106|       |          // threaded mode.
  107|      0|          assert((recursive || acquired == 0) && "Lock already acquired!!");
  108|      0|          ++acquired;
  109|      0|          return true;
  110|      0|        }
  111|     19|      }
_ZN4llvh3sys15SmartScopedLockILb1EED2Ev:
  150|     19|      ~SmartScopedLock() {
  151|     19|        mtx.unlock();
  152|     19|      }
_ZN4llvh3sys10SmartMutexILb1EE6unlockEv:
  113|     19|      bool unlock() {
  114|     19|        if (!mt_only || llvm_is_multithreaded()) {
  ------------------
  |  Branch (114:13): [Folded - Ignored]
  |  Branch (114:25): [True: 19, False: 0]
  ------------------
  115|     19|          return impl.release();
  116|     19|        } else {
  117|       |          // Single-threaded debugging code.  This would be racy in
  118|       |          // multithreaded mode, but provides not sanity checks in single
  119|       |          // threaded mode.
  120|      0|          assert(((recursive && acquired) || (acquired == 1)) &&
  121|      0|                 "Lock not acquired before release!");
  122|      0|          --acquired;
  123|      0|          return true;
  124|      0|        }
  125|     19|      }

_ZN4llvh10MutexGuardC2ERNS_3sys10SmartMutexILb0EEE:
   32|     11|    MutexGuard(sys::Mutex &m) : M(m) { M.lock(); }
_ZN4llvh10MutexGuardD2Ev:
   33|     11|    ~MutexGuard() { M.unlock(); }

_ZN4llvh21PointerLikeTypeTraitsIPNS_2cl10SubCommandEE18getFromVoidPointerEPv:
   58|     38|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNS_2cl10SubCommandEE16getAsVoidPointerES3_:
   57|     16|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPKN6hermes10BasicBlockEE16getAsVoidPointerES4_:
   94|  39.3k|  static inline const void *getAsVoidPointer(const T *P) {
   95|  39.3k|    return NonConst::getAsVoidPointer(const_cast<T *>(P));
   96|  39.3k|  }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes10BasicBlockEE16getAsVoidPointerES3_:
   57|   197k|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes10BasicBlockEE18getFromVoidPointerEPv:
   58|     12|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPN6hermes12UniqueStringEE16getAsVoidPointerES3_:
   57|   114k|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIhNS1_9allocatorIhEEEEE18getFromVoidPointerEPv:
   58|   141k|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEE18getFromVoidPointerEPv:
   58|   140k|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNSt3__16vectorIjNS1_9allocatorIjEEEEE16getAsVoidPointerES6_:
   57|     99|  static inline void *getAsVoidPointer(T *P) { return P; }
_ZN4llvh21PointerLikeTypeTraitsIPNS_2cl14OptionCategoryEE18getFromVoidPointerEPv:
   58|      2|  static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); }
_ZN4llvh21PointerLikeTypeTraitsIPNS_2cl14OptionCategoryEE16getAsVoidPointerES3_:
   57|      4|  static inline void *getAsVoidPointer(T *P) { return P; }

_ZN4llvh20shouldReverseIterateINSt3__14pairINS_9StringRefES3_EEEEbv:
   10|  34.3k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  34.3k|  return false;
   15|  34.3k|#endif
   16|  34.3k|}
_ZN4llvh20shouldReverseIterateINS_9StringRefEEEbv:
   10|  13.8M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  13.8M|  return false;
   15|  13.8M|#endif
   16|  13.8M|}
_ZN4llvh20shouldReverseIterateIjEEbv:
   10|  88.4k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  88.4k|  return false;
   15|  88.4k|#endif
   16|  88.4k|}
_ZN4llvh20shouldReverseIterateIPvEEbv:
   10|   702k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   702k|  return false;
   15|   702k|#endif
   16|   702k|}
_ZN4llvh20shouldReverseIterateIN6hermes10IdentifierEEEbv:
   10|  1.13M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.13M|  return false;
   15|  1.13M|#endif
   16|  1.13M|}
_ZN4llvh20shouldReverseIterateIPN6hermes8FunctionEEEbv:
   10|  1.83M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  1.83M|  return false;
   15|  1.83M|#endif
   16|  1.83M|}
_ZN4llvh20shouldReverseIterateIN6hermes2vm6detail10TransitionEEEbv:
   10|   512k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   512k|  return false;
   15|   512k|#endif
   16|   512k|}
_ZN4llvh20shouldReverseIterateIPN6hermes2vm6DomainEEEbv:
   10|  2.37k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  2.37k|  return false;
   15|  2.37k|#endif
   16|  2.37k|}
_ZN4llvh20shouldReverseIterateIPN6hermes2vm7RuntimeEEEbv:
   10|    693|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|    693|  return false;
   15|    693|#endif
   16|    693|}
_ZN4llvh20shouldReverseIterateIPN6hermes10BasicBlockEEEbv:
   10|   309k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   309k|  return false;
   15|   309k|#endif
   16|   309k|}
_ZN4llvh20shouldReverseIterateIPKN6hermes10BasicBlockEEEbv:
   10|   267k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   267k|  return false;
   15|   267k|#endif
   16|   267k|}
_ZN4llvh20shouldReverseIterateIPN6hermes12UniqueStringEEEbv:
   10|   271k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   271k|  return false;
   15|   271k|#endif
   16|   271k|}
_ZN4llvh20shouldReverseIterateIPN6hermes11InstructionEEEbv:
   10|  12.1M|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|  12.1M|  return false;
   15|  12.1M|#endif
   16|  12.1M|}
_ZN4llvh20shouldReverseIterateIPN6hermes5ValueEEEbv:
   10|   307k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   307k|  return false;
   15|   307k|#endif
   16|   307k|}
_ZN4llvh20shouldReverseIterateIPN6hermes9CatchInstEEEbv:
   10|     32|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|     32|  return false;
   15|     32|#endif
   16|     32|}
_ZN4llvh20shouldReverseIterateIPKN6hermes9ScopeDescEEEbv:
   10|   571k|bool shouldReverseIterate() {
   11|       |#if LLVM_ENABLE_REVERSE_ITERATION
   12|       |  return detail::IsPointerLike<T>::value;
   13|       |#else
   14|   571k|  return false;
   15|   571k|#endif
   16|   571k|}

_ZN4llvh4SHA1C2Ev:
   31|    297|  SHA1() { init(); }

_ZN4llvh5SMLocC2Ev:
   28|  49.5M|  SMLoc() = default;
_ZNK4llvh5SMLoc7isValidEv:
   30|  3.48M|  bool isValid() const { return Ptr != nullptr; }
_ZNK4llvh5SMLoceqERKS0_:
   32|   139k|  bool operator==(const SMLoc &RHS) const { return RHS.Ptr == Ptr; }
_ZNK4llvh5SMLoc10getPointerEv:
   35|  3.33M|  const char *getPointer() const { return Ptr; }
_ZN4llvh5SMLoc14getFromPointerEPKc:
   37|  17.7M|  static SMLoc getFromPointer(const char *Ptr) {
   38|  17.7M|    SMLoc L;
   39|  17.7M|    L.Ptr = Ptr;
   40|  17.7M|    return L;
   41|  17.7M|  }
_ZN4llvh7SMRangeC2ENS_5SMLocES1_:
   55|    195|  SMRange(SMLoc St, SMLoc En) : Start(St), End(En) {
   56|    195|    assert(Start.isValid() == End.isValid() &&
   57|    195|           "Start and End should either both be valid or both be invalid!");
   58|    195|  }
_ZNK4llvh7SMRange7isValidEv:
   60|    422|  bool isValid() const { return Start.isValid(); }
_ZN4llvh7SMRangeC2Ev:
   53|  7.60M|  SMRange() = default;

_ZN4llvh14SaveAndRestoreIPN6hermes5irgen15FunctionContextEEC2ERS4_RKS4_:
   24|     56|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|     56|    X = NewValue;
   26|     56|  }
_ZN4llvh14SaveAndRestoreIPN6hermes5irgen15FunctionContextEED2Ev:
   27|     56|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIbEC2ERbRKb:
   24|   933k|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|   933k|    X = NewValue;
   26|   933k|  }
_ZN4llvh14SaveAndRestoreIbED2Ev:
   27|   933k|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIbE3getEv:
   28|  9.85k|  T get() { return OldValue; }
_ZN4llvh14SaveAndRestoreIjEC2ERjRKj:
   24|  3.95M|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|  3.95M|    X = NewValue;
   26|  3.95M|  }
_ZN4llvh14SaveAndRestoreIjED2Ev:
   27|  3.95M|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree17LoopStatementNodeEEC2ERS4_RKS4_:
   24|      1|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|      1|    X = NewValue;
   26|      1|  }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree17LoopStatementNodeEED2Ev:
   27|      1|  ~SaveAndRestore() { X = OldValue; }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree13StatementNodeEEC2ERS4_RKS4_:
   24|      1|  SaveAndRestore(T &X, const T &NewValue) : X(X), OldValue(X) {
   25|      1|    X = NewValue;
   26|      1|  }
_ZN4llvh14SaveAndRestoreIPN6hermes6ESTree13StatementNodeEED2Ev:
   27|      1|  ~SaveAndRestore() { X = OldValue; }

_ZN4llvh12SMDiagnosticC2Ev:
  304|     99|  SMDiagnostic() = default;
_ZN4llvh9SourceMgrD2Ev:
  128|     99|  ~SourceMgr() = default;
_ZNK4llvh9SourceMgr15isValidBufferIDEj:
  122|   141k|  bool isValidBufferID(unsigned i) const { return i && i <= Buffers.size(); }
  ------------------
  |  Branch (122:51): [True: 141k, False: 0]
  |  Branch (122:56): [True: 141k, False: 0]
  ------------------
_ZN4llvh9SourceMgr14setDiagHandlerEPFvRKNS_12SMDiagnosticEPvES4_:
  136|    297|  void setDiagHandler(DiagHandlerTy DH, void *Ctx = nullptr) {
  137|    297|    DiagHandler = DH;
  138|    297|    DiagContext = Ctx;
  139|    297|  }
_ZNK4llvh9SourceMgr14getDiagHandlerEv:
  141|     99|  DiagHandlerTy getDiagHandler() const { return DiagHandler; }
_ZNK4llvh9SourceMgr14getDiagContextEv:
  142|     99|  void *getDiagContext() const { return DiagContext; }
_ZNK4llvh9SourceMgr13getBufferInfoEj:
  144|   140k|  const SrcBuffer &getBufferInfo(unsigned i) const {
  145|   140k|    assert(isValidBufferID(i));
  146|      0|    return Buffers[i - 1];
  147|   140k|  }
_ZNK4llvh9SourceMgr15getMemoryBufferEj:
  149|    524|  const MemoryBuffer *getMemoryBuffer(unsigned i) const {
  150|    524|    assert(isValidBufferID(i));
  151|      0|    return Buffers[i - 1].Buffer.get();
  152|    524|  }
_ZN4llvh9SourceMgr18AddNewSourceBufferENSt3__110unique_ptrINS_12MemoryBufferENS1_14default_deleteIS3_EEEENS_5SMLocE:
  171|    198|                              SMLoc IncludeLoc) {
  172|    198|    const char * End = F->getBufferEnd();
  173|    198|    SrcBuffer NB;
  174|    198|    NB.Buffer = std::move(F);
  175|    198|    NB.IncludeLoc = IncludeLoc;
  176|    198|    Buffers.push_back(std::move(NB));
  177|    198|    unsigned BufId = Buffers.size();
  178|    198|    BufferEnds.emplace(End, BufId);
  179|    198|    return BufId;
  180|    198|  }
_ZNK4llvh12SMDiagnostic9getLineNoEv:
  319|     43|  int getLineNo() const { return LineNo; }
_ZNK4llvh12SMDiagnostic11getColumnNoEv:
  320|     43|  int getColumnNo() const { return ColumnNo; }
_ZNK4llvh12SMDiagnostic7getKindEv:
  321|    248|  SourceMgr::DiagKind getKind() const { return Kind; }
_ZNK4llvh12SMDiagnostic10getMessageEv:
  322|    172|  StringRef getMessage() const { return Message; }
_ZN4llvh9SourceMgrC2Ev:
  125|     99|  SourceMgr() = default;
_ZN4llvh9SourceMgr9SrcBufferC2Ev:
  100|    198|    SrcBuffer() = default;

_ZN4llvh9call_onceIRFvvEJEEEvRNSt3__19once_flagEOT_DpOT0_:
   99|     11|  void call_once(once_flag &flag, Function &&F, Args &&... ArgList) {
  100|     11|#if LLVM_THREADING_USE_STD_CALL_ONCE
  101|     11|    std::call_once(flag, std::forward<Function>(F),
  102|     11|                   std::forward<Args>(ArgList)...);
  103|       |#else
  104|       |    // For other platforms we use a generic (if brittle) version based on our
  105|       |    // atomics.
  106|       |    sys::cas_flag old_val = sys::CompareAndSwap(&flag.status, Wait, Uninitialized);
  107|       |    if (old_val == Uninitialized) {
  108|       |      std::forward<Function>(F)(std::forward<Args>(ArgList)...);
  109|       |      sys::MemoryFence();
  110|       |      TsanIgnoreWritesBegin();
  111|       |      TsanHappensBefore(&flag.status);
  112|       |      flag.status = Done;
  113|       |      TsanIgnoreWritesEnd();
  114|       |    } else {
  115|       |      // Wait until any thread doing the call has finished.
  116|       |      sys::cas_flag tmp = flag.status;
  117|       |      sys::MemoryFence();
  118|       |      while (tmp != Done) {
  119|       |        tmp = flag.status;
  120|       |        sys::MemoryFence();
  121|       |      }
  122|       |    }
  123|       |    TsanHappensAfter(&flag.status);
  124|       |#endif
  125|     11|  }

_ZN4llvh10TimeRegionD2Ev:
  152|  1.06k|  ~TimeRegion() {
  153|  1.06k|    if (T) T->stopTimer();
  ------------------
  |  Branch (153:9): [True: 0, False: 1.06k]
  ------------------
  154|  1.06k|  }
_ZN4llvh10TimeRegionC2EPNS_5TimerE:
  149|  1.06k|  explicit TimeRegion(Timer *t) : T(t) {
  150|  1.06k|    if (T) T->startTimer();
  ------------------
  |  Branch (150:9): [True: 0, False: 1.06k]
  ------------------
  151|  1.06k|  }

_ZNK4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|   481k|  template <typename T> const T *getTrailingObjects() const {
  310|   481k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   481k|    return this->getTrailingObjectsImpl(
  314|   481k|        static_cast<const BaseTy *>(this),
  315|   481k|        TrailingObjectsBase::OverloadToken<T>());
  316|   481k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|  3.35M|  static void verifyTrailingObjectsAssertions() {
  258|  3.35M|#ifdef LLVM_IS_FINAL
  259|  3.35M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  3.35M|#endif
  261|  3.35M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|   481k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   481k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   481k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   481k|                TopTrailingObj::callNumTrailingObjects(
  172|   481k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   481k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   481k|    else
  178|   481k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   481k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|   481k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   481k|    return Obj;
  268|   481k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|  3.35M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  3.35M|    return 1;
  287|  3.35M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE18getTrailingObjectsIcEEPKT_v:
  309|   919k|  template <typename T> const T *getTrailingObjects() const {
  310|   919k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   919k|    return this->getTrailingObjectsImpl(
  314|   919k|        static_cast<const BaseTy *>(this),
  315|   919k|        TrailingObjectsBase::OverloadToken<T>());
  316|   919k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE31verifyTrailingObjectsAssertionsEv:
  257|  1.02M|  static void verifyTrailingObjectsAssertions() {
  258|  1.02M|#ifdef LLVM_IS_FINAL
  259|  1.02M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  1.02M|#endif
  261|  1.02M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  168|   919k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   919k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   919k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   919k|                TopTrailingObj::callNumTrailingObjects(
  172|   919k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   919k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   919k|    else
  178|   919k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   919k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|   919k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   919k|    return Obj;
  268|   919k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|  1.02M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  1.02M|    return 1;
  287|  1.02M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE18getTrailingObjectsIcEEPKT_v:
  309|   422k|  template <typename T> const T *getTrailingObjects() const {
  310|   422k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   422k|    return this->getTrailingObjectsImpl(
  314|   422k|        static_cast<const BaseTy *>(this),
  315|   422k|        TrailingObjectsBase::OverloadToken<T>());
  316|   422k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE31verifyTrailingObjectsAssertionsEv:
  257|   733k|  static void verifyTrailingObjectsAssertions() {
  258|   733k|#ifdef LLVM_IS_FINAL
  259|   733k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|   733k|#endif
  261|   733k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  168|   422k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   422k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   422k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   422k|                TopTrailingObj::callNumTrailingObjects(
  172|   422k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   422k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   422k|    else
  178|   422k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   422k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|   422k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   422k|    return Obj;
  268|   422k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|   733k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|   733k|    return 1;
  287|   733k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE18getTrailingObjectsIDsEEPKT_v:
  309|  20.9k|  template <typename T> const T *getTrailingObjects() const {
  310|  20.9k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  20.9k|    return this->getTrailingObjectsImpl(
  314|  20.9k|        static_cast<const BaseTy *>(this),
  315|  20.9k|        TrailingObjectsBase::OverloadToken<T>());
  316|  20.9k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE31verifyTrailingObjectsAssertionsEv:
  257|  21.1k|  static void verifyTrailingObjectsAssertions() {
  258|  21.1k|#ifdef LLVM_IS_FINAL
  259|  21.1k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  21.1k|#endif
  261|  21.1k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  168|  20.9k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  20.9k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  20.9k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  20.9k|                TopTrailingObj::callNumTrailingObjects(
  172|  20.9k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  20.9k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  20.9k|    else
  178|  20.9k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  20.9k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|  20.9k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  20.9k|    return Obj;
  268|  20.9k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|  21.1k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  21.1k|    return 1;
  287|  21.1k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE18getTrailingObjectsIDsEEPKT_v:
  309|   165k|  template <typename T> const T *getTrailingObjects() const {
  310|   165k|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|   165k|    return this->getTrailingObjectsImpl(
  314|   165k|        static_cast<const BaseTy *>(this),
  315|   165k|        TrailingObjectsBase::OverloadToken<T>());
  316|   165k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE31verifyTrailingObjectsAssertionsEv:
  257|   723k|  static void verifyTrailingObjectsAssertions() {
  258|   723k|#ifdef LLVM_IS_FINAL
  259|   723k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|   723k|#endif
  261|   723k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPKS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  168|   165k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|   165k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|   165k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|   165k|                TopTrailingObj::callNumTrailingObjects(
  172|   165k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|   165k|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|   165k|    else
  178|   165k|      return reinterpret_cast<const NextTy *>(Ptr);
  179|   165k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22getTrailingObjectsImplEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  266|   165k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|   165k|    return Obj;
  268|   165k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22callNumTrailingObjectsEPKS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  285|   723k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|   723k|    return 1;
  287|   723k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|      1|  template <typename T> const T *getTrailingObjects() const {
  310|      1|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|      1|    return this->getTrailingObjectsImpl(
  314|      1|        static_cast<const BaseTy *>(this),
  315|      1|        TrailingObjectsBase::OverloadToken<T>());
  316|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|      1|  static void verifyTrailingObjectsAssertions() {
  258|      1|#ifdef LLVM_IS_FINAL
  259|      1|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|      1|#endif
  261|      1|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm18SegmentedArrayBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|      1|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|      1|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|      1|                TopTrailingObj::callNumTrailingObjects(
  172|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|      1|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|      1|    else
  178|      1|      return reinterpret_cast<const NextTy *>(Ptr);
  179|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|      1|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|      1|    return Obj;
  268|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|      1|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|      1|    return 1;
  287|      1|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES6_JEE25additionalSizeToAllocImplEm:
  220|  4.69k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  4.69k|    return SizeSoFar;
  222|  4.69k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES4_JS6_EE25additionalSizeToAllocImplEmm:
  200|  4.69k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  4.69k|    return ParentType::additionalSizeToAllocImpl(
  202|  4.69k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  4.69k|                               : SizeSoFar) +
  204|  4.69k|            sizeof(NextTy) * Count1,
  205|  4.69k|        MoreCounts...);
  206|  4.69k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE16totalSizeToAllocIJS4_EEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJS4_EEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|  4.69k|                   TrailingTys, size_t>::type... Counts) {
  352|  4.69k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  4.69k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|    430|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    430|    return SizeSoFar;
  222|    430|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|    430|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    430|    return ParentType::additionalSizeToAllocImpl(
  202|    430|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    430|                               : SizeSoFar) +
  204|    430|            sizeof(NextTy) * Count1,
  205|    430|        MoreCounts...);
  206|    430|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|    430|                   TrailingTys, size_t>::type... Counts) {
  352|    430|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    430|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|  1.92M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  1.92M|    return SizeSoFar;
  222|  1.92M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|  1.92M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  1.92M|    return ParentType::additionalSizeToAllocImpl(
  202|  1.92M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  1.92M|                               : SizeSoFar) +
  204|  1.92M|            sizeof(NextTy) * Count1,
  205|  1.92M|        MoreCounts...);
  206|  1.92M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|  1.92M|                   TrailingTys, size_t>::type... Counts) {
  352|  1.92M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  1.92M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESC_JEE25additionalSizeToAllocImplEm:
  220|  19.2k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  19.2k|    return SizeSoFar;
  222|  19.2k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESA_JSC_EE25additionalSizeToAllocImplEmm:
  200|  19.2k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  19.2k|    return ParentType::additionalSizeToAllocImpl(
  202|  19.2k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  19.2k|                               : SizeSoFar) +
  204|  19.2k|            sizeof(NextTy) * Count1,
  205|  19.2k|        MoreCounts...);
  206|  19.2k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE25additionalSizeToAllocImplEmmm:
  200|  19.2k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  19.2k|    return ParentType::additionalSizeToAllocImpl(
  202|  19.2k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  19.2k|                               : SizeSoFar) +
  204|  19.2k|            sizeof(NextTy) * Count1,
  205|  19.2k|        MoreCounts...);
  206|  19.2k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE16totalSizeToAllocIJS8_SA_EEENS4_9enable_ifIXsr3std7is_sameINSB_3FooIJS8_SA_EEENSE_IJDpT_EEEEE5valueEmE4typeEmm:
  351|  19.2k|                   TrailingTys, size_t>::type... Counts) {
  352|  19.2k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  19.2k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES9_JEE25additionalSizeToAllocImplEm:
  220|  8.66M|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|  8.66M|    return SizeSoFar;
  222|  8.66M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE25additionalSizeToAllocImplEmm:
  200|  8.66M|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|  8.66M|    return ParentType::additionalSizeToAllocImpl(
  202|  8.66M|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|  8.66M|                               : SizeSoFar) +
  204|  8.66M|            sizeof(NextTy) * Count1,
  205|  8.66M|        MoreCounts...);
  206|  8.66M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE16totalSizeToAllocIJS7_EEENSt3__19enable_ifIXsr3std7is_sameINS8_3FooIJS7_EEENSC_IJDpT_EEEEE5valueEmE4typeEm:
  351|  8.66M|                   TrailingTys, size_t>::type... Counts) {
  352|  8.66M|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|  8.66M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES8_JEE25additionalSizeToAllocImplEm:
  220|    452|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    452|    return SizeSoFar;
  222|    452|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES4_JS8_EE25additionalSizeToAllocImplEmm:
  200|    452|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    452|    return ParentType::additionalSizeToAllocImpl(
  202|    452|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    452|                               : SizeSoFar) +
  204|    452|            sizeof(NextTy) * Count1,
  205|    452|        MoreCounts...);
  206|    452|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE16totalSizeToAllocIJS6_EEENSt3__19enable_ifIXsr3std7is_sameINS7_3FooIJS6_EEENSB_IJDpT_EEEEE5valueEmE4typeEm:
  351|    452|                   TrailingTys, size_t>::type... Counts) {
  352|    452|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    452|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE18getTrailingObjectsIS4_EEPT_v:
  321|  60.0k|  template <typename T> T *getTrailingObjects() {
  322|  60.0k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  60.0k|    return this->getTrailingObjectsImpl(
  326|  60.0k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  60.0k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE31verifyTrailingObjectsAssertionsEv:
  257|  60.0k|  static void verifyTrailingObjectsAssertions() {
  258|  60.0k|#ifdef LLVM_IS_FINAL
  259|  60.0k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  60.0k|#endif
  261|  60.0k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm9CodeBlockENS_15TrailingObjectsIS4_JNS3_18PropertyCacheEntryEEEES4_JS6_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenIS6_EE:
  183|  60.0k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  60.0k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  60.0k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  60.0k|                TopTrailingObj::callNumTrailingObjects(
  187|  60.0k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  60.0k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  60.0k|    else
  192|  60.0k|      return reinterpret_cast<NextTy *>(Ptr);
  193|  60.0k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  60.0k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  60.0k|    return Obj;
  274|  60.0k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm9CodeBlockEJNS2_18PropertyCacheEntryEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  60.0k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  60.0k|    return 1;
  287|  60.0k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE18getTrailingObjectsIcEEPT_v:
  321|   105k|  template <typename T> T *getTrailingObjects() {
  322|   105k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|   105k|    return this->getTrailingObjectsImpl(
  326|   105k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|   105k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  183|   105k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|   105k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|   105k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|   105k|                TopTrailingObj::callNumTrailingObjects(
  187|   105k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|   105k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|   105k|    else
  192|   105k|      return reinterpret_cast<NextTy *>(Ptr);
  193|   105k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|   105k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|   105k|    return Obj;
  274|   105k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE18getTrailingObjectsIcEEPT_v:
  321|   311k|  template <typename T> T *getTrailingObjects() {
  322|   311k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|   311k|    return this->getTrailingObjectsImpl(
  326|   311k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|   311k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIcEE:
  183|   311k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|   311k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|   311k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|   311k|                TopTrailingObj::callNumTrailingObjects(
  187|   311k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|   311k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|   311k|    else
  192|   311k|      return reinterpret_cast<NextTy *>(Ptr);
  193|   311k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|   311k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|   311k|    return Obj;
  274|   311k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE18getTrailingObjectsIDsEEPT_v:
  321|    132|  template <typename T> T *getTrailingObjects() {
  322|    132|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|    132|    return this->getTrailingObjectsImpl(
  326|    132|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|    132|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  183|    132|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|    132|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|    132|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|    132|                TopTrailingObj::callNumTrailingObjects(
  187|    132|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|    132|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|    132|    else
  192|    132|      return reinterpret_cast<NextTy *>(Ptr);
  193|    132|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|    132|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|    132|    return Obj;
  274|    132|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE18getTrailingObjectsIDsEEPT_v:
  321|   557k|  template <typename T> T *getTrailingObjects() {
  322|   557k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|   557k|    return this->getTrailingObjectsImpl(
  326|   557k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|   557k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE22getTrailingObjectsImplEPS5_NS0_19TrailingObjectsBase13OverloadTokenIDsEE:
  183|   557k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|   557k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|   557k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|   557k|                TopTrailingObj::callNumTrailingObjects(
  187|   557k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|   557k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|   557k|    else
  192|   557k|      return reinterpret_cast<NextTy *>(Ptr);
  193|   557k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE22getTrailingObjectsImplEPS4_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS4_EE:
  272|   557k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|   557k|    return Obj;
  274|   557k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsIS8_EEPT_v:
  321|  2.09M|  template <typename T> T *getTrailingObjects() {
  322|  2.09M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  2.09M|    return this->getTrailingObjectsImpl(
  326|  2.09M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  2.09M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE31verifyTrailingObjectsAssertionsEv:
  257|  10.6M|  static void verifyTrailingObjectsAssertions() {
  258|  10.6M|#ifdef LLVM_IS_FINAL
  259|  10.6M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  10.6M|#endif
  261|  10.6M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenISA_EE:
  183|  8.78M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  8.78M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  8.78M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  8.78M|                TopTrailingObj::callNumTrailingObjects(
  187|  8.78M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  8.78M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  8.78M|    else
  192|  8.78M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  8.78M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  8.78M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  8.78M|    return Obj;
  274|  8.78M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  10.6M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  10.6M|    return 1;
  287|  10.6M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsIS8_EEPKT_v:
  309|  1.85M|  template <typename T> const T *getTrailingObjects() const {
  310|  1.85M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  1.85M|    return this->getTrailingObjectsImpl(
  314|  1.85M|        static_cast<const BaseTy *>(this),
  315|  1.85M|        TrailingObjectsBase::OverloadToken<T>());
  316|  1.85M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEES4_JSA_SC_EE22getTrailingObjectsImplEPKS4_NS0_19TrailingObjectsBase13OverloadTokenISA_EE:
  168|  1.85M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  1.85M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  1.85M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  1.85M|                TopTrailingObj::callNumTrailingObjects(
  172|  1.85M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  1.85M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  1.85M|    else
  178|  1.85M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  1.85M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22getTrailingObjectsImplEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  266|  1.85M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  1.85M|    return Obj;
  268|  1.85M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE18getTrailingObjectsISA_EEPT_v:
  321|  6.69M|  template <typename T> T *getTrailingObjects() {
  322|  6.69M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  6.69M|    return this->getTrailingObjectsImpl(
  326|  6.69M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  6.69M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm15DictPropertyMapENS_15TrailingObjectsIS4_JNSt3__14pairINS3_10GCSymbolIDENS3_23NamedPropertyDescriptorEEENS3_6detail11DPMHashPairEEEESA_JSC_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenISC_EE:
  183|  6.69M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  6.69M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  6.69M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  6.69M|                TopTrailingObj::callNumTrailingObjects(
  187|  6.69M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  6.69M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  6.69M|    else
  192|  6.69M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  6.69M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm15DictPropertyMapEJNSt3__14pairINS2_10GCSymbolIDENS2_23NamedPropertyDescriptorEEENS2_6detail11DPMHashPairEEE22callNumTrailingObjectsIS8_EEmPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIT_EE:
  291|  6.69M|                                       TrailingObjectsBase::OverloadToken<T>) {
  292|  6.69M|    return Obj->numTrailingObjects(TrailingObjectsBase::OverloadToken<T>());
  293|  6.69M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|  2.87M|  template <typename T> T *getTrailingObjects() {
  322|  2.87M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  2.87M|    return this->getTrailingObjectsImpl(
  326|  2.87M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  2.87M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm16ArrayStorageBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|  2.87M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  2.87M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  2.87M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  2.87M|                TopTrailingObj::callNumTrailingObjects(
  187|  2.87M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  2.87M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  2.87M|    else
  192|  2.87M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  2.87M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|  2.87M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  2.87M|    return Obj;
  274|  2.87M|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|      1|  template <typename T> const T *getTrailingObjects() const {
  310|      1|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|      1|    return this->getTrailingObjectsImpl(
  314|      1|        static_cast<const BaseTy *>(this),
  315|      1|        TrailingObjectsBase::OverloadToken<T>());
  316|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|    100|  static void verifyTrailingObjectsAssertions() {
  258|    100|#ifdef LLVM_IS_FINAL
  259|    100|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|    100|#endif
  261|    100|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|      1|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|      1|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|      1|                TopTrailingObj::callNumTrailingObjects(
  172|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|      1|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|      1|    else
  178|      1|      return reinterpret_cast<const NextTy *>(Ptr);
  179|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|      1|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|      1|    return Obj;
  268|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|    100|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|    100|    return 1;
  287|    100|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|     99|  template <typename T> T *getTrailingObjects() {
  322|     99|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|     99|    return this->getTrailingObjectsImpl(
  326|     99|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|     99|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm16ArrayStorageBaseINS3_11HermesValueEEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|     99|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|     99|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|     99|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|     99|                TopTrailingObj::callNumTrailingObjects(
  187|     99|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|     99|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|     99|    else
  192|     99|      return reinterpret_cast<NextTy *>(Ptr);
  193|     99|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm16ArrayStorageBaseINS2_11HermesValueEEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|     99|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|     99|    return Obj;
  274|     99|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE18getTrailingObjectsIS6_EEPT_v:
  321|  5.96k|  template <typename T> T *getTrailingObjects() {
  322|  5.96k|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  5.96k|    return this->getTrailingObjectsImpl(
  326|  5.96k|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  5.96k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE31verifyTrailingObjectsAssertionsEv:
  257|  5.96k|  static void verifyTrailingObjectsAssertions() {
  258|  5.96k|#ifdef LLVM_IS_FINAL
  259|  5.96k|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  5.96k|#endif
  261|  5.96k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES4_JS8_EE22getTrailingObjectsImplEPS4_NS0_19TrailingObjectsBase13OverloadTokenIS8_EE:
  183|  5.96k|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  5.96k|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  5.96k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  5.96k|                TopTrailingObj::callNumTrailingObjects(
  187|  5.96k|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  5.96k|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  5.96k|    else
  192|  5.96k|      return reinterpret_cast<NextTy *>(Ptr);
  193|  5.96k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE22getTrailingObjectsImplEPS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  272|  5.96k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  5.96k|    return Obj;
  274|  5.96k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE22callNumTrailingObjectsEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  285|  5.96k|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  5.96k|    return 1;
  287|  5.96k|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE18getTrailingObjectsIS6_EEPKT_v:
  309|      1|  template <typename T> const T *getTrailingObjects() const {
  310|      1|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|      1|    return this->getTrailingObjectsImpl(
  314|      1|        static_cast<const BaseTy *>(this),
  315|      1|        TrailingObjectsBase::OverloadToken<T>());
  316|      1|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi8EN6hermes2vm11EnvironmentENS_15TrailingObjectsIS4_JNS3_17GCHermesValueBaseINS3_11HermesValueEEEEEES4_JS8_EE22getTrailingObjectsImplEPKS4_NS0_19TrailingObjectsBase13OverloadTokenIS8_EE:
  168|      1|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|      1|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|      1|                TopTrailingObj::callNumTrailingObjects(
  172|      1|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|      1|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|      1|    else
  178|      1|      return reinterpret_cast<const NextTy *>(Ptr);
  179|      1|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm11EnvironmentEJNS2_17GCHermesValueBaseINS2_11HermesValueEEEEE22getTrailingObjectsImplEPKS3_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS3_EE:
  266|      1|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|      1|    return Obj;
  268|      1|  }
_ZNK4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPKT_v:
  309|  7.25M|  template <typename T> const T *getTrailingObjects() const {
  310|  7.25M|    verifyTrailingObjectsAssertions();
  311|       |    // Forwards to an impl function with overloads, since member
  312|       |    // function templates can't be specialized.
  313|  7.25M|    return this->getTrailingObjectsImpl(
  314|  7.25M|        static_cast<const BaseTy *>(this),
  315|  7.25M|        TrailingObjectsBase::OverloadToken<T>());
  316|  7.25M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE31verifyTrailingObjectsAssertionsEv:
  257|  8.79M|  static void verifyTrailingObjectsAssertions() {
  258|  8.79M|#ifdef LLVM_IS_FINAL
  259|  8.79M|    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
  260|  8.79M|#endif
  261|  8.79M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPKS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  168|  7.25M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  169|  7.25M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  170|  7.25M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  171|  7.25M|                TopTrailingObj::callNumTrailingObjects(
  172|  7.25M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  173|       |
  174|  7.25M|    if (requiresRealignment())
  ------------------
  |  Branch (174:9): [Folded - Ignored]
  ------------------
  175|      0|      return reinterpret_cast<const NextTy *>(
  176|      0|          llvh::alignAddr(Ptr, alignof(NextTy)));
  177|  7.25M|    else
  178|  7.25M|      return reinterpret_cast<const NextTy *>(Ptr);
  179|  7.25M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  266|  7.25M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  267|  7.25M|    return Obj;
  268|  7.25M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22callNumTrailingObjectsEPKS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  285|  8.79M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  286|  8.79M|    return 1;
  287|  8.79M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE18getTrailingObjectsIS7_EEPT_v:
  321|  1.53M|  template <typename T> T *getTrailingObjects() {
  322|  1.53M|    verifyTrailingObjectsAssertions();
  323|       |    // Forwards to an impl function with overloads, since member
  324|       |    // function templates can't be specialized.
  325|  1.53M|    return this->getTrailingObjectsImpl(
  326|  1.53M|        static_cast<BaseTy *>(this), TrailingObjectsBase::OverloadToken<T>());
  327|  1.53M|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi4EN6hermes2vm18SegmentedArrayBaseINS3_13HermesValue32EEENS_15TrailingObjectsIS6_JNS3_17GCHermesValueBaseIS5_EEEEES6_JS9_EE22getTrailingObjectsImplEPS6_NS0_19TrailingObjectsBase13OverloadTokenIS9_EE:
  183|  1.53M|                         TrailingObjectsBase::OverloadToken<NextTy>) {
  184|  1.53M|    auto *Ptr = TopTrailingObj::getTrailingObjectsImpl(
  185|  1.53M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>()) +
  186|  1.53M|                TopTrailingObj::callNumTrailingObjects(
  187|  1.53M|                    Obj, TrailingObjectsBase::OverloadToken<PrevTy>());
  188|       |
  189|  1.53M|    if (requiresRealignment())
  ------------------
  |  Branch (189:9): [Folded - Ignored]
  ------------------
  190|      0|      return reinterpret_cast<NextTy *>(llvh::alignAddr(Ptr, alignof(NextTy)));
  191|  1.53M|    else
  192|  1.53M|      return reinterpret_cast<NextTy *>(Ptr);
  193|  1.53M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm18SegmentedArrayBaseINS2_13HermesValue32EEEJNS2_17GCHermesValueBaseIS4_EEEE22getTrailingObjectsImplEPS5_NS_25trailing_objects_internal19TrailingObjectsBase13OverloadTokenIS5_EE:
  272|  1.53M|                         TrailingObjectsBase::OverloadToken<BaseTy>) {
  273|  1.53M|    return Obj;
  274|  1.53M|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb1EEEJcEE16totalSizeToAllocIJcEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJcEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|   105k|                   TrailingTys, size_t>::type... Counts) {
  352|   105k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   105k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEES5_JcEE25additionalSizeToAllocImplEmm:
  200|   105k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   105k|    return ParentType::additionalSizeToAllocImpl(
  202|   105k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   105k|                               : SizeSoFar) +
  204|   105k|            sizeof(NextTy) * Count1,
  205|   105k|        MoreCounts...);
  206|   105k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb1EEENS_15TrailingObjectsIS5_JcEEEcJEE25additionalSizeToAllocImplEm:
  220|   105k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   105k|    return SizeSoFar;
  222|   105k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb1EEEJDsEE16totalSizeToAllocIJDsEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJDsEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|    132|                   TrailingTys, size_t>::type... Counts) {
  352|    132|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|    132|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE25additionalSizeToAllocImplEmm:
  200|    132|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|    132|    return ParentType::additionalSizeToAllocImpl(
  202|    132|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|    132|                               : SizeSoFar) +
  204|    132|            sizeof(NextTy) * Count1,
  205|    132|        MoreCounts...);
  206|    132|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb1EEENS_15TrailingObjectsIS5_JDsEEEDsJEE25additionalSizeToAllocImplEm:
  220|    132|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|    132|    return SizeSoFar;
  222|    132|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIcLb0EEEJcEE16totalSizeToAllocIJcEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJcEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|   311k|                   TrailingTys, size_t>::type... Counts) {
  352|   311k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   311k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEES5_JcEE25additionalSizeToAllocImplEmm:
  200|   311k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   311k|    return ParentType::additionalSizeToAllocImpl(
  202|   311k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   311k|                               : SizeSoFar) +
  204|   311k|            sizeof(NextTy) * Count1,
  205|   311k|        MoreCounts...);
  206|   311k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi1EN6hermes2vm22DynamicStringPrimitiveIcLb0EEENS_15TrailingObjectsIS5_JcEEEcJEE25additionalSizeToAllocImplEm:
  220|   311k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   311k|    return SizeSoFar;
  222|   311k|  }
_ZN4llvh15TrailingObjectsIN6hermes2vm22DynamicStringPrimitiveIDsLb0EEEJDsEE16totalSizeToAllocIJDsEEENSt3__19enable_ifIXsr3std7is_sameINS5_3FooIJDsEEENS9_IJDpT_EEEEE5valueEmE4typeEm:
  351|   423k|                   TrailingTys, size_t>::type... Counts) {
  352|   423k|    return sizeof(BaseTy) + ParentType::additionalSizeToAllocImpl(0, Counts...);
  353|   423k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEES5_JDsEE25additionalSizeToAllocImplEmm:
  200|   423k|      typename ExtractSecondType<MoreTys, size_t>::type... MoreCounts) {
  201|   423k|    return ParentType::additionalSizeToAllocImpl(
  202|   423k|        (requiresRealignment() ? llvh::alignTo<alignof(NextTy)>(SizeSoFar)
  ------------------
  |  Branch (202:10): [Folded - Ignored]
  ------------------
  203|   423k|                               : SizeSoFar) +
  204|   423k|            sizeof(NextTy) * Count1,
  205|   423k|        MoreCounts...);
  206|   423k|  }
_ZN4llvh25trailing_objects_internal19TrailingObjectsImplILi2EN6hermes2vm22DynamicStringPrimitiveIDsLb0EEENS_15TrailingObjectsIS5_JDsEEEDsJEE25additionalSizeToAllocImplEm:
  220|   423k|  static constexpr size_t additionalSizeToAllocImpl(size_t SizeSoFar) {
  221|   423k|    return SizeSoFar;
  222|   423k|  }

_ZN4llvh11raw_ostreamC2Eb:
   89|  3.59M|      : BufferMode(unbuffered ? Unbuffered : InternalBuffer) {
   90|       |    // Start out ready to flush.
   91|  3.59M|    OutBufStart = OutBufEnd = OutBufCur = nullptr;
   92|  3.59M|  }
_ZN4llvh18raw_string_ostreamC2ERNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  494|     43|  explicit raw_string_ostream(std::string &O) : OS(O) {}
_ZN4llvh11raw_ostream5flushEv:
  142|  3.59M|  void flush() {
  143|  3.59M|    if (OutBufCur != OutBufStart)
  ------------------
  |  Branch (143:9): [True: 48, False: 3.59M]
  ------------------
  144|     48|      flush_nonempty();
  145|  3.59M|  }
_ZN4llvh11raw_ostreamlsEPKc:
  183|  67.6k|  raw_ostream &operator<<(const char *Str) {
  184|       |    // Inline fast path, particularly for constant strings where a sufficiently
  185|       |    // smart compiler will simplify strlen.
  186|       |
  187|  67.6k|    return this->operator<<(StringRef(Str));
  188|  67.6k|  }
_ZN4llvh11raw_ostreamlsENS_9StringRefE:
  168|  84.5k|  raw_ostream &operator<<(StringRef Str) {
  169|       |    // Inline fast path, particularly for strings with a known length.
  170|  84.5k|    size_t Size = Str.size();
  171|       |
  172|       |    // Make sure we can use the fast path.
  173|  84.5k|    if (Size > (size_t)(OutBufEnd - OutBufCur))
  ------------------
  |  Branch (173:9): [True: 14.8k, False: 69.6k]
  ------------------
  174|  14.8k|      return write(Str.data(), Size);
  175|       |
  176|  69.6k|    if (Size) {
  ------------------
  |  Branch (176:9): [True: 67.1k, False: 2.50k]
  ------------------
  177|  67.1k|      memcpy(OutBufCur, Str.data(), Size);
  178|  67.1k|      OutBufCur += Size;
  179|  67.1k|    }
  180|  69.6k|    return *this;
  181|  84.5k|  }
_ZN4llvh11raw_ostreamlsERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEE:
  190|  67.1k|  raw_ostream &operator<<(const std::string &Str) {
  191|       |    // Avoid the fast path, it would only increase code size for a marginal win.
  192|  67.1k|    return write(Str.data(), Str.length());
  193|  67.1k|  }
_ZN4llvh18raw_string_ostream3strEv:
  499|     43|  std::string& str() {
  500|     43|    flush();
  501|     43|    return OS;
  502|     43|  }
_ZN4llvh11raw_ostreamlsEi:
  209|     86|  raw_ostream &operator<<(int N) {
  210|     86|    return this->operator<<(static_cast<long>(N));
  211|     86|  }
_ZN4llvh11raw_ostream13SetBufferSizeEm:
  111|     44|  void SetBufferSize(size_t Size) {
  112|     44|    flush();
  113|     44|    SetBufferAndMode(new char[Size], Size, InternalBuffer);
  114|     44|  }
_ZN4llvh11raw_ostream13SetUnbufferedEv:
  129|  3.59M|  void SetUnbuffered() {
  130|  3.59M|    flush();
  131|  3.59M|    SetBufferAndMode(nullptr, 0, Unbuffered);
  132|  3.59M|  }
_ZNK4llvh11raw_ostream19GetNumBytesInBufferEv:
  134|  3.59M|  size_t GetNumBytesInBuffer() const {
  135|  3.59M|    return OutBufCur - OutBufStart;
  136|  3.59M|  }
_ZN4llvh11raw_ostreamlsEc:
  147|  4.18M|  raw_ostream &operator<<(char C) {
  148|  4.18M|    if (OutBufCur >= OutBufEnd)
  ------------------
  |  Branch (148:9): [True: 4.18M, False: 0]
  ------------------
  149|  4.18M|      return write(C);
  150|      0|    *OutBufCur++ = C;
  151|      0|    return *this;
  152|  4.18M|  }
_ZN4llvh17raw_pwrite_streamC2Eb:
  347|  3.59M|      : raw_ostream(Unbuffered) {}
_ZNK4llvh14raw_fd_ostream9has_errorEv:
  452|      2|  bool has_error() const { return bool(EC); }
_ZN4llvh19raw_svector_ostreamC2ERNS_15SmallVectorImplIcEE:
  526|  3.59M|  explicit raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) {
  527|  3.59M|    SetUnbuffered();
  528|  3.59M|  }
_ZN4llvh19raw_svector_ostream3strEv:
  535|    152|  StringRef str() { return StringRef(OS.data(), OS.size()); }

_ZN4llvh2cl6Option11addArgumentEv:
  356|     30|void Option::addArgument() {
  357|     30|  GlobalParser->addOption(this);
  358|     30|  FullyInitialized = true;
  359|     30|}
_ZN4llvh2cl6Option9setArgStrENS_9StringRefE:
  363|     30|void Option::setArgStr(StringRef S) {
  364|     30|  if (FullyInitialized)
  ------------------
  |  Branch (364:7): [True: 0, False: 30]
  ------------------
  365|      0|    GlobalParser->updateArgStr(this, S);
  366|     30|  assert((S.empty() || S[0] != '-') && "Option can't start with '-");
  367|      0|  ArgStr = S;
  368|     30|}
_ZN4llvh2cl14OptionCategory16registerCategoryEv:
  373|      4|void OptionCategory::registerCategory() {
  374|      4|  GlobalParser->registerCategory(this);
  375|      4|}
CommandLine.cpp:_ZN12_GLOBAL__N_117CommandLineParser9addOptionEPN4llvh2cl6OptionE:
  189|     30|  void addOption(Option *O) {
  190|     30|    if (O->Subs.empty()) {
  ------------------
  |  Branch (190:9): [True: 18, False: 12]
  ------------------
  191|     18|      addOption(O, &*TopLevelSubCommand);
  192|     18|    } else {
  193|     12|      for (auto SC : O->Subs)
  ------------------
  |  Branch (193:20): [True: 12, False: 12]
  ------------------
  194|     12|        addOption(O, SC);
  195|     12|    }
  196|     30|  }
CommandLine.cpp:_ZN12_GLOBAL__N_117CommandLineParser9addOptionEPN4llvh2cl6OptionEPNS2_10SubCommandE:
  147|     42|  void addOption(Option *O, SubCommand *SC) {
  148|     42|    bool HadErrors = false;
  149|     42|    if (O->hasArgStr()) {
  ------------------
  |  Branch (149:9): [True: 42, False: 0]
  ------------------
  150|       |      // Add argument to the argument map!
  151|     42|      if (!SC->OptionsMap.insert(std::make_pair(O->ArgStr, O)).second) {
  ------------------
  |  Branch (151:11): [True: 0, False: 42]
  ------------------
  152|      0|        errs() << ProgramName << ": CommandLine Error: Option '" << O->ArgStr
  153|      0|               << "' registered more than once!\n";
  154|      0|        HadErrors = true;
  155|      0|      }
  156|     42|    }
  157|       |
  158|       |    // Remember information about positional options.
  159|     42|    if (O->getFormattingFlag() == cl::Positional)
  ------------------
  |  Branch (159:9): [True: 0, False: 42]
  ------------------
  160|      0|      SC->PositionalOpts.push_back(O);
  161|     42|    else if (O->getMiscFlags() & cl::Sink) // Remember sink options
  ------------------
  |  Branch (161:14): [True: 0, False: 42]
  ------------------
  162|      0|      SC->SinkOpts.push_back(O);
  163|     42|    else if (O->getNumOccurrencesFlag() == cl::ConsumeAfter) {
  ------------------
  |  Branch (163:14): [True: 0, False: 42]
  ------------------
  164|      0|      if (SC->ConsumeAfterOpt) {
  ------------------
  |  Branch (164:11): [True: 0, False: 0]
  ------------------
  165|      0|        O->error("Cannot specify more than one option with cl::ConsumeAfter!");
  166|      0|        HadErrors = true;
  167|      0|      }
  168|      0|      SC->ConsumeAfterOpt = O;
  169|      0|    }
  170|       |
  171|       |    // Fail hard if there were errors. These are strictly unrecoverable and
  172|       |    // indicate serious issues such as conflicting option names or an
  173|       |    // incorrectly
  174|       |    // linked LLVM distribution.
  175|     42|    if (HadErrors)
  ------------------
  |  Branch (175:9): [True: 0, False: 42]
  ------------------
  176|      0|      report_fatal_error("inconsistency in registered CommandLine options");
  177|       |
  178|       |    // If we're adding this to all sub-commands, add it to the ones that have
  179|       |    // already been registered.
  180|     42|    if (SC == &*AllSubCommands) {
  ------------------
  |  Branch (180:9): [True: 12, False: 30]
  ------------------
  181|     24|      for (const auto &Sub : RegisteredSubCommands) {
  ------------------
  |  Branch (181:28): [True: 24, False: 12]
  ------------------
  182|     24|        if (SC == Sub)
  ------------------
  |  Branch (182:13): [True: 12, False: 12]
  ------------------
  183|     12|          continue;
  184|     12|        addOption(O, Sub);
  185|     12|      }
  186|     12|    }
  187|     42|  }
CommandLine.cpp:_ZN12_GLOBAL__N_117CommandLineParser16registerCategoryEPN4llvh2cl14OptionCategoryE:
  277|      4|  void registerCategory(OptionCategory *cat) {
  278|      4|    assert(count_if(RegisteredOptionCategories,
  279|      4|                    [cat](const OptionCategory *Category) {
  280|      4|             return cat->getName() == Category->getName();
  281|      4|           }) == 0 &&
  282|      4|           "Duplicate option categories");
  283|       |
  284|      0|    RegisteredOptionCategories.insert(cat);
  285|      4|  }
CommandLine.cpp:_ZN12_GLOBAL__N_117CommandLineParser18registerSubCommandEPN4llvh2cl10SubCommandE:
  287|      4|  void registerSubCommand(SubCommand *sub) {
  288|      4|    assert(count_if(RegisteredSubCommands,
  289|      4|                    [sub](const SubCommand *Sub) {
  290|      4|                      return (!sub->getName().empty()) &&
  291|      4|                             (Sub->getName() == sub->getName());
  292|      4|                    }) == 0 &&
  293|      4|           "Duplicate subcommands");
  294|      0|    RegisteredSubCommands.insert(sub);
  295|       |
  296|       |    // For all options that have been registered for all subcommands, add the
  297|       |    // option to this subcommand now.
  298|      4|    if (sub != &*AllSubCommands) {
  ------------------
  |  Branch (298:9): [True: 2, False: 2]
  ------------------
  299|      2|      for (auto &E : AllSubCommands->OptionsMap) {
  ------------------
  |  Branch (299:20): [True: 0, False: 2]
  ------------------
  300|      0|        Option *O = E.second;
  301|      0|        if ((O->isPositional() || O->isSink() || O->isConsumeAfter()) ||
  ------------------
  |  Branch (301:14): [True: 0, False: 0]
  |  Branch (301:35): [True: 0, False: 0]
  |  Branch (301:50): [True: 0, False: 0]
  ------------------
  302|      0|            O->hasArgStr())
  ------------------
  |  Branch (302:13): [True: 0, False: 0]
  ------------------
  303|      0|          addOption(O, sub);
  304|      0|        else
  305|      0|          addLiteralOption(*O, sub, E.first());
  306|      0|      }
  307|      2|    }
  308|      4|  }
CommandLine.cpp:_ZN12_GLOBAL__N_111HelpPrinterC2Eb:
 1831|      8|  explicit HelpPrinter(bool showHidden) : ShowHidden(showHidden) {}
CommandLine.cpp:_ZN12_GLOBAL__N_122CategorizedHelpPrinterC2Eb:
 1917|      4|  explicit CategorizedHelpPrinter(bool showHidden) : HelpPrinter(showHidden) {}
CommandLine.cpp:_ZN12_GLOBAL__N_118HelpPrinterWrapperC2ERNS_11HelpPrinterERNS_22CategorizedHelpPrinterE:
 2011|      4|        CategorizedPrinter(CategorizedPrinter) {}
CommandLine.cpp:_ZN12_GLOBAL__N_117CommandLineParserC2Ev:
  108|      2|  CommandLineParser() : ActiveSubCommand(nullptr) {
  109|      2|    registerSubCommand(&*TopLevelSubCommand);
  110|      2|    registerSubCommand(&*AllSubCommands);
  111|      2|  }

_ZN4llvh27install_fatal_error_handlerEPFvPvRKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEbES0_:
   65|      1|                                       void *user_data) {
   66|      1|#if LLVM_ENABLE_THREADS == 1
   67|      1|  std::lock_guard<std::mutex> Lock(ErrorHandlerMutex);
   68|      1|#endif
   69|      1|  assert(!ErrorHandler && "Error handler already registered!\n");
   70|      0|  ErrorHandler = handler;
   71|      1|  ErrorHandlerUserData = user_data;
   72|      1|}

_ZNK4llvh19FoldingSetNodeIDRef11ComputeHashEv:
   30|  1.78M|unsigned FoldingSetNodeIDRef::ComputeHash() const {
   31|  1.78M|  return static_cast<unsigned>(hash_combine_range(Data, Data+Size));
   32|  1.78M|}
_ZNK4llvh19FoldingSetNodeIDRefeqES0_:
   34|  1.80M|bool FoldingSetNodeIDRef::operator==(FoldingSetNodeIDRef RHS) const {
   35|  1.80M|  if (Size != RHS.Size) return false;
  ------------------
  |  Branch (35:7): [True: 0, False: 1.80M]
  ------------------
   36|  1.80M|  return memcmp(Data, RHS.Data, Size*sizeof(*Data)) == 0;
   37|  1.80M|}
_ZN4llvh16FoldingSetNodeID10AddPointerEPKv:
   52|   650k|void FoldingSetNodeID::AddPointer(const void *Ptr) {
   53|       |  // Note: this adds pointers to the hash using sizes and endianness that
   54|       |  // depend on the host. It doesn't matter, however, because hashing on
   55|       |  // pointer values is inherently unstable. Nothing should depend on the
   56|       |  // ordering of nodes in the folding set.
   57|   650k|  static_assert(sizeof(uintptr_t) <= sizeof(unsigned long long),
   58|   650k|                "unexpected pointer size");
   59|   650k|  AddInteger(reinterpret_cast<uintptr_t>(Ptr));
   60|   650k|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEj:
   64|  7.18M|void FoldingSetNodeID::AddInteger(unsigned I) {
   65|  7.18M|  Bits.push_back(I);
   66|  7.18M|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEm:
   70|  3.59M|void FoldingSetNodeID::AddInteger(unsigned long I) {
   71|  3.59M|  if (sizeof(long) == sizeof(int))
  ------------------
  |  Branch (71:7): [Folded - Ignored]
  ------------------
   72|      0|    AddInteger(unsigned(I));
   73|  3.59M|  else if (sizeof(long) == sizeof(long long)) {
  ------------------
  |  Branch (73:12): [Folded - Ignored]
  ------------------
   74|  3.59M|    AddInteger((unsigned long long)I);
   75|  3.59M|  } else {
   76|      0|    llvm_unreachable("unexpected sizeof(long)");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   77|      0|  }
   78|  3.59M|}
_ZN4llvh16FoldingSetNodeID10AddIntegerEy:
   82|  3.59M|void FoldingSetNodeID::AddInteger(unsigned long long I) {
   83|  3.59M|  AddInteger(unsigned(I));
   84|  3.59M|  AddInteger(unsigned(I >> 32));
   85|  3.59M|}
_ZNK4llvh16FoldingSetNodeID11ComputeHashEv:
  146|  1.78M|unsigned FoldingSetNodeID::ComputeHash() const {
  147|  1.78M|  return FoldingSetNodeIDRef(Bits.data(), Bits.size()).ComputeHash();
  148|  1.78M|}
_ZNK4llvh16FoldingSetNodeIDeqERKS0_:
  152|  1.80M|bool FoldingSetNodeID::operator==(const FoldingSetNodeID &RHS) const {
  153|  1.80M|  return *this == FoldingSetNodeIDRef(RHS.Bits.data(), RHS.Bits.size());
  154|  1.80M|}
_ZNK4llvh16FoldingSetNodeIDeqENS_19FoldingSetNodeIDRefE:
  158|  1.80M|bool FoldingSetNodeID::operator==(FoldingSetNodeIDRef RHS) const {
  159|  1.80M|  return FoldingSetNodeIDRef(Bits.data(), Bits.size()) == RHS;
  160|  1.80M|}
_ZN4llvh14FoldingSetBaseC2Ej:
  229|    168|FoldingSetBase::FoldingSetBase(unsigned Log2InitSize) {
  230|    168|  assert(5 < Log2InitSize && Log2InitSize < 32 &&
  231|    168|         "Initial hash table size out of range");
  232|      0|  NumBuckets = 1 << Log2InitSize;
  233|    168|  Buckets = AllocateBuckets(NumBuckets);
  234|    168|  NumNodes = 0;
  235|    168|}
_ZN4llvh14FoldingSetBaseD2Ev:
  255|    168|FoldingSetBase::~FoldingSetBase() {
  256|    168|  free(Buckets);
  257|    168|}
_ZN4llvh14FoldingSetBase15GrowBucketCountEj:
  270|    120|void FoldingSetBase::GrowBucketCount(unsigned NewBucketCount) {
  271|    120|  assert((NewBucketCount > NumBuckets) && "Can't shrink a folding set with GrowBucketCount");
  272|      0|  assert(isPowerOf2_32(NewBucketCount) && "Bad bucket count!");
  273|      0|  void **OldBuckets = Buckets;
  274|    120|  unsigned OldNumBuckets = NumBuckets;
  275|       |
  276|       |  // Clear out new buckets.
  277|    120|  Buckets = AllocateBuckets(NewBucketCount);
  278|       |  // Set NumBuckets only if allocation of new buckets was successful.
  279|    120|  NumBuckets = NewBucketCount;
  280|    120|  NumNodes = 0;
  281|       |
  282|       |  // Walk the old buckets, rehashing nodes into their new place.
  283|    120|  FoldingSetNodeID TempID;
  284|   169k|  for (unsigned i = 0; i != OldNumBuckets; ++i) {
  ------------------
  |  Branch (284:24): [True: 169k, False: 120]
  ------------------
  285|   169k|    void *Probe = OldBuckets[i];
  286|   169k|    if (!Probe) continue;
  ------------------
  |  Branch (286:9): [True: 22.7k, False: 147k]
  ------------------
  287|   486k|    while (Node *NodeInBucket = GetNextPtr(Probe)) {
  ------------------
  |  Branch (287:18): [True: 339k, False: 147k]
  ------------------
  288|       |      // Figure out the next link, remove NodeInBucket from the old link.
  289|   339k|      Probe = NodeInBucket->getNextInBucket();
  290|   339k|      NodeInBucket->SetNextInBucket(nullptr);
  291|       |
  292|       |      // Insert the node into the new bucket, after recomputing the hash.
  293|   339k|      InsertNode(NodeInBucket,
  294|   339k|                 GetBucketFor(ComputeNodeHash(NodeInBucket, TempID),
  295|   339k|                              Buckets, NumBuckets));
  296|   339k|      TempID.clear();
  297|   339k|    }
  298|   147k|  }
  299|       |
  300|    120|  free(OldBuckets);
  301|    120|}
_ZN4llvh14FoldingSetBase13GrowHashTableEv:
  305|    120|void FoldingSetBase::GrowHashTable() {
  306|    120|  GrowBucketCount(NumBuckets * 2);
  307|    120|}
_ZN4llvh14FoldingSetBase19FindNodeOrInsertPosERKNS_16FoldingSetNodeIDERPv:
  323|  1.44M|                                    void *&InsertPos) {
  324|  1.44M|  unsigned IDHash = ID.ComputeHash();
  325|  1.44M|  void **Bucket = GetBucketFor(IDHash, Buckets, NumBuckets);
  326|  1.44M|  void *Probe = *Bucket;
  327|       |
  328|  1.44M|  InsertPos = nullptr;
  329|       |
  330|  1.44M|  FoldingSetNodeID TempID;
  331|  2.03M|  while (Node *NodeInBucket = GetNextPtr(Probe)) {
  ------------------
  |  Branch (331:16): [True: 1.80M, False: 224k]
  ------------------
  332|  1.80M|    if (NodeEquals(NodeInBucket, ID, IDHash, TempID))
  ------------------
  |  Branch (332:9): [True: 1.21M, False: 589k]
  ------------------
  333|  1.21M|      return NodeInBucket;
  334|   589k|    TempID.clear();
  335|       |
  336|   589k|    Probe = NodeInBucket->getNextInBucket();
  337|   589k|  }
  338|       |
  339|       |  // Didn't find the node, return null with the bucket as the InsertPos.
  340|   224k|  InsertPos = Bucket;
  341|   224k|  return nullptr;
  342|  1.44M|}
_ZN4llvh14FoldingSetBase10InsertNodeEPNS0_4NodeEPv:
  347|   563k|void FoldingSetBase::InsertNode(Node *N, void *InsertPos) {
  348|   563k|  assert(!N->getNextInBucket());
  349|       |  // Do we need to grow the hashtable?
  350|   563k|  if (NumNodes+1 > capacity()) {
  ------------------
  |  Branch (350:7): [True: 120, False: 563k]
  ------------------
  351|    120|    GrowHashTable();
  352|    120|    FoldingSetNodeID TempID;
  353|    120|    InsertPos = GetBucketFor(ComputeNodeHash(N, TempID), Buckets, NumBuckets);
  354|    120|  }
  355|       |
  356|   563k|  ++NumNodes;
  357|       |
  358|       |  /// The insert position is actually a bucket pointer.
  359|   563k|  void **Bucket = static_cast<void**>(InsertPos);
  360|       |
  361|   563k|  void *Next = *Bucket;
  362|       |
  363|       |  // If this is the first insertion into this bucket, its next pointer will be
  364|       |  // null.  Pretend as if it pointed to itself, setting the low bit to indicate
  365|       |  // that it is a pointer to the bucket.
  366|   563k|  if (!Next)
  ------------------
  |  Branch (366:7): [True: 271k, False: 292k]
  ------------------
  367|   271k|    Next = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(Bucket)|1);
  368|       |
  369|       |  // Set the node's next pointer, and make the bucket point to the node.
  370|   563k|  N->SetNextInBucket(Next);
  371|   563k|  *Bucket = N;
  372|   563k|}
_ZN4llvh22FoldingSetIteratorImplC2EPPv:
  430|    336|FoldingSetIteratorImpl::FoldingSetIteratorImpl(void **Bucket) {
  431|       |  // Skip to the first non-null non-self-cycle bucket.
  432|  5.12k|  while (*Bucket != reinterpret_cast<void*>(-1) &&
  ------------------
  |  Branch (432:10): [True: 4.88k, False: 240]
  ------------------
  433|  5.12k|         (!*Bucket || !GetNextPtr(*Bucket)))
  ------------------
  |  Branch (433:11): [True: 4.78k, False: 96]
  |  Branch (433:23): [True: 0, False: 96]
  ------------------
  434|  4.78k|    ++Bucket;
  435|       |
  436|    336|  NodePtr = static_cast<FoldingSetNode*>(*Bucket);
  437|    336|}
_ZN4llvh22FoldingSetIteratorImpl7advanceEv:
  439|   224k|void FoldingSetIteratorImpl::advance() {
  440|       |  // If there is another link within this bucket, go to it.
  441|   224k|  void *Probe = NodePtr->getNextInBucket();
  442|       |
  443|   224k|  if (FoldingSetNode *NextNodeInBucket = GetNextPtr(Probe))
  ------------------
  |  Branch (443:23): [True: 99.4k, False: 124k]
  ------------------
  444|  99.4k|    NodePtr = NextNodeInBucket;
  445|   124k|  else {
  446|       |    // Otherwise, this is the last link in this bucket.
  447|   124k|    void **Bucket = GetBucketPtr(Probe);
  448|       |
  449|       |    // Skip to the next non-null non-self-cycle bucket.
  450|   175k|    do {
  451|   175k|      ++Bucket;
  452|   175k|    } while (*Bucket != reinterpret_cast<void*>(-1) &&
  ------------------
  |  Branch (452:14): [True: 175k, False: 96]
  ------------------
  453|   175k|             (!*Bucket || !GetNextPtr(*Bucket)));
  ------------------
  |  Branch (453:15): [True: 51.0k, False: 124k]
  |  Branch (453:27): [True: 0, False: 124k]
  ------------------
  454|       |
  455|   124k|    NodePtr = static_cast<FoldingSetNode*>(*Bucket);
  456|   124k|  }
  457|   224k|}
FoldingSet.cpp:_ZL15AllocateBucketsj:
  216|    288|static void **AllocateBuckets(unsigned NumBuckets) {
  217|    288|  void **Buckets = static_cast<void**>(safe_calloc(NumBuckets + 1,
  218|    288|                                                   sizeof(void*)));
  219|       |  // Set the very last bucket to be a non-null "pointer".
  220|    288|  Buckets[NumBuckets] = reinterpret_cast<void*>(-1);
  221|    288|  return Buckets;
  222|    288|}
FoldingSet.cpp:_ZL10GetNextPtrPv:
  191|  2.86M|static FoldingSetBase::Node *GetNextPtr(void *NextInBucketPtr) {
  192|       |  // The low bit is set if this is the pointer back to the bucket.
  193|  2.86M|  if (reinterpret_cast<intptr_t>(NextInBucketPtr) & 1)
  ------------------
  |  Branch (193:7): [True: 439k, False: 2.43M]
  ------------------
  194|   439k|    return nullptr;
  195|       |
  196|  2.43M|  return static_cast<FoldingSetBase::Node*>(NextInBucketPtr);
  197|  2.86M|}
FoldingSet.cpp:_ZL12GetBucketForjPPvj:
  209|  1.78M|static void **GetBucketFor(unsigned Hash, void **Buckets, unsigned NumBuckets) {
  210|       |  // NumBuckets is always a power of 2.
  211|  1.78M|  unsigned BucketNum = Hash & (NumBuckets-1);
  212|  1.78M|  return Buckets + BucketNum;
  213|  1.78M|}
FoldingSet.cpp:_ZL12GetBucketPtrPv:
  201|   124k|static void **GetBucketPtr(void *NextInBucketPtr) {
  202|   124k|  intptr_t Ptr = reinterpret_cast<intptr_t>(NextInBucketPtr);
  203|   124k|  assert((Ptr & 1) && "Not a bucket pointer");
  204|      0|  return reinterpret_cast<void**>(Ptr & ~intptr_t(1));
  205|   124k|}

_ZNK4llvh17ManagedStaticBase21RegisterManagedStaticEPFPvvEPFvS1_E:
   36|     11|                                              void (*Deleter)(void*)) const {
   37|     11|  assert(Creator);
   38|     11|  if (llvm_is_multithreaded()) {
  ------------------
  |  Branch (38:7): [True: 11, False: 0]
  ------------------
   39|     11|    MutexGuard Lock(*getManagedStaticMutex());
   40|       |
   41|     11|    if (!Ptr.load(std::memory_order_relaxed)) {
  ------------------
  |  Branch (41:9): [True: 11, False: 0]
  ------------------
   42|     11|      void *Tmp = Creator();
   43|       |
   44|     11|      Ptr.store(Tmp, std::memory_order_release);
   45|     11|      DeleterFn = Deleter;
   46|       |
   47|       |      // Add to list of managed statics.
   48|     11|      Next = StaticList;
   49|     11|      StaticList = this;
   50|     11|    }
   51|     11|  } else {
   52|      0|    assert(!Ptr && !DeleterFn && !Next &&
   53|      0|           "Partially initialized ManagedStatic!?");
   54|      0|    Ptr = Creator();
   55|      0|    DeleterFn = Deleter;
   56|       |
   57|       |    // Add to list of managed statics.
   58|      0|    Next = StaticList;
   59|      0|    StaticList = this;
   60|      0|  }
   61|     11|}
ManagedStatic.cpp:_ZL21getManagedStaticMutexv:
   30|     11|static sys::Mutex* getManagedStaticMutex() {
   31|     11|  llvh::call_once(mutex_init_flag, initializeMutex);
   32|     11|  return ManagedStaticMutex;
   33|     11|}
ManagedStatic.cpp:_ZL15initializeMutexv:
   26|      2|static void initializeMutex() {
   27|      2|  ManagedStaticMutex = new sys::Mutex();
   28|      2|}

_ZN4llvh12MemoryBufferD2Ev:
   42|    198|MemoryBuffer::~MemoryBuffer() { }
_ZN4llvh12MemoryBuffer4initEPKcS2_b:
   47|    198|                        bool RequiresNullTerminator) {
   48|    198|  assert((!RequiresNullTerminator || BufEnd[0] == 0) &&
   49|    198|         "Buffer is not null terminated!");
   50|      0|  BufferStart = BufStart;
   51|    198|  BufferEnd = BufEnd;
   52|    198|}
_ZN4llvh12MemoryBuffer12getMemBufferENS_9StringRefES1_b:
  114|     99|                           bool RequiresNullTerminator) {
  115|     99|  auto *Ret = new (NamedBufferAlloc(BufferName))
  116|     99|      MemoryBufferMem<MemoryBuffer>(InputData, RequiresNullTerminator);
  117|     99|  return std::unique_ptr<MemoryBuffer>(Ret);
  118|     99|}
MemoryBuffer.cpp:_ZN12_GLOBAL__N_116NamedBufferAllocC2ERKN4llvh5TwineE:
   69|     99|  NamedBufferAlloc(const Twine &Name) : Name(Name) {}
MemoryBuffer.cpp:_ZnwmRKN12_GLOBAL__N_116NamedBufferAllocE:
   73|     99|void *operator new(size_t N, const NamedBufferAlloc &Alloc) {
   74|     99|  SmallString<256> NameBuf;
   75|     99|  StringRef NameRef = Alloc.Name.toStringRef(NameBuf);
   76|       |
   77|     99|  char *Mem = static_cast<char *>(operator new(N + NameRef.size() + 1));
   78|     99|  CopyStringRef(Mem + N, NameRef);
   79|     99|  return Mem;
   80|     99|}
MemoryBuffer.cpp:_ZL13CopyStringRefPcN4llvh9StringRefE:
   60|     99|static void CopyStringRef(char *Memory, StringRef Data) {
   61|     99|  if (!Data.empty())
  ------------------
  |  Branch (61:7): [True: 0, False: 99]
  ------------------
   62|      0|    memcpy(Memory, Data.data(), Data.size());
   63|     99|  Memory[Data.size()] = 0; // Null terminate string.
   64|     99|}
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh12MemoryBufferEEC2ENS1_9StringRefEb:
   87|     99|  MemoryBufferMem(StringRef InputData, bool RequiresNullTerminator) {
   88|     99|    MemoryBuffer::init(InputData.begin(), InputData.end(),
   89|     99|                       RequiresNullTerminator);
   90|     99|  }
MemoryBuffer.cpp:_ZN12_GLOBAL__N_115MemoryBufferMemIN4llvh12MemoryBufferEEdlEPv:
   94|     99|  void operator delete(void *p) { ::operator delete(p); }

_ZN4llvh3sys9MutexImplC2Eb:
   47|      3|{
   48|       |  // Declare the pthread_mutex data structures
   49|      3|  pthread_mutex_t* mutex =
   50|      3|    static_cast<pthread_mutex_t*>(safe_malloc(sizeof(pthread_mutex_t)));
   51|       |
   52|      3|  pthread_mutexattr_t attr;
   53|       |
   54|       |  // Initialize the mutex attributes
   55|      3|  int errorcode = pthread_mutexattr_init(&attr);
   56|      3|  assert(errorcode == 0); (void)errorcode;
   57|       |
   58|       |  // Initialize the mutex as a recursive mutex, if requested, or normal
   59|       |  // otherwise.
   60|      3|  int kind = ( recursive  ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL );
  ------------------
  |  Branch (60:16): [True: 3, False: 0]
  ------------------
   61|      3|  errorcode = pthread_mutexattr_settype(&attr, kind);
   62|      3|  assert(errorcode == 0);
   63|       |
   64|       |  // Initialize the mutex
   65|      0|  errorcode = pthread_mutex_init(mutex, &attr);
   66|      3|  assert(errorcode == 0);
   67|       |
   68|       |  // Destroy the attributes
   69|      0|  errorcode = pthread_mutexattr_destroy(&attr);
   70|      3|  assert(errorcode == 0);
   71|       |
   72|       |  // Assign the data member
   73|      0|  data_ = mutex;
   74|      3|}
_ZN4llvh3sys9MutexImpl7acquireEv:
   87|     30|{
   88|     30|  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
   89|     30|  assert(mutex != nullptr);
   90|       |
   91|      0|  int errorcode = pthread_mutex_lock(mutex);
   92|     30|  return errorcode == 0;
   93|     30|}
_ZN4llvh3sys9MutexImpl7releaseEv:
   97|     30|{
   98|     30|  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data_);
   99|     30|  assert(mutex != nullptr);
  100|       |
  101|      0|  int errorcode = pthread_mutex_unlock(mutex);
  102|     30|  return errorcode == 0;
  103|     30|}

_ZN4llvh13write_integerERNS_11raw_ostreamEmmNS_12IntegerStyleE:
  115|    180|                         IntegerStyle Style) {
  116|    180|  write_unsigned(S, N, MinDigits, Style);
  117|    180|}
_ZN4llvh13write_integerERNS_11raw_ostreamElmNS_12IntegerStyleE:
  120|     86|                         IntegerStyle Style) {
  121|     86|  write_signed(S, N, MinDigits, Style);
  122|     86|}
_ZN4llvh9write_hexERNS_11raw_ostreamEmNS_13HexPrintStyleENS_8OptionalImEE:
  135|    695|                     Optional<size_t> Width) {
  136|    695|  const size_t kMaxWidth = 128u;
  137|       |
  138|    695|  size_t W = std::min(kMaxWidth, Width.getValueOr(0u));
  139|       |
  140|    695|  unsigned Nibbles = (64 - countLeadingZeros(N) + 3) / 4;
  141|    695|  bool Prefix = (Style == HexPrintStyle::PrefixLower ||
  ------------------
  |  Branch (141:18): [True: 0, False: 695]
  ------------------
  142|    695|                 Style == HexPrintStyle::PrefixUpper);
  ------------------
  |  Branch (142:18): [True: 0, False: 695]
  ------------------
  143|    695|  bool Upper =
  144|    695|      (Style == HexPrintStyle::Upper || Style == HexPrintStyle::PrefixUpper);
  ------------------
  |  Branch (144:8): [True: 0, False: 695]
  |  Branch (144:41): [True: 0, False: 695]
  ------------------
  145|    695|  unsigned PrefixChars = Prefix ? 2 : 0;
  ------------------
  |  Branch (145:26): [True: 0, False: 695]
  ------------------
  146|    695|  unsigned NumChars =
  147|    695|      std::max(static_cast<unsigned>(W), std::max(1u, Nibbles) + PrefixChars);
  148|       |
  149|    695|  char NumberBuffer[kMaxWidth];
  150|    695|  ::memset(NumberBuffer, '0', llvh::array_lengthof(NumberBuffer));
  151|    695|  if (Prefix)
  ------------------
  |  Branch (151:7): [True: 0, False: 695]
  ------------------
  152|      0|    NumberBuffer[1] = 'x';
  153|    695|  char *EndPtr = NumberBuffer + NumChars;
  154|    695|  char *CurPtr = EndPtr;
  155|  1.94k|  while (N) {
  ------------------
  |  Branch (155:10): [True: 1.25k, False: 695]
  ------------------
  156|  1.25k|    unsigned char x = static_cast<unsigned char>(N) % 16;
  157|  1.25k|    *--CurPtr = hexdigit(x, !Upper);
  158|  1.25k|    N /= 16;
  159|  1.25k|  }
  160|       |
  161|    695|  S.write(NumberBuffer, NumChars);
  162|    695|}
NativeFormatting.cpp:_ZL19write_unsigned_implIjEvRN4llvh11raw_ostreamET_mNS0_12IntegerStyleEb:
   53|    266|                                IntegerStyle Style, bool IsNegative) {
   54|    266|  static_assert(std::is_unsigned<T>::value, "Value is not unsigned!");
   55|       |
   56|    266|  char NumberBuffer[128];
   57|    266|  std::memset(NumberBuffer, '0', sizeof(NumberBuffer));
   58|       |
   59|    266|  size_t Len = 0;
   60|    266|  Len = format_to_buffer(N, NumberBuffer);
   61|       |
   62|    266|  if (IsNegative)
  ------------------
  |  Branch (62:7): [True: 0, False: 266]
  ------------------
   63|      0|    S << '-';
   64|       |
   65|    266|  if (Len < MinDigits && Style != IntegerStyle::Number) {
  ------------------
  |  Branch (65:7): [True: 0, False: 266]
  |  Branch (65:26): [True: 0, False: 0]
  ------------------
   66|      0|    for (size_t I = Len; I < MinDigits; ++I)
  ------------------
  |  Branch (66:26): [True: 0, False: 0]
  ------------------
   67|      0|      S << '0';
   68|      0|  }
   69|       |
   70|    266|  if (Style == IntegerStyle::Number) {
  ------------------
  |  Branch (70:7): [True: 0, False: 266]
  ------------------
   71|      0|    writeWithCommas(S, ArrayRef<char>(std::end(NumberBuffer) - Len, Len));
   72|    266|  } else {
   73|    266|    S.write(std::end(NumberBuffer) - Len, Len);
   74|    266|  }
   75|    266|}
NativeFormatting.cpp:_ZL16format_to_bufferIjLm128EEiT_RAT0__c:
   22|    266|static int format_to_buffer(T Value, char (&Buffer)[N]) {
   23|    266|  char *EndPtr = std::end(Buffer);
   24|    266|  char *CurPtr = EndPtr;
   25|       |
   26|    663|  do {
   27|    663|    *--CurPtr = '0' + char(Value % 10);
   28|    663|    Value /= 10;
   29|    663|  } while (Value);
  ------------------
  |  Branch (29:12): [True: 397, False: 266]
  ------------------
   30|    266|  return EndPtr - CurPtr;
   31|    266|}
NativeFormatting.cpp:_ZL14write_unsignedImEvRN4llvh11raw_ostreamET_mNS0_12IntegerStyleEb:
   79|    266|                           IntegerStyle Style, bool IsNegative = false) {
   80|       |  // Output using 32-bit div/mod if possible.
   81|    266|  if (N == static_cast<uint32_t>(N))
  ------------------
  |  Branch (81:7): [True: 266, False: 0]
  ------------------
   82|    266|    write_unsigned_impl(S, static_cast<uint32_t>(N), MinDigits, Style,
   83|    266|                        IsNegative);
   84|      0|  else
   85|      0|    write_unsigned_impl(S, N, MinDigits, Style, IsNegative);
   86|    266|}
NativeFormatting.cpp:_ZL12write_signedIlEvRN4llvh11raw_ostreamET_mNS0_12IntegerStyleE:
   90|     86|                         IntegerStyle Style) {
   91|     86|  static_assert(std::is_signed<T>::value, "Value is not signed!");
   92|       |
   93|     86|  using UnsignedT = typename std::make_unsigned<T>::type;
   94|       |
   95|     86|  if (N >= 0) {
  ------------------
  |  Branch (95:7): [True: 86, False: 0]
  ------------------
   96|     86|    write_unsigned(S, static_cast<UnsignedT>(N), MinDigits, Style);
   97|     86|    return;
   98|     86|  }
   99|       |
  100|      0|  UnsignedT UN = -(UnsignedT)N;
  101|      0|  write_unsigned(S, UN, MinDigits, Style, true);
  102|      0|}

_ZN4llvh4SHA14initEv:
   85|    297|void SHA1::init() {
   86|    297|  InternalState.State[0] = SEED_0;
  ------------------
  |  |   79|    297|#define SEED_0 0x67452301
  ------------------
   87|    297|  InternalState.State[1] = SEED_1;
  ------------------
  |  |   80|    297|#define SEED_1 0xefcdab89
  ------------------
   88|    297|  InternalState.State[2] = SEED_2;
  ------------------
  |  |   81|    297|#define SEED_2 0x98badcfe
  ------------------
   89|    297|  InternalState.State[3] = SEED_3;
  ------------------
  |  |   82|    297|#define SEED_3 0x10325476
  ------------------
   90|    297|  InternalState.State[4] = SEED_4;
  ------------------
  |  |   83|    297|#define SEED_4 0xc3d2e1f0
  ------------------
   91|    297|  InternalState.ByteCount = 0;
   92|    297|  InternalState.BufferOffset = 0;
   93|    297|}
_ZN4llvh4SHA19hashBlockEv:
   95|  18.9k|void SHA1::hashBlock() {
   96|  18.9k|  uint32_t A = InternalState.State[0];
   97|  18.9k|  uint32_t B = InternalState.State[1];
   98|  18.9k|  uint32_t C = InternalState.State[2];
   99|  18.9k|  uint32_t D = InternalState.State[3];
  100|  18.9k|  uint32_t E = InternalState.State[4];
  101|       |
  102|       |  // 4 rounds of 20 operations each. Loop unrolled.
  103|  18.9k|  r0(A, B, C, D, E, 0, InternalState.Buffer.L);
  104|  18.9k|  r0(E, A, B, C, D, 1, InternalState.Buffer.L);
  105|  18.9k|  r0(D, E, A, B, C, 2, InternalState.Buffer.L);
  106|  18.9k|  r0(C, D, E, A, B, 3, InternalState.Buffer.L);
  107|  18.9k|  r0(B, C, D, E, A, 4, InternalState.Buffer.L);
  108|  18.9k|  r0(A, B, C, D, E, 5, InternalState.Buffer.L);
  109|  18.9k|  r0(E, A, B, C, D, 6, InternalState.Buffer.L);
  110|  18.9k|  r0(D, E, A, B, C, 7, InternalState.Buffer.L);
  111|  18.9k|  r0(C, D, E, A, B, 8, InternalState.Buffer.L);
  112|  18.9k|  r0(B, C, D, E, A, 9, InternalState.Buffer.L);
  113|  18.9k|  r0(A, B, C, D, E, 10, InternalState.Buffer.L);
  114|  18.9k|  r0(E, A, B, C, D, 11, InternalState.Buffer.L);
  115|  18.9k|  r0(D, E, A, B, C, 12, InternalState.Buffer.L);
  116|  18.9k|  r0(C, D, E, A, B, 13, InternalState.Buffer.L);
  117|  18.9k|  r0(B, C, D, E, A, 14, InternalState.Buffer.L);
  118|  18.9k|  r0(A, B, C, D, E, 15, InternalState.Buffer.L);
  119|  18.9k|  r1(E, A, B, C, D, 16, InternalState.Buffer.L);
  120|  18.9k|  r1(D, E, A, B, C, 17, InternalState.Buffer.L);
  121|  18.9k|  r1(C, D, E, A, B, 18, InternalState.Buffer.L);
  122|  18.9k|  r1(B, C, D, E, A, 19, InternalState.Buffer.L);
  123|       |
  124|  18.9k|  r2(A, B, C, D, E, 20, InternalState.Buffer.L);
  125|  18.9k|  r2(E, A, B, C, D, 21, InternalState.Buffer.L);
  126|  18.9k|  r2(D, E, A, B, C, 22, InternalState.Buffer.L);
  127|  18.9k|  r2(C, D, E, A, B, 23, InternalState.Buffer.L);
  128|  18.9k|  r2(B, C, D, E, A, 24, InternalState.Buffer.L);
  129|  18.9k|  r2(A, B, C, D, E, 25, InternalState.Buffer.L);
  130|  18.9k|  r2(E, A, B, C, D, 26, InternalState.Buffer.L);
  131|  18.9k|  r2(D, E, A, B, C, 27, InternalState.Buffer.L);
  132|  18.9k|  r2(C, D, E, A, B, 28, InternalState.Buffer.L);
  133|  18.9k|  r2(B, C, D, E, A, 29, InternalState.Buffer.L);
  134|  18.9k|  r2(A, B, C, D, E, 30, InternalState.Buffer.L);
  135|  18.9k|  r2(E, A, B, C, D, 31, InternalState.Buffer.L);
  136|  18.9k|  r2(D, E, A, B, C, 32, InternalState.Buffer.L);
  137|  18.9k|  r2(C, D, E, A, B, 33, InternalState.Buffer.L);
  138|  18.9k|  r2(B, C, D, E, A, 34, InternalState.Buffer.L);
  139|  18.9k|  r2(A, B, C, D, E, 35, InternalState.Buffer.L);
  140|  18.9k|  r2(E, A, B, C, D, 36, InternalState.Buffer.L);
  141|  18.9k|  r2(D, E, A, B, C, 37, InternalState.Buffer.L);
  142|  18.9k|  r2(C, D, E, A, B, 38, InternalState.Buffer.L);
  143|  18.9k|  r2(B, C, D, E, A, 39, InternalState.Buffer.L);
  144|       |
  145|  18.9k|  r3(A, B, C, D, E, 40, InternalState.Buffer.L);
  146|  18.9k|  r3(E, A, B, C, D, 41, InternalState.Buffer.L);
  147|  18.9k|  r3(D, E, A, B, C, 42, InternalState.Buffer.L);
  148|  18.9k|  r3(C, D, E, A, B, 43, InternalState.Buffer.L);
  149|  18.9k|  r3(B, C, D, E, A, 44, InternalState.Buffer.L);
  150|  18.9k|  r3(A, B, C, D, E, 45, InternalState.Buffer.L);
  151|  18.9k|  r3(E, A, B, C, D, 46, InternalState.Buffer.L);
  152|  18.9k|  r3(D, E, A, B, C, 47, InternalState.Buffer.L);
  153|  18.9k|  r3(C, D, E, A, B, 48, InternalState.Buffer.L);
  154|  18.9k|  r3(B, C, D, E, A, 49, InternalState.Buffer.L);
  155|  18.9k|  r3(A, B, C, D, E, 50, InternalState.Buffer.L);
  156|  18.9k|  r3(E, A, B, C, D, 51, InternalState.Buffer.L);
  157|  18.9k|  r3(D, E, A, B, C, 52, InternalState.Buffer.L);
  158|  18.9k|  r3(C, D, E, A, B, 53, InternalState.Buffer.L);
  159|  18.9k|  r3(B, C, D, E, A, 54, InternalState.Buffer.L);
  160|  18.9k|  r3(A, B, C, D, E, 55, InternalState.Buffer.L);
  161|  18.9k|  r3(E, A, B, C, D, 56, InternalState.Buffer.L);
  162|  18.9k|  r3(D, E, A, B, C, 57, InternalState.Buffer.L);
  163|  18.9k|  r3(C, D, E, A, B, 58, InternalState.Buffer.L);
  164|  18.9k|  r3(B, C, D, E, A, 59, InternalState.Buffer.L);
  165|       |
  166|  18.9k|  r4(A, B, C, D, E, 60, InternalState.Buffer.L);
  167|  18.9k|  r4(E, A, B, C, D, 61, InternalState.Buffer.L);
  168|  18.9k|  r4(D, E, A, B, C, 62, InternalState.Buffer.L);
  169|  18.9k|  r4(C, D, E, A, B, 63, InternalState.Buffer.L);
  170|  18.9k|  r4(B, C, D, E, A, 64, InternalState.Buffer.L);
  171|  18.9k|  r4(A, B, C, D, E, 65, InternalState.Buffer.L);
  172|  18.9k|  r4(E, A, B, C, D, 66, InternalState.Buffer.L);
  173|  18.9k|  r4(D, E, A, B, C, 67, InternalState.Buffer.L);
  174|  18.9k|  r4(C, D, E, A, B, 68, InternalState.Buffer.L);
  175|  18.9k|  r4(B, C, D, E, A, 69, InternalState.Buffer.L);
  176|  18.9k|  r4(A, B, C, D, E, 70, InternalState.Buffer.L);
  177|  18.9k|  r4(E, A, B, C, D, 71, InternalState.Buffer.L);
  178|  18.9k|  r4(D, E, A, B, C, 72, InternalState.Buffer.L);
  179|  18.9k|  r4(C, D, E, A, B, 73, InternalState.Buffer.L);
  180|  18.9k|  r4(B, C, D, E, A, 74, InternalState.Buffer.L);
  181|  18.9k|  r4(A, B, C, D, E, 75, InternalState.Buffer.L);
  182|  18.9k|  r4(E, A, B, C, D, 76, InternalState.Buffer.L);
  183|  18.9k|  r4(D, E, A, B, C, 77, InternalState.Buffer.L);
  184|  18.9k|  r4(C, D, E, A, B, 78, InternalState.Buffer.L);
  185|  18.9k|  r4(B, C, D, E, A, 79, InternalState.Buffer.L);
  186|       |
  187|  18.9k|  InternalState.State[0] += A;
  188|  18.9k|  InternalState.State[1] += B;
  189|  18.9k|  InternalState.State[2] += C;
  190|  18.9k|  InternalState.State[3] += D;
  191|  18.9k|  InternalState.State[4] += E;
  192|  18.9k|}
_ZN4llvh4SHA112addUncountedEh:
  194|  1.21M|void SHA1::addUncounted(uint8_t Data) {
  195|       |#ifdef SHA_BIG_ENDIAN
  196|       |  InternalState.Buffer.C[InternalState.BufferOffset] = Data;
  197|       |#else
  198|  1.21M|  InternalState.Buffer.C[InternalState.BufferOffset ^ 3] = Data;
  199|  1.21M|#endif
  200|       |
  201|  1.21M|  InternalState.BufferOffset++;
  202|  1.21M|  if (InternalState.BufferOffset == BLOCK_LENGTH) {
  ------------------
  |  Branch (202:7): [True: 18.9k, False: 1.19M]
  ------------------
  203|  18.9k|    hashBlock();
  204|  18.9k|    InternalState.BufferOffset = 0;
  205|  18.9k|  }
  206|  1.21M|}
_ZN4llvh4SHA19writebyteEh:
  208|  1.19M|void SHA1::writebyte(uint8_t Data) {
  209|  1.19M|  ++InternalState.ByteCount;
  210|  1.19M|  addUncounted(Data);
  211|  1.19M|}
_ZN4llvh4SHA16updateENS_8ArrayRefIhEE:
  213|    297|void SHA1::update(ArrayRef<uint8_t> Data) {
  214|    297|  for (auto &C : Data)
  ------------------
  |  Branch (214:16): [True: 1.19M, False: 297]
  ------------------
  215|  1.19M|    writebyte(C);
  216|    297|}
_ZN4llvh4SHA13padEv:
  218|    297|void SHA1::pad() {
  219|       |  // Implement SHA-1 padding (fips180-2 5.1.1)
  220|       |
  221|       |  // Pad with 0x80 followed by 0x00 until the end of the block
  222|    297|  addUncounted(0x80);
  223|  12.5k|  while (InternalState.BufferOffset != 56)
  ------------------
  |  Branch (223:10): [True: 12.2k, False: 297]
  ------------------
  224|  12.2k|    addUncounted(0x00);
  225|       |
  226|       |  // Append length in the last 8 bytes
  227|    297|  addUncounted(0); // We're only using 32 bit lengths
  228|    297|  addUncounted(0); // But SHA-1 supports 64 bit lengths
  229|    297|  addUncounted(0); // So zero pad the top bits
  230|    297|  addUncounted(InternalState.ByteCount >> 29); // Shifting to multiply by 8
  231|    297|  addUncounted(InternalState.ByteCount >>
  232|    297|               21); // as SHA-1 supports bitstreams as well as
  233|    297|  addUncounted(InternalState.ByteCount >> 13); // byte.
  234|    297|  addUncounted(InternalState.ByteCount >> 5);
  235|    297|  addUncounted(InternalState.ByteCount << 3);
  236|    297|}
_ZN4llvh4SHA15finalEv:
  238|    297|StringRef SHA1::final() {
  239|       |  // Pad to complete the last block
  240|    297|  pad();
  241|       |
  242|       |#ifdef SHA_BIG_ENDIAN
  243|       |  // Just copy the current state
  244|       |  for (int i = 0; i < 5; i++) {
  245|       |    HashResult[i] = InternalState.State[i];
  246|       |  }
  247|       |#else
  248|       |  // Swap byte order back
  249|  1.78k|  for (int i = 0; i < 5; i++) {
  ------------------
  |  Branch (249:19): [True: 1.48k, False: 297]
  ------------------
  250|  1.48k|    HashResult[i] = (((InternalState.State[i]) << 24) & 0xff000000) |
  251|  1.48k|                    (((InternalState.State[i]) << 8) & 0x00ff0000) |
  252|  1.48k|                    (((InternalState.State[i]) >> 8) & 0x0000ff00) |
  253|  1.48k|                    (((InternalState.State[i]) >> 24) & 0x000000ff);
  254|  1.48k|  }
  255|    297|#endif
  256|       |
  257|       |  // Return pointer to hash (20 characters)
  258|    297|  return StringRef((char *)HashResult, HASH_LENGTH);
  259|    297|}
_ZN4llvh4SHA14hashENS_8ArrayRefIhEE:
  273|    297|std::array<uint8_t, 20> SHA1::hash(ArrayRef<uint8_t> Data) {
  274|    297|  SHA1 Hash;
  275|    297|  Hash.update(Data);
  276|    297|  StringRef S = Hash.final();
  277|       |
  278|    297|  std::array<uint8_t, 20> Arr;
  279|    297|  memcpy(Arr.data(), S.data(), S.size());
  280|    297|  return Arr;
  281|    297|}
SHA1.cpp:_ZL2r0RjS_S_S_S_iPj:
   44|   302k|               int I, uint32_t *Buf) {
   45|   302k|  E += ((B & (C ^ D)) ^ D) + blk0(Buf, I) + 0x5A827999 + rol(A, 5);
   46|   302k|  B = rol(B, 30);
   47|   302k|}
SHA1.cpp:_ZL4blk0Pji:
   34|   302k|static uint32_t blk0(uint32_t *Buf, int I) { return Buf[I]; }
SHA1.cpp:_ZL3rolji:
   30|  4.23M|static uint32_t rol(uint32_t Number, int Bits) {
   31|  4.23M|  return (Number << Bits) | (Number >> (32 - Bits));
   32|  4.23M|}
SHA1.cpp:_ZL2r1RjS_S_S_S_iPj:
   50|  75.6k|               int I, uint32_t *Buf) {
   51|  75.6k|  E += ((B & (C ^ D)) ^ D) + blk(Buf, I) + 0x5A827999 + rol(A, 5);
   52|  75.6k|  B = rol(B, 30);
   53|  75.6k|}
SHA1.cpp:_ZL3blkPji:
   36|  1.21M|static uint32_t blk(uint32_t *Buf, int I) {
   37|  1.21M|  Buf[I & 15] = rol(Buf[(I + 13) & 15] ^ Buf[(I + 8) & 15] ^ Buf[(I + 2) & 15] ^
   38|  1.21M|                        Buf[I & 15],
   39|  1.21M|                    1);
   40|  1.21M|  return Buf[I & 15];
   41|  1.21M|}
SHA1.cpp:_ZL2r2RjS_S_S_S_iPj:
   56|   378k|               int I, uint32_t *Buf) {
   57|   378k|  E += (B ^ C ^ D) + blk(Buf, I) + 0x6ED9EBA1 + rol(A, 5);
   58|   378k|  B = rol(B, 30);
   59|   378k|}
SHA1.cpp:_ZL2r3RjS_S_S_S_iPj:
   62|   378k|               int I, uint32_t *Buf) {
   63|   378k|  E += (((B | C) & D) | (B & C)) + blk(Buf, I) + 0x8F1BBCDC + rol(A, 5);
   64|   378k|  B = rol(B, 30);
   65|   378k|}
SHA1.cpp:_ZL2r4RjS_S_S_S_iPj:
   68|   378k|               int I, uint32_t *Buf) {
   69|   378k|  E += (B ^ C ^ D) + blk(Buf, I) + 0xCA62C1D6 + rol(A, 5);
   70|   378k|  B = rol(B, 30);
   71|   378k|}

_ZN4llvh19SmallPtrSetImplBase14insert_imp_bigEPKv:
   41|   157k|SmallPtrSetImplBase::insert_imp_big(const void *Ptr) {
   42|   157k|  if (LLVM_UNLIKELY(size() * 4 >= CurArraySize * 3)) {
  ------------------
  |  |  189|   157k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 80, False: 157k]
  |  |  ------------------
  ------------------
   43|       |    // If more than 3/4 of the array is full, grow.
   44|     80|    Grow(CurArraySize < 64 ? 128 : CurArraySize * 2);
  ------------------
  |  Branch (44:10): [True: 16, False: 64]
  ------------------
   45|   157k|  } else if (LLVM_UNLIKELY(CurArraySize - NumNonEmpty < CurArraySize / 8)) {
  ------------------
  |  |  189|   157k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 157k]
  |  |  ------------------
  ------------------
   46|       |    // If fewer of 1/8 of the array is empty (meaning that many are filled with
   47|       |    // tombstones), rehash.
   48|      0|    Grow(CurArraySize);
   49|      0|  }
   50|       |
   51|       |  // Okay, we know we have space.  Find a hash bucket.
   52|   157k|  const void **Bucket = const_cast<const void**>(FindBucketFor(Ptr));
   53|   157k|  if (*Bucket == Ptr)
  ------------------
  |  Branch (53:7): [True: 264, False: 157k]
  ------------------
   54|    264|    return std::make_pair(Bucket, false); // Already inserted, good.
   55|       |
   56|       |  // Otherwise, insert it!
   57|   157k|  if (*Bucket == getTombstoneMarker())
  ------------------
  |  Branch (57:7): [True: 0, False: 157k]
  ------------------
   58|      0|    --NumTombstones;
   59|   157k|  else
   60|   157k|    ++NumNonEmpty; // Track density.
   61|   157k|  *Bucket = Ptr;
   62|   157k|  incrementEpoch();
   63|   157k|  return std::make_pair(Bucket, true);
   64|   157k|}
_ZNK4llvh19SmallPtrSetImplBase13FindBucketForEPKv:
   66|   393k|const void * const *SmallPtrSetImplBase::FindBucketFor(const void *Ptr) const {
   67|   393k|  unsigned Bucket = DenseMapInfo<void *>::getHashValue(Ptr) & (CurArraySize-1);
   68|   393k|  unsigned ArraySize = CurArraySize;
   69|   393k|  unsigned ProbeAmt = 1;
   70|   393k|  const void *const *Array = CurArray;
   71|   393k|  const void *const *Tombstone = nullptr;
   72|   708k|  while (true) {
  ------------------
  |  Branch (72:10): [Folded - Ignored]
  ------------------
   73|       |    // If we found an empty bucket, the pointer doesn't exist in the set.
   74|       |    // Return a tombstone if we've seen one so far, or the empty bucket if
   75|       |    // not.
   76|   708k|    if (LLVM_LIKELY(Array[Bucket] == getEmptyMarker()))
  ------------------
  |  |  188|   708k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 353k, False: 355k]
  |  |  ------------------
  ------------------
   77|   353k|      return Tombstone ? Tombstone : Array+Bucket;
  ------------------
  |  Branch (77:14): [True: 0, False: 353k]
  ------------------
   78|       |
   79|       |    // Found Ptr's bucket?
   80|   355k|    if (LLVM_LIKELY(Array[Bucket] == Ptr))
  ------------------
  |  |  188|   355k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 39.5k, False: 315k]
  |  |  ------------------
  ------------------
   81|  39.5k|      return Array+Bucket;
   82|       |
   83|       |    // If this is a tombstone, remember it.  If Ptr ends up not in the set, we
   84|       |    // prefer to return it than something that would require more probing.
   85|   315k|    if (Array[Bucket] == getTombstoneMarker() && !Tombstone)
  ------------------
  |  Branch (85:9): [True: 0, False: 315k]
  |  Branch (85:50): [True: 0, False: 0]
  ------------------
   86|      0|      Tombstone = Array+Bucket;  // Remember the first tombstone found.
   87|       |
   88|       |    // It's a hash collision or a tombstone. Reprobe.
   89|   315k|    Bucket = (Bucket + ProbeAmt++) & (ArraySize-1);
   90|   315k|  }
   91|   393k|}
_ZN4llvh19SmallPtrSetImplBase4GrowEj:
   95|     80|void SmallPtrSetImplBase::Grow(unsigned NewSize) {
   96|     80|  const void **OldBuckets = CurArray;
   97|     80|  const void **OldEnd = EndPointer();
   98|     80|  bool WasSmall = isSmall();
   99|       |
  100|       |  // Install the new array.  Clear all the buckets to empty.
  101|     80|  const void **NewBuckets = (const void**) safe_malloc(sizeof(void*) * NewSize);
  102|       |
  103|       |  // Reset member only if memory was allocated successfully
  104|     80|  CurArray = NewBuckets;
  105|     80|  CurArraySize = NewSize;
  106|     80|  memset(CurArray, -1, NewSize*sizeof(void*));
  107|       |
  108|       |  // Copy over all valid entries.
  109|   261k|  for (const void **BucketPtr = OldBuckets; BucketPtr != OldEnd; ++BucketPtr) {
  ------------------
  |  Branch (109:45): [True: 261k, False: 80]
  ------------------
  110|       |    // Copy over the element if it is valid.
  111|   261k|    const void *Elt = *BucketPtr;
  112|   261k|    if (Elt != getTombstoneMarker() && Elt != getEmptyMarker())
  ------------------
  |  Branch (112:9): [True: 261k, False: 0]
  |  Branch (112:40): [True: 196k, False: 65.2k]
  ------------------
  113|   196k|      *const_cast<void**>(FindBucketFor(Elt)) = const_cast<void*>(Elt);
  114|   261k|  }
  115|       |
  116|     80|  if (!WasSmall)
  ------------------
  |  Branch (116:7): [True: 64, False: 16]
  ------------------
  117|     64|    free(OldBuckets);
  118|     80|  NumNonEmpty -= NumTombstones;
  119|     80|  NumTombstones = 0;
  120|     80|}
_ZN4llvh19SmallPtrSetImplBaseC2EPPKvjOS0_:
  140|     14|                                         SmallPtrSetImplBase &&that) {
  141|     14|  SmallArray = SmallStorage;
  142|     14|  MoveHelper(SmallSize, std::move(that));
  143|     14|}
_ZN4llvh19SmallPtrSetImplBase10MoveHelperEjOS0_:
  190|     14|                                     SmallPtrSetImplBase &&RHS) {
  191|     14|  assert(&RHS != this && "Self-move should be handled by the caller.");
  192|       |
  193|     14|  if (RHS.isSmall()) {
  ------------------
  |  Branch (193:7): [True: 14, False: 0]
  ------------------
  194|       |    // Copy a small RHS rather than moving.
  195|     14|    CurArray = SmallArray;
  196|     14|    std::copy(RHS.CurArray, RHS.CurArray + RHS.NumNonEmpty, CurArray);
  197|     14|  } else {
  198|      0|    CurArray = RHS.CurArray;
  199|      0|    RHS.CurArray = RHS.SmallArray;
  200|      0|  }
  201|       |
  202|       |  // Copy the rest of the trivial members.
  203|     14|  CurArraySize = RHS.CurArraySize;
  204|     14|  NumNonEmpty = RHS.NumNonEmpty;
  205|     14|  NumTombstones = RHS.NumTombstones;
  206|       |
  207|       |  // Make the RHS small and empty.
  208|     14|  RHS.CurArraySize = SmallSize;
  209|     14|  assert(RHS.CurArray == RHS.SmallArray);
  210|      0|  RHS.NumNonEmpty = 0;
  211|     14|  RHS.NumTombstones = 0;
  212|     14|}

_ZN4llvh15SmallVectorBase8grow_podEPvmm:
   44|   575k|                               size_t TSize) {
   45|   575k|  constexpr size_t MinGrowth = 1;
   46|   575k|  size_t NewCapacity = 2 * capacity() + MinGrowth; // Always grow.
   47|   575k|  NewCapacity = static_cast<unsigned>(std::max(NewCapacity, MinCapacity));
   48|       |
   49|       |  // Ensure that NewCapacity did not overflow an unsigned int,
   50|       |  // and that the capacity in bytes will not overflow a size_t.
   51|   575k|  if (NewCapacity <= this->capacity() ||
  ------------------
  |  Branch (51:7): [True: 0, False: 575k]
  ------------------
   52|   575k|      NewCapacity < MinCapacity ||
  ------------------
  |  Branch (52:7): [True: 0, False: 575k]
  ------------------
   53|   575k|      NewCapacity > size_t(-1) / TSize)
  ------------------
  |  Branch (53:7): [True: 0, False: 575k]
  ------------------
   54|      0|    report_bad_alloc_error("SmallVector capacity overflow during allocation");
   55|       |
   56|   575k|  void *NewElts;
   57|   575k|  if (BeginX == FirstEl) {
  ------------------
  |  Branch (57:7): [True: 566k, False: 8.86k]
  ------------------
   58|   566k|    NewElts = safe_malloc(NewCapacity * TSize);
   59|       |
   60|       |    // Copy the elements over.  No need to run dtors on PODs.
   61|   566k|    memcpy(NewElts, this->BeginX, size() * TSize);
   62|   566k|  } else {
   63|       |    // If this wasn't grown from the inline copy, grow the allocated space.
   64|  8.86k|    NewElts = safe_realloc(this->BeginX, NewCapacity * TSize);
   65|  8.86k|  }
   66|       |
   67|   575k|  this->BeginX = NewElts;
   68|   575k|  this->Capacity = NewCapacity;
   69|   575k|}

_ZNK4llvh9SourceMgr23FindBufferContainingLocENS_5SMLocE:
   61|  35.4k|unsigned SourceMgr::FindBufferContainingLoc(SMLoc Loc) const {
   62|       |  // Check the last buffer we found. Most searches are likely to be in the same
   63|       |  // one.
   64|  35.4k|  if (LLVM_LIKELY(
  ------------------
  |  |  188|   141k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 35.3k, False: 99]
  |  |  |  Branch (188:51): [True: 35.3k, False: 99]
  |  |  |  Branch (188:51): [True: 35.3k, False: 0]
  |  |  |  Branch (188:51): [True: 35.3k, False: 0]
  |  |  ------------------
  ------------------
   65|  35.4k|          LastFoundBufId &&
   66|  35.4k|          Loc.getPointer() >=
   67|  35.4k|              Buffers[LastFoundBufId - 1].Buffer->getBufferStart() &&
   68|  35.4k|          Loc.getPointer() <=
   69|  35.4k|              Buffers[LastFoundBufId - 1].Buffer->getBufferEnd())) {
   70|  35.3k|    return LastFoundBufId;
   71|  35.3k|  }
   72|       |
   73|     99|  auto it = BufferEnds.lower_bound(Loc.getPointer());
   74|     99|  if (it != BufferEnds.end() &&
  ------------------
  |  Branch (74:7): [True: 99, False: 0]
  |  Branch (74:7): [True: 99, False: 0]
  ------------------
   75|     99|      Loc.getPointer() >= Buffers[it->second - 1].Buffer->getBufferStart()) {
  ------------------
  |  Branch (75:7): [True: 99, False: 0]
  ------------------
   76|     99|    return LastFoundBufId = it->second;
   77|     99|  }
   78|       |
   79|      0|  return 0;
   80|     99|}
_ZN4llvh9SourceMgr9SrcBufferC2EOS1_:
  167|    297|    IncludeLoc(Other.IncludeLoc) {
  168|    297|  Other.OffsetCache = nullptr;
  169|    297|}
_ZN4llvh9SourceMgr9SrcBufferD2Ev:
  171|    495|SourceMgr::SrcBuffer::~SrcBuffer() {
  172|    495|  if (!OffsetCache.isNull()) {
  ------------------
  |  Branch (172:7): [True: 99, False: 396]
  ------------------
  173|     99|    if (OffsetCache.is<std::vector<uint8_t>*>())
  ------------------
  |  Branch (173:9): [True: 0, False: 99]
  ------------------
  174|      0|      delete OffsetCache.get<std::vector<uint8_t>*>();
  175|     99|    else if (OffsetCache.is<std::vector<uint16_t>*>())
  ------------------
  |  Branch (175:14): [True: 0, False: 99]
  ------------------
  176|      0|      delete OffsetCache.get<std::vector<uint16_t>*>();
  177|     99|    else if (OffsetCache.is<std::vector<uint32_t>*>())
  ------------------
  |  Branch (177:14): [True: 99, False: 0]
  ------------------
  178|     99|      delete OffsetCache.get<std::vector<uint32_t>*>();
  179|      0|    else
  180|      0|      delete OffsetCache.get<std::vector<uint64_t>*>();
  181|     99|    OffsetCache = nullptr;
  182|     99|  }
  183|    495|}
_ZNK4llvh9SourceMgr8FindLineENS_5SMLocEj:
  185|  35.4k|std::pair<StringRef, unsigned> SourceMgr::FindLine(SMLoc Loc, unsigned int BufferID) const {
  186|  35.4k|  if (!BufferID)
  ------------------
  |  Branch (186:7): [True: 0, False: 35.4k]
  ------------------
  187|      0|    BufferID = FindBufferContainingLoc(Loc);
  188|  35.4k|  assert(BufferID && "Invalid Location!");
  189|       |
  190|      0|  auto &SB = getBufferInfo(BufferID);
  191|  35.4k|  const char *Ptr = Loc.getPointer();
  192|       |
  193|  35.4k|  size_t Sz = SB.Buffer->getBufferSize();
  194|  35.4k|  if (Sz <= std::numeric_limits<uint8_t>::max())
  ------------------
  |  Branch (194:7): [True: 0, False: 35.4k]
  ------------------
  195|      0|    return SB.getLineNumber<uint8_t>(Ptr);
  196|  35.4k|  else if (Sz <= std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (196:12): [True: 0, False: 35.4k]
  ------------------
  197|      0|    return SB.getLineNumber<uint16_t>(Ptr);
  198|  35.4k|  else if (Sz <= std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (198:12): [True: 35.4k, False: 0]
  ------------------
  199|  35.4k|    return SB.getLineNumber<uint32_t>(Ptr);
  200|      0|  else
  201|      0|    return SB.getLineNumber<uint64_t>(Ptr);
  202|  35.4k|}
_ZNK4llvh9SourceMgr10getLineRefEjj:
  204|   105k|StringRef SourceMgr::getLineRef(unsigned line, unsigned BufferID) const {
  205|   105k|  assert(BufferID != 0 && "BufferID must be specified");
  206|      0|  auto &SB = getBufferInfo(BufferID);
  207|   105k|  size_t Sz = SB.Buffer->getBufferSize();
  208|   105k|  if (Sz <= std::numeric_limits<uint8_t>::max())
  ------------------
  |  Branch (208:7): [True: 0, False: 105k]
  ------------------
  209|      0|    return SB.getLineRef<uint8_t>(line);
  210|   105k|  else if (Sz <= std::numeric_limits<uint16_t>::max())
  ------------------
  |  Branch (210:12): [True: 0, False: 105k]
  ------------------
  211|      0|    return SB.getLineRef<uint16_t>(line);
  212|   105k|  else if (Sz <= std::numeric_limits<uint32_t>::max())
  ------------------
  |  Branch (212:12): [True: 105k, False: 0]
  ------------------
  213|   105k|    return SB.getLineRef<uint32_t>(line);
  214|      0|  else
  215|      0|    return SB.getLineRef<uint64_t>(line);
  216|   105k|}
_ZNK4llvh9SourceMgr16getLineAndColumnENS_5SMLocEj:
  219|    205|SourceMgr::getLineAndColumn(SMLoc Loc, unsigned BufferID) const {
  220|    205|  auto LineRefAndNo = FindLine(Loc, BufferID);
  221|    205|  return std::make_pair(LineRefAndNo.second,
  222|    205|                        static_cast<unsigned>(Loc.getPointer() - LineRefAndNo.first.data() + 1));
  223|    205|}
_ZNK4llvh9SourceMgr10GetMessageENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS6_INS_7SMFixItEEE:
  241|    248|                                   ArrayRef<SMFixIt> FixIts) const {
  242|       |  // First thing to do: find the current buffer containing the specified
  243|       |  // location to pull out the source line.
  244|    248|  SmallVector<std::pair<unsigned, unsigned>, 4> ColRanges;
  245|    248|  std::pair<unsigned, unsigned> LineAndCol;
  246|    248|  StringRef BufferID = "<unknown>";
  247|    248|  std::string LineStr;
  248|       |
  249|    248|  if (Loc.isValid()) {
  ------------------
  |  Branch (249:7): [True: 205, False: 43]
  ------------------
  250|    205|    unsigned CurBuf = FindBufferContainingLoc(Loc);
  251|    205|    assert(CurBuf && "Invalid or unspecified location!");
  252|       |
  253|      0|    const MemoryBuffer *CurMB = getMemoryBuffer(CurBuf);
  254|    205|    BufferID = CurMB->getBufferIdentifier();
  255|       |
  256|       |    // Scan backward to find the start of the line.
  257|    205|    const char *LineStart = Loc.getPointer();
  258|    205|    const char *BufStart = CurMB->getBufferStart();
  259|  7.65M|    while (LineStart != BufStart && LineStart[-1] != '\n' &&
  ------------------
  |  Branch (259:12): [True: 7.65M, False: 72]
  |  Branch (259:37): [True: 7.65M, False: 133]
  ------------------
  260|  7.65M|           LineStart[-1] != '\r')
  ------------------
  |  Branch (260:12): [True: 7.65M, False: 0]
  ------------------
  261|  7.65M|      --LineStart;
  262|       |
  263|       |    // Get the end of the line.
  264|    205|    const char *LineEnd = Loc.getPointer();
  265|    205|    const char *BufEnd = CurMB->getBufferEnd();
  266|  13.7M|    while (LineEnd != BufEnd && LineEnd[0] != '\n' && LineEnd[0] != '\r')
  ------------------
  |  Branch (266:12): [True: 13.7M, False: 70]
  |  Branch (266:33): [True: 13.7M, False: 134]
  |  Branch (266:55): [True: 13.7M, False: 1]
  ------------------
  267|  13.7M|      ++LineEnd;
  268|    205|    LineStr = std::string(LineStart, LineEnd);
  269|       |
  270|       |    // Convert any ranges to column ranges that only intersect the line of the
  271|       |    // location.
  272|    379|    for (unsigned i = 0, e = Ranges.size(); i != e; ++i) {
  ------------------
  |  Branch (272:45): [True: 174, False: 205]
  ------------------
  273|    174|      SMRange R = Ranges[i];
  274|    174|      if (!R.isValid()) continue;
  ------------------
  |  Branch (274:11): [True: 0, False: 174]
  ------------------
  275|       |
  276|       |      // If the line doesn't contain any part of the range, then ignore it.
  277|    174|      if (R.Start.getPointer() > LineEnd || R.End.getPointer() < LineStart)
  ------------------
  |  Branch (277:11): [True: 0, False: 174]
  |  Branch (277:45): [True: 0, False: 174]
  ------------------
  278|      0|        continue;
  279|       |
  280|       |      // Ignore pieces of the range that go onto other lines.
  281|    174|      if (R.Start.getPointer() < LineStart)
  ------------------
  |  Branch (281:11): [True: 0, False: 174]
  ------------------
  282|      0|        R.Start = SMLoc::getFromPointer(LineStart);
  283|    174|      if (R.End.getPointer() > LineEnd)
  ------------------
  |  Branch (283:11): [True: 4, False: 170]
  ------------------
  284|      4|        R.End = SMLoc::getFromPointer(LineEnd);
  285|       |
  286|       |      // Translate from SMLoc ranges to column ranges.
  287|       |      // FIXME: Handle multibyte characters.
  288|    174|      ColRanges.push_back(std::make_pair(static_cast<unsigned>(R.Start.getPointer()-LineStart),
  289|    174|                                         static_cast<unsigned>(R.End.getPointer()-LineStart)));
  290|    174|    }
  291|       |
  292|    205|    LineAndCol = getLineAndColumn(Loc, CurBuf);
  293|    205|  }
  294|       |
  295|      0|  return SMDiagnostic(*this, Loc, BufferID, LineAndCol.first,
  296|    248|                      LineAndCol.second-1, Kind, Msg.str(),
  297|    248|                      LineStr, ColRanges, FixIts);
  298|    248|}
_ZNK4llvh9SourceMgr12PrintMessageERNS_11raw_ostreamERKNS_12SMDiagnosticEb:
  301|    248|                             bool ShowColors) const {
  302|       |  // Report the message with the diagnostic handler if present.
  303|    248|  if (DiagHandler) {
  ------------------
  |  Branch (303:7): [True: 248, False: 0]
  ------------------
  304|    248|    DiagHandler(Diagnostic, DiagContext);
  305|    248|    return;
  306|    248|  }
  307|       |
  308|      0|  if (Diagnostic.getLoc().isValid()) {
  ------------------
  |  Branch (308:7): [True: 0, False: 0]
  ------------------
  309|      0|    unsigned CurBuf = FindBufferContainingLoc(Diagnostic.getLoc());
  310|      0|    assert(CurBuf && "Invalid or unspecified location!");
  311|      0|    PrintIncludeStack(getBufferInfo(CurBuf).IncludeLoc, OS);
  312|      0|  }
  313|       |
  314|      0|  Diagnostic.print(nullptr, OS, ShowColors);
  315|      0|}
_ZNK4llvh9SourceMgr12PrintMessageERNS_11raw_ostreamENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS8_INS_7SMFixItEEEb:
  320|    248|                             ArrayRef<SMFixIt> FixIts, bool ShowColors) const {
  321|    248|  PrintMessage(OS, GetMessage(Loc, Kind, Msg, Ranges, FixIts), ShowColors);
  322|    248|}
_ZNK4llvh9SourceMgr12PrintMessageENS_5SMLocENS0_8DiagKindERKNS_5TwineENS_8ArrayRefINS_7SMRangeEEENS6_INS_7SMFixItEEEb:
  326|    248|                             ArrayRef<SMFixIt> FixIts, bool ShowColors) const {
  327|    248|  PrintMessage(errs(), Loc, Kind, Msg, Ranges, FixIts, ShowColors);
  328|    248|}
_ZN4llvh12SMDiagnosticC2ERKNS_9SourceMgrENS_5SMLocENS_9StringRefEiiNS1_8DiagKindES5_S5_NS_8ArrayRefINSt3__14pairIjjEEEENS7_INS_7SMFixItEEE:
  341|    248|    FixIts(Hints.begin(), Hints.end()) {
  342|    248|  llvh::sort(FixIts);
  343|    248|}
_ZNK4llvh9SourceMgr9SrcBuffer13getLineNumberIjEENSt3__14pairINS_9StringRefEjEEPKc:
  105|  35.4k|    const char *Ptr) const {
  106|  35.4k|  std::vector<T> *Offsets = getOffsets<T>();
  107|       |
  108|  35.4k|  const char *BufStart = Buffer->getBufferStart();
  109|  35.4k|  assert(Ptr >= BufStart && Ptr <= Buffer->getBufferEnd());
  110|      0|  ptrdiff_t PtrDiff = Ptr - BufStart;
  111|  35.4k|  assert(PtrDiff >= 0 && static_cast<size_t>(PtrDiff) <= std::numeric_limits<T>::max());
  112|      0|  T PtrOffset = static_cast<T>(PtrDiff);
  113|       |
  114|       |  // std::lower_bound returns the first EOL offset that's not-less-than
  115|       |  // PtrOffset, meaning the EOL that _ends the line_ that PtrOffset is on
  116|       |  // (including if PtrOffset refers to the EOL itself). If there's no such
  117|       |  // EOL, returns end().
  118|  35.4k|  auto EOL = std::lower_bound(Offsets->begin(), Offsets->end(), PtrOffset);
  119|       |
  120|       |  // The start of the line is the previous line end + 1.
  121|  35.4k|  const char *LineStart =
  122|  35.4k|      EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (122:7): [True: 20.2k, False: 15.1k]
  ------------------
  123|       |
  124|       |  // The end of the line is the EOL inclusive or the end of the buffer exclusive.
  125|  35.4k|  const char *LineEnd =
  126|  35.4k|      EOL != Offsets->end() ? BufStart + *EOL + 1 : Buffer->getBufferEnd();
  ------------------
  |  Branch (126:7): [True: 35.3k, False: 158]
  ------------------
  127|       |
  128|       |  // Lines count from 1, so add 1 to the distance from the 0th line.
  129|  35.4k|  return {StringRef(LineStart, LineEnd - LineStart), static_cast<unsigned>((1 + (EOL - Offsets->begin())))};
  130|  35.4k|}
_ZNK4llvh9SourceMgr9SrcBuffer10getOffsetsIjEEPNSt3__16vectorIT_NS3_9allocatorIS5_EEEEv:
   83|   140k|std::vector<T> *SourceMgr::SrcBuffer::getOffsets() const {
   84|       |  // Ensure OffsetCache is allocated and populated with offsets of all the
   85|       |  // '\n' bytes.
   86|   140k|  if (!OffsetCache.isNull())
  ------------------
  |  Branch (86:7): [True: 140k, False: 99]
  ------------------
   87|   140k|    return OffsetCache.get<std::vector<T> *>();
   88|       |
   89|     99|  std::vector<T> *Offsets = new std::vector<T>();
   90|     99|  OffsetCache = Offsets;
   91|     99|  size_t Sz = Buffer->getBufferSize();
   92|     99|  assert(Sz <= std::numeric_limits<T>::max());
   93|      0|  StringRef S = Buffer->getBuffer();
   94|  31.5M|  for (size_t N = 0; N < Sz; ++N) {
  ------------------
  |  Branch (94:22): [True: 31.5M, False: 99]
  ------------------
   95|  31.5M|    if (S[N] == '\n') {
  ------------------
  |  Branch (95:9): [True: 2.56M, False: 28.9M]
  ------------------
   96|  2.56M|      Offsets->push_back(static_cast<T>(N));
   97|  2.56M|    }
   98|  31.5M|  }
   99|       |
  100|     99|  return Offsets;
  101|   140k|}
_ZNK4llvh9SourceMgr9SrcBuffer10getLineRefIjEENS_9StringRefEj:
  133|   105k|StringRef SourceMgr::SrcBuffer::getLineRef(unsigned line) const {
  134|   105k|  assert(line >= 1 && "line number must be 1-based");
  135|      0|  --line;
  136|       |
  137|   105k|  const char *BufStart = Buffer->getBufferStart();
  138|   105k|  std::vector<T> *Offsets = getOffsets<T>();
  139|   105k|  size_t size = Offsets->size();
  140|   105k|  if (line < size) {
  ------------------
  |  Branch (140:7): [True: 105k, False: 102]
  ------------------
  141|   105k|    auto EOL = Offsets->begin() + line;
  142|       |
  143|       |    // The start of the line is the previous line end + 1.
  144|   105k|    const char *LineStart =
  145|   105k|        EOL != Offsets->begin() ? BufStart + EOL[-1] + 1 : BufStart;
  ------------------
  |  Branch (145:9): [True: 105k, False: 0]
  ------------------
  146|       |
  147|       |    // The end of the line is the EOL inclusive.
  148|   105k|    const char *LineEnd = BufStart + *EOL + 1;
  149|       |
  150|   105k|    return StringRef(LineStart, LineEnd - LineStart);
  151|   105k|  } else {
  152|       |    // Asking for the last line?
  153|    102|    if (line == size) {
  ------------------
  |  Branch (153:9): [True: 10, False: 92]
  ------------------
  154|     10|      const char *LineStart =
  155|     10|          size != 0 ? BufStart + Offsets->back() + 1 : BufStart;
  ------------------
  |  Branch (155:11): [True: 10, False: 0]
  ------------------
  156|     10|      const char *LineEnd = Buffer->getBufferEnd();
  157|     10|      return StringRef(LineStart, LineEnd - LineStart);
  158|     92|    } else {
  159|     92|      return StringRef(Buffer->getBufferEnd(), 0);
  160|     92|    }
  161|    102|  }
  162|   105k|}

_ZN4llvh9Statistic17RegisterStatisticEv:
   94|     19|void Statistic::RegisterStatistic() {
   95|       |  // If stats are enabled, inform StatInfo that this statistic should be
   96|       |  // printed.
   97|       |  // llvm_shutdown calls destructors while holding the ManagedStatic mutex.
   98|       |  // These destructors end up calling PrintStatistics, which takes StatLock.
   99|       |  // Since dereferencing StatInfo and StatLock can require taking the
  100|       |  // ManagedStatic mutex, doing so with StatLock held would lead to a lock
  101|       |  // order inversion. To avoid that, we dereference the ManagedStatics first,
  102|       |  // and only take StatLock afterwards.
  103|     19|  if (!Initialized.load(std::memory_order_relaxed)) {
  ------------------
  |  Branch (103:7): [True: 19, False: 0]
  ------------------
  104|     19|    sys::SmartMutex<true> &Lock = *StatLock;
  105|     19|    StatisticInfo &SI = *StatInfo;
  106|     19|    sys::SmartScopedLock<true> Writer(Lock);
  107|       |    // Check Initialized again after acquiring the lock.
  108|     19|    if (Initialized.load(std::memory_order_relaxed))
  ------------------
  |  Branch (108:9): [True: 0, False: 19]
  ------------------
  109|      0|      return;
  110|     19|    if (Stats || Enabled)
  ------------------
  |  Branch (110:9): [True: 0, False: 19]
  |  Branch (110:18): [True: 0, False: 19]
  ------------------
  111|      0|      SI.addStatistic(this);
  112|       |
  113|       |    // Remember we have been registered.
  114|     19|    Initialized.store(true, std::memory_order_release);
  115|     19|  }
  116|     19|}
_ZN4llvh20AreStatisticsEnabledEv:
  134|    336|bool llvh::AreStatisticsEnabled() {
  135|    336|  return Enabled || Stats;
  ------------------
  |  Branch (135:10): [True: 0, False: 336]
  |  Branch (135:21): [True: 0, False: 336]
  ------------------
  136|    336|}
Statistic.cpp:_ZN12_GLOBAL__N_113StatisticInfoC2Ev:
  118|      1|StatisticInfo::StatisticInfo() {
  119|       |  // Ensure timergroup lists are created first so they are destructed after us.
  120|      1|  TimerGroup::ConstructTimerLists();
  121|      1|}

_ZN4llvh13StringMapImpl4initEj:
   53|  10.0k|void StringMapImpl::init(unsigned InitSize) {
   54|  10.0k|  assert((InitSize & (InitSize-1)) == 0 &&
   55|  10.0k|         "Init Size must be a power of 2 or zero!");
   56|       |
   57|  10.0k|  unsigned NewNumBuckets = InitSize ? InitSize : 16;
  ------------------
  |  Branch (57:28): [True: 10.0k, False: 0]
  ------------------
   58|  10.0k|  NumItems = 0;
   59|  10.0k|  NumTombstones = 0;
   60|       |
   61|  10.0k|  TheTable = static_cast<StringMapEntryBase **>(
   62|  10.0k|      safe_calloc(NewNumBuckets+1,
   63|  10.0k|                  sizeof(StringMapEntryBase **) + sizeof(unsigned)));
   64|       |
   65|       |  // Set the member only if TheTable was successfully allocated
   66|  10.0k|  NumBuckets = NewNumBuckets;
   67|       |
   68|       |  // Allocate one extra bucket, set it to look filled so the iterators stop at
   69|       |  // end.
   70|  10.0k|  TheTable[NumBuckets] = (StringMapEntryBase*)2;
   71|  10.0k|}
_ZN4llvh13StringMapImpl15LookupBucketForENS_9StringRefE:
   78|  17.9k|unsigned StringMapImpl::LookupBucketFor(StringRef Name) {
   79|  17.9k|  unsigned HTSize = NumBuckets;
   80|  17.9k|  if (HTSize == 0) {  // Hash table unallocated so far?
  ------------------
  |  Branch (80:7): [True: 10.0k, False: 7.89k]
  ------------------
   81|  10.0k|    init(16);
   82|  10.0k|    HTSize = NumBuckets;
   83|  10.0k|  }
   84|  17.9k|  unsigned FullHashValue = djbHash(Name, 0);
   85|  17.9k|  unsigned BucketNo = FullHashValue & (HTSize-1);
   86|  17.9k|  unsigned *HashTable = (unsigned *)(TheTable + NumBuckets + 1);
   87|       |
   88|  17.9k|  unsigned ProbeAmt = 1;
   89|  17.9k|  int FirstTombstone = -1;
   90|  18.2k|  while (true) {
  ------------------
  |  Branch (90:10): [Folded - Ignored]
  ------------------
   91|  18.2k|    StringMapEntryBase *BucketItem = TheTable[BucketNo];
   92|       |    // If we found an empty bucket, this key isn't in the table yet, return it.
   93|  18.2k|    if (LLVM_LIKELY(!BucketItem)) {
  ------------------
  |  |  188|  18.2k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 11.9k, False: 6.25k]
  |  |  ------------------
  ------------------
   94|       |      // If we found a tombstone, we want to reuse the tombstone instead of an
   95|       |      // empty bucket.  This reduces probing.
   96|  11.9k|      if (FirstTombstone != -1) {
  ------------------
  |  Branch (96:11): [True: 0, False: 11.9k]
  ------------------
   97|      0|        HashTable[FirstTombstone] = FullHashValue;
   98|      0|        return FirstTombstone;
   99|      0|      }
  100|       |
  101|  11.9k|      HashTable[BucketNo] = FullHashValue;
  102|  11.9k|      return BucketNo;
  103|  11.9k|    }
  104|       |
  105|  6.25k|    if (BucketItem == getTombstoneVal()) {
  ------------------
  |  Branch (105:9): [True: 0, False: 6.25k]
  ------------------
  106|       |      // Skip over tombstones.  However, remember the first one we see.
  107|      0|      if (FirstTombstone == -1) FirstTombstone = BucketNo;
  ------------------
  |  Branch (107:11): [True: 0, False: 0]
  ------------------
  108|  6.25k|    } else if (LLVM_LIKELY(HashTable[BucketNo] == FullHashValue)) {
  ------------------
  |  |  188|  6.25k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.97k, False: 273]
  |  |  ------------------
  ------------------
  109|       |      // If the full hash value matches, check deeply for a match.  The common
  110|       |      // case here is that we are only looking at the buckets (for item info
  111|       |      // being non-null and for the full hash value) not at the items.  This
  112|       |      // is important for cache locality.
  113|       |
  114|       |      // Do the comparison like this because Name isn't necessarily
  115|       |      // null-terminated!
  116|  5.97k|      char *ItemStr = (char*)BucketItem+ItemSize;
  117|  5.97k|      if (Name == StringRef(ItemStr, BucketItem->getKeyLength())) {
  ------------------
  |  Branch (117:11): [True: 5.97k, False: 0]
  ------------------
  118|       |        // We found a match!
  119|  5.97k|        return BucketNo;
  120|  5.97k|      }
  121|  5.97k|    }
  122|       |
  123|       |    // Okay, we didn't find the item.  Probe to the next bucket.
  124|    273|    BucketNo = (BucketNo+ProbeAmt) & (HTSize-1);
  125|       |
  126|       |    // Use quadratic probing, it has fewer clumping artifacts than linear
  127|       |    // probing and has good cache behavior in the common case.
  128|    273|    ++ProbeAmt;
  129|    273|  }
  130|  17.9k|}
_ZN4llvh13StringMapImpl11RehashTableEj:
  201|  11.9k|unsigned StringMapImpl::RehashTable(unsigned BucketNo) {
  202|  11.9k|  unsigned NewSize;
  203|  11.9k|  unsigned *HashTable = (unsigned *)(TheTable + NumBuckets + 1);
  204|       |
  205|       |  // If the hash table is now more than 3/4 full, or if fewer than 1/8 of
  206|       |  // the buckets are empty (meaning that many are filled with tombstones),
  207|       |  // grow/rehash the table.
  208|  11.9k|  if (LLVM_UNLIKELY(NumItems * 4 > NumBuckets * 3)) {
  ------------------
  |  |  189|  11.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 11.9k]
  |  |  ------------------
  ------------------
  209|      2|    NewSize = NumBuckets*2;
  210|  11.9k|  } else if (LLVM_UNLIKELY(NumBuckets - (NumItems + NumTombstones) <=
  ------------------
  |  |  189|  11.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11.9k]
  |  |  ------------------
  ------------------
  211|  11.9k|                           NumBuckets / 8)) {
  212|      0|    NewSize = NumBuckets;
  213|  11.9k|  } else {
  214|  11.9k|    return BucketNo;
  215|  11.9k|  }
  216|       |
  217|      2|  unsigned NewBucketNo = BucketNo;
  218|       |  // Allocate one extra bucket which will always be non-empty.  This allows the
  219|       |  // iterators to stop at end.
  220|      2|  auto NewTableArray = static_cast<StringMapEntryBase **>(
  221|      2|      safe_calloc(NewSize+1, sizeof(StringMapEntryBase *) + sizeof(unsigned)));
  222|       |
  223|      2|  unsigned *NewHashArray = (unsigned *)(NewTableArray + NewSize + 1);
  224|      2|  NewTableArray[NewSize] = (StringMapEntryBase*)2;
  225|       |
  226|       |  // Rehash all the items into their new buckets.  Luckily :) we already have
  227|       |  // the hash values available, so we don't have to rehash any strings.
  228|     34|  for (unsigned I = 0, E = NumBuckets; I != E; ++I) {
  ------------------
  |  Branch (228:40): [True: 32, False: 2]
  ------------------
  229|     32|    StringMapEntryBase *Bucket = TheTable[I];
  230|     32|    if (Bucket && Bucket != getTombstoneVal()) {
  ------------------
  |  Branch (230:9): [True: 26, False: 6]
  |  Branch (230:19): [True: 26, False: 0]
  ------------------
  231|       |      // Fast case, bucket available.
  232|     26|      unsigned FullHash = HashTable[I];
  233|     26|      unsigned NewBucket = FullHash & (NewSize-1);
  234|     26|      if (!NewTableArray[NewBucket]) {
  ------------------
  |  Branch (234:11): [True: 20, False: 6]
  ------------------
  235|     20|        NewTableArray[FullHash & (NewSize-1)] = Bucket;
  236|     20|        NewHashArray[FullHash & (NewSize-1)] = FullHash;
  237|     20|        if (I == BucketNo)
  ------------------
  |  Branch (237:13): [True: 2, False: 18]
  ------------------
  238|      2|          NewBucketNo = NewBucket;
  239|     20|        continue;
  240|     20|      }
  241|       |
  242|       |      // Otherwise probe for a spot.
  243|      6|      unsigned ProbeSize = 1;
  244|      8|      do {
  245|      8|        NewBucket = (NewBucket + ProbeSize++) & (NewSize-1);
  246|      8|      } while (NewTableArray[NewBucket]);
  ------------------
  |  Branch (246:16): [True: 2, False: 6]
  ------------------
  247|       |
  248|       |      // Finally found a slot.  Fill it in.
  249|      6|      NewTableArray[NewBucket] = Bucket;
  250|      6|      NewHashArray[NewBucket] = FullHash;
  251|      6|      if (I == BucketNo)
  ------------------
  |  Branch (251:11): [True: 0, False: 6]
  ------------------
  252|      0|        NewBucketNo = NewBucket;
  253|      6|    }
  254|     32|  }
  255|       |
  256|      2|  free(TheTable);
  257|       |
  258|      2|  TheTable = NewTableArray;
  259|      2|  NumBuckets = NewSize;
  260|      2|  NumTombstones = 0;
  261|      2|  return NewBucketNo;
  262|  11.9k|}

_ZN4llvh10hash_valueENS_9StringRefE:
  598|  5.67M|hash_code llvh::hash_value(StringRef S) {
  599|  5.67M|  return hash_combine_range(S.begin(), S.end());
  600|  5.67M|}

_ZN4llvh21llvm_is_multithreadedEv:
   31|     49|bool llvh::llvm_is_multithreaded() {
   32|     49|#if LLVM_ENABLE_THREADS != 0
   33|     49|  return true;
   34|       |#else
   35|       |  return false;
   36|       |#endif
   37|     49|}

_ZN4llvh16NamedRegionTimerC2ENS_9StringRefES1_S1_S1_b:
  217|    280|                                            GroupDescription)) {}
_ZN4llvh10TimerGroup19ConstructTimerListsEv:
  430|      1|void TimerGroup::ConstructTimerLists() {
  431|      1|  (void)*NamedGroupedTimers;
  432|      1|}
Timer.cpp:_ZL31getLibSupportInfoOutputFilenamev:
   37|      2|static std::string &getLibSupportInfoOutputFilename() {
   38|      2|  return *LibSupportInfoOutputFilename;
   39|      2|}

_ZNK4llvh5Twine3strEv:
   18|  6.28k|std::string Twine::str() const {
   19|       |  // If we're storing only a std::string, just return it.
   20|  6.28k|  if (LHSKind == StdStringKind && RHSKind == EmptyKind)
  ------------------
  |  Branch (20:7): [True: 18, False: 6.26k]
  |  Branch (20:35): [True: 18, False: 0]
  ------------------
   21|     18|    return *LHS.stdString;
   22|       |
   23|       |  // If we're storing a formatv_object, we can avoid an extra copy by formatting
   24|       |  // it immediately and returning the result.
   25|  6.26k|  if (LHSKind == FormatvObjectKind && RHSKind == EmptyKind)
  ------------------
  |  Branch (25:7): [True: 0, False: 6.26k]
  |  Branch (25:39): [True: 0, False: 0]
  ------------------
   26|      0|    return LHS.formatvObject->str();
   27|       |
   28|       |  // Otherwise, flatten and copy the contents first.
   29|  6.26k|  SmallString<256> Vec;
   30|  6.26k|  return toStringRef(Vec).str();
   31|  6.26k|}
_ZNK4llvh5Twine8toVectorERNS_15SmallVectorImplIcEE:
   33|  6.02k|void Twine::toVector(SmallVectorImpl<char> &Out) const {
   34|  6.02k|  raw_svector_ostream OS(Out);
   35|  6.02k|  print(OS);
   36|  6.02k|}
_ZNK4llvh5Twine13printOneChildERNS_11raw_ostreamENS0_5ChildENS0_8NodeKindE:
   59|  12.3k|                          NodeKind Kind) const {
   60|  12.3k|  switch (Kind) {
  ------------------
  |  Branch (60:11): [True: 0, False: 12.3k]
  ------------------
   61|      0|  case Twine::NullKind: break;
  ------------------
  |  Branch (61:3): [True: 0, False: 12.3k]
  ------------------
   62|      0|  case Twine::EmptyKind: break;
  ------------------
  |  Branch (62:3): [True: 0, False: 12.3k]
  ------------------
   63|    129|  case Twine::TwineKind:
  ------------------
  |  Branch (63:3): [True: 129, False: 12.1k]
  ------------------
   64|    129|    Ptr.twine->print(OS);
   65|    129|    break;
   66|     93|  case Twine::CStringKind:
  ------------------
  |  Branch (66:3): [True: 93, False: 12.2k]
  ------------------
   67|     93|    OS << Ptr.cString;
   68|     93|    break;
   69|      0|  case Twine::StdStringKind:
  ------------------
  |  Branch (69:3): [True: 0, False: 12.3k]
  ------------------
   70|      0|    OS << *Ptr.stdString;
   71|      0|    break;
   72|  11.9k|  case Twine::StringRefKind:
  ------------------
  |  Branch (72:3): [True: 11.9k, False: 315]
  ------------------
   73|  11.9k|    OS << *Ptr.stringRef;
   74|  11.9k|    break;
   75|      0|  case Twine::SmallStringKind:
  ------------------
  |  Branch (75:3): [True: 0, False: 12.3k]
  ------------------
   76|      0|    OS << *Ptr.smallString;
   77|      0|    break;
   78|      0|  case Twine::FormatvObjectKind:
  ------------------
  |  Branch (78:3): [True: 0, False: 12.3k]
  ------------------
   79|      0|    OS << *Ptr.formatvObject;
   80|      0|    break;
   81|      0|  case Twine::CharKind:
  ------------------
  |  Branch (81:3): [True: 0, False: 12.3k]
  ------------------
   82|      0|    OS << Ptr.character;
   83|      0|    break;
   84|      0|  case Twine::DecUIKind:
  ------------------
  |  Branch (84:3): [True: 0, False: 12.3k]
  ------------------
   85|      0|    OS << Ptr.decUI;
   86|      0|    break;
   87|     86|  case Twine::DecIKind:
  ------------------
  |  Branch (87:3): [True: 86, False: 12.2k]
  ------------------
   88|     86|    OS << Ptr.decI;
   89|     86|    break;
   90|      0|  case Twine::DecULKind:
  ------------------
  |  Branch (90:3): [True: 0, False: 12.3k]
  ------------------
   91|      0|    OS << *Ptr.decUL;
   92|      0|    break;
   93|      0|  case Twine::DecLKind:
  ------------------
  |  Branch (93:3): [True: 0, False: 12.3k]
  ------------------
   94|      0|    OS << *Ptr.decL;
   95|      0|    break;
   96|      0|  case Twine::DecULLKind:
  ------------------
  |  Branch (96:3): [True: 0, False: 12.3k]
  ------------------
   97|      0|    OS << *Ptr.decULL;
   98|      0|    break;
   99|      0|  case Twine::DecLLKind:
  ------------------
  |  Branch (99:3): [True: 0, False: 12.3k]
  ------------------
  100|      0|    OS << *Ptr.decLL;
  101|      0|    break;
  102|      7|  case Twine::UHexKind:
  ------------------
  |  Branch (102:3): [True: 7, False: 12.3k]
  ------------------
  103|      7|    OS.write_hex(*Ptr.uHex);
  104|      7|    break;
  105|  12.3k|  }
  106|  12.3k|}
_ZNK4llvh5Twine5printERNS_11raw_ostreamE:
  164|  6.15k|void Twine::print(raw_ostream &OS) const {
  165|  6.15k|  printOneChild(OS, LHS, getLHSKind());
  166|  6.15k|  printOneChild(OS, RHS, getRHSKind());
  167|  6.15k|}

_ZN4llvh3sys20ChangeStdoutToBinaryEv:
  435|      1|std::error_code sys::ChangeStdoutToBinary() {
  436|       |  // Do nothing, as Unix doesn't differentiate between text and binary.
  437|      1|  return std::error_code();
  438|      1|}

_ZN4llvh11raw_ostreamD2Ev:
   69|  3.59M|raw_ostream::~raw_ostream() {
   70|       |  // raw_ostream's subclasses should take care to flush the buffer
   71|       |  // in their destructors.
   72|  3.59M|  assert(OutBufCur == OutBufStart &&
   73|  3.59M|         "raw_ostream destructor called with non-empty buffer!");
   74|       |
   75|  3.59M|  if (BufferMode == InternalBuffer)
  ------------------
  |  Branch (75:7): [True: 44, False: 3.59M]
  ------------------
   76|     44|    delete [] OutBufStart;
   77|  3.59M|}
_ZNK4llvh11raw_ostream21preferred_buffer_sizeEv:
   79|     43|size_t raw_ostream::preferred_buffer_size() const {
   80|       |  // BUFSIZ is intended to be a reasonable default.
   81|     43|  return BUFSIZ;
   82|     43|}
_ZN4llvh11raw_ostream11SetBufferedEv:
   84|     44|void raw_ostream::SetBuffered() {
   85|       |  // Ask the subclass to determine an appropriate buffer size.
   86|     44|  if (size_t Size = preferred_buffer_size())
  ------------------
  |  Branch (86:14): [True: 44, False: 0]
  ------------------
   87|     44|    SetBufferSize(Size);
   88|      0|  else
   89|       |    // It may return 0, meaning this stream should be unbuffered.
   90|      0|    SetUnbuffered();
   91|     44|}
_ZN4llvh11raw_ostream16SetBufferAndModeEPcmNS0_10BufferKindE:
   94|  3.59M|                                   BufferKind Mode) {
   95|  3.59M|  assert(((Mode == Unbuffered && !BufferStart && Size == 0) ||
   96|  3.59M|          (Mode != Unbuffered && BufferStart && Size != 0)) &&
   97|  3.59M|         "stream must be unbuffered or have at least one byte");
   98|       |  // Make sure the current buffer is free of content (we can't flush here; the
   99|       |  // child buffer management logic will be in write_impl).
  100|      0|  assert(GetNumBytesInBuffer() == 0 && "Current buffer is non-empty!");
  101|       |
  102|  3.59M|  if (BufferMode == InternalBuffer)
  ------------------
  |  Branch (102:7): [True: 3.59M, False: 0]
  ------------------
  103|  3.59M|    delete [] OutBufStart;
  104|  3.59M|  OutBufStart = BufferStart;
  105|  3.59M|  OutBufEnd = OutBufStart+Size;
  106|  3.59M|  OutBufCur = OutBufStart;
  107|  3.59M|  BufferMode = Mode;
  108|       |
  109|  3.59M|  assert(OutBufStart <= OutBufEnd && "Invalid size!");
  110|  3.59M|}
_ZN4llvh11raw_ostreamlsEm:
  112|    180|raw_ostream &raw_ostream::operator<<(unsigned long N) {
  113|    180|  write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
  114|    180|  return *this;
  115|    180|}
_ZN4llvh11raw_ostreamlsEl:
  117|     86|raw_ostream &raw_ostream::operator<<(long N) {
  118|     86|  write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
  119|     86|  return *this;
  120|     86|}
_ZN4llvh11raw_ostream9write_hexEy:
  132|      7|raw_ostream &raw_ostream::write_hex(unsigned long long N) {
  133|      7|  llvh::write_hex(*this, N, HexPrintStyle::Lower);
  134|      7|  return *this;
  135|      7|}
_ZN4llvh11raw_ostream14flush_nonemptyEv:
  197|    106|void raw_ostream::flush_nonempty() {
  198|    106|  assert(OutBufCur > OutBufStart && "Invalid call to flush_nonempty.");
  199|      0|  size_t Length = OutBufCur - OutBufStart;
  200|    106|  OutBufCur = OutBufStart;
  201|    106|  write_impl(OutBufStart, Length);
  202|    106|}
_ZN4llvh11raw_ostream5writeEh:
  204|  4.18M|raw_ostream &raw_ostream::write(unsigned char C) {
  205|       |  // Group exceptional cases into a single branch.
  206|  4.18M|  if (LLVM_UNLIKELY(OutBufCur >= OutBufEnd)) {
  ------------------
  |  |  189|  4.18M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4.18M, False: 0]
  |  |  ------------------
  ------------------
  207|  4.18M|    if (LLVM_UNLIKELY(!OutBufStart)) {
  ------------------
  |  |  189|  4.18M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4.18M, False: 0]
  |  |  ------------------
  ------------------
  208|  4.18M|      if (BufferMode == Unbuffered) {
  ------------------
  |  Branch (208:11): [True: 4.18M, False: 0]
  ------------------
  209|  4.18M|        write_impl(reinterpret_cast<char*>(&C), 1);
  210|  4.18M|        return *this;
  211|  4.18M|      }
  212|       |      // Set up a buffer and start over.
  213|      0|      SetBuffered();
  214|      0|      return write(C);
  215|  4.18M|    }
  216|       |
  217|      0|    flush_nonempty();
  218|      0|  }
  219|       |
  220|      0|  *OutBufCur++ = C;
  221|      0|  return *this;
  222|  4.18M|}
_ZN4llvh11raw_ostream5writeEPKcm:
  224|  83.0k|raw_ostream &raw_ostream::write(const char *Ptr, size_t Size) {
  225|       |  // Group exceptional cases into a single branch.
  226|  83.0k|  if (LLVM_UNLIKELY(size_t(OutBufEnd - OutBufCur) < Size)) {
  ------------------
  |  |  189|  83.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 15.1k, False: 67.9k]
  |  |  ------------------
  ------------------
  227|  15.1k|    if (LLVM_UNLIKELY(!OutBufStart)) {
  ------------------
  |  |  189|  15.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 15.0k, False: 63]
  |  |  ------------------
  ------------------
  228|  15.0k|      if (BufferMode == Unbuffered) {
  ------------------
  |  Branch (228:11): [True: 15.0k, False: 44]
  ------------------
  229|  15.0k|        write_impl(Ptr, Size);
  230|  15.0k|        return *this;
  231|  15.0k|      }
  232|       |      // Set up a buffer and start over.
  233|     44|      SetBuffered();
  234|     44|      return write(Ptr, Size);
  235|  15.0k|    }
  236|       |
  237|     63|    size_t NumBytes = OutBufEnd - OutBufCur;
  238|       |
  239|       |    // If the buffer is empty at this point we have a string that is larger
  240|       |    // than the buffer. Directly write the chunk that is a multiple of the
  241|       |    // preferred buffer size and put the remainder in the buffer.
  242|     63|    if (LLVM_UNLIKELY(OutBufCur == OutBufStart)) {
  ------------------
  |  |  189|     63|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 5, False: 58]
  |  |  ------------------
  ------------------
  243|      5|      assert(NumBytes != 0 && "undefined behavior");
  244|      0|      size_t BytesToWrite = Size - (Size % NumBytes);
  245|      5|      write_impl(Ptr, BytesToWrite);
  246|      5|      size_t BytesRemaining = Size - BytesToWrite;
  247|      5|      if (BytesRemaining > size_t(OutBufEnd - OutBufCur)) {
  ------------------
  |  Branch (247:11): [True: 0, False: 5]
  ------------------
  248|       |        // Too much left over to copy into our buffer.
  249|      0|        return write(Ptr + BytesToWrite, BytesRemaining);
  250|      0|      }
  251|      5|      copy_to_buffer(Ptr + BytesToWrite, BytesRemaining);
  252|      5|      return *this;
  253|      5|    }
  254|       |
  255|       |    // We don't have enough space in the buffer to fit the string in. Insert as
  256|       |    // much as possible, flush and start over with the remainder.
  257|     58|    copy_to_buffer(Ptr, NumBytes);
  258|     58|    flush_nonempty();
  259|     58|    return write(Ptr + NumBytes, Size - NumBytes);
  260|     63|  }
  261|       |
  262|  67.9k|  copy_to_buffer(Ptr, Size);
  263|       |
  264|  67.9k|  return *this;
  265|  83.0k|}
_ZN4llvh11raw_ostream14copy_to_bufferEPKcm:
  267|  67.9k|void raw_ostream::copy_to_buffer(const char *Ptr, size_t Size) {
  268|  67.9k|  assert(Size <= size_t(OutBufEnd - OutBufCur) && "Buffer overrun!");
  269|       |
  270|       |  // Handle short strings specially, memcpy isn't very good at very short
  271|       |  // strings.
  272|      0|  switch (Size) {
  273|     51|  case 4: OutBufCur[3] = Ptr[3]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|     51|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (273:3): [True: 51, False: 67.9k]
  ------------------
  274|  15.8k|  case 3: OutBufCur[2] = Ptr[2]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  15.8k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (274:3): [True: 15.7k, False: 52.2k]
  ------------------
  275|  16.5k|  case 2: OutBufCur[1] = Ptr[1]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  16.5k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (275:3): [True: 732, False: 67.2k]
  ------------------
  276|  63.8k|  case 1: OutBufCur[0] = Ptr[0]; LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  63.8k|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  |  Branch (276:3): [True: 47.3k, False: 20.6k]
  ------------------
  277|  63.9k|  case 0: break;
  ------------------
  |  Branch (277:3): [True: 33, False: 67.9k]
  ------------------
  278|  4.09k|  default:
  ------------------
  |  Branch (278:3): [True: 4.09k, False: 63.9k]
  ------------------
  279|  4.09k|    memcpy(OutBufCur, Ptr, Size);
  280|  4.09k|    break;
  281|  67.9k|  }
  282|       |
  283|  67.9k|  OutBufCur += Size;
  284|  67.9k|}
_ZN4llvh11raw_ostreamlsERKNS_15FormattedNumberE:
  361|    688|raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
  362|    688|  if (FN.Hex) {
  ------------------
  |  Branch (362:7): [True: 688, False: 0]
  ------------------
  363|    688|    HexPrintStyle Style;
  364|    688|    if (FN.Upper && FN.HexPrefix)
  ------------------
  |  Branch (364:9): [True: 0, False: 688]
  |  Branch (364:21): [True: 0, False: 0]
  ------------------
  365|      0|      Style = HexPrintStyle::PrefixUpper;
  366|    688|    else if (FN.Upper && !FN.HexPrefix)
  ------------------
  |  Branch (366:14): [True: 0, False: 688]
  |  Branch (366:26): [True: 0, False: 0]
  ------------------
  367|      0|      Style = HexPrintStyle::Upper;
  368|    688|    else if (!FN.Upper && FN.HexPrefix)
  ------------------
  |  Branch (368:14): [True: 688, False: 0]
  |  Branch (368:27): [True: 0, False: 688]
  ------------------
  369|      0|      Style = HexPrintStyle::PrefixLower;
  370|    688|    else
  371|    688|      Style = HexPrintStyle::Lower;
  372|    688|    llvh::write_hex(*this, FN.HexValue, Style, FN.Width);
  373|    688|  } else {
  374|      0|    llvh::SmallString<16> Buffer;
  375|      0|    llvh::raw_svector_ostream Stream(Buffer);
  376|      0|    llvh::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer);
  377|      0|    if (Buffer.size() < FN.Width)
  ------------------
  |  Branch (377:9): [True: 0, False: 0]
  ------------------
  378|      0|      indent(FN.Width - Buffer.size());
  379|      0|    (*this) << Buffer;
  380|      0|  }
  381|    688|  return *this;
  382|    688|}
_ZN4llvh14raw_fd_ostreamC2ENS_9StringRefERNSt3__110error_codeENS_3sys2fs9OpenFlagsE:
  545|      1|                     Flags) {}
_ZN4llvh14raw_fd_ostreamC2ENS_9StringRefERNSt3__110error_codeENS_3sys2fs19CreationDispositionENS6_10FileAccessENS6_9OpenFlagsE:
  551|      1|    : raw_fd_ostream(getFD(Filename, EC, Disp, Access, Flags), true) {}
_ZN4llvh14raw_fd_ostreamC2Eibb:
  556|      2|    : raw_pwrite_stream(unbuffered), FD(fd), ShouldClose(shouldClose) {
  557|      2|  if (FD < 0 ) {
  ------------------
  |  Branch (557:7): [True: 0, False: 2]
  ------------------
  558|      0|    ShouldClose = false;
  559|      0|    return;
  560|      0|  }
  561|       |
  562|       |  // Do not attempt to close stdout or stderr. We used to try to maintain the
  563|       |  // property that tools that support writing file to stdout should not also
  564|       |  // write informational output to stdout, but in practice we were never able to
  565|       |  // maintain this invariant. Many features have been added to LLVM and clang
  566|       |  // (-fdump-record-layouts, optimization remarks, etc) that print to stdout, so
  567|       |  // users must simply be aware that mixed output and remarks is a possibility.
  568|      2|  if (FD <= STDERR_FILENO)
  ------------------
  |  Branch (568:7): [True: 2, False: 0]
  ------------------
  569|      2|    ShouldClose = false;
  570|       |
  571|       |#ifdef _WIN32
  572|       |  // Check if this is a console device. This is not equivalent to isatty.
  573|       |  IsWindowsConsole =
  574|       |      ::GetFileType((HANDLE)::_get_osfhandle(fd)) == FILE_TYPE_CHAR;
  575|       |#endif
  576|       |
  577|       |  // Get the starting position.
  578|      2|  off_t loc = ::lseek(FD, 0, SEEK_CUR);
  579|       |#ifdef _WIN32
  580|       |  // MSVCRT's _lseek(SEEK_CUR) doesn't return -1 for pipes.
  581|       |  sys::fs::file_status Status;
  582|       |  std::error_code EC = status(FD, Status);
  583|       |  SupportsSeeking = !EC && Status.type() == sys::fs::file_type::regular_file;
  584|       |#else
  585|      2|  SupportsSeeking = loc != (off_t)-1;
  586|      2|#endif
  587|      2|  if (!SupportsSeeking)
  ------------------
  |  Branch (587:7): [True: 0, False: 2]
  ------------------
  588|      0|    pos = 0;
  589|      2|  else
  590|      2|    pos = static_cast<uint64_t>(loc);
  591|      2|}
_ZN4llvh14raw_fd_ostreamD2Ev:
  593|      2|raw_fd_ostream::~raw_fd_ostream() {
  594|      2|  if (FD >= 0) {
  ------------------
  |  Branch (594:7): [True: 2, False: 0]
  ------------------
  595|      2|    flush();
  596|      2|    if (ShouldClose) {
  ------------------
  |  Branch (596:9): [True: 0, False: 2]
  ------------------
  597|      0|      if (auto EC = sys::Process::SafelyCloseFileDescriptor(FD))
  ------------------
  |  Branch (597:16): [True: 0, False: 0]
  ------------------
  598|      0|        error_detected(EC);
  599|      0|    }
  600|      2|  }
  601|       |
  602|       |#ifdef __MINGW32__
  603|       |  // On mingw, global dtors should not call exit().
  604|       |  // report_fatal_error() invokes exit(). We know report_fatal_error()
  605|       |  // might not write messages to stderr when any errors were detected
  606|       |  // on FD == 2.
  607|       |  if (FD == 2) return;
  608|       |#endif
  609|       |
  610|       |  // If there are any pending errors, report them now. Clients wishing
  611|       |  // to avoid report_fatal_error calls should check for errors with
  612|       |  // has_error() and clear the error flag with clear_error() before
  613|       |  // destructing raw_ostream objects which may have errors.
  614|      2|  if (has_error())
  ------------------
  |  Branch (614:7): [True: 0, False: 2]
  ------------------
  615|      0|    report_fatal_error("IO failure on output stream: " + error().message(),
  616|      0|                       /*GenCrashDiag=*/false);
  617|      2|}
_ZN4llvh14raw_fd_ostream10write_implEPKcm:
  669|     68|void raw_fd_ostream::write_impl(const char *Ptr, size_t Size) {
  670|     68|  assert(FD >= 0 && "File already closed.");
  671|      0|  pos += Size;
  672|       |
  673|       |#if defined(_WIN32)
  674|       |  // If this is a Windows console device, try re-encoding from UTF-8 to UTF-16
  675|       |  // and using WriteConsoleW. If that fails, fall back to plain write().
  676|       |  if (IsWindowsConsole)
  677|       |    if (write_console_impl(FD, StringRef(Ptr, Size)))
  678|       |      return;
  679|       |#endif
  680|       |
  681|       |  // The maximum write size is limited to INT32_MAX. A write
  682|       |  // greater than SSIZE_MAX is implementation-defined in POSIX,
  683|       |  // and Windows _write requires 32 bit input.
  684|     68|  size_t MaxWriteSize = INT32_MAX;
  685|       |
  686|     68|#if defined(__linux__)
  687|       |  // It is observed that Linux returns EINVAL for a very large write (>2G).
  688|       |  // Make it a reasonably small value.
  689|     68|  MaxWriteSize = 1024 * 1024 * 1024;
  690|     68|#endif
  691|       |
  692|     68|  do {
  693|     68|    size_t ChunkSize = std::min(Size, MaxWriteSize);
  694|     68|    ssize_t ret = ::write(FD, Ptr, ChunkSize);
  695|       |
  696|     68|    if (ret < 0) {
  ------------------
  |  Branch (696:9): [True: 0, False: 68]
  ------------------
  697|       |      // If it's a recoverable error, swallow it and retry the write.
  698|       |      //
  699|       |      // Ideally we wouldn't ever see EAGAIN or EWOULDBLOCK here, since
  700|       |      // raw_ostream isn't designed to do non-blocking I/O. However, some
  701|       |      // programs, such as old versions of bjam, have mistakenly used
  702|       |      // O_NONBLOCK. For compatibility, emulate blocking semantics by
  703|       |      // spinning until the write succeeds. If you don't want spinning,
  704|       |      // don't use O_NONBLOCK file descriptors with raw_ostream.
  705|      0|      if (errno == EINTR || errno == EAGAIN
  ------------------
  |  Branch (705:11): [True: 0, False: 0]
  |  Branch (705:29): [True: 0, False: 0]
  ------------------
  706|      0|#ifdef EWOULDBLOCK
  707|      0|          || errno == EWOULDBLOCK
  ------------------
  |  Branch (707:14): [True: 0, False: 0]
  ------------------
  708|      0|#endif
  709|      0|          )
  710|      0|        continue;
  711|       |
  712|       |      // Otherwise it's a non-recoverable error. Note it and quit.
  713|      0|      error_detected(std::error_code(errno, std::generic_category()));
  714|      0|      break;
  715|      0|    }
  716|       |
  717|       |    // The write may have written some or all of the data. Update the
  718|       |    // size and buffer pointer to reflect the remainder that needs
  719|       |    // to be written. If there are no bytes left, we're done.
  720|     68|    Ptr += ret;
  721|     68|    Size -= ret;
  722|     68|  } while (Size > 0);
  ------------------
  |  Branch (722:12): [True: 0, False: 68]
  ------------------
  723|     68|}
_ZNK4llvh14raw_fd_ostream21preferred_buffer_sizeEv:
  757|      1|size_t raw_fd_ostream::preferred_buffer_size() const {
  758|       |#if defined(_WIN32)
  759|       |  // Disable buffering for console devices. Console output is re-encoded from
  760|       |  // UTF-8 to UTF-16 on Windows, and buffering it would require us to split the
  761|       |  // buffer on a valid UTF-8 codepoint boundary. Terminal buffering is disabled
  762|       |  // below on most other OSs, so do the same thing on Windows and avoid that
  763|       |  // complexity.
  764|       |  if (IsWindowsConsole)
  765|       |    return 0;
  766|       |  return raw_ostream::preferred_buffer_size();
  767|       |#elif !defined(__minix)
  768|       |  // Minix has no st_blksize.
  769|      1|  assert(FD >= 0 && "File not yet open!");
  770|      0|  struct stat statbuf;
  771|      1|  if (fstat(FD, &statbuf) != 0)
  ------------------
  |  Branch (771:7): [True: 0, False: 1]
  ------------------
  772|      0|    return 0;
  773|       |
  774|       |  // If this is a terminal, don't use buffering. Line buffering
  775|       |  // would be a more traditional thing to do, but it's not worth
  776|       |  // the complexity.
  777|      1|  if (S_ISCHR(statbuf.st_mode) && isatty(FD))
  ------------------
  |  Branch (777:35): [True: 0, False: 0]
  ------------------
  778|      0|    return 0;
  779|       |  // Return the preferred block size.
  780|      1|  return statbuf.st_blksize;
  781|       |#else
  782|       |  return raw_ostream::preferred_buffer_size();
  783|       |#endif
  784|      1|}
_ZN4llvh4outsEv:
  844|   134k|raw_ostream &llvh::outs() {
  845|       |  // Set buffer settings to model stdout behavior.
  846|   134k|  std::error_code EC;
  847|   134k|  static raw_fd_ostream S("-", EC, sys::fs::F_None);
  848|   134k|  assert(!EC);
  849|      0|  return S;
  850|   134k|}
_ZN4llvh4errsEv:
  854|    248|raw_ostream &llvh::errs() {
  855|       |  // Set standard error to be unbuffered by default.
  856|    248|  static raw_fd_ostream S(STDERR_FILENO, false, true);
  857|    248|  return S;
  858|    248|}
_ZN4llvh18raw_string_ostreamD2Ev:
  870|     43|raw_string_ostream::~raw_string_ostream() {
  871|     43|  flush();
  872|     43|}
_ZN4llvh18raw_string_ostream10write_implEPKcm:
  874|     43|void raw_string_ostream::write_impl(const char *Ptr, size_t Size) {
  875|     43|  OS.append(Ptr, Size);
  876|     43|}
_ZN4llvh19raw_svector_ostream10write_implEPKcm:
  884|  4.20M|void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
  885|  4.20M|  OS.append(Ptr, Ptr + Size);
  886|  4.20M|}
raw_ostream.cpp:_ZL5getFDN4llvh9StringRefERNSt3__110error_codeENS_3sys2fs19CreationDispositionENS5_10FileAccessENS5_9OpenFlagsE:
  503|      1|                 sys::fs::OpenFlags Flags) {
  504|      1|  assert((Access & sys::fs::FA_Write) &&
  505|      1|         "Cannot make a raw_ostream from a read-only descriptor!");
  506|       |
  507|       |  // Handle "-" as stdout. Note that when we do this, we consider ourself
  508|       |  // the owner of stdout and may set the "binary" flag globally based on Flags.
  509|      1|  if (Filename == "-") {
  ------------------
  |  Branch (509:7): [True: 1, False: 0]
  ------------------
  510|      1|    EC = std::error_code();
  511|       |    // If user requested binary then put stdout into binary mode if
  512|       |    // possible.
  513|      1|    if (!(Flags & sys::fs::OF_Text))
  ------------------
  |  Branch (513:9): [True: 1, False: 0]
  ------------------
  514|      1|      sys::ChangeStdoutToBinary();
  515|      1|    return STDOUT_FILENO;
  516|      1|  }
  517|       |
  518|      0|  int FD;
  519|      0|  if (Access & sys::fs::FA_Read)
  ------------------
  |  Branch (519:7): [True: 0, False: 0]
  ------------------
  520|      0|    EC = sys::fs::openFileForReadWrite(Filename, FD, Disp, Flags);
  521|      0|  else
  522|      0|    EC = sys::fs::openFileForWrite(Filename, FD, Disp, Flags);
  523|      0|  if (EC)
  ------------------
  |  Branch (523:7): [True: 0, False: 0]
  ------------------
  524|      0|    return -1;
  525|       |
  526|      0|  return FD;
  527|      0|}

_ZNK6hermes8BitArrayILm524288ELm8EE2atEm:
  151|  5.82M|  inline bool at(size_t idx) const {
  152|  5.82M|    assert(idx < N && "Index must be within the bitset");
  153|      0|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  154|  5.82M|    const auto wordIdx = idx / kBitsPerWord;
  155|  5.82M|    return allBits_[wordIdx] & mask;
  156|  5.82M|  }
_ZN6hermes8BitArrayILm524288ELm8EE3setEmb:
  136|  1.41M|  inline void set(size_t idx, bool val) {
  137|  1.41M|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  138|  1.41M|    const size_t wordIdx = idx / kBitsPerWord;
  139|  1.41M|    if (val)
  ------------------
  |  Branch (139:9): [True: 1.41M, False: 0]
  ------------------
  140|  1.41M|      allBits_[wordIdx] |= mask;
  141|      0|    else
  142|      0|      allBits_[wordIdx] &= ~mask;
  143|  1.41M|  }
_ZN6hermes8BitArrayILm524288ELm8EE5resetEv:
  146|    150|  inline void reset() {
  147|    150|    std::fill_n(allBits_.begin(), kNumWords, 0);
  148|    150|  }
_ZN6hermes8BitArrayILm524288ELm8EE3setEv:
  131|    203|  inline void set() {
  132|    203|    std::fill_n(
  133|    203|        allBits_.begin(), kNumWords, std::numeric_limits<uintptr_t>::max());
  134|    203|  }
_ZNK6hermes8BitArrayILm524288ELm8EE19findNextZeroBitFromEm:
  163|    602|  size_t findNextZeroBitFrom(size_t idx) const {
  164|    602|    return findNextBitImpl<false>(idx);
  165|    602|  }
_ZNK6hermes8BitArrayILm524288ELm8EE15findNextBitImplILb0EEEmm:
   44|    602|  size_t findNextBitImpl(size_t idx) const {
   45|    602|    assert(
   46|    602|        idx <= N &&
   47|    602|        "precondition: idx is less than or equal to number of bits");
   48|       |    // If there are bits after N but in the same word, we do not need to
   49|       |    // generate this special case, since we will do a check on idx at the end.
   50|    602|    if (N % kBitsPerWord == 0 && idx == N) {
  ------------------
  |  Branch (50:9): [Folded - Ignored]
  |  Branch (50:34): [True: 0, False: 602]
  ------------------
   51|      0|      return N;
   52|      0|    }
   53|    602|    size_t wordIdx = idx / kBitsPerWord;
   54|    602|    size_t offset = idx % kBitsPerWord;
   55|       |    // Start looking from the given idx. Invert the word if we are looking for a
   56|       |    // 0 so it's the same as looking for a 1.
   57|    602|    uintptr_t currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (57:29): [Folded - Ignored]
  ------------------
   58|       |    // Set all bits before idx in the word to zero so we skip past them.
   59|    602|    currentWord &= (std::numeric_limits<uintptr_t>::max() << offset);
   60|       |
   61|       |    // In the case where we have padding words, they are filled with 1's, so we
   62|       |    // do not need the bounds check on wordIdx when searching for a 1.
   63|    602|    constexpr bool noBoundsCheck = kNumWords < kPaddedWords && V;
  ------------------
  |  Branch (63:36): [Folded - Ignored]
  |  Branch (63:64): [Folded - Ignored]
  ------------------
   64|       |    // Loops through word-sized values in the bit array. Note that at the end of
   65|       |    // this loop, wordIdx points to the element right after currentWord. Writing
   66|       |    // it in this way helps with handling the first and last element edge cases.
   67|    602|    ++wordIdx;
   68|  4.93M|    while (!currentWord && (noBoundsCheck || wordIdx < kNumWords)) {
  ------------------
  |  Branch (68:12): [True: 4.93M, False: 0]
  |  Branch (68:29): [Folded - Ignored]
  |  Branch (68:46): [True: 4.93M, False: 602]
  ------------------
   69|  4.93M|      currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (69:21): [Folded - Ignored]
  ------------------
   70|  4.93M|      ++wordIdx;
   71|  4.93M|    }
   72|    602|    idx = (wordIdx - 1) * kBitsPerWord + llvh::countTrailingZeros(currentWord);
   73|       |    // In the case where N is not a multiple of the word size, this ensures
   74|       |    // that the returned value is equal to N. Otherwise, this check is
   75|       |    // optimised away at compile time.
   76|    602|    if (N % kBitsPerWord) {
  ------------------
  |  Branch (76:9): [Folded - Ignored]
  ------------------
   77|      0|      idx = std::min(idx, N);
   78|      0|    }
   79|    602|    return idx;
   80|    602|  }
_ZN6hermes8BitArrayILm524288ELm8EEC2Ev:
  120|    203|  BitArray() {
  121|    203|    std::fill_n(allBits_.begin(), kNumWords, 0);
  122|       |    // Fill the padding bits with 1's so we can efficiently search for 1's in
  123|       |    // the data.
  124|    203|    std::fill_n(
  125|    203|        allBits_.begin() + kNumWords,
  126|    203|        kPaddedWords - kNumWords,
  127|    203|        std::numeric_limits<uintptr_t>::max());
  128|    203|  }
_ZN6hermes8BitArrayILm267ELm8EE3setEmb:
  136|  39.6k|  inline void set(size_t idx, bool val) {
  137|  39.6k|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  138|  39.6k|    const size_t wordIdx = idx / kBitsPerWord;
  139|  39.6k|    if (val)
  ------------------
  |  Branch (139:9): [True: 1.03k, False: 38.6k]
  ------------------
  140|  1.03k|      allBits_[wordIdx] |= mask;
  141|  38.6k|    else
  142|  38.6k|      allBits_[wordIdx] &= ~mask;
  143|  39.6k|  }
_ZN6hermes8BitArrayILm267ELm8EEC2Ev:
  120|     99|  BitArray() {
  121|     99|    std::fill_n(allBits_.begin(), kNumWords, 0);
  122|       |    // Fill the padding bits with 1's so we can efficiently search for 1's in
  123|       |    // the data.
  124|     99|    std::fill_n(
  125|     99|        allBits_.begin() + kNumWords,
  126|     99|        kPaddedWords - kNumWords,
  127|     99|        std::numeric_limits<uintptr_t>::max());
  128|     99|  }
_ZNK6hermes8BitArrayILm267ELm8EE2atEm:
  151|    171|  inline bool at(size_t idx) const {
  152|    171|    assert(idx < N && "Index must be within the bitset");
  153|      0|    const uintptr_t mask = 1ULL << (idx % kBitsPerWord);
  154|    171|    const auto wordIdx = idx / kBitsPerWord;
  155|    171|    return allBits_[wordIdx] & mask;
  156|    171|  }
_ZNK6hermes8BitArrayILm267ELm8EE18findNextSetBitFromEm:
  159|   616k|  size_t findNextSetBitFrom(size_t idx) const {
  160|   616k|    return findNextBitImpl<true>(idx);
  161|   616k|  }
_ZNK6hermes8BitArrayILm267ELm8EE15findNextBitImplILb1EEEmm:
   44|   616k|  size_t findNextBitImpl(size_t idx) const {
   45|   616k|    assert(
   46|   616k|        idx <= N &&
   47|   616k|        "precondition: idx is less than or equal to number of bits");
   48|       |    // If there are bits after N but in the same word, we do not need to
   49|       |    // generate this special case, since we will do a check on idx at the end.
   50|   616k|    if (N % kBitsPerWord == 0 && idx == N) {
  ------------------
  |  Branch (50:9): [Folded - Ignored]
  |  Branch (50:34): [True: 0, False: 0]
  ------------------
   51|      0|      return N;
   52|      0|    }
   53|   616k|    size_t wordIdx = idx / kBitsPerWord;
   54|   616k|    size_t offset = idx % kBitsPerWord;
   55|       |    // Start looking from the given idx. Invert the word if we are looking for a
   56|       |    // 0 so it's the same as looking for a 1.
   57|   616k|    uintptr_t currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (57:29): [Folded - Ignored]
  ------------------
   58|       |    // Set all bits before idx in the word to zero so we skip past them.
   59|   616k|    currentWord &= (std::numeric_limits<uintptr_t>::max() << offset);
   60|       |
   61|       |    // In the case where we have padding words, they are filled with 1's, so we
   62|       |    // do not need the bounds check on wordIdx when searching for a 1.
   63|   616k|    constexpr bool noBoundsCheck = kNumWords < kPaddedWords && V;
  ------------------
  |  Branch (63:36): [Folded - Ignored]
  |  Branch (63:64): [Folded - Ignored]
  ------------------
   64|       |    // Loops through word-sized values in the bit array. Note that at the end of
   65|       |    // this loop, wordIdx points to the element right after currentWord. Writing
   66|       |    // it in this way helps with handling the first and last element edge cases.
   67|   616k|    ++wordIdx;
   68|  3.05M|    while (!currentWord && (noBoundsCheck || wordIdx < kNumWords)) {
  ------------------
  |  Branch (68:12): [True: 2.44M, False: 616k]
  |  Branch (68:29): [Folded - Ignored]
  |  Branch (68:46): [True: 2.44M, False: 104]
  ------------------
   69|  2.44M|      currentWord = V ? allBits_[wordIdx] : ~allBits_[wordIdx];
  ------------------
  |  Branch (69:21): [Folded - Ignored]
  ------------------
   70|  2.44M|      ++wordIdx;
   71|  2.44M|    }
   72|   616k|    idx = (wordIdx - 1) * kBitsPerWord + llvh::countTrailingZeros(currentWord);
   73|       |    // In the case where N is not a multiple of the word size, this ensures
   74|       |    // that the returned value is equal to N. Otherwise, this check is
   75|       |    // optimised away at compile time.
   76|   616k|    if (N % kBitsPerWord) {
  ------------------
  |  Branch (76:9): [Folded - Ignored]
  ------------------
   77|   616k|      idx = std::min(idx, N);
   78|   616k|    }
   79|   616k|    return idx;
   80|   616k|  }

_ZN6hermes12CompactArrayC2EjNS0_5ScaleE:
   41|    317|        raw_(static_cast<char *>(checkedCalloc(count, 1ULL << initScale))) {}
_ZN6hermes12CompactArrayD2Ev:
   42|    317|  ~CompactArray() {
   43|    317|    ::free(raw_);
   44|    317|  }
_ZN6hermes12CompactArray4swapERS0_:
   48|    218|  void swap(CompactArray &other) {
   49|    218|    std::swap(size_, other.size_);
   50|    218|    std::swap(scale_, other.scale_);
   51|    218|    std::swap(raw_, other.raw_);
   52|    218|  }
_ZNK6hermes12CompactArray3getEj:
   53|  3.55M|  uint32_t get(uint32_t idx) const {
   54|  3.55M|    assert(idx < size_);
   55|      0|    switch (scale_) {
  ------------------
  |  Branch (55:13): [True: 0, False: 3.55M]
  ------------------
   56|   406k|      case UINT8:
  ------------------
  |  Branch (56:7): [True: 406k, False: 3.14M]
  ------------------
   57|   406k|        return Fixed<uint8_t>::get(raw_, idx);
   58|  3.14M|      case UINT16:
  ------------------
  |  Branch (58:7): [True: 3.14M, False: 406k]
  ------------------
   59|  3.14M|        return Fixed<uint16_t>::get(raw_, idx);
   60|      0|      case UINT32:
  ------------------
  |  Branch (60:7): [True: 0, False: 3.55M]
  ------------------
   61|      0|        return Fixed<uint32_t>::get(raw_, idx);
   62|  3.55M|    }
   63|      0|    llvm_unreachable("impossible scale");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   64|  3.55M|  }
_ZN6hermes12CompactArray3setEjj:
   66|   243k|  void set(uint32_t idx, uint32_t value) {
   67|       |    // Note: Scales up twice if value > 64k and current scale is UINT8.
   68|       |    // We assume this happens rarely.
   69|   243k|    while (!trySet(idx, value))
  ------------------
  |  Branch (69:12): [True: 99, False: 243k]
  ------------------
   70|     99|      scaleUp();
   71|   243k|  }
_ZNK6hermes12CompactArray4sizeEv:
   72|   766k|  uint32_t size() const {
   73|   766k|    return size_;
   74|   766k|  }
_ZNK6hermes12CompactArray15getCurrentScaleEv:
   75|    119|  Scale getCurrentScale() const {
   76|    119|    return scale_;
   77|    119|  }
_ZN6hermes12CompactArray6trySetEjj:
   99|   446k|  bool trySet(uint32_t idx, uint32_t value) {
  100|   446k|    assert(idx < size_);
  101|      0|    switch (scale_) {
  ------------------
  |  Branch (101:13): [True: 0, False: 446k]
  ------------------
  102|  24.0k|      case UINT8:
  ------------------
  |  Branch (102:7): [True: 24.0k, False: 422k]
  ------------------
  103|  24.0k|        return Fixed<uint8_t>::trySet(raw_, idx, value);
  104|   422k|      case UINT16:
  ------------------
  |  Branch (104:7): [True: 422k, False: 24.0k]
  ------------------
  105|   422k|        return Fixed<uint16_t>::trySet(raw_, idx, value);
  106|      0|      case UINT32:
  ------------------
  |  Branch (106:7): [True: 0, False: 446k]
  ------------------
  107|      0|        return Fixed<uint32_t>::trySet(raw_, idx, value);
  108|   446k|    }
  109|      0|    llvm_unreachable("impossible scale");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  110|   446k|  }
_ZN6hermes12CompactTable4swapERS0_:
  128|    119|  void swap(CompactTable &other) {
  129|    119|    CompactArray::swap(other);
  130|    119|  }
_ZNK6hermes12CompactTable7isEmptyEj:
  131|   657k|  bool isEmpty(uint32_t idx) const {
  132|   657k|    return CompactArray::get(idx) == EMPTY;
  133|   657k|  }
_ZNK6hermes12CompactTable9isDeletedEj:
  134|   413k|  bool isDeleted(uint32_t idx) const {
  135|   413k|    return CompactArray::get(idx) == DELETED;
  136|   413k|  }
_ZNK6hermes12CompactTable7isValidEj:
  137|  1.64M|  bool isValid(uint32_t idx) const {
  138|  1.64M|    return CompactArray::get(idx) >= FIRST_VALID;
  139|  1.64M|  }
_ZNK6hermes12CompactTable3getEj:
  140|   635k|  uint32_t get(uint32_t idx) const {
  141|   635k|    assert(isValid(idx));
  142|      0|    return CompactArray::get(idx) - FIRST_VALID;
  143|   635k|  }
_ZN6hermes12CompactTable3setEjj:
  144|   243k|  void set(uint32_t idx, uint32_t value) {
  145|   243k|    assert(!isValid(idx));
  146|      0|    CompactArray::set(idx, value + FIRST_VALID);
  147|       |    /// Checks for overflow.
  148|   243k|    assert(isValid(idx));
  149|   243k|  }
_ZN6hermes12CompactTable13markAsDeletedEj:
  150|    273|  void markAsDeleted(uint32_t idx) {
  151|    273|    assert(isValid(idx));
  152|      0|    CompactArray::set(idx, DELETED);
  153|    273|  }
_ZN6hermes12CompactArray5FixedIhE3getEPcj:
   85|   406k|    static uint32_t get(char *raw, uint32_t idx) {
   86|   406k|      return reinterpret_cast<T *>(raw)[idx];
   87|   406k|    }
_ZN6hermes12CompactArray5FixedItE3getEPcj:
   85|  3.14M|    static uint32_t get(char *raw, uint32_t idx) {
   86|  3.14M|      return reinterpret_cast<T *>(raw)[idx];
   87|  3.14M|    }
_ZN6hermes12CompactArray5FixedIhE6trySetEPcjj:
   89|  24.0k|    static bool trySet(char *raw, uint32_t idx, uint32_t value) {
   90|  24.0k|      if (value > std::numeric_limits<T>::max())
  ------------------
  |  Branch (90:11): [True: 99, False: 23.9k]
  ------------------
   91|     99|        return false;
   92|  23.9k|      reinterpret_cast<T *>(raw)[idx] = static_cast<T>(value);
   93|  23.9k|      return true;
   94|  24.0k|    }
_ZN6hermes12CompactArray5FixedItE6trySetEPcjj:
   89|   422k|    static bool trySet(char *raw, uint32_t idx, uint32_t value) {
   90|   422k|      if (value > std::numeric_limits<T>::max())
  ------------------
  |  Branch (90:11): [True: 0, False: 422k]
  ------------------
   91|      0|        return false;
   92|   422k|      reinterpret_cast<T *>(raw)[idx] = static_cast<T>(value);
   93|   422k|      return true;
   94|   422k|    }

_ZNK6hermes24ExponentialMovingAveragecvdEv:
   32|  1.75k|  operator double() const {
   33|  1.75k|    return avg_;
   34|  1.75k|  }
_ZN6hermes24ExponentialMovingAverage6updateEd:
   36|    880|  void update(double value) {
   37|    880|    avg_ = avg_ * (1 - weight_) + weight_ * value;
   38|    880|  }
_ZN6hermes24ExponentialMovingAverageC2Edd:
   27|    594|      : weight_(weight), avg_(init) {
   28|    594|    assert(weight >= 0 && weight <= 1 && "Weight must be between 0 and 1");
   29|    594|  }

_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE3addIJRNS5_11HermesValueEEEERS7_DpOT_:
   68|    440|  Element &add(Args &&...args) {
   69|       |    // Check to see if the list is out of free elements.
   70|    440|    if (LLVM_UNLIKELY(!freeList_)) {
  ------------------
  |  |  189|    440|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 99, False: 341]
  |  |  ------------------
  ------------------
   71|       |      // There are no free elements; need to either garbage collect or allocate
   72|       |      // a new chunk.
   73|     99|      if (chunkCount_ < targetChunkCount_) {
  ------------------
  |  Branch (73:11): [True: 0, False: 99]
  ------------------
   74|       |        // Garbage collection is scheduled to happen at a larger chunk count;
   75|       |        // just allocate a new chunk of unoccpied elements.
   76|      0|        allocateChunk();
   77|     99|      } else {
   78|       |        // Reached the garbage collection threshold; collect.
   79|     99|        collect();
   80|       |
   81|       |        // A new chunk may still be required (e.g. if nothing was collected).
   82|     99|        if (!freeList_) {
  ------------------
  |  Branch (82:13): [True: 99, False: 0]
  ------------------
   83|     99|          allocateChunk();
   84|     99|        }
   85|     99|      }
   86|     99|    }
   87|    440|    assert(freeList_ && "Freelist must be populated before inserting");
   88|       |
   89|       |    // Emplace the new value at the first location in the free list.
   90|      0|    Element &element = *freeList_;
   91|    440|    freeList_ = freeList_->getNextFree();
   92|    440|    assert(element.isFree() && "Premature element reuse");
   93|      0|    element.emplace(std::forward<Args>(args)...);
   94|    440|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|    440|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   95|      0|    return element;
   96|    440|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE13allocateChunkEv:
  187|     99|  void allocateChunk() {
  188|     99|    assert(!freeList_ && "Freelist must be empty before allocating a chunk");
  189|       |
  190|      0|    Chunk *chunk = new Chunk;
  191|       |
  192|       |    // Create a linked list of free elements, going from high address
  193|       |    // to low.
  194|     99|    Element *next = nullptr;
  195|  1.58k|    for (Element &current : chunk->elements) {
  ------------------
  |  Branch (195:27): [True: 1.58k, False: 99]
  ------------------
  196|  1.58k|      assert(current.isFree());
  197|      0|      current.setNextFree(next);
  198|  1.58k|      next = &current;
  199|  1.58k|    }
  200|       |
  201|       |    // Insert into the chunk list
  202|     99|    chunk->nextChunk = chunks_;
  203|     99|    chunks_ = chunk;
  204|       |
  205|       |    // Chunks are only allocated when the free list is empty. Just start the
  206|       |    // free list at this chunk.
  207|     99|    freeList_ = next;
  208|       |
  209|     99|    chunkCount_++;
  210|       |
  211|     99|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  212|     99|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7collectEv:
  128|    198|  void collect() {
  129|    198|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  130|       |
  131|      0|    freeList_ = nullptr;
  132|    198|    size_t occupiedElementCount = 0;
  133|       |
  134|       |    // Delete chunks based on the target number of chunks from the previous
  135|       |    // collection. This can make deletion lag by one collection cycle, but
  136|       |    // simplifies the collection logic by allowing chunks to be deleted as they
  137|       |    // are encountered, before knowing the number of surviving values.
  138|    198|    size_t targetChunkCount = ceil(targetChunkCount_);
  139|    198|    Chunk **chunkListEndLoc = &chunks_;
  140|    297|    for (Chunk *chunk = chunks_; chunk;) {
  ------------------
  |  Branch (140:34): [True: 99, False: 198]
  ------------------
  141|     99|      size_t chunkOccupiedElementCount = 0;
  142|     99|      Element *newFreeList = freeList_;
  143|       |
  144|       |      // Rebuild free list and count elements.
  145|  1.58k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (145:29): [True: 1.58k, False: 99]
  ------------------
  146|  1.58k|        if (element.isFree()) {
  ------------------
  |  Branch (146:13): [True: 1.58k, False: 0]
  ------------------
  147|  1.58k|          element.setNextFree(newFreeList);
  148|  1.58k|          newFreeList = &element;
  149|  1.58k|        } else {
  150|      0|          chunkOccupiedElementCount++;
  151|      0|        }
  152|  1.58k|      }
  153|       |
  154|     99|      Chunk *nextChunk = chunk->nextChunk;
  155|     99|      if (chunkOccupiedElementCount == 0 && chunkCount_ > targetChunkCount) {
  ------------------
  |  Branch (155:11): [True: 99, False: 0]
  |  Branch (155:45): [True: 99, False: 0]
  ------------------
  156|       |        // This chunk is empty, and there are more chunks than desired;
  157|       |        // remove the chunk.
  158|     99|        *chunkListEndLoc = nextChunk;
  159|     99|        chunkCount_--;
  160|     99|        delete chunk;
  161|     99|      } else {
  162|      0|        freeList_ = newFreeList;
  163|      0|        occupiedElementCount += chunkOccupiedElementCount;
  164|      0|        chunkListEndLoc = &chunk->nextChunk;
  165|      0|      }
  166|     99|      chunk = nextChunk;
  167|     99|    }
  168|       |
  169|       |    // Schedule the next collection at a multiple of the the number of suviving
  170|       |    // elements (using the occupancy ratio), averaged with previous target to
  171|       |    // avoid drastic jumps.
  172|    198|    targetChunkCount_.update(
  173|    198|        occupiedElementCount / occupancyRatio_ / kElementsPerChunk);
  174|       |
  175|    198|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  176|    198|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE15checkWellFormedEv:
  214|    935|  bool checkWellFormed() {
  215|  9.29k|    for (Element *freeElement = freeList_; freeElement;
  ------------------
  |  Branch (215:44): [True: 8.36k, False: 935]
  ------------------
  216|  8.36k|         freeElement = freeElement->getNextFree()) {
  217|  8.36k|      if (!freeElement->isFree()) {
  ------------------
  |  Branch (217:11): [True: 0, False: 8.36k]
  ------------------
  218|      0|        return false;
  219|      0|      }
  220|  8.36k|    }
  221|       |
  222|    935|    size_t chunkCount = 0;
  223|  1.57k|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (223:34): [True: 638, False: 935]
  ------------------
  224|    638|      chunkCount++;
  225|    638|    }
  226|    935|    if (chunkCount != chunkCount_) {
  ------------------
  |  Branch (226:9): [True: 0, False: 935]
  ------------------
  227|      0|      return false;
  228|      0|    }
  229|       |
  230|    935|    return true;
  231|    935|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7collectEv:
  128|     99|  void collect() {
  129|     99|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  130|       |
  131|      0|    freeList_ = nullptr;
  132|     99|    size_t occupiedElementCount = 0;
  133|       |
  134|       |    // Delete chunks based on the target number of chunks from the previous
  135|       |    // collection. This can make deletion lag by one collection cycle, but
  136|       |    // simplifies the collection logic by allowing chunks to be deleted as they
  137|       |    // are encountered, before knowing the number of surviving values.
  138|     99|    size_t targetChunkCount = ceil(targetChunkCount_);
  139|     99|    Chunk **chunkListEndLoc = &chunks_;
  140|     99|    for (Chunk *chunk = chunks_; chunk;) {
  ------------------
  |  Branch (140:34): [True: 0, False: 99]
  ------------------
  141|      0|      size_t chunkOccupiedElementCount = 0;
  142|      0|      Element *newFreeList = freeList_;
  143|       |
  144|       |      // Rebuild free list and count elements.
  145|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (145:29): [True: 0, False: 0]
  ------------------
  146|      0|        if (element.isFree()) {
  ------------------
  |  Branch (146:13): [True: 0, False: 0]
  ------------------
  147|      0|          element.setNextFree(newFreeList);
  148|      0|          newFreeList = &element;
  149|      0|        } else {
  150|      0|          chunkOccupiedElementCount++;
  151|      0|        }
  152|      0|      }
  153|       |
  154|      0|      Chunk *nextChunk = chunk->nextChunk;
  155|      0|      if (chunkOccupiedElementCount == 0 && chunkCount_ > targetChunkCount) {
  ------------------
  |  Branch (155:11): [True: 0, False: 0]
  |  Branch (155:45): [True: 0, False: 0]
  ------------------
  156|       |        // This chunk is empty, and there are more chunks than desired;
  157|       |        // remove the chunk.
  158|      0|        *chunkListEndLoc = nextChunk;
  159|      0|        chunkCount_--;
  160|      0|        delete chunk;
  161|      0|      } else {
  162|      0|        freeList_ = newFreeList;
  163|      0|        occupiedElementCount += chunkOccupiedElementCount;
  164|      0|        chunkListEndLoc = &chunk->nextChunk;
  165|      0|      }
  166|      0|      chunk = nextChunk;
  167|      0|    }
  168|       |
  169|       |    // Schedule the next collection at a multiple of the the number of suviving
  170|       |    // elements (using the occupancy ratio), averaged with previous target to
  171|       |    // avoid drastic jumps.
  172|     99|    targetChunkCount_.update(
  173|     99|        occupiedElementCount / occupancyRatio_ / kElementsPerChunk);
  174|       |
  175|     99|    HERMES_SLOW_ASSERT(checkWellFormed());
  ------------------
  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  176|     99|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE15checkWellFormedEv:
  214|    198|  bool checkWellFormed() {
  215|    198|    for (Element *freeElement = freeList_; freeElement;
  ------------------
  |  Branch (215:44): [True: 0, False: 198]
  ------------------
  216|    198|         freeElement = freeElement->getNextFree()) {
  217|      0|      if (!freeElement->isFree()) {
  ------------------
  |  Branch (217:11): [True: 0, False: 0]
  ------------------
  218|      0|        return false;
  219|      0|      }
  220|      0|    }
  221|       |
  222|    198|    size_t chunkCount = 0;
  223|    198|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (223:34): [True: 0, False: 198]
  ------------------
  224|      0|      chunkCount++;
  225|      0|    }
  226|    198|    if (chunkCount != chunkCount_) {
  ------------------
  |  Branch (226:9): [True: 0, False: 198]
  ------------------
  227|      0|      return false;
  228|      0|    }
  229|       |
  230|    198|    return true;
  231|    198|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7forEachIZNS3_13ManagedValuesIS8_ED1EvEUlRS9_E_EEvT_:
  102|     99|  void forEach(Func accept) const {
  103|     99|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (103:34): [True: 0, False: 99]
  ------------------
  104|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (104:29): [True: 0, False: 0]
  ------------------
  105|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (105:13): [True: 0, False: 0]
  ------------------
  106|      0|          accept(element);
  107|      0|        }
  108|      0|      }
  109|      0|    }
  110|     99|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EED2Ev:
   58|     99|  ~ManagedChunkedList() {
   59|     99|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (59:19): [True: 0, False: 99]
  ------------------
   60|      0|      chunks_ = chunk->nextChunk;
   61|      0|      delete chunk;
   62|      0|    }
   63|     99|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7forEachIZNS3_13ManagedValuesIS6_ED1EvEUlRS7_E_EEvT_:
  102|     99|  void forEach(Func accept) const {
  103|     99|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (103:34): [True: 0, False: 99]
  ------------------
  104|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (104:29): [True: 0, False: 0]
  ------------------
  105|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (105:13): [True: 0, False: 0]
  ------------------
  106|      0|          accept(element);
  107|      0|        }
  108|      0|      }
  109|      0|    }
  110|     99|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EED2Ev:
   58|     99|  ~ManagedChunkedList() {
   59|     99|    while (Chunk *chunk = chunks_) {
  ------------------
  |  Branch (59:19): [True: 0, False: 99]
  ------------------
   60|      0|      chunks_ = chunk->nextChunk;
   61|      0|      delete chunk;
   62|      0|    }
   63|     99|  }
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EEC2Edd:
   41|     99|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZN6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EEC2Edd:
   41|     99|      : targetChunkCount_(sizingWeight, 0.0), occupancyRatio_{occupancyRatio} {}
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm17PinnedHermesValueEEELm16EE7forEachIZZNS3_C1ERKNS5_13RuntimeConfigEENKUlPNS5_7HadesGCERNS5_12RootAcceptorEE_clESE_SG_EUlRS7_E_EEvT_:
  102|  1.18k|  void forEach(Func accept) const {
  103|  2.37k|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (103:34): [True: 1.18k, False: 1.18k]
  ------------------
  104|  19.0k|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (104:29): [True: 19.0k, False: 1.18k]
  ------------------
  105|  19.0k|        if (!element.isFree()) {
  ------------------
  |  Branch (105:13): [True: 12, False: 19.0k]
  ------------------
  106|     12|          accept(element);
  107|     12|        }
  108|  19.0k|      }
  109|  1.18k|    }
  110|  1.18k|  }
_ZNK6hermes18ManagedChunkedListIN8facebook6hermes17HermesRuntimeImpl12ManagedValueINS_2vm8WeakRootINS5_8JSObjectEEEEELm16EE7forEachIZZNS3_C1ERKNS5_13RuntimeConfigEENKUlPNS5_7HadesGCERNS5_16WeakRootAcceptorEE_clESG_SI_EUlRS9_E_EEvT_:
  102|  1.18k|  void forEach(Func accept) const {
  103|  1.18k|    for (Chunk *chunk = chunks_; chunk; chunk = chunk->nextChunk) {
  ------------------
  |  Branch (103:34): [True: 0, False: 1.18k]
  ------------------
  104|      0|      for (Element &element : chunk->elements) {
  ------------------
  |  Branch (104:29): [True: 0, False: 0]
  ------------------
  105|      0|        if (!element.isFree()) {
  ------------------
  |  Branch (105:13): [True: 0, False: 0]
  ------------------
  106|      0|          accept(element);
  107|      0|        }
  108|      0|      }
  109|      0|    }
  110|  1.18k|  }

_ZN6hermes10SafeUInt32C2Ej:
   32|   462k|  explicit SafeUInt32(uint32_t value = 0) : value_(value), ors_(0) {}
_ZNK6hermes10SafeUInt3212isOverflowedEv:
   35|  1.04M|  bool isOverflowed() const {
   36|  1.04M|    return ors_ != 0;
   37|  1.04M|  }
_ZNK6hermes10SafeUInt323getEv:
   46|   464k|  uint32_t get() const {
   47|   464k|    assert(
   48|   464k|        !isOverflowed() &&
   49|   464k|        "attempt to retrieve value of overflowed SafeUInt32");
   50|      0|    return value_;
   51|   464k|  };
_ZN6hermes10SafeUInt323addEj:
   54|   247k|  void add(uint32_t n) {
   55|   247k|    value_ += n;
   56|   247k|    ors_ |= (value_ >> 32);
   57|   247k|  };
_ZNK6hermes10SafeUInt32deEv:
   59|   459k|  uint32_t operator*() const {
   60|   459k|    return get();
   61|   459k|  }

_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEED2Ev:
  117|     56|  ~ScopedHashTable() {
  118|     56|    assert(!scope_ && "Scopes remain when destructing ScopedHashTable");
  119|      0|    assert(!map_.size() && "Elements remaining in map without scope!");
  120|     56|  }
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEEC2Ev:
  116|     56|  ScopedHashTable() : map_() {}
_ZNK6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE6lookupERKS1_:
  157|   265k|  V lookup(const K &key) const {
  158|   265k|    auto result = map_.find(key);
  159|   265k|    if (result == map_.end())
  ------------------
  |  Branch (159:9): [True: 3.62k, False: 262k]
  ------------------
  160|  3.62k|      return V();
  161|       |
  162|   262k|    return result->second->value_;
  163|   265k|  }
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE6insertERKS1_RKS3_:
  133|   114k|  void insert(const K &key, const V &value) {
  134|   114k|    insertIntoScope(scope_, key, value);
  135|   114k|  }
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE15insertIntoScopeEPNS_20ScopedHashTableScopeIS1_S3_EERKS1_RKS3_:
  127|   117k|      const V &value) {
  128|   117k|    assert(scope && "No currently defined scope");
  129|      0|    insertNewNode(scope, key, value, map_[key]);
  130|   117k|  }
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE13insertNewNodeEPNS_20ScopedHashTableScopeIS1_S3_EERKS1_RKS3_RPNS_19ScopedHashTableNodeIS1_S3_EE:
  103|   117k|      ScopedHashTableNode<K, V> *&entry) {
  104|       |    // All Nodes allocated here.
  105|   117k|    auto *update = new ScopedHashTableNode<K, V>(scope->depth_, key, value);
  106|   117k|    assert(
  107|   117k|        (!entry || entry->depth_ <= scope->depth_) &&
  108|   117k|        "Can't insert values under existing names");
  109|      0|    update->nextShadowed_ = entry;
  110|   117k|    update->nextInScope_ = scope->head_;
  111|   117k|    scope->head_ = update;
  112|   117k|    entry = update;
  113|   117k|  }
_ZN6hermes19ScopedHashTableNodeINS_10IdentifierEPNS_5ValueEEC2EjRKS1_RKS3_:
   28|   117k|      : key_(key), value_(value), depth_(depth) {}
_ZNK6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE5countERKS1_:
  152|      2|  uint32_t count(const K &key) const {
  153|      2|    return map_.count(key);
  154|      2|  }
_ZN6hermes20ScopedHashTableScopeINS_10IdentifierEPNS_5ValueEEC2ERNS_15ScopedHashTableIS1_S3_EE:
  200|   114k|    : base_(base) {
  201|   114k|  previous_ = base.scope_;
  202|   114k|  depth_ = !previous_ ? 0 : previous_->depth_ + 1;
  ------------------
  |  Branch (202:12): [True: 56, False: 114k]
  ------------------
  203|   114k|  base.scope_ = this;
  204|   114k|}
_ZN6hermes20ScopedHashTableScopeINS_10IdentifierEPNS_5ValueEED2Ev:
  207|   114k|ScopedHashTableScope<K, V>::~ScopedHashTableScope() {
  208|   114k|  assert(this == base_.scope_ && "Deallocating scope that's not current!");
  209|      0|  base_.clearCurrentScope();
  210|   114k|  base_.scope_ = previous_;
  211|   114k|}
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE17clearCurrentScopeEv:
   83|   114k|  void clearCurrentScope() {
   84|   114k|    assert(scope_ && "No current scope to clear");
   85|       |
   86|      0|    auto *current = scope_->head_;
   87|   231k|    while (current) {
  ------------------
  |  Branch (87:12): [True: 117k, False: 114k]
  ------------------
   88|   117k|      assert(current->depth_ == scope_->depth_ && "Bad scope link");
   89|      0|      auto *popped = pop(current->key_);
   90|   117k|      assert(current == popped && "Unexpected innermost value for key");
   91|      0|      current = current->nextInScope_;
   92|       |      // All nodes deallocated here.
   93|   117k|      delete popped;
   94|   117k|    }
   95|   114k|    scope_->head_ = nullptr;
   96|   114k|  }
_ZN6hermes15ScopedHashTableINS_10IdentifierEPNS_5ValueEE3popERKS1_:
   67|   117k|  ScopedHashTableNode<K, V> *pop(const K &key) {
   68|   117k|    ScopedHashTableNode<K, V> *&entry = map_[key];
   69|   117k|    assert(entry && "Asked to pop an empty scope value");
   70|      0|    assert(
   71|   117k|        entry->depth_ == scope_->depth_ &&
   72|   117k|        "Asked to pop value not from innermost scope");
   73|      0|    auto *ret = entry;
   74|   117k|    if (entry->nextShadowed_) {
  ------------------
  |  Branch (74:9): [True: 86.5k, False: 31.0k]
  ------------------
   75|  86.5k|      entry = entry->nextShadowed_;
   76|  86.5k|    } else {
   77|  31.0k|      map_.erase(key);
   78|  31.0k|    }
   79|   117k|    return ret;
   80|   117k|  }

_ZNK6hermes10WordBitSetIjE2atEj:
   50|     28|  bool at(unsigned pos) const {
   51|     28|    assert(pos < NUM_BITS && "Invalid index");
   52|      0|    return (value_ & ((T)1 << pos));
   53|     28|  }
_ZN6hermes10WordBitSetIjEC2Ev:
   27|     28|  WordBitSet() = default;

_ZN6hermes7ContextC2ENS_22CodeGenerationSettingsENS_20OptimizationSettingsENSt3__110unique_ptrIN4llvh8DenseMapINS5_9StringRefENS6_IS7_S7_NS5_12DenseMapInfoIS7_EENS5_6detail12DenseMapPairIS7_S7_EEEES9_NSB_IS7_SD_EEEENS3_14default_deleteISF_EEEENS3_6vectorIjNS3_9allocatorIjEEEE:
  278|     99|        optimizationSettings_(std::move(optimizationOpts)) {}
_ZN6hermes7Context12getAllocatorEv:
  283|  1.14k|  Allocator &getAllocator() {
  284|  1.14k|    return allocator_;
  285|  1.14k|  }
_ZN6hermes7Context14getStringTableEv:
  287|   228k|  StringTable &getStringTable() {
  288|   228k|    return stringTable_;
  289|   228k|  }
_ZN6hermes7Context17addCompiledRegExpEPNS_12UniqueStringES2_ONS_14CompiledRegExpE:
  294|  11.4k|      CompiledRegExp &&compiled) {
  295|  11.4k|    compiledRegExps_.emplace(
  296|  11.4k|        std::make_pair(pattern, flags), std::move(compiled));
  297|  11.4k|  }
_ZN6hermes7Context17getCompiledRegExpEPNS_12UniqueStringES2_:
  301|  22.8k|      UniqueString *flags) {
  302|  22.8k|    auto it = compiledRegExps_.find(std::make_pair(pattern, flags));
  303|  22.8k|    assert(it != compiledRegExps_.end() && "Regex hasn't been compiled");
  304|      0|    return it->second;
  305|  22.8k|  }
_ZN6hermes7Context22getPreParsedBufferInfoEj:
  307|    164|  parser::PreParsedBufferInfo *getPreParsedBufferInfo(uint32_t bufferId) {
  308|    164|    if (!preParsed_)
  ------------------
  |  Branch (308:9): [True: 99, False: 65]
  ------------------
  309|     99|      preParsed_ = std::make_unique<parser::PreParsedData>();
  310|    164|    return preParsed_->getBufferInfo(bufferId);
  311|    164|  }
_ZN6hermes7Context21getSourceErrorManagerEv:
  313|   115k|  SourceErrorManager &getSourceErrorManager() {
  314|   115k|    return sm_;
  315|   115k|  }
_ZN6hermes7Context13getIdentifierEN4llvh9StringRefE:
  333|   758k|  Identifier getIdentifier(llvh::StringRef str) {
  334|   758k|    return stringTable_.getIdentifier(str);
  335|   758k|  }
_ZN6hermes7Context13setStrictModeEb:
  342|     99|  void setStrictMode(bool strictMode) {
  343|     99|    strictMode_ = strictMode;
  344|     99|  }
_ZNK6hermes7Context12isStrictModeEv:
  345|    328|  bool isStrictMode() const {
  346|    328|    return strictMode_;
  347|    328|  }
_ZN6hermes7Context13setEnableEvalEb:
  352|     99|  void setEnableEval(bool enableEval) {
  353|     99|    enableEval_ = enableEval;
  354|     99|  }
_ZN6hermes7Context19setDebugInfoSettingENS_16DebugInfoSettingE:
  356|     99|  void setDebugInfoSetting(DebugInfoSetting debugInfoSetting) {
  357|     99|    debugInfoSetting_ = debugInfoSetting;
  358|     99|  }
_ZNK6hermes7Context19getDebugInfoSettingEv:
  359|  2.01M|  DebugInfoSetting getDebugInfoSetting() const {
  360|  2.01M|    return debugInfoSetting_;
  361|  2.01M|  }
_ZN6hermes7Context22setEmitAsyncBreakCheckEb:
  363|     99|  void setEmitAsyncBreakCheck(bool check) {
  364|     99|    emitAsyncBreakCheck_ = check;
  365|     99|  }
_ZNK6hermes7Context12getParseFlowEv:
  387|  9.05M|  bool getParseFlow() const {
  388|  9.05M|    return parseFlow_ != ParseFlowSetting::NONE;
  389|  9.05M|  }
_ZNK6hermes7Context21getParseFlowAmbiguousEv:
  390|  3.95M|  bool getParseFlowAmbiguous() const {
  391|  3.95M|    return parseFlow_ == ParseFlowSetting::ALL;
  392|  3.95M|  }
_ZNK6hermes7Context10getParseTSEv:
  397|  15.0M|  bool getParseTS() const {
  398|  15.0M|    return parseTS_;
  399|  15.0M|  }
_ZNK6hermes7Context13getParseTypesEv:
  402|  2.56M|  bool getParseTypes() const {
  403|  2.56M|    return getParseFlow() || getParseTS();
  ------------------
  |  Branch (403:12): [True: 0, False: 2.56M]
  |  Branch (403:30): [True: 0, False: 2.56M]
  ------------------
  404|  2.56M|  }
_ZNK6hermes7Context17isLazyCompilationEv:
  406|     99|  bool isLazyCompilation() const {
  407|     99|    return lazyCompilation_;
  408|     99|  }
_ZN6hermes7Context18setLazyCompilationEb:
  410|     99|  void setLazyCompilation(bool lazyCompilation) {
  411|     99|    lazyCompilation_ = lazyCompilation;
  412|     99|  }
_ZN6hermes7Context41getPreemptiveFunctionCompilationThresholdEv:
  414|    768|  unsigned getPreemptiveFunctionCompilationThreshold() {
  415|    768|    return preemptiveFunctionCompilationThreshold_;
  416|    768|  }
_ZN6hermes7Context41setPreemptiveFunctionCompilationThresholdEj:
  418|     99|  void setPreemptiveFunctionCompilationThreshold(unsigned byteCount) {
  419|     99|    preemptiveFunctionCompilationThreshold_ = byteCount;
  420|     99|  };
_ZN6hermes7Context37getPreemptiveFileCompilationThresholdEv:
  422|     99|  unsigned getPreemptiveFileCompilationThreshold() {
  423|     99|    return preemptiveFileCompilationThreshold_;
  424|     99|  }
_ZN6hermes7Context37setPreemptiveFileCompilationThresholdEj:
  426|     99|  void setPreemptiveFileCompilationThreshold(unsigned byteCount) {
  427|     99|    preemptiveFileCompilationThreshold_ = byteCount;
  428|     99|  };
_ZN6hermes7Context19setGeneratorEnabledEb:
  442|     99|  void setGeneratorEnabled(bool v) {
  443|     99|    generatorEnabled_ = v;
  444|     99|  }
_ZN6hermes7Context28setStaticBuiltinOptimizationEb:
  446|     56|  void setStaticBuiltinOptimization(bool staticBuiltins) {
  447|     56|    optimizationSettings_.staticBuiltins = staticBuiltins;
  448|     56|  }
_ZNK6hermes7Context25getCodeGenerationSettingsEv:
  458|   260k|  const CodeGenerationSettings &getCodeGenerationSettings() const {
  459|   260k|    return codeGenerationSettings_;
  460|   260k|  }
_ZNK6hermes7Context23getOptimizationSettingsEv:
  462|   135k|  const OptimizationSettings &getOptimizationSettings() const {
  463|   135k|    return optimizationSettings_;
  464|   135k|  }
_ZN6hermes7Context12allocateNodeEmm:
  472|  7.48M|  void *allocateNode(size_t size, size_t alignment) {
  473|  7.48M|    return allocator_.Allocate(size, alignment);
  474|  7.48M|  }
_ZN6hermes7Context20getHBCBackendContextEv:
  476|   228k|  hbc::BackendContext *getHBCBackendContext() {
  477|   228k|    return hbcBackendContext_.get();
  478|   228k|  }
_ZN6hermes7Context20setHBCBackendContextENSt3__110shared_ptrINS_3hbc14BackendContextEEE:
  481|     56|      std::shared_ptr<hbc::BackendContext> hbcBackendContext) {
  482|     56|    hbcBackendContext_ = std::move(hbcBackendContext);
  483|     56|  }

_ZN6hermes6ESTree4NodeC2ENS0_8NodeKindE:
   85|  7.48M|  explicit Node(NodeKind kind) : kind_(kind) {}
_ZN6hermes6ESTree4Node14setSourceRangeEN4llvh7SMRangeE:
   87|   228k|  void setSourceRange(SMRange rng) {
   88|   228k|    sourceRange_ = rng;
   89|   228k|  }
_ZNK6hermes6ESTree4Node14getSourceRangeEv:
   90|   577k|  SMRange getSourceRange() const {
   91|   577k|    return sourceRange_;
   92|   577k|  }
_ZN6hermes6ESTree4Node11setStartLocEN4llvh5SMLocE:
   93|  7.25M|  void setStartLoc(SMLoc loc) {
   94|  7.25M|    sourceRange_.Start = loc;
   95|  7.25M|  }
_ZNK6hermes6ESTree4Node11getStartLocEv:
   96|  1.52M|  SMLoc getStartLoc() const {
   97|  1.52M|    return sourceRange_.Start;
   98|  1.52M|  }
_ZN6hermes6ESTree4Node9setEndLocEN4llvh5SMLocE:
   99|  7.25M|  void setEndLoc(SMLoc loc) {
  100|  7.25M|    sourceRange_.End = loc;
  101|  7.25M|  }
_ZNK6hermes6ESTree4Node9getEndLocEv:
  102|  99.2k|  SMLoc getEndLoc() const {
  103|  99.2k|    return sourceRange_.End;
  104|  99.2k|  }
_ZN6hermes6ESTree4Node11setDebugLocEN4llvh5SMLocE:
  105|  7.48M|  void setDebugLoc(SMLoc loc) {
  106|  7.48M|    debugLoc_ = loc;
  107|  7.48M|  }
_ZNK6hermes6ESTree4Node11getDebugLocEv:
  108|  2.04M|  SMLoc getDebugLoc() const {
  109|  2.04M|    return debugLoc_;
  110|  2.04M|  }
_ZNK6hermes6ESTree4Node9getParensEv:
  112|  4.40M|  unsigned getParens() const {
  113|  4.40M|    return parens_;
  114|  4.40M|  }
_ZN6hermes6ESTree4Node16copyLocationFromEPKS1_:
  123|   228k|  void copyLocationFrom(const Node *src) {
  124|   228k|    setSourceRange(src->getSourceRange());
  125|   228k|    setDebugLoc(src->getDebugLoc());
  126|   228k|  }
_ZNK6hermes6ESTree4Node7getKindEv:
  175|  38.9M|  NodeKind getKind() const {
  176|  38.9M|    return kind_;
  177|  38.9M|  }
_ZN6hermes6ESTree4NodenwEmRNS_7ContextEm:
  186|  7.48M|  operator new(size_t size, Context &ctx, size_t alignment = alignof(double)) {
  187|  7.48M|    return ctx.allocateNode(size, alignment);
  188|  7.48M|  }
_ZN6hermes6ESTree22FunctionLikeDecoration10setSemInfoEPNS_3sem12FunctionInfoE:
  273|   114k|  void setSemInfo(sem::FunctionInfo *semInfo) {
  274|   114k|    assert(semInfo && "setting semInfo to null");
  275|      0|    assert(!semInfo_ && "semInfo is already set");
  276|      0|    semInfo_ = semInfo;
  277|   114k|  }
_ZNK6hermes6ESTree22FunctionLikeDecoration10getSemInfoEv:
  279|   456k|  sem::FunctionInfo *getSemInfo() const {
  280|   456k|    assert(semInfo_ && "semInfo is not set!");
  281|      0|    return semInfo_;
  282|   456k|  }
_ZNK6hermes6ESTree19LabelDecorationBase15isLabelIndexSetEv:
  297|  82.0k|  bool isLabelIndexSet() const {
  298|  82.0k|    return labelIndex_ != INVALID_LABEL;
  299|  82.0k|  }
_ZNK6hermes6ESTree19LabelDecorationBase13getLabelIndexEv:
  301|  39.2k|  unsigned getLabelIndex() const {
  302|  39.2k|    assert(isLabelIndexSet() && "labelIndex is not set");
  303|      0|    return labelIndex_;
  304|  39.2k|  }
_ZN6hermes6ESTree19LabelDecorationBase13setLabelIndexEj:
  306|  42.8k|  void setLabelIndex(unsigned labelIndex) {
  307|  42.8k|    assert(labelIndex != INVALID_LABEL && "setting labelIndex to invalid");
  308|      0|    assert(!isLabelIndexSet() && "labelIndex is already set");
  309|      0|    labelIndex_ = labelIndex;
  310|  42.8k|  }
_ZN6hermes6ESTree9EmptyNodeC2Ev:
  425|    493|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree9EmptyNode7classofEPKNS0_4NodeE:
  426|   848k|    static bool classof(const Node *V) {                               \
  427|   848k|      return V->getKind() == NodeKind::NAME;                           \
  428|   848k|    }                                                                  \
_ZN6hermes6ESTree16FunctionLikeNodeC2ENS0_8NodeKindE:
  413|   233k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree11ProgramNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  445|    243|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree11ProgramNode7classofEPKNS0_4NodeE:
  455|    401|    static bool classof(const Node *V) {                                 \
  456|    401|      return V->getKind() == NodeKind::NAME;                             \
  457|    401|    }                                                                    \
_ZN6hermes6ESTree22FunctionExpressionNode7classofEPKNS0_4NodeE:
  845|   159k|    static bool classof(const Node *V) {                               \
  846|   159k|      return V->getKind() == NodeKind::NAME;                           \
  847|   159k|    }                                                                  \
_ZN6hermes6ESTree27ArrowFunctionExpressionNodeC2EPNS0_4NodeEON4llvh12simple_ilistIS2_JEEES3_S3_S3_S3_bb:
  827|   228k|          _##ARG7NM(std::move(ARG7NM##_)) {}                           \
_ZN6hermes6ESTree27ArrowFunctionExpressionNode7classofEPKNS0_4NodeE:
  845|   844k|    static bool classof(const Node *V) {                               \
  846|   844k|      return V->getKind() == NodeKind::NAME;                           \
  847|   844k|    }                                                                  \
_ZN6hermes6ESTree23FunctionDeclarationNodeC2EPNS0_4NodeEON4llvh12simple_ilistIS2_JEEES3_S3_S3_S3_bb:
  827|  4.91k|          _##ARG7NM(std::move(ARG7NM##_)) {}                           \
_ZN6hermes6ESTree23FunctionDeclarationNode7classofEPKNS0_4NodeE:
  845|   554k|    static bool classof(const Node *V) {                               \
  846|   554k|      return V->getKind() == NodeKind::NAME;                           \
  847|   554k|    }                                                                  \
_ZN6hermes6ESTree13StatementNodeC2ENS0_8NodeKindE:
  413|   935k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree17LoopStatementNodeC2ENS0_8NodeKindE:
  413|      3|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree17LoopStatementNode7classofEPKNS0_4NodeE:
  414|  43.4k|    static bool classof(const Node *V) {                          \
  415|  43.4k|      auto kind = V->getKind();                                   \
  416|  43.4k|      return NodeKind::_##NAME##_First < kind &&                  \
  ------------------
  |  Branch (416:14): [True: 43.4k, False: 0]
  ------------------
  417|  43.4k|          kind < NodeKind::_##NAME##_Last;                        \
  ------------------
  |  Branch (417:11): [True: 0, False: 43.4k]
  ------------------
  418|  43.4k|    }                                                             \
_ZN6hermes6ESTree18WhileStatementNodeC2EPNS0_4NodeES3_:
  472|      3|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree18WhileStatementNode7classofEPKNS0_4NodeE:
  483|   131k|    static bool classof(const Node *V) {                               \
  484|   131k|      return V->getKind() == NodeKind::NAME;                           \
  485|   131k|    }                                                                  \
_ZN6hermes6ESTree20DoWhileStatementNode7classofEPKNS0_4NodeE:
  483|   131k|    static bool classof(const Node *V) {                               \
  484|   131k|      return V->getKind() == NodeKind::NAME;                           \
  485|   131k|    }                                                                  \
_ZN6hermes6ESTree18ForInStatementNode7classofEPKNS0_4NodeE:
  525|   529k|    static bool classof(const Node *V) {                               \
  526|   529k|      return V->getKind() == NodeKind::NAME;                           \
  527|   529k|    }                                                                  \
_ZN6hermes6ESTree18ForOfStatementNode7classofEPKNS0_4NodeE:
  575|   529k|    static bool classof(const Node *V) {                               \
  576|   529k|      return V->getKind() == NodeKind::NAME;                           \
  577|   529k|    }                                                                  \
_ZN6hermes6ESTree16ForStatementNode7classofEPKNS0_4NodeE:
  575|   131k|    static bool classof(const Node *V) {                               \
  576|   131k|      return V->getKind() == NodeKind::NAME;                           \
  577|   131k|    }                                                                  \
_ZN6hermes6ESTree18EmptyStatementNodeC2Ev:
  425|   263k|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree18EmptyStatementNode7classofEPKNS0_4NodeE:
  426|   394k|    static bool classof(const Node *V) {                               \
  427|   394k|      return V->getKind() == NodeKind::NAME;                           \
  428|   394k|    }                                                                  \
_ZN6hermes6ESTree18BlockStatementNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  445|   121k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18BlockStatementNode7classofEPKNS0_4NodeE:
  455|   862k|    static bool classof(const Node *V) {                                 \
  456|   862k|      return V->getKind() == NodeKind::NAME;                             \
  457|   862k|    }                                                                    \
_ZN6hermes6ESTree18BreakStatementNode7classofEPKNS0_4NodeE:
  455|   131k|    static bool classof(const Node *V) {                                 \
  456|   131k|      return V->getKind() == NodeKind::NAME;                             \
  457|   131k|    }                                                                    \
_ZN6hermes6ESTree21ContinueStatementNodeC2EPNS0_4NodeE:
  445|      7|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree21ContinueStatementNode7classofEPKNS0_4NodeE:
  455|   131k|    static bool classof(const Node *V) {                                 \
  456|   131k|      return V->getKind() == NodeKind::NAME;                             \
  457|   131k|    }                                                                    \
_ZN6hermes6ESTree18ThrowStatementNode7classofEPKNS0_4NodeE:
  455|   131k|    static bool classof(const Node *V) {                                 \
  456|   131k|      return V->getKind() == NodeKind::NAME;                             \
  457|   131k|    }                                                                    \
_ZN6hermes6ESTree19ReturnStatementNodeC2EPNS0_4NodeE:
  445|   114k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree19ReturnStatementNode7classofEPKNS0_4NodeE:
  455|   758k|    static bool classof(const Node *V) {                                 \
  456|   758k|      return V->getKind() == NodeKind::NAME;                             \
  457|   758k|    }                                                                    \
_ZN6hermes6ESTree19SwitchStatementNode7classofEPKNS0_4NodeE:
  483|   285k|    static bool classof(const Node *V) {                               \
  484|   285k|      return V->getKind() == NodeKind::NAME;                           \
  485|   285k|    }                                                                  \
_ZN6hermes6ESTree20LabeledStatementNodeC2EPNS0_4NodeES3_:
  472|  85.6k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree20LabeledStatementNode7classofEPKNS0_4NodeE:
  483|   296k|    static bool classof(const Node *V) {                               \
  484|   296k|      return V->getKind() == NodeKind::NAME;                           \
  485|   296k|    }                                                                  \
_ZN6hermes6ESTree23ExpressionStatementNodeC2EPNS0_4NodeEPNS_12UniqueStringE:
  472|   351k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree23ExpressionStatementNode7classofEPKNS0_4NodeE:
  483|   947k|    static bool classof(const Node *V) {                               \
  484|   947k|      return V->getKind() == NodeKind::NAME;                           \
  485|   947k|    }                                                                  \
_ZN6hermes6ESTree16TryStatementNode7classofEPKNS0_4NodeE:
  525|   131k|    static bool classof(const Node *V) {                               \
  526|   131k|      return V->getKind() == NodeKind::NAME;                           \
  527|   131k|    }                                                                  \
_ZN6hermes6ESTree15IfStatementNode7classofEPKNS0_4NodeE:
  525|   529k|    static bool classof(const Node *V) {                               \
  526|   529k|      return V->getKind() == NodeKind::NAME;                           \
  527|   529k|    }                                                                  \
_ZN6hermes6ESTree15NullLiteralNode7classofEPKNS0_4NodeE:
  426|   977k|    static bool classof(const Node *V) {                               \
  427|   977k|      return V->getKind() == NodeKind::NAME;                           \
  428|   977k|    }                                                                  \
_ZN6hermes6ESTree18BooleanLiteralNodeC2Eb:
  445|  4.03k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18BooleanLiteralNode7classofEPKNS0_4NodeE:
  455|   971k|    static bool classof(const Node *V) {                                 \
  456|   971k|      return V->getKind() == NodeKind::NAME;                             \
  457|   971k|    }                                                                    \
_ZN6hermes6ESTree17StringLiteralNodeC2EPNS_12UniqueStringE:
  445|  15.5k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree17StringLiteralNode7classofEPKNS0_4NodeE:
  455|  1.01M|    static bool classof(const Node *V) {                                 \
  456|  1.01M|      return V->getKind() == NodeKind::NAME;                             \
  457|  1.01M|    }                                                                    \
_ZN6hermes6ESTree18NumericLiteralNodeC2Ed:
  445|  1.79M|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree18NumericLiteralNode7classofEPKNS0_4NodeE:
  455|  3.17M|    static bool classof(const Node *V) {                                 \
  456|  3.17M|      return V->getKind() == NodeKind::NAME;                             \
  457|  3.17M|    }                                                                    \
_ZN6hermes6ESTree17RegExpLiteralNodeC2EPNS_12UniqueStringES3_:
  472|  34.1k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree17RegExpLiteralNode7classofEPKNS0_4NodeE:
  483|  1.00M|    static bool classof(const Node *V) {                               \
  484|  1.00M|      return V->getKind() == NodeKind::NAME;                           \
  485|  1.00M|    }                                                                  \
_ZN6hermes6ESTree17BigIntLiteralNodeC2EPNS_12UniqueStringE:
  445|     24|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree17BigIntLiteralNode7classofEPKNS0_4NodeE:
  455|   225k|    static bool classof(const Node *V) {                                 \
  456|   225k|      return V->getKind() == NodeKind::NAME;                             \
  457|   225k|    }                                                                    \
_ZN6hermes6ESTree18ThisExpressionNode7classofEPKNS0_4NodeE:
  426|   155k|    static bool classof(const Node *V) {                               \
  427|   155k|      return V->getKind() == NodeKind::NAME;                           \
  428|   155k|    }                                                                  \
_ZN6hermes6ESTree9SuperNode7classofEPKNS0_4NodeE:
  426|    643|    static bool classof(const Node *V) {                               \
  427|    643|      return V->getKind() == NodeKind::NAME;                           \
  428|    643|    }                                                                  \
_ZN6hermes6ESTree22SequenceExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  445|  1.18k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree22SequenceExpressionNode7classofEPKNS0_4NodeE:
  455|  41.7k|    static bool classof(const Node *V) {                                 \
  456|  41.7k|      return V->getKind() == NodeKind::NAME;                             \
  457|  41.7k|    }                                                                    \
_ZN6hermes6ESTree20ObjectExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEE:
  445|  10.2k|        : BASE##Node(NodeKind::NAME), _##ARG0NM(std::move(ARG0NM##_)) {} \
_ZN6hermes6ESTree20ObjectExpressionNode7classofEPKNS0_4NodeE:
  455|   212k|    static bool classof(const Node *V) {                                 \
  456|   212k|      return V->getKind() == NodeKind::NAME;                             \
  457|   212k|    }                                                                    \
_ZN6hermes6ESTree19ArrayExpressionNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEEb:
  472|  67.1k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree19ArrayExpressionNode7classofEPKNS0_4NodeE:
  483|   331k|    static bool classof(const Node *V) {                               \
  484|   331k|      return V->getKind() == NodeKind::NAME;                           \
  485|   331k|    }                                                                  \
_ZN6hermes6ESTree17SpreadElementNode7classofEPKNS0_4NodeE:
  455|  1.41M|    static bool classof(const Node *V) {                                 \
  456|  1.41M|      return V->getKind() == NodeKind::NAME;                             \
  457|  1.41M|    }                                                                    \
_ZN6hermes6ESTree17NewExpressionNode7classofEPKNS0_4NodeE:
  525|   221k|    static bool classof(const Node *V) {                               \
  526|   221k|      return V->getKind() == NodeKind::NAME;                           \
  527|   221k|    }                                                                  \
_ZN6hermes6ESTree22CallExpressionLikeNodeC2ENS0_8NodeKindE:
  413|  2.05k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree18CallExpressionNodeC2EPNS0_4NodeES3_ON4llvh12simple_ilistIS2_JEEE:
  513|  2.05k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree18CallExpressionNode7classofEPKNS0_4NodeE:
  525|   353k|    static bool classof(const Node *V) {                               \
  526|   353k|      return V->getKind() == NodeKind::NAME;                           \
  527|   353k|    }                                                                  \
_ZN6hermes6ESTree26OptionalCallExpressionNode7classofEPKNS0_4NodeE:
  575|  4.17M|    static bool classof(const Node *V) {                               \
  576|  4.17M|      return V->getKind() == NodeKind::NAME;                           \
  577|  4.17M|    }                                                                  \
_ZN6hermes6ESTree24AssignmentExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeES5_:
  513|  9.19k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree24AssignmentExpressionNode7classofEPKNS0_4NodeE:
  525|   241k|    static bool classof(const Node *V) {                               \
  526|   241k|      return V->getKind() == NodeKind::NAME;                           \
  527|   241k|    }                                                                  \
_ZN6hermes6ESTree19UnaryExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  513|  11.0k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree19UnaryExpressionNode7classofEPKNS0_4NodeE:
  525|   167k|    static bool classof(const Node *V) {                               \
  526|   167k|      return V->getKind() == NodeKind::NAME;                           \
  527|   167k|    }                                                                  \
_ZN6hermes6ESTree20UpdateExpressionNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  513|     58|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20UpdateExpressionNode7classofEPKNS0_4NodeE:
  525|  41.3k|    static bool classof(const Node *V) {                               \
  526|  41.3k|      return V->getKind() == NodeKind::NAME;                           \
  527|  41.3k|    }                                                                  \
_ZN6hermes6ESTree24MemberExpressionLikeNodeC2ENS0_8NodeKindE:
  413|  6.81k|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree20MemberExpressionNodeC2EPNS0_4NodeES3_b:
  513|  3.29k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20MemberExpressionNode7classofEPKNS0_4NodeE:
  525|   347k|    static bool classof(const Node *V) {                               \
  526|   347k|      return V->getKind() == NodeKind::NAME;                           \
  527|   347k|    }                                                                  \
_ZN6hermes6ESTree28OptionalMemberExpressionNodeC2EPNS0_4NodeES3_bb:
  561|  3.51k|          _##ARG3NM(std::move(ARG3NM##_)) {}                           \
_ZN6hermes6ESTree28OptionalMemberExpressionNode7classofEPKNS0_4NodeE:
  575|  4.17M|    static bool classof(const Node *V) {                               \
  576|  4.17M|      return V->getKind() == NodeKind::NAME;                           \
  577|  4.17M|    }                                                                  \
_ZN6hermes6ESTree21LogicalExpressionNodeC2EPNS0_4NodeES3_PNS_12UniqueStringE:
  513|  90.0k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree21LogicalExpressionNode7classofEPKNS0_4NodeE:
  525|   191k|    static bool classof(const Node *V) {                               \
  526|   191k|      return V->getKind() == NodeKind::NAME;                           \
  527|   191k|    }                                                                  \
_ZN6hermes6ESTree25ConditionalExpressionNodeC2EPNS0_4NodeES3_S3_:
  513|    180|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree25ConditionalExpressionNode7classofEPKNS0_4NodeE:
  525|  41.5k|    static bool classof(const Node *V) {                               \
  526|  41.5k|      return V->getKind() == NodeKind::NAME;                           \
  527|  41.5k|    }                                                                  \
_ZN6hermes6ESTree20BinaryExpressionNodeC2EPNS0_4NodeES3_PNS_12UniqueStringE:
  513|  1.30M|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree20BinaryExpressionNode7classofEPKNS0_4NodeE:
  525|  1.00M|    static bool classof(const Node *V) {                               \
  526|  1.00M|      return V->getKind() == NodeKind::NAME;                           \
  527|  1.00M|    }                                                                  \
_ZN6hermes6ESTree14IdentifierNodeC2EPNS_12UniqueStringEPNS0_4NodeEb:
  513|  1.31M|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree14IdentifierNode7classofEPKNS0_4NodeE:
  525|  3.82M|    static bool classof(const Node *V) {                               \
  526|  3.82M|      return V->getKind() == NodeKind::NAME;                           \
  527|  3.82M|    }                                                                  \
_ZN6hermes6ESTree16MetaPropertyNode7classofEPKNS0_4NodeE:
  483|   155k|    static bool classof(const Node *V) {                               \
  484|   155k|      return V->getKind() == NodeKind::NAME;                           \
  485|   155k|    }                                                                  \
_ZN6hermes6ESTree22VariableDeclaratorNodeC2EPNS0_4NodeES3_:
  472|  3.06k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree22VariableDeclaratorNode7classofEPKNS0_4NodeE:
  483|  11.7k|    static bool classof(const Node *V) {                               \
  484|  11.7k|      return V->getKind() == NodeKind::NAME;                           \
  485|  11.7k|    }                                                                  \
_ZN6hermes6ESTree23VariableDeclarationNodeC2EPNS_12UniqueStringEON4llvh12simple_ilistINS0_4NodeEJEEE:
  472|  3.06k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree23VariableDeclarationNode7classofEPKNS0_4NodeE:
  483|   287k|    static bool classof(const Node *V) {                               \
  484|   287k|      return V->getKind() == NodeKind::NAME;                           \
  485|   287k|    }                                                                  \
_ZN6hermes6ESTree19TemplateLiteralNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEES6_:
  472|   743k|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree19TemplateLiteralNode7classofEPKNS0_4NodeE:
  483|   212k|    static bool classof(const Node *V) {                               \
  484|   212k|      return V->getKind() == NodeKind::NAME;                           \
  485|   212k|    }                                                                  \
_ZN6hermes6ESTree28TaggedTemplateExpressionNodeC2EPNS0_4NodeES3_:
  472|    640|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree28TaggedTemplateExpressionNode7classofEPKNS0_4NodeE:
  483|  1.13k|    static bool classof(const Node *V) {                               \
  484|  1.13k|      return V->getKind() == NodeKind::NAME;                           \
  485|  1.13k|    }                                                                  \
_ZN6hermes6ESTree19TemplateElementNodeC2EbPNS_12UniqueStringES3_:
  513|   898k|          _##ARG2NM(std::move(ARG2NM##_)) {}                           \
_ZN6hermes6ESTree19TemplateElementNode7classofEPKNS0_4NodeE:
  525|   439k|    static bool classof(const Node *V) {                               \
  526|   439k|      return V->getKind() == NodeKind::NAME;                           \
  527|   439k|    }                                                                  \
_ZN6hermes6ESTree12PropertyNodeC2EPNS0_4NodeES3_PNS_12UniqueStringEbbb:
  680|  12.0k|          _##ARG5NM(std::move(ARG5NM##_)) {}                           \
_ZN6hermes6ESTree12PropertyNode7classofEPKNS0_4NodeE:
  696|  23.9k|    static bool classof(const Node *V) {                               \
  697|  23.9k|      return V->getKind() == NodeKind::NAME;                           \
  698|  23.9k|    }                                                                  \
_ZN6hermes6ESTree21ImportDeclarationNode7classofEPKNS0_4NodeE:
  575|   529k|    static bool classof(const Node *V) {                               \
  576|   529k|      return V->getKind() == NodeKind::NAME;                           \
  577|   529k|    }                                                                  \
_ZN6hermes6ESTree11PatternNodeC2ENS0_8NodeKindE:
  413|    228|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree11PatternNode7classofEPKNS0_4NodeE:
  414|   117k|    static bool classof(const Node *V) {                          \
  415|   117k|      auto kind = V->getKind();                                   \
  416|   117k|      return NodeKind::_##NAME##_First < kind &&                  \
  ------------------
  |  Branch (416:14): [True: 24, False: 117k]
  ------------------
  417|   117k|          kind < NodeKind::_##NAME##_Last;                        \
  ------------------
  |  Branch (417:11): [True: 24, False: 0]
  ------------------
  418|   117k|    }                                                             \
_ZN6hermes6ESTree17ObjectPatternNode7classofEPKNS0_4NodeE:
  483|      1|    static bool classof(const Node *V) {                               \
  484|      1|      return V->getKind() == NodeKind::NAME;                           \
  485|      1|    }                                                                  \
_ZN6hermes6ESTree16ArrayPatternNodeC2EON4llvh12simple_ilistINS0_4NodeEJEEEPS4_:
  472|    228|          _##ARG1NM(std::move(ARG1NM##_)) {}                           \
_ZN6hermes6ESTree16ArrayPatternNode7classofEPKNS0_4NodeE:
  483|    313|    static bool classof(const Node *V) {                               \
  484|    313|      return V->getKind() == NodeKind::NAME;                           \
  485|    313|    }                                                                  \
_ZN6hermes6ESTree15RestElementNode7classofEPKNS0_4NodeE:
  455|   114k|    static bool classof(const Node *V) {                                 \
  456|   114k|      return V->getKind() == NodeKind::NAME;                             \
  457|   114k|    }                                                                    \
_ZN6hermes6ESTree21AssignmentPatternNode7classofEPKNS0_4NodeE:
  483|   229k|    static bool classof(const Node *V) {                               \
  484|   229k|      return V->getKind() == NodeKind::NAME;                           \
  485|   229k|    }                                                                  \
_ZN6hermes6ESTree9CoverNodeC2ENS0_8NodeKindE:
  413|    146|    explicit NAME##Node(NodeKind kind) : BASE##Node(kind) {}      \
_ZN6hermes6ESTree18CoverEmptyArgsNodeC2Ev:
  425|    146|    explicit NAME##Node() : BASE##Node(NodeKind::NAME) {}              \
_ZN6hermes6ESTree18CoverEmptyArgsNode7classofEPKNS0_4NodeE:
  426|   228k|    static bool classof(const Node *V) {                               \
  427|   228k|      return V->getKind() == NodeKind::NAME;                           \
  428|   228k|    }                                                                  \
_ZN6hermes6ESTree8isStrictENS0_10StrictnessE:
  248|   114k|inline bool isStrict(Strictness strictness) {
  249|   114k|  assert(strictness != Strictness::NotSet && "strictness hasn't been set");
  250|      0|  return strictness == Strictness::StrictMode;
  251|   114k|}
_ZN6hermes6ESTree14makeStrictnessEb:
  255|   114k|inline Strictness makeStrictness(bool strictMode) {
  256|   114k|  return strictMode ? Strictness::StrictMode : Strictness::NonStrictMode;
  ------------------
  |  Branch (256:10): [True: 0, False: 114k]
  ------------------
  257|   114k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ProgramNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  447|     56|    void visit(Visitor &V) {                                             \
  448|     56|      if (!V.shouldVisit(this)) {                                        \
  ------------------
  |  Branch (448:11): [True: 0, False: 56]
  ------------------
  449|      0|        return;                                                          \
  450|      0|      }                                                                  \
  451|     56|      V.enter(this);                                                     \
  452|     56|      ESTreeVisit(V, _##ARG0NM);                                         \
  453|     56|      V.leave(this);                                                     \
  454|     56|    }                                                                    \
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RN4llvh12simple_ilistINS0_4NodeEJEEE:
  217|  1.40k|void ESTreeVisit(Visitor &V, NodeList &Lst) {
  218|  4.59k|  for (auto &Elem : Lst) {
  ------------------
  |  Branch (218:19): [True: 4.59k, False: 1.40k]
  ------------------
  219|  4.59k|    ESTreeVisit(V, &Elem);
  220|  4.59k|  }
  221|  1.40k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_PNS0_4NodeE:
  939|  8.62k|void ESTreeVisit(Visitor &V, NodePtr Node) {
  940|  8.62k|  if (!Node) {
  ------------------
  |  Branch (940:7): [True: 2.68k, False: 5.93k]
  ------------------
  941|  2.68k|    return;
  942|  2.68k|  }
  943|       |
  944|  5.93k|  switch (Node->getKind()) {
  945|      0|    default:
  ------------------
  |  Branch (945:5): [True: 0, False: 5.93k]
  ------------------
  946|      0|      llvm_unreachable("invalid node kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  947|       |
  948|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) \
  949|      0|  case NodeKind::NAME:                \
  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  951|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) \
  952|      0|  case NodeKind::NAME:                \
  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  954|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) \
  955|      0|  case NodeKind::NAME:                \
  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  957|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) \
  958|      0|  case NodeKind::NAME:                \
  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  960|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) \
  961|      0|  case NodeKind::NAME:                \
  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  963|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) \
  964|      0|  case NodeKind::NAME:                \
  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  966|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) \
  967|      0|  case NodeKind::NAME:                \
  968|      0|    return cast<NAME##Node>(Node)->visit(V);
  969|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) \
  970|      0|  case NodeKind::NAME:                \
  971|      0|    return cast<NAME##Node>(Node)->visit(V);
  972|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) \
  973|      0|  case NodeKind::NAME:                \
  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  975|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) \
  976|      0|  case NodeKind::NAME:                \
  977|      0|    return cast<NAME##Node>(Node)->visit(V);
  978|       |
  979|      0|#include "ESTree.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |/// This file defines the ESTree nodes, which are documented in:
  |  |    9|       |/// https://github.com/estree/estree/blob/master/spec.md
  |  |   10|       |///
  |  |   11|       |/// Each parameter is described by three tokens: Type, Name and Optional.
  |  |   12|       |
  |  |   13|      0|#include "hermes/AST/Config.h"
  |  |   14|       |
  |  |   15|       |// clang-format off
  |  |   16|       |
  |  |   17|       |// Defines the start of range of nodes with the same base
  |  |   18|      0|#ifndef ESTREE_FIRST
  |  |   19|      0|#define ESTREE_FIRST(NAME, BASE)
  |  |   20|      0|#endif
  |  |   21|       |
  |  |   22|       |// Defines the end of range of nodes with the same base
  |  |   23|      0|#ifndef ESTREE_LAST
  |  |   24|      0|#define ESTREE_LAST(NAME)
  |  |   25|      0|#endif
  |  |   26|       |
  |  |   27|       |// Ignores the given field if it is "empty" (e.g. nullptr, empty list).
  |  |   28|      0|#ifndef ESTREE_IGNORE_IF_EMPTY
  |  |   29|      0|#define ESTREE_IGNORE_IF_EMPTY(NODE, FIELD)
  |  |   30|      0|#endif
  |  |   31|       |
  |  |   32|      0|ESTREE_NODE_0_ARGS(Empty, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   33|      0|ESTREE_NODE_0_ARGS(Metadata, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   34|       |
  |  |   35|      0|ESTREE_FIRST(FunctionLike, Base)
  |  |   36|      0|ESTREE_NODE_1_ARGS(Program, FunctionLike,
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   37|      0|    NodeList, body, false)
  |  |   38|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   39|      0|    FunctionExpression, FunctionLike,
  |  |   40|      0|    NodePtr, id, true,
  |  |   41|      0|    NodeList, params, false,
  |  |   42|      0|    NodePtr, body, false,
  |  |   43|      0|    NodePtr, typeParameters, true,
  |  |   44|      0|    NodePtr, returnType, true,
  |  |   45|      0|    NodePtr, predicate, true,
  |  |   46|      0|    NodeBoolean, generator, false,
  |  |   47|      0|    NodeBoolean, async, false)
  |  |   48|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, typeParameters)
  |  |   49|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, returnType)
  |  |   50|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, predicate)
  |  |   51|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   52|      0|    ArrowFunctionExpression, FunctionLike,
  |  |   53|      0|    NodePtr, id, true,
  |  |   54|      0|    NodeList, params, false,
  |  |   55|      0|    NodePtr, body, false,
  |  |   56|      0|    NodePtr, typeParameters, true,
  |  |   57|      0|    NodePtr, returnType, true,
  |  |   58|      0|    NodePtr, predicate, true,
  |  |   59|      0|    NodeBoolean, expression, false,
  |  |   60|      0|    NodeBoolean, async, false)
  |  |   61|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, typeParameters)
  |  |   62|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, returnType)
  |  |   63|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, predicate)
  |  |   64|  1.90k|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|  1.90k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 1.90k, False: 4.03k]
  |  |  |  |  ------------------
  |  |  |  |  974|  1.90k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   65|  1.90k|    FunctionDeclaration, FunctionLike,
  |  |   66|  1.90k|    NodePtr, id, true,
  |  |   67|  1.90k|    NodeList, params, false,
  |  |   68|  1.90k|    NodePtr, body, false,
  |  |   69|  1.90k|    NodePtr, typeParameters, true,
  |  |   70|  1.90k|    NodePtr, returnType, true,
  |  |   71|  1.90k|    NodePtr, predicate, true,
  |  |   72|  1.90k|    NodeBoolean, generator, false,
  |  |   73|  1.90k|    NodeBoolean, async, false)
  |  |   74|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, typeParameters)
  |  |   75|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, returnType)
  |  |   76|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, predicate)
  |  |   77|      0|ESTREE_LAST(FunctionLike)
  |  |   78|       |
  |  |   79|      0|ESTREE_FIRST(Statement, Base)
  |  |   80|       |
  |  |   81|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |   82|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   83|      0|    WhileStatement,
  |  |   84|      0|    LoopStatement,
  |  |   85|      0|    NodePtr,
  |  |   86|      0|    body,
  |  |   87|      0|    false,
  |  |   88|      0|    NodePtr,
  |  |   89|      0|    test,
  |  |   90|      0|    false)
  |  |   91|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |   92|      0|    DoWhileStatement,
  |  |   93|      0|    LoopStatement,
  |  |   94|      0|    NodePtr,
  |  |   95|      0|    body,
  |  |   96|      0|    false,
  |  |   97|      0|    NodePtr,
  |  |   98|      0|    test,
  |  |   99|      0|    false)
  |  |  100|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  101|      0|    ForInStatement,
  |  |  102|      0|    LoopStatement,
  |  |  103|      0|    NodePtr,
  |  |  104|      0|    left,
  |  |  105|      0|    false,
  |  |  106|      0|    NodePtr,
  |  |  107|      0|    right,
  |  |  108|      0|    false,
  |  |  109|      0|    NodePtr,
  |  |  110|      0|    body,
  |  |  111|      0|    false)
  |  |  112|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  113|      0|    ForOfStatement, LoopStatement,
  |  |  114|      0|    NodePtr, left, false,
  |  |  115|      0|    NodePtr, right, false,
  |  |  116|      0|    NodePtr, body, false,
  |  |  117|      0|    NodeBoolean, await, false)
  |  |  118|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  119|      0|    ForStatement,
  |  |  120|      0|    LoopStatement,
  |  |  121|      0|    NodePtr,
  |  |  122|      0|    init,
  |  |  123|      0|    true,
  |  |  124|      0|    NodePtr,
  |  |  125|      0|    test,
  |  |  126|      0|    true,
  |  |  127|      0|    NodePtr,
  |  |  128|      0|    update,
  |  |  129|      0|    true,
  |  |  130|      0|    NodePtr,
  |  |  131|      0|    body,
  |  |  132|      0|    false)
  |  |  133|      0|ESTREE_LAST(LoopStatement)
  |  |  134|       |
  |  |  135|      0|ESTREE_NODE_0_ARGS(DebuggerStatement, Statement)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  136|      0|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  137|      0|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  138|      0|ESTREE_NODE_1_ARGS(BreakStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  139|      0|ESTREE_NODE_1_ARGS(ContinueStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  140|      0|ESTREE_NODE_1_ARGS(ThrowStatement, Statement, NodePtr, argument, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  141|      0|ESTREE_NODE_1_ARGS(ReturnStatement, Statement, NodePtr, argument, true)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  142|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  143|      0|    WithStatement,
  |  |  144|      0|    Statement,
  |  |  145|      0|    NodePtr,
  |  |  146|      0|    object,
  |  |  147|      0|    false,
  |  |  148|      0|    NodePtr,
  |  |  149|      0|    body,
  |  |  150|      0|    false)
  |  |  151|       |
  |  |  152|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  153|      0|    SwitchStatement,
  |  |  154|      0|    Statement,
  |  |  155|      0|    NodePtr,
  |  |  156|      0|    discriminant,
  |  |  157|      0|    false,
  |  |  158|      0|    NodeList,
  |  |  159|      0|    cases,
  |  |  160|      0|    false)
  |  |  161|       |
  |  |  162|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  163|      0|    LabeledStatement,
  |  |  164|      0|    Statement,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    label,
  |  |  167|      0|    false,
  |  |  168|      0|    NodePtr,
  |  |  169|      0|    body,
  |  |  170|      0|    false)
  |  |  171|       |
  |  |  172|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  173|      0|    ExpressionStatement,
  |  |  174|      0|    Statement,
  |  |  175|      0|    NodePtr,
  |  |  176|      0|    expression,
  |  |  177|      0|    false,
  |  |  178|      0|    NodeString,
  |  |  179|      0|    directive,
  |  |  180|      0|    true)
  |  |  181|       |
  |  |  182|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  183|      0|    TryStatement,
  |  |  184|      0|    Statement,
  |  |  185|      0|    NodePtr,
  |  |  186|      0|    block,
  |  |  187|      0|    false,
  |  |  188|      0|    NodePtr,
  |  |  189|      0|    handler,
  |  |  190|      0|    true,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    finalizer,
  |  |  193|      0|    true)
  |  |  194|       |
  |  |  195|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  196|      0|    IfStatement,
  |  |  197|      0|    Statement,
  |  |  198|      0|    NodePtr,
  |  |  199|      0|    test,
  |  |  200|      0|    false,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    consequent,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    alternate,
  |  |  206|      0|    true)
  |  |  207|       |
  |  |  208|      0|ESTREE_LAST(Statement)
  |  |  209|       |
  |  |  210|      0|ESTREE_NODE_0_ARGS(NullLiteral, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  211|      0|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  212|      0|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  213|      0|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  214|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  215|      0|    RegExpLiteral,
  |  |  216|      0|    Base,
  |  |  217|      0|    NodeLabel,
  |  |  218|      0|    pattern,
  |  |  219|      0|    false,
  |  |  220|      0|    NodeLabel,
  |  |  221|      0|    flags,
  |  |  222|      0|    false)
  |  |  223|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  224|      0|    BigIntLiteral, Base,
  |  |  225|      0|    NodeLabel, bigint, false)
  |  |  226|       |
  |  |  227|      0|ESTREE_NODE_0_ARGS(ThisExpression, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  228|      0|ESTREE_NODE_0_ARGS(Super, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  229|      0|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  230|      0|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  231|      0|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  232|      0|    NodeList, elements, false,
  |  |  233|      0|    NodeBoolean, trailingComma, false)
  |  |  234|       |
  |  |  235|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  236|      0|    SpreadElement, Base,
  |  |  237|      0|    NodePtr, argument, false)
  |  |  238|       |
  |  |  239|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  240|      0|    NewExpression, Base,
  |  |  241|      0|    NodePtr, callee, false,
  |  |  242|      0|    NodePtr, typeArguments, true,
  |  |  243|      0|    NodeList, arguments, false)
  |  |  244|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  245|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  246|      0|    YieldExpression, Base,
  |  |  247|      0|    NodePtr, argument, true,
  |  |  248|      0|    NodeBoolean, delegate, true)
  |  |  249|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  250|      0|    AwaitExpression, Base,
  |  |  251|      0|    NodePtr, argument, false)
  |  |  252|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  253|      0|    ImportExpression, Base,
  |  |  254|      0|    NodePtr, source, false,
  |  |  255|      0|    NodePtr, attributes, true)
  |  |  256|       |
  |  |  257|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  258|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  259|      0|    CallExpression, CallExpressionLike,
  |  |  260|      0|    NodePtr, callee, false,
  |  |  261|      0|    NodePtr, typeArguments, true,
  |  |  262|      0|    NodeList, arguments, false)
  |  |  263|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  264|       |
  |  |  265|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  266|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  267|      0|    NodePtr, callee, false,
  |  |  268|      0|    NodePtr, typeArguments, true,
  |  |  269|      0|    NodeList, arguments, false,
  |  |  270|      0|    NodeBoolean, optional, false)
  |  |  271|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  272|      0|ESTREE_LAST(CallExpressionLike)
  |  |  273|       |
  |  |  274|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  275|      0|    AssignmentExpression,
  |  |  276|      0|    Base,
  |  |  277|      0|    NodeLabel,
  |  |  278|      0|    operator,
  |  |  279|      0|    false,
  |  |  280|      0|    NodePtr,
  |  |  281|      0|    left,
  |  |  282|      0|    false,
  |  |  283|      0|    NodePtr,
  |  |  284|      0|    right,
  |  |  285|      0|    false)
  |  |  286|       |
  |  |  287|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  288|      0|    UnaryExpression,
  |  |  289|      0|    Base,
  |  |  290|      0|    NodeLabel,
  |  |  291|      0|    operator,
  |  |  292|      0|    false,
  |  |  293|      0|    NodePtr,
  |  |  294|      0|    argument,
  |  |  295|      0|    false,
  |  |  296|      0|    NodeBoolean,
  |  |  297|      0|    prefix,
  |  |  298|      0|    false)
  |  |  299|       |
  |  |  300|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  301|      0|    UpdateExpression,
  |  |  302|      0|    Base,
  |  |  303|      0|    NodeLabel,
  |  |  304|      0|    operator,
  |  |  305|      0|    false,
  |  |  306|      0|    NodePtr,
  |  |  307|      0|    argument,
  |  |  308|      0|    false,
  |  |  309|      0|    NodeBoolean,
  |  |  310|      0|    prefix,
  |  |  311|      0|    false)
  |  |  312|       |
  |  |  313|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  314|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  315|      0|    MemberExpression, MemberExpressionLike,
  |  |  316|      0|    NodePtr, object, false,
  |  |  317|      0|    NodePtr, property, false,
  |  |  318|      0|    NodeBoolean, computed, false)
  |  |  319|       |
  |  |  320|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  321|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  322|      0|    NodePtr, object, false,
  |  |  323|      0|    NodePtr, property, false,
  |  |  324|      0|    NodeBoolean, computed, false,
  |  |  325|      0|    NodeBoolean, optional, false)
  |  |  326|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  327|       |
  |  |  328|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  329|      0|    LogicalExpression,
  |  |  330|      0|    Base,
  |  |  331|      0|    NodePtr,
  |  |  332|      0|    left,
  |  |  333|      0|    false,
  |  |  334|      0|    NodePtr,
  |  |  335|      0|    right,
  |  |  336|      0|    false,
  |  |  337|      0|    NodeLabel,
  |  |  338|      0|    operator,
  |  |  339|      0|    false)
  |  |  340|       |
  |  |  341|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  342|      0|    ConditionalExpression,
  |  |  343|      0|    Base,
  |  |  344|      0|    NodePtr,
  |  |  345|      0|    test,
  |  |  346|      0|    false,
  |  |  347|      0|    NodePtr,
  |  |  348|      0|    alternate,
  |  |  349|      0|    false,
  |  |  350|      0|    NodePtr,
  |  |  351|      0|    consequent,
  |  |  352|      0|    false)
  |  |  353|       |
  |  |  354|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  355|      0|    BinaryExpression,
  |  |  356|      0|    Base,
  |  |  357|      0|    NodePtr,
  |  |  358|      0|    left,
  |  |  359|      0|    false,
  |  |  360|      0|    NodePtr,
  |  |  361|      0|    right,
  |  |  362|      0|    false,
  |  |  363|      0|    NodeLabel,
  |  |  364|      0|    operator,
  |  |  365|      0|    false)
  |  |  366|       |
  |  |  367|      0|ESTREE_NODE_1_ARGS(Directive, Base, NodePtr, value, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  368|      0|ESTREE_NODE_1_ARGS(DirectiveLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  369|       |
  |  |  370|  1.34k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|  1.34k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 1.34k, False: 4.59k]
  |  |  |  |  ------------------
  |  |  |  |  959|  1.34k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  371|  1.34k|    Identifier, Base,
  |  |  372|  1.34k|    NodeLabel, name, false,
  |  |  373|  1.34k|    NodePtr, typeAnnotation, true,
  |  |  374|  1.34k|    NodeBoolean, optional, false)
  |  |  375|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  376|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  377|       |
  |  |  378|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  379|      0|    PrivateName, Base,
  |  |  380|      0|    NodePtr, id, false)
  |  |  381|       |
  |  |  382|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  383|      0|    MetaProperty,
  |  |  384|      0|    Base,
  |  |  385|      0|    NodePtr,
  |  |  386|      0|    meta,
  |  |  387|      0|    false,
  |  |  388|      0|    NodePtr,
  |  |  389|      0|    property,
  |  |  390|      0|    false)
  |  |  391|       |
  |  |  392|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  393|      0|    SwitchCase,
  |  |  394|      0|    Base,
  |  |  395|      0|    NodePtr,
  |  |  396|      0|    test,
  |  |  397|      0|    true,
  |  |  398|      0|    NodeList,
  |  |  399|      0|    consequent,
  |  |  400|      0|    false)
  |  |  401|       |
  |  |  402|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  403|      0|    CatchClause,
  |  |  404|      0|    Base,
  |  |  405|      0|    NodePtr,
  |  |  406|      0|    param,
  |  |  407|      0|    true,
  |  |  408|      0|    NodePtr,
  |  |  409|      0|    body,
  |  |  410|      0|    false)
  |  |  411|       |
  |  |  412|  1.34k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|  1.34k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 1.34k, False: 4.59k]
  |  |  |  |  ------------------
  |  |  |  |  956|  1.34k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  413|  1.34k|    VariableDeclarator,
  |  |  414|  1.34k|    Base,
  |  |  415|  1.34k|    NodePtr,
  |  |  416|  1.34k|    init,
  |  |  417|  1.34k|    true,
  |  |  418|  1.34k|    NodePtr,
  |  |  419|  1.34k|    id,
  |  |  420|  1.34k|    false)
  |  |  421|       |
  |  |  422|  1.34k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|  1.34k|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 1.34k, False: 4.59k]
  |  |  |  |  ------------------
  |  |  |  |  956|  1.34k|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  423|  1.34k|    VariableDeclaration,
  |  |  424|  1.34k|    Base,
  |  |  425|  1.34k|    NodeLabel,
  |  |  426|  1.34k|    kind,
  |  |  427|  1.34k|    false,
  |  |  428|  1.34k|    NodeList,
  |  |  429|  1.34k|    declarations,
  |  |  430|  1.34k|    false)
  |  |  431|       |
  |  |  432|      0|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  433|      0|                   NodeList, quasis, false,
  |  |  434|      0|                   NodeList, expressions, false)
  |  |  435|       |
  |  |  436|      0|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  437|      0|                   NodePtr, tag, false,
  |  |  438|      0|                   NodePtr, quasi, false)
  |  |  439|       |
  |  |  440|       |// In ESTree, it is defined as {tail : boolean,
  |  |  441|       |//                              value : {cooked : string, raw : string}},
  |  |  442|       |// we flatten the value field.
  |  |  443|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  444|       |// cooked will be null.
  |  |  445|      0|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  446|      0|                   NodeBoolean, tail, false,
  |  |  447|      0|                   NodeString, cooked, true,
  |  |  448|      0|                   NodeLabel, raw, false)
  |  |  449|       |
  |  |  450|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  967|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (967:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  968|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  451|      0|    Property, Base,
  |  |  452|      0|    NodePtr, key, false,
  |  |  453|      0|    NodePtr, value, false,
  |  |  454|      0|    NodeLabel, kind, false,
  |  |  455|      0|    NodeBoolean, computed, false,
  |  |  456|      0|    NodeBoolean, method, false,
  |  |  457|      0|    NodeBoolean, shorthand, false)
  |  |  458|       |
  |  |  459|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  970|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (970:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  971|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  460|      0|    ClassDeclaration, Base,
  |  |  461|      0|    NodePtr, id, true,
  |  |  462|      0|    NodePtr, typeParameters, true,
  |  |  463|      0|    NodePtr, superClass, true,
  |  |  464|      0|    NodePtr, superTypeParameters, true,
  |  |  465|      0|    NodeList, implements, false,
  |  |  466|      0|    NodeList, decorators, false,
  |  |  467|      0|    NodePtr, body, false)
  |  |  468|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  469|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  470|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  471|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  472|       |
  |  |  473|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  970|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (970:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  971|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  474|      0|    ClassExpression, Base,
  |  |  475|      0|    NodePtr, id, true,
  |  |  476|      0|    NodePtr, typeParameters, true,
  |  |  477|      0|    NodePtr, superClass, true,
  |  |  478|      0|    NodePtr, superTypeParameters, true,
  |  |  479|      0|    NodeList, implements, false,
  |  |  480|      0|    NodeList, decorators, false,
  |  |  481|      0|    NodePtr, body, false)
  |  |  482|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  483|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  484|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  485|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  486|       |
  |  |  487|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  488|      0|    ClassBody, Base,
  |  |  489|      0|    NodeList, body, false)
  |  |  490|       |
  |  |  491|      0|ESTREE_NODE_9_ARGS(
  |  |  ------------------
  |  |  |  |  976|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (976:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  977|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  492|      0|    ClassProperty, Base,
  |  |  493|      0|    NodePtr, key, false,
  |  |  494|      0|    NodePtr, value, true,
  |  |  495|      0|    NodeBoolean, computed, false,
  |  |  496|      0|    NodeBoolean, static, false,
  |  |  497|      0|    NodeBoolean, declare, false,
  |  |  498|      0|    NodeBoolean, optional, false,
  |  |  499|      0|    NodePtr, variance, true,
  |  |  500|      0|    NodePtr, typeAnnotation, true,
  |  |  501|      0|    NodePtr, tsModifiers, true)
  |  |  502|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  503|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  506|       |
  |  |  507|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  508|      0|    ClassPrivateProperty, Base,
  |  |  509|      0|    NodePtr, key, false,
  |  |  510|      0|    NodePtr, value, true,
  |  |  511|      0|    NodeBoolean, static, false,
  |  |  512|      0|    NodeBoolean, declare, false,
  |  |  513|      0|    NodeBoolean, optional, false,
  |  |  514|      0|    NodePtr, variance, true,
  |  |  515|      0|    NodePtr, typeAnnotation, true,
  |  |  516|      0|    NodePtr, tsModifiers, true)
  |  |  517|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  521|       |
  |  |  522|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  964|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (964:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  523|      0|    MethodDefinition, Base,
  |  |  524|      0|    NodePtr, key, false,
  |  |  525|      0|    NodePtr, value, false,
  |  |  526|      0|    NodeLabel, kind, false,
  |  |  527|      0|    NodeBoolean, computed, false,
  |  |  528|      0|    NodeBoolean, static, false)
  |  |  529|       |
  |  |  530|       |// Imports ========================================
  |  |  531|       |
  |  |  532|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  533|      0|    ImportDeclaration, Base,
  |  |  534|      0|    NodeList, specifiers, false,
  |  |  535|      0|    NodePtr, source, false,
  |  |  536|      0|    NodeList, assertions, true,
  |  |  537|      0|    NodeLabel, importKind, false)
  |  |  538|       |
  |  |  539|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  540|      0|    ImportSpecifier, Base,
  |  |  541|      0|    NodePtr, imported, false,
  |  |  542|      0|    NodePtr, local, false,
  |  |  543|      0|    NodeLabel, importKind, false)
  |  |  544|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  545|      0|    ImportDefaultSpecifier, Base,
  |  |  546|      0|    NodePtr, local, false)
  |  |  547|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  548|      0|    ImportNamespaceSpecifier, Base,
  |  |  549|      0|    NodePtr, local, false)
  |  |  550|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  551|      0|    ImportAttribute, Base,
  |  |  552|      0|    NodePtr, key, false,
  |  |  553|      0|    NodePtr, value, false)
  |  |  554|       |
  |  |  555|       |
  |  |  556|       |// ================================================
  |  |  557|       |
  |  |  558|       |// Exports ========================================
  |  |  559|       |
  |  |  560|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  561|      0|    ExportNamedDeclaration, Base,
  |  |  562|      0|    NodePtr, declaration, true,
  |  |  563|      0|    NodeList, specifiers, false,
  |  |  564|      0|    NodePtr, source, true,
  |  |  565|      0|    NodeLabel, exportKind, false)
  |  |  566|       |
  |  |  567|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  568|      0|    ExportSpecifier, Base,
  |  |  569|      0|    NodePtr, exported, false,
  |  |  570|      0|    NodePtr, local, false)
  |  |  571|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  572|      0|    ExportNamespaceSpecifier, Base,
  |  |  573|      0|    NodePtr, exported, false)
  |  |  574|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  575|      0|    ExportDefaultDeclaration, Base,
  |  |  576|      0|    NodePtr, declaration, false)
  |  |  577|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  578|      0|    ExportAllDeclaration, Base,
  |  |  579|      0|    NodePtr, source, false,
  |  |  580|      0|    NodeLabel, exportKind, false)
  |  |  581|       |
  |  |  582|       |// ================================================
  |  |  583|       |
  |  |  584|       |// Patterns =======================================
  |  |  585|      0|ESTREE_FIRST(Pattern, Base)
  |  |  586|       |
  |  |  587|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  588|      0|    ObjectPattern, Pattern,
  |  |  589|      0|    NodeList, properties, false,
  |  |  590|      0|    NodePtr, typeAnnotation, true)
  |  |  591|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  592|       |
  |  |  593|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  594|      0|    ArrayPattern, Pattern,
  |  |  595|      0|    NodeList, elements, false,
  |  |  596|      0|    NodePtr, typeAnnotation, true)
  |  |  597|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  598|       |
  |  |  599|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  600|      0|    RestElement, Pattern,
  |  |  601|      0|    NodePtr, argument, false)
  |  |  602|       |
  |  |  603|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  604|      0|    AssignmentPattern, Pattern,
  |  |  605|      0|    NodePtr, left, false,          // Pattern
  |  |  606|       |    NodePtr, right, false)         // Expression
  |  |  607|      0|
  |  |  608|      0|ESTREE_LAST(Pattern)
  |  |  609|       |// ================================================
  |  |  610|       |
  |  |  611|       |// JSX ============================================
  |  |  612|       |
  |  |  613|      0|#if HERMES_PARSE_JSX
  |  |  614|       |
  |  |  615|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  616|      0|    JSXIdentifier, Base,
  |  |  617|      0|    NodeLabel, name, false)
  |  |  618|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  619|      0|    JSXMemberExpression, Base,
  |  |  620|      0|    NodePtr, object, false,
  |  |  621|      0|    NodePtr, property, false)
  |  |  622|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  623|      0|    JSXNamespacedName, Base,
  |  |  624|      0|    NodePtr, namespace, false,
  |  |  625|      0|    NodePtr, name, false)
  |  |  626|       |
  |  |  627|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  628|      0|    JSXEmptyExpression, Base)
  |  |  629|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  630|      0|    JSXExpressionContainer, Base,
  |  |  631|      0|    NodePtr, expression, false)
  |  |  632|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  633|      0|    JSXSpreadChild, Base,
  |  |  634|      0|    NodePtr, expression, false)
  |  |  635|       |
  |  |  636|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  637|      0|    JSXOpeningElement, Base,
  |  |  638|      0|    NodePtr, name, false,
  |  |  639|      0|    NodeList, attributes, false,
  |  |  640|      0|    NodeBoolean, selfClosing, false)
  |  |  641|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  642|      0|    JSXClosingElement, Base,
  |  |  643|      0|    NodePtr, name, false)
  |  |  644|       |
  |  |  645|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  646|      0|    JSXAttribute, Base,
  |  |  647|      0|    NodePtr, name, false,
  |  |  648|      0|    NodePtr, value, true)
  |  |  649|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  650|      0|    JSXSpreadAttribute, Base,
  |  |  651|      0|    NodePtr, argument, false)
  |  |  652|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  653|      0|    JSXStringLiteral, Base,
  |  |  654|      0|    NodeString, value, false,
  |  |  655|      0|    NodeLabel, raw, false)
  |  |  656|       |
  |  |  657|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  658|      0|    JSXText, Base,
  |  |  659|      0|    NodeString, value, false,
  |  |  660|      0|    NodeLabel, raw, false)
  |  |  661|       |
  |  |  662|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  663|      0|    JSXElement, Base,
  |  |  664|      0|    NodePtr, openingElement, false,
  |  |  665|      0|    NodeList, children, false,
  |  |  666|      0|    NodePtr, closingElement, true)
  |  |  667|       |
  |  |  668|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  669|      0|    JSXFragment, Base,
  |  |  670|      0|    NodePtr, openingFragment, false,
  |  |  671|      0|    NodeList, children, false,
  |  |  672|      0|    NodePtr, closingFragment, false)
  |  |  673|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  674|      0|    JSXOpeningFragment, Base)
  |  |  675|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  676|      0|    JSXClosingFragment, Base)
  |  |  677|       |
  |  |  678|      0|#endif
  |  |  679|       |
  |  |  680|       |// ================================================
  |  |  681|       |
  |  |  682|       |// Types ==========================================
  |  |  683|       |
  |  |  684|      0|#if HERMES_PARSE_FLOW
  |  |  685|       |
  |  |  686|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  687|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  688|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  689|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  690|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  691|      0|    StringLiteralTypeAnnotation, Base,
  |  |  692|      0|    NodeString, value, false,
  |  |  693|      0|    NodeString, raw, false)
  |  |  694|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  695|      0|    NumberLiteralTypeAnnotation, Base,
  |  |  696|      0|    NodeNumber, value, false,
  |  |  697|      0|    NodeLabel, raw, false)
  |  |  698|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  699|      0|    BigIntLiteralTypeAnnotation, Base,
  |  |  700|      0|    NodeLabel, raw, false)
  |  |  701|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  702|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  703|      0|    BooleanLiteralTypeAnnotation, Base,
  |  |  704|      0|    NodeBoolean, value, false,
  |  |  705|      0|    NodeLabel, raw, false)
  |  |  706|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  707|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  708|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  709|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  710|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  711|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  712|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  964|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (964:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  713|      0|    FunctionTypeAnnotation, Base,
  |  |  714|      0|    NodeList, params, false,
  |  |  715|      0|    NodePtr, this, true,
  |  |  716|      0|    NodePtr, returnType, false,
  |  |  717|      0|    NodePtr, rest, true,
  |  |  718|      0|    NodePtr, typeParameters, true)
  |  |  719|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  720|      0|    FunctionTypeParam, Base,
  |  |  721|      0|    NodePtr, name, true,
  |  |  722|      0|    NodePtr, typeAnnotation, false,
  |  |  723|      0|    NodeBoolean, optional, false)
  |  |  724|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  725|      0|    NullableTypeAnnotation, Base,
  |  |  726|      0|    NodePtr, typeAnnotation, false)
  |  |  727|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  728|      0|    QualifiedTypeIdentifier, Base,
  |  |  729|      0|    NodePtr, qualification, false,
  |  |  730|      0|    NodePtr, id, false)
  |  |  731|       |
  |  |  732|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  733|      0|    TypeofTypeAnnotation, Base,
  |  |  734|      0|    NodePtr, argument, false)
  |  |  735|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  736|      0|    TupleTypeAnnotation, Base,
  |  |  737|      0|    NodeList, types, false)
  |  |  738|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  739|      0|    ArrayTypeAnnotation, Base,
  |  |  740|      0|    NodePtr, elementType, false)
  |  |  741|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  742|      0|    UnionTypeAnnotation, Base,
  |  |  743|      0|    NodeList, types, false)
  |  |  744|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  745|      0|    IntersectionTypeAnnotation, Base,
  |  |  746|      0|    NodeList, types, false)
  |  |  747|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  748|      0|    GenericTypeAnnotation, Base,
  |  |  749|      0|    NodePtr, id, false,
  |  |  750|      0|    NodePtr, typeParameters, true)
  |  |  751|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  752|      0|    IndexedAccessType, Base,
  |  |  753|      0|    NodePtr, objectType, false,
  |  |  754|      0|    NodePtr, indexType, false)
  |  |  755|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  756|      0|    OptionalIndexedAccessType, Base,
  |  |  757|      0|    NodePtr, objectType, false,
  |  |  758|      0|    NodePtr, indexType, false,
  |  |  759|      0|    NodeBoolean, optional, false)
  |  |  760|       |
  |  |  761|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  762|      0|    InterfaceTypeAnnotation, Base,
  |  |  763|      0|    NodeList, extends, false,
  |  |  764|      0|    NodePtr, body, true)
  |  |  765|       |
  |  |  766|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  767|      0|    TypeAlias, Base,
  |  |  768|      0|    NodePtr, id, false,
  |  |  769|      0|    NodePtr, typeParameters, true,
  |  |  770|      0|    NodePtr, right, false)
  |  |  771|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  772|      0|    OpaqueType, Base,
  |  |  773|      0|    NodePtr, id, false,
  |  |  774|      0|    NodePtr, typeParameters, true,
  |  |  775|      0|    NodePtr, impltype, false,
  |  |  776|      0|    NodePtr, supertype, true)
  |  |  777|       |
  |  |  778|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  779|      0|    InterfaceDeclaration, Base,
  |  |  780|      0|    NodePtr, id, false,
  |  |  781|      0|    NodePtr, typeParameters, true,
  |  |  782|      0|    NodeList, extends, false,
  |  |  783|      0|    NodePtr, body, false)
  |  |  784|       |
  |  |  785|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  786|      0|    DeclareTypeAlias, Base,
  |  |  787|      0|    NodePtr, id, false,
  |  |  788|      0|    NodePtr, typeParameters, true,
  |  |  789|      0|    NodePtr, right, false)
  |  |  790|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  791|      0|    DeclareOpaqueType, Base,
  |  |  792|      0|    NodePtr, id, false,
  |  |  793|      0|    NodePtr, typeParameters, true,
  |  |  794|      0|    NodePtr, impltype, true,
  |  |  795|      0|    NodePtr, supertype, true)
  |  |  796|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  797|      0|    DeclareInterface, Base,
  |  |  798|      0|    NodePtr, id, false,
  |  |  799|      0|    NodePtr, typeParameters, true,
  |  |  800|      0|    NodeList, extends, false,
  |  |  801|      0|    NodePtr, body, false)
  |  |  802|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  967|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (967:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  968|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  803|      0|    DeclareClass, Base,
  |  |  804|      0|    NodePtr, id, false,
  |  |  805|      0|    NodePtr, typeParameters, true,
  |  |  806|      0|    NodeList, extends, false,
  |  |  807|      0|    NodeList, implements, false,
  |  |  808|      0|    NodeList, mixins, false,
  |  |  809|      0|    NodePtr, body, false)
  |  |  810|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  811|      0|    DeclareFunction, Base,
  |  |  812|      0|    NodePtr, id, false,
  |  |  813|      0|    NodePtr, predicate, true)
  |  |  814|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  815|      0|    DeclareVariable, Base,
  |  |  816|      0|    NodePtr, id, false)
  |  |  817|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  818|      0|    DeclareExportDeclaration, Base,
  |  |  819|      0|    NodePtr, declaration, true,
  |  |  820|      0|    NodeList, specifiers, false,
  |  |  821|      0|    NodePtr, source, true,
  |  |  822|      0|    NodeBoolean, default, false)
  |  |  823|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  824|      0|    DeclareExportAllDeclaration, Base,
  |  |  825|      0|    NodePtr, source, false)
  |  |  826|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  827|      0|    DeclareModule, Base,
  |  |  828|      0|    NodePtr, id, false,
  |  |  829|      0|    NodePtr, body, false,
  |  |  830|      0|    NodeLabel, kind, false)
  |  |  831|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  832|      0|    DeclareModuleExports, Base,
  |  |  833|      0|    NodePtr, typeAnnotation, false)
  |  |  834|       |
  |  |  835|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  836|      0|    InterfaceExtends, Base,
  |  |  837|      0|    NodePtr, id, false,
  |  |  838|      0|    NodePtr, typeParameters, true)
  |  |  839|       |
  |  |  840|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  841|      0|    ClassImplements, Base,
  |  |  842|      0|    NodePtr, id, false,
  |  |  843|      0|    NodePtr, typeParameters, true)
  |  |  844|       |
  |  |  845|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  846|      0|    TypeAnnotation, Base,
  |  |  847|      0|    NodePtr, typeAnnotation, false)
  |  |  848|       |
  |  |  849|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  967|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (967:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  968|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  850|      0|    ObjectTypeAnnotation, Base,
  |  |  851|      0|    NodeList, properties, false,
  |  |  852|      0|    NodeList, indexers, false,
  |  |  853|      0|    NodeList, callProperties, false,
  |  |  854|      0|    NodeList, internalSlots, false,
  |  |  855|      0|    NodeBoolean, inexact, false,
  |  |  856|      0|    NodeBoolean, exact, false)
  |  |  857|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  858|      0|    ObjectTypeProperty, Base,
  |  |  859|      0|    NodePtr, key, false,
  |  |  860|      0|    NodePtr, value, false,
  |  |  861|      0|    NodeBoolean, method, false,
  |  |  862|      0|    NodeBoolean, optional, false,
  |  |  863|      0|    NodeBoolean, static, false,
  |  |  864|      0|    NodeBoolean, proto, false,
  |  |  865|      0|    NodePtr, variance, true,
  |  |  866|      0|    NodeLabel, kind, false)
  |  |  867|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  868|      0|    ObjectTypeSpreadProperty, Base,
  |  |  869|      0|    NodePtr, argument, false)
  |  |  870|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  964|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (964:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  871|      0|    ObjectTypeInternalSlot, Base,
  |  |  872|      0|    NodePtr, id, false,
  |  |  873|      0|    NodePtr, value, false,
  |  |  874|      0|    NodeBoolean, optional, false,
  |  |  875|      0|    NodeBoolean, static, false,
  |  |  876|      0|    NodeBoolean, method, false)
  |  |  877|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  878|      0|    ObjectTypeCallProperty, Base,
  |  |  879|      0|    NodePtr, value, false,
  |  |  880|      0|    NodeBoolean, static, false)
  |  |  881|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  964|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (964:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  882|      0|    ObjectTypeIndexer, Base,
  |  |  883|      0|    NodePtr, id, true,
  |  |  884|      0|    NodePtr, key, false,
  |  |  885|      0|    NodePtr, value, false,
  |  |  886|      0|    NodeBoolean, static, false,
  |  |  887|      0|    NodePtr, variance, true)
  |  |  888|       |
  |  |  889|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  890|      0|    Variance, Base,
  |  |  891|      0|    NodeLabel, kind, false)
  |  |  892|       |
  |  |  893|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  894|      0|    TypeParameterDeclaration, Base,
  |  |  895|      0|    NodeList, params, false)
  |  |  896|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  897|      0|    TypeParameter, Base,
  |  |  898|      0|    NodeLabel, name, false,
  |  |  899|      0|    NodePtr, bound, true,
  |  |  900|      0|    NodePtr, variance, true,
  |  |  901|      0|    NodePtr, default, true)
  |  |  902|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  903|      0|    TypeParameterInstantiation, Base,
  |  |  904|      0|    NodeList, params, false)
  |  |  905|       |
  |  |  906|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  907|      0|    TypeCastExpression, Base,
  |  |  908|      0|    NodePtr, expression, false,
  |  |  909|      0|    NodePtr, typeAnnotation, false)
  |  |  910|       |
  |  |  911|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  912|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  913|      0|    DeclaredPredicate, Base,
  |  |  914|      0|    NodePtr, value, false)
  |  |  915|       |
  |  |  916|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  917|      0|    EnumDeclaration, Base,
  |  |  918|      0|    NodePtr, id, false,
  |  |  919|      0|    NodePtr, body, false)
  |  |  920|       |
  |  |  921|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  922|      0|    EnumStringBody, Base,
  |  |  923|      0|    NodeList, members, false,
  |  |  924|      0|    NodeBoolean, explicitType, false,
  |  |  925|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  926|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  927|      0|    EnumNumberBody, Base,
  |  |  928|      0|    NodeList, members, false,
  |  |  929|      0|    NodeBoolean, explicitType, false,
  |  |  930|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  931|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  932|      0|    EnumBooleanBody, Base,
  |  |  933|      0|    NodeList, members, false,
  |  |  934|      0|    NodeBoolean, explicitType, false,
  |  |  935|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  936|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  937|      0|    EnumSymbolBody, Base,
  |  |  938|      0|    NodeList, members, false,
  |  |  939|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  940|       |
  |  |  941|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  942|      0|    EnumDefaultedMember, Base,
  |  |  943|      0|    NodePtr, id, false)
  |  |  944|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  945|      0|    EnumStringMember, Base,
  |  |  946|      0|    NodePtr, id, false,
  |  |  947|      0|    NodePtr, init, false)
  |  |  948|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  949|      0|    EnumNumberMember, Base,
  |  |  950|      0|    NodePtr, id, false,
  |  |  951|      0|    NodePtr, init, false)
  |  |  952|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  953|      0|    EnumBooleanMember, Base,
  |  |  954|      0|    NodePtr, id, false,
  |  |  955|      0|    NodePtr, init, false)
  |  |  956|       |
  |  |  957|      0|#endif
  |  |  958|       |
  |  |  959|      0|#if HERMES_PARSE_TS
  |  |  960|       |
  |  |  961|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  962|      0|    TSTypeAnnotation, Base,
  |  |  963|      0|    NodePtr, typeAnnotation, false)
  |  |  964|       |
  |  |  965|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  966|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  967|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  968|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  969|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  970|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  971|      0|ESTREE_NODE_0_ARGS(TSThisType, Base)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  972|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  973|      0|    TSLiteralType, Base,
  |  |  974|      0|    NodePtr, literal, false)
  |  |  975|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  976|      0|    TSIndexedAccessType, Base,
  |  |  977|      0|    NodePtr, objectType, false,
  |  |  978|      0|    NodePtr, indexType, false)
  |  |  979|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  980|      0|    TSArrayType, Base,
  |  |  981|      0|    NodePtr, elementType, false)
  |  |  982|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  983|      0|    TSTypeReference, Base,
  |  |  984|      0|    NodePtr, typeName, false,
  |  |  985|      0|    NodePtr, typeParameters, true)
  |  |  986|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  987|      0|    TSQualifiedName, Base,
  |  |  988|      0|    NodePtr, left, false,
  |  |  989|      0|    NodePtr, right, true)
  |  |  990|       |
  |  |  991|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  992|      0|    TSFunctionType, Base,
  |  |  993|      0|    NodeList, params, false,
  |  |  994|      0|    NodePtr, returnType, false,
  |  |  995|      0|    NodePtr, typeParameters, true)
  |  |  996|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  |  997|      0|    TSConstructorType, Base,
  |  |  998|      0|    NodeList, params, false,
  |  |  999|      0|    NodePtr, returnType, false,
  |  | 1000|      0|    NodePtr, typeParameters, true)
  |  | 1001|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1002|      0|    TSTypePredicate, Base,
  |  | 1003|      0|    NodePtr, parameterName, false,
  |  | 1004|      0|    NodePtr, typeAnnotation, false)
  |  | 1005|       |
  |  | 1006|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1007|      0|    TSTupleType, Base,
  |  | 1008|      0|    NodeList, elementTypes, false)
  |  | 1009|       |
  |  | 1010|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1011|      0|    TSTypeAssertion, Base,
  |  | 1012|      0|    NodePtr, typeAnnotation, false,
  |  | 1013|      0|    NodePtr, expression, false)
  |  | 1014|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1015|      0|    TSAsExpression, Base,
  |  | 1016|      0|    NodePtr, expression, false,
  |  | 1017|      0|    NodePtr, typeAnnotation, false)
  |  | 1018|       |
  |  | 1019|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  964|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (964:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  965|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1020|      0|    TSParameterProperty, Base,
  |  | 1021|      0|    NodePtr, parameter, false,
  |  | 1022|      0|    NodeLabel, accessibility, true,
  |  | 1023|      0|    NodeBoolean, readonly, false,
  |  | 1024|      0|    NodeBoolean, static, false,
  |  | 1025|      0|    NodeBoolean, export, false)
  |  | 1026|       |
  |  | 1027|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1028|      0|    TSTypeAliasDeclaration, Base,
  |  | 1029|      0|    NodePtr, id, false,
  |  | 1030|      0|    NodePtr, typeParameters, true,
  |  | 1031|      0|    NodePtr, typeAnnotation, false)
  |  | 1032|       |
  |  | 1033|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1034|      0|    TSInterfaceDeclaration, Base,
  |  | 1035|      0|    NodePtr, id, false,
  |  | 1036|      0|    NodePtr, body, false,
  |  | 1037|      0|    NodeList, extends, false,
  |  | 1038|      0|    NodePtr, typeParameters, true)
  |  | 1039|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1040|      0|    TSInterfaceHeritage, Base,
  |  | 1041|      0|    NodePtr, expression, false,
  |  | 1042|      0|    NodePtr, typeParameters, true)
  |  | 1043|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1044|      0|    TSInterfaceBody, Base,
  |  | 1045|      0|    NodeList, body, false)
  |  | 1046|       |
  |  | 1047|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1048|      0|    TSEnumDeclaration, Base,
  |  | 1049|      0|    NodePtr, id, false,
  |  | 1050|      0|    NodeList, members, false)
  |  | 1051|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1052|      0|    TSEnumMember, Base,
  |  | 1053|      0|    NodePtr, id, false,
  |  | 1054|      0|    NodePtr, initializer, true)
  |  | 1055|       |
  |  | 1056|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1057|      0|    TSModuleDeclaration, Base,
  |  | 1058|      0|    NodePtr, id, false,
  |  | 1059|      0|    NodePtr, body, false)
  |  | 1060|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1061|      0|    TSModuleBlock, Base,
  |  | 1062|      0|    NodeList, body, false)
  |  | 1063|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1064|      0|    TSModuleMember, Base,
  |  | 1065|      0|    NodePtr, id, false,
  |  | 1066|      0|    NodePtr, initializer, true)
  |  | 1067|       |
  |  | 1068|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1069|      0|    TSTypeParameterDeclaration, Base,
  |  | 1070|      0|    NodeList, params, false)
  |  | 1071|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1072|      0|    TSTypeParameter, Base,
  |  | 1073|      0|    NodePtr, name, false,
  |  | 1074|      0|    NodePtr, constraint, true,
  |  | 1075|      0|    NodePtr, default, true)
  |  | 1076|       |
  |  | 1077|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1078|      0|    TSTypeParameterInstantiation, Base,
  |  | 1079|      0|    NodeList, params, false)
  |  | 1080|       |
  |  | 1081|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1082|      0|    TSUnionType, Base,
  |  | 1083|      0|    NodeList, types, false)
  |  | 1084|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1085|      0|    TSIntersectionType, Base,
  |  | 1086|      0|    NodeList, types, false)
  |  | 1087|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1088|      0|    TSTypeQuery, Base,
  |  | 1089|      0|    NodePtr, exprName, false)
  |  | 1090|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1091|      0|    TSConditionalType, Base,
  |  | 1092|      0|    NodePtr, extendsType, false,
  |  | 1093|      0|    NodePtr, checkType, false,
  |  | 1094|      0|    NodePtr, trueType, false,
  |  | 1095|      0|    NodePtr, falseTYpe, false)
  |  | 1096|       |
  |  | 1097|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1098|      0|    TSTypeLiteral, Base,
  |  | 1099|      0|    NodeList, members, false)
  |  | 1100|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  973|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (973:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  974|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1101|      0|    TSPropertySignature, Base,
  |  | 1102|      0|    NodePtr, key, false,
  |  | 1103|      0|    NodePtr, typeAnnotation, true,
  |  | 1104|      0|    NodePtr, initializer, true,
  |  | 1105|      0|    NodeBoolean, optional, false,
  |  | 1106|      0|    NodeBoolean, computed, false,
  |  | 1107|      0|    NodeBoolean, readonly, false,
  |  | 1108|      0|    NodeBoolean, static, false,
  |  | 1109|      0|    NodeBoolean, export, false)
  |  | 1110|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  961|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (961:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  962|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1111|      0|    TSMethodSignature, Base,
  |  | 1112|      0|    NodePtr, key, false,
  |  | 1113|      0|    NodeList, params, false,
  |  | 1114|      0|    NodePtr, returnType, true,
  |  | 1115|      0|    NodeBoolean, computed, false)
  |  | 1116|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1117|      0|    TSIndexSignature, Base,
  |  | 1118|      0|    NodeList, parameters, false,
  |  | 1119|      0|    NodePtr, typeAnnotation, true)
  |  | 1120|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1121|      0|    TSCallSignatureDeclaration, Base,
  |  | 1122|      0|    NodeList, params, false,
  |  | 1123|      0|    NodePtr, returnType, true)
  |  | 1124|       |
  |  | 1125|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  955|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (955:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  956|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1126|      0|    TSModifiers, Base,
  |  | 1127|      0|    NodeLabel, accessibility, false,
  |  | 1128|      0|    NodeBoolean, readonly, false)
  |  | 1129|      0|#endif
  |  | 1130|       |
  |  | 1131|       |// ================================================
  |  | 1132|       |
  |  | 1133|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1134|       |
  |  | 1135|      0|ESTREE_FIRST(Cover, Base)
  |  | 1136|       |
  |  | 1137|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1138|      0|ESTREE_NODE_0_ARGS(CoverEmptyArgs, Cover)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1139|       |
  |  | 1140|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1141|       |//      "(" Expression "," ")"
  |  | 1142|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1143|       |// SequenceExpression.
  |  | 1144|      0|ESTREE_NODE_0_ARGS(CoverTrailingComma, Cover)
  |  |  ------------------
  |  |  |  |  949|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (949:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  950|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1145|       |
  |  | 1146|       |// CoverInitializer
  |  | 1147|       |// This is used for destructuring object assignment with initializers. It
  |  | 1148|       |// will be the value node of a Property.
  |  | 1149|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1150|      0|    CoverInitializer, Cover,
  |  | 1151|      0|    NodePtr, init, false)
  |  | 1152|       |
  |  | 1153|       |// CoverRestElement
  |  | 1154|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1155|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1156|       |// to the actual RestElement.
  |  | 1157|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  952|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (952:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  953|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1158|      0|    CoverRestElement, Cover,
  |  | 1159|      0|    NodePtr, rest, false)
  |  | 1160|       |
  |  | 1161|       |// CoverTypedIdentifier
  |  | 1162|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1163|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1164|       |// 'left' is the identifier which is typed.
  |  | 1165|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1166|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1167|       |//   with a type annotation.
  |  | 1168|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  958|      0|  case NodeKind::NAME:                \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (958:3): [True: 0, False: 5.93k]
  |  |  |  |  ------------------
  |  |  |  |  959|      0|    return cast<NAME##Node>(Node)->visit(V);
  |  |  ------------------
  |  | 1169|      0|    CoverTypedIdentifier, Cover,
  |  | 1170|      0|    NodePtr, left, false,
  |  | 1171|      0|    NodePtr, right, true,
  |  | 1172|      0|    NodeBoolean, optional, false)
  |  | 1173|       |
  |  | 1174|      0|ESTREE_LAST(Cover)
  |  | 1175|       |
  |  | 1176|      0|#endif
  |  | 1177|       |
  |  | 1178|      0|#undef ESTREE_FIRST
  |  | 1179|      0|#undef ESTREE_LAST
  |  | 1180|      0|#undef ESTREE_WRAP
  |  | 1181|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1182|       |
  |  | 1183|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1184|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1185|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1186|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1187|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1188|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1189|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1190|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1191|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1192|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  980|  5.93k|  }
  981|  5.93k|}
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RKb:
  211|  1.34k|void ESTreeVisit(Visitor &V, const NodeBoolean &label) {}
ESTreeIRGen.cpp:_ZN6hermes6ESTree23FunctionDeclarationNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  829|  1.90k|    void visit(Visitor &V) {                                           \
  830|  1.90k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (830:11): [True: 1.90k, False: 0]
  ------------------
  831|  1.90k|        return;                                                        \
  832|  1.90k|      }                                                                \
  833|  1.90k|      V.enter(this);                                                   \
  834|      0|      ESTreeVisit(V, _##ARG0NM);                                       \
  835|      0|      ESTreeVisit(V, _##ARG1NM);                                       \
  836|      0|      ESTreeVisit(V, _##ARG2NM);                                       \
  837|      0|      ESTreeVisit(V, _##ARG3NM);                                       \
  838|      0|      ESTreeVisit(V, _##ARG4NM);                                       \
  839|      0|      ESTreeVisit(V, _##ARG5NM);                                       \
  840|      0|      ESTreeVisit(V, _##ARG6NM);                                       \
  841|      0|      ESTreeVisit(V, _##ARG7NM);                                       \
  842|      0|      V.leave(this);                                                   \
  843|      0|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree11ESTreeVisitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_RKPNS_12UniqueStringE:
  209|  2.68k|void ESTreeVisit(Visitor &V, const NodeLabel &label) {}
ESTreeIRGen.cpp:_ZN6hermes6ESTree14IdentifierNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  515|  1.34k|    void visit(Visitor &V) {                                           \
  516|  1.34k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (516:11): [True: 0, False: 1.34k]
  ------------------
  517|      0|        return;                                                        \
  518|      0|      }                                                                \
  519|  1.34k|      V.enter(this);                                                   \
  520|  1.34k|      ESTreeVisit(V, _##ARG0NM);                                       \
  521|  1.34k|      ESTreeVisit(V, _##ARG1NM);                                       \
  522|  1.34k|      ESTreeVisit(V, _##ARG2NM);                                       \
  523|  1.34k|      V.leave(this);                                                   \
  524|  1.34k|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree22VariableDeclaratorNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  474|  1.34k|    void visit(Visitor &V) {                                           \
  475|  1.34k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (475:11): [True: 0, False: 1.34k]
  ------------------
  476|      0|        return;                                                        \
  477|      0|      }                                                                \
  478|  1.34k|      V.enter(this);                                                   \
  479|  1.34k|      ESTreeVisit(V, _##ARG0NM);                                       \
  480|  1.34k|      ESTreeVisit(V, _##ARG1NM);                                       \
  481|  1.34k|      V.leave(this);                                                   \
  482|  1.34k|    }                                                                  \
ESTreeIRGen.cpp:_ZN6hermes6ESTree23VariableDeclarationNode5visitINS_5irgen12_GLOBAL__N_112DeclHoistingEEEvRT_:
  474|  1.34k|    void visit(Visitor &V) {                                           \
  475|  1.34k|      if (!V.shouldVisit(this)) {                                      \
  ------------------
  |  Branch (475:11): [True: 0, False: 1.34k]
  ------------------
  476|      0|        return;                                                        \
  477|      0|      }                                                                \
  478|  1.34k|      V.enter(this);                                                   \
  479|  1.34k|      ESTreeVisit(V, _##ARG0NM);                                       \
  480|  1.34k|      ESTreeVisit(V, _##ARG1NM);                                       \
  481|  1.34k|      V.leave(this);                                                   \
  482|  1.34k|    }                                                                  \
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL13linearizeLeftINS0_20BinaryExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1070|     79|    llvh::ArrayRef<llvh::StringRef> ops) {
 1071|     79|  llvh::SmallVector<N *, 1> vec;
 1072|       |
 1073|     79|  vec.push_back(e);
 1074|  41.1k|  while (auto *left = checkExprOperator<N>(e->_left, ops)) {
  ------------------
  |  Branch (1074:16): [True: 41.1k, False: 79]
  ------------------
 1075|  41.1k|    e = left;
 1076|  41.1k|    vec.push_back(e);
 1077|  41.1k|  }
 1078|       |
 1079|     79|  std::reverse(vec.begin(), vec.end());
 1080|     79|  return vec;
 1081|     79|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_20BinaryExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1049|  41.1k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1050|  41.1k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1050:13): [True: 41.1k, False: 71]
  ------------------
 1051|  41.1k|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1051:9): [True: 41.1k, False: 8]
  ------------------
 1052|  41.1k|      return n;
 1053|  41.1k|  }
 1054|     79|  return nullptr;
 1055|  41.1k|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL14linearizeRightINS0_24AssignmentExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1097|  3.85k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1098|  3.85k|  llvh::SmallVector<N *, 1> vec;
 1099|       |
 1100|  3.85k|  vec.push_back(e);
 1101|  3.85k|  while (auto *right = checkExprOperator<N>(e->_right, ops)) {
  ------------------
  |  Branch (1101:16): [True: 2, False: 3.85k]
  ------------------
 1102|      2|    e = right;
 1103|      2|    vec.push_back(e);
 1104|      2|  }
 1105|       |
 1106|  3.85k|  return vec;
 1107|  3.85k|}
ESTreeIRGen-expr.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_24AssignmentExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1049|  3.85k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1050|  3.85k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1050:13): [True: 2, False: 3.85k]
  ------------------
 1051|      2|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1051:9): [True: 2, False: 0]
  ------------------
 1052|      2|      return n;
 1053|      2|  }
 1054|  3.85k|  return nullptr;
 1055|  3.85k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL13linearizeLeftINS0_20BinaryExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1070|    277|    llvh::ArrayRef<llvh::StringRef> ops) {
 1071|    277|  llvh::SmallVector<N *, 1> vec;
 1072|       |
 1073|    277|  vec.push_back(e);
 1074|   344k|  while (auto *left = checkExprOperator<N>(e->_left, ops)) {
  ------------------
  |  Branch (1074:16): [True: 344k, False: 277]
  ------------------
 1075|   344k|    e = left;
 1076|   344k|    vec.push_back(e);
 1077|   344k|  }
 1078|       |
 1079|    277|  std::reverse(vec.begin(), vec.end());
 1080|    277|  return vec;
 1081|    277|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_20BinaryExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1049|   344k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1050|   344k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1050:13): [True: 344k, False: 249]
  ------------------
 1051|   344k|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1051:9): [True: 344k, False: 28]
  ------------------
 1052|   344k|      return n;
 1053|   344k|  }
 1054|    277|  return nullptr;
 1055|   344k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL14linearizeRightINS0_24AssignmentExpressionNodeEEEN4llvh11SmallVectorIPT_Lj1EEES6_NS3_8ArrayRefINS3_9StringRefEEE:
 1097|  3.99k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1098|  3.99k|  llvh::SmallVector<N *, 1> vec;
 1099|       |
 1100|  3.99k|  vec.push_back(e);
 1101|  4.03k|  while (auto *right = checkExprOperator<N>(e->_right, ops)) {
  ------------------
  |  Branch (1101:16): [True: 40, False: 3.99k]
  ------------------
 1102|     40|    e = right;
 1103|     40|    vec.push_back(e);
 1104|     40|  }
 1105|       |
 1106|  3.99k|  return vec;
 1107|  3.99k|}
SemanticValidator.cpp:_ZN6hermes6ESTreeL17checkExprOperatorINS0_24AssignmentExpressionNodeEEEPT_PNS0_4NodeEN4llvh8ArrayRefINS7_9StringRefEEE:
 1049|  4.03k|    llvh::ArrayRef<llvh::StringRef> ops) {
 1050|  4.03k|  if (auto *n = llvh::dyn_cast<N>(e)) {
  ------------------
  |  Branch (1050:13): [True: 54, False: 3.98k]
  ------------------
 1051|     54|    if (std::find(ops.begin(), ops.end(), n->_operator->str()) != ops.end())
  ------------------
  |  Branch (1051:9): [True: 40, False: 14]
  ------------------
 1052|     40|      return n;
 1053|     54|  }
 1054|  3.99k|  return nullptr;
 1055|  4.03k|}

_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_4NodeEEEvRT_PT0_:
  565|  1.38M|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  1.38M|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  1.38M|}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_4NodeE:
  287|  1.38M|  static void visitChildren(Visitor &v, Node *node) {
  288|  1.38M|    if (!node)
  ------------------
  |  Branch (288:9): [True: 0, False: 1.38M]
  ------------------
  289|      0|      return;
  290|       |
  291|  1.38M|    switch (node->getKind()) {
  292|      0|      default:
  ------------------
  |  Branch (292:7): [True: 0, False: 1.38M]
  ------------------
  293|      0|        llvm_unreachable("invalid node kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  294|       |
  295|      0|#define VISIT(NAME)    \
  296|      0|  case NodeKind::NAME: \
  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  298|       |
  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  305|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  306|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  308|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) VISIT(NAME)
  309|       |
  310|  1.38M|#include "hermes/AST/ESTree.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |/// This file defines the ESTree nodes, which are documented in:
  |  |    9|       |/// https://github.com/estree/estree/blob/master/spec.md
  |  |   10|       |///
  |  |   11|       |/// Each parameter is described by three tokens: Type, Name and Optional.
  |  |   12|       |
  |  |   13|     12|#include "hermes/AST/Config.h"
  |  |   14|       |
  |  |   15|       |// clang-format off
  |  |   16|       |
  |  |   17|       |// Defines the start of range of nodes with the same base
  |  |   18|     12|#ifndef ESTREE_FIRST
  |  |   19|     12|#define ESTREE_FIRST(NAME, BASE)
  |  |   20|     12|#endif
  |  |   21|       |
  |  |   22|       |// Defines the end of range of nodes with the same base
  |  |   23|     12|#ifndef ESTREE_LAST
  |  |   24|     12|#define ESTREE_LAST(NAME)
  |  |   25|     12|#endif
  |  |   26|       |
  |  |   27|       |// Ignores the given field if it is "empty" (e.g. nullptr, empty list).
  |  |   28|     12|#ifndef ESTREE_IGNORE_IF_EMPTY
  |  |   29|     12|#define ESTREE_IGNORE_IF_EMPTY(NODE, FIELD)
  |  |   30|     12|#endif
  |  |   31|       |
  |  |   32|     12|ESTREE_NODE_0_ARGS(Empty, Base)
  |  |  ------------------
  |  |  |  |  299|     12|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     12|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 12, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     12|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   33|      0|ESTREE_NODE_0_ARGS(Metadata, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   34|       |
  |  |   35|      0|ESTREE_FIRST(FunctionLike, Base)
  |  |   36|      0|ESTREE_NODE_1_ARGS(Program, FunctionLike,
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   37|      0|    NodeList, body, false)
  |  |   38|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   39|      0|    FunctionExpression, FunctionLike,
  |  |   40|      0|    NodePtr, id, true,
  |  |   41|      0|    NodeList, params, false,
  |  |   42|      0|    NodePtr, body, false,
  |  |   43|      0|    NodePtr, typeParameters, true,
  |  |   44|      0|    NodePtr, returnType, true,
  |  |   45|      0|    NodePtr, predicate, true,
  |  |   46|      0|    NodeBoolean, generator, false,
  |  |   47|      0|    NodeBoolean, async, false)
  |  |   48|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, typeParameters)
  |  |   49|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, returnType)
  |  |   50|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, predicate)
  |  |   51|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   52|      0|    ArrowFunctionExpression, FunctionLike,
  |  |   53|      0|    NodePtr, id, true,
  |  |   54|      0|    NodeList, params, false,
  |  |   55|      0|    NodePtr, body, false,
  |  |   56|      0|    NodePtr, typeParameters, true,
  |  |   57|      0|    NodePtr, returnType, true,
  |  |   58|      0|    NodePtr, predicate, true,
  |  |   59|      0|    NodeBoolean, expression, false,
  |  |   60|      0|    NodeBoolean, async, false)
  |  |   61|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, typeParameters)
  |  |   62|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, returnType)
  |  |   63|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, predicate)
  |  |   64|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|      0|    FunctionDeclaration, FunctionLike,
  |  |   66|      0|    NodePtr, id, true,
  |  |   67|      0|    NodeList, params, false,
  |  |   68|      0|    NodePtr, body, false,
  |  |   69|      0|    NodePtr, typeParameters, true,
  |  |   70|      0|    NodePtr, returnType, true,
  |  |   71|      0|    NodePtr, predicate, true,
  |  |   72|      0|    NodeBoolean, generator, false,
  |  |   73|      0|    NodeBoolean, async, false)
  |  |   74|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, typeParameters)
  |  |   75|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, returnType)
  |  |   76|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, predicate)
  |  |   77|      0|ESTREE_LAST(FunctionLike)
  |  |   78|       |
  |  |   79|      0|ESTREE_FIRST(Statement, Base)
  |  |   80|       |
  |  |   81|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |   82|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   83|      0|    WhileStatement,
  |  |   84|      0|    LoopStatement,
  |  |   85|      0|    NodePtr,
  |  |   86|      0|    body,
  |  |   87|      0|    false,
  |  |   88|      0|    NodePtr,
  |  |   89|      0|    test,
  |  |   90|      0|    false)
  |  |   91|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   92|      0|    DoWhileStatement,
  |  |   93|      0|    LoopStatement,
  |  |   94|      0|    NodePtr,
  |  |   95|      0|    body,
  |  |   96|      0|    false,
  |  |   97|      0|    NodePtr,
  |  |   98|      0|    test,
  |  |   99|      0|    false)
  |  |  100|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  101|      0|    ForInStatement,
  |  |  102|      0|    LoopStatement,
  |  |  103|      0|    NodePtr,
  |  |  104|      0|    left,
  |  |  105|      0|    false,
  |  |  106|      0|    NodePtr,
  |  |  107|      0|    right,
  |  |  108|      0|    false,
  |  |  109|      0|    NodePtr,
  |  |  110|      0|    body,
  |  |  111|      0|    false)
  |  |  112|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    ForOfStatement, LoopStatement,
  |  |  114|      0|    NodePtr, left, false,
  |  |  115|      0|    NodePtr, right, false,
  |  |  116|      0|    NodePtr, body, false,
  |  |  117|      0|    NodeBoolean, await, false)
  |  |  118|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      0|    ForStatement,
  |  |  120|      0|    LoopStatement,
  |  |  121|      0|    NodePtr,
  |  |  122|      0|    init,
  |  |  123|      0|    true,
  |  |  124|      0|    NodePtr,
  |  |  125|      0|    test,
  |  |  126|      0|    true,
  |  |  127|      0|    NodePtr,
  |  |  128|      0|    update,
  |  |  129|      0|    true,
  |  |  130|      0|    NodePtr,
  |  |  131|      0|    body,
  |  |  132|      0|    false)
  |  |  133|      0|ESTREE_LAST(LoopStatement)
  |  |  134|       |
  |  |  135|      0|ESTREE_NODE_0_ARGS(DebuggerStatement, Statement)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|   131k|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  299|   131k|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   131k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 131k, False: 1.25M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   131k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|   115k|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  300|   115k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   115k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 115k, False: 1.27M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   115k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|ESTREE_NODE_1_ARGS(BreakStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|      0|ESTREE_NODE_1_ARGS(ContinueStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  140|      0|ESTREE_NODE_1_ARGS(ThrowStatement, Statement, NodePtr, argument, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|      0|ESTREE_NODE_1_ARGS(ReturnStatement, Statement, NodePtr, argument, true)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|      0|    WithStatement,
  |  |  144|      0|    Statement,
  |  |  145|      0|    NodePtr,
  |  |  146|      0|    object,
  |  |  147|      0|    false,
  |  |  148|      0|    NodePtr,
  |  |  149|      0|    body,
  |  |  150|      0|    false)
  |  |  151|       |
  |  |  152|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|    SwitchStatement,
  |  |  154|      0|    Statement,
  |  |  155|      0|    NodePtr,
  |  |  156|      0|    discriminant,
  |  |  157|      0|    false,
  |  |  158|      0|    NodeList,
  |  |  159|      0|    cases,
  |  |  160|      0|    false)
  |  |  161|       |
  |  |  162|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      0|    LabeledStatement,
  |  |  164|      0|    Statement,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    label,
  |  |  167|      0|    false,
  |  |  168|      0|    NodePtr,
  |  |  169|      0|    body,
  |  |  170|      0|    false)
  |  |  171|       |
  |  |  172|   143k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|   143k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   143k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 143k, False: 1.24M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   143k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|      0|    ExpressionStatement,
  |  |  174|      0|    Statement,
  |  |  175|      0|    NodePtr,
  |  |  176|      0|    expression,
  |  |  177|      0|    false,
  |  |  178|      0|    NodeString,
  |  |  179|      0|    directive,
  |  |  180|      0|    true)
  |  |  181|       |
  |  |  182|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  183|      0|    TryStatement,
  |  |  184|      0|    Statement,
  |  |  185|      0|    NodePtr,
  |  |  186|      0|    block,
  |  |  187|      0|    false,
  |  |  188|      0|    NodePtr,
  |  |  189|      0|    handler,
  |  |  190|      0|    true,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    finalizer,
  |  |  193|      0|    true)
  |  |  194|       |
  |  |  195|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  196|      0|    IfStatement,
  |  |  197|      0|    Statement,
  |  |  198|      0|    NodePtr,
  |  |  199|      0|    test,
  |  |  200|      0|    false,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    consequent,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    alternate,
  |  |  206|      0|    true)
  |  |  207|       |
  |  |  208|      0|ESTREE_LAST(Statement)
  |  |  209|       |
  |  |  210|      0|ESTREE_NODE_0_ARGS(NullLiteral, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  211|  2.01k|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  300|  2.01k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  2.01k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 2.01k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  2.01k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  212|  5.98k|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  300|  5.98k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  5.98k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 5.98k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  5.98k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  213|   738k|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  300|   738k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   738k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 738k, False: 648k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   738k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  214|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  215|      0|    RegExpLiteral,
  |  |  216|      0|    Base,
  |  |  217|      0|    NodeLabel,
  |  |  218|      0|    pattern,
  |  |  219|      0|    false,
  |  |  220|      0|    NodeLabel,
  |  |  221|      0|    flags,
  |  |  222|      0|    false)
  |  |  223|     11|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|     11|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     11|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 11, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     11|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  224|      0|    BigIntLiteral, Base,
  |  |  225|      0|    NodeLabel, bigint, false)
  |  |  226|       |
  |  |  227|      0|ESTREE_NODE_0_ARGS(ThisExpression, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  228|      0|ESTREE_NODE_0_ARGS(Super, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  229|    189|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  300|    189|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|    189|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 189, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|    189|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  230|  5.08k|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  300|  5.08k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  5.08k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 5.08k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  5.08k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  231|  33.4k|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  301|  33.4k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  33.4k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 33.4k, False: 1.35M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  33.4k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  232|      0|    NodeList, elements, false,
  |  |  233|      0|    NodeBoolean, trailingComma, false)
  |  |  234|       |
  |  |  235|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  236|      0|    SpreadElement, Base,
  |  |  237|      0|    NodePtr, argument, false)
  |  |  238|       |
  |  |  239|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  240|      0|    NewExpression, Base,
  |  |  241|      0|    NodePtr, callee, false,
  |  |  242|      0|    NodePtr, typeArguments, true,
  |  |  243|      0|    NodeList, arguments, false)
  |  |  244|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  245|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  246|      0|    YieldExpression, Base,
  |  |  247|      0|    NodePtr, argument, true,
  |  |  248|      0|    NodeBoolean, delegate, true)
  |  |  249|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  250|      0|    AwaitExpression, Base,
  |  |  251|      0|    NodePtr, argument, false)
  |  |  252|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  253|      0|    ImportExpression, Base,
  |  |  254|      0|    NodePtr, source, false,
  |  |  255|      0|    NodePtr, attributes, true)
  |  |  256|       |
  |  |  257|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  258|      8|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      8|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      8|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 8, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      8|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  259|      0|    CallExpression, CallExpressionLike,
  |  |  260|      0|    NodePtr, callee, false,
  |  |  261|      0|    NodePtr, typeArguments, true,
  |  |  262|      0|    NodeList, arguments, false)
  |  |  263|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  264|       |
  |  |  265|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  266|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  267|      0|    NodePtr, callee, false,
  |  |  268|      0|    NodePtr, typeArguments, true,
  |  |  269|      0|    NodeList, arguments, false,
  |  |  270|      0|    NodeBoolean, optional, false)
  |  |  271|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  272|      0|ESTREE_LAST(CallExpressionLike)
  |  |  273|       |
  |  |  274|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  275|      0|    AssignmentExpression,
  |  |  276|      0|    Base,
  |  |  277|      0|    NodeLabel,
  |  |  278|      0|    operator,
  |  |  279|      0|    false,
  |  |  280|      0|    NodePtr,
  |  |  281|      0|    left,
  |  |  282|      0|    false,
  |  |  283|      0|    NodePtr,
  |  |  284|      0|    right,
  |  |  285|      0|    false)
  |  |  286|       |
  |  |  287|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|    UnaryExpression,
  |  |  289|      0|    Base,
  |  |  290|      0|    NodeLabel,
  |  |  291|      0|    operator,
  |  |  292|      0|    false,
  |  |  293|      0|    NodePtr,
  |  |  294|      0|    argument,
  |  |  295|      0|    false,
  |  |  296|      0|    NodeBoolean,
  |  |  297|      0|    prefix,
  |  |  298|      0|    false)
  |  |  299|       |
  |  |  300|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  301|      0|    UpdateExpression,
  |  |  302|      0|    Base,
  |  |  303|      0|    NodeLabel,
  |  |  304|      0|    operator,
  |  |  305|      0|    false,
  |  |  306|      0|    NodePtr,
  |  |  307|      0|    argument,
  |  |  308|      0|    false,
  |  |  309|      0|    NodeBoolean,
  |  |  310|      0|    prefix,
  |  |  311|      0|    false)
  |  |  312|       |
  |  |  313|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  314|  1.64k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  1.64k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  1.64k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 1.64k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  1.64k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  315|      0|    MemberExpression, MemberExpressionLike,
  |  |  316|      0|    NodePtr, object, false,
  |  |  317|      0|    NodePtr, property, false,
  |  |  318|      0|    NodeBoolean, computed, false)
  |  |  319|       |
  |  |  320|  1.75k|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|  1.75k|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  1.75k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 1.75k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  1.75k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  321|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  322|      0|    NodePtr, object, false,
  |  |  323|      0|    NodePtr, property, false,
  |  |  324|      0|    NodeBoolean, computed, false,
  |  |  325|      0|    NodeBoolean, optional, false)
  |  |  326|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  327|       |
  |  |  328|  4.30k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|  4.30k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  4.30k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 4.30k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  4.30k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  329|      0|    LogicalExpression,
  |  |  330|      0|    Base,
  |  |  331|      0|    NodePtr,
  |  |  332|      0|    left,
  |  |  333|      0|    false,
  |  |  334|      0|    NodePtr,
  |  |  335|      0|    right,
  |  |  336|      0|    false,
  |  |  337|      0|    NodeLabel,
  |  |  338|      0|    operator,
  |  |  339|      0|    false)
  |  |  340|       |
  |  |  341|     90|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|     90|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|     90|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 90, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|     90|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|    ConditionalExpression,
  |  |  343|      0|    Base,
  |  |  344|      0|    NodePtr,
  |  |  345|      0|    test,
  |  |  346|      0|    false,
  |  |  347|      0|    NodePtr,
  |  |  348|      0|    alternate,
  |  |  349|      0|    false,
  |  |  350|      0|    NodePtr,
  |  |  351|      0|    consequent,
  |  |  352|      0|    false)
  |  |  353|       |
  |  |  354|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  355|      0|    BinaryExpression,
  |  |  356|      0|    Base,
  |  |  357|      0|    NodePtr,
  |  |  358|      0|    left,
  |  |  359|      0|    false,
  |  |  360|      0|    NodePtr,
  |  |  361|      0|    right,
  |  |  362|      0|    false,
  |  |  363|      0|    NodeLabel,
  |  |  364|      0|    operator,
  |  |  365|      0|    false)
  |  |  366|       |
  |  |  367|      0|ESTREE_NODE_1_ARGS(Directive, Base, NodePtr, value, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  368|      0|ESTREE_NODE_1_ARGS(DirectiveLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  369|       |
  |  |  370|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  371|      0|    Identifier, Base,
  |  |  372|      0|    NodeLabel, name, false,
  |  |  373|      0|    NodePtr, typeAnnotation, true,
  |  |  374|      0|    NodeBoolean, optional, false)
  |  |  375|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  376|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  377|       |
  |  |  378|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  379|      0|    PrivateName, Base,
  |  |  380|      0|    NodePtr, id, false)
  |  |  381|       |
  |  |  382|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|      0|    MetaProperty,
  |  |  384|      0|    Base,
  |  |  385|      0|    NodePtr,
  |  |  386|      0|    meta,
  |  |  387|      0|    false,
  |  |  388|      0|    NodePtr,
  |  |  389|      0|    property,
  |  |  390|      0|    false)
  |  |  391|       |
  |  |  392|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  393|      0|    SwitchCase,
  |  |  394|      0|    Base,
  |  |  395|      0|    NodePtr,
  |  |  396|      0|    test,
  |  |  397|      0|    true,
  |  |  398|      0|    NodeList,
  |  |  399|      0|    consequent,
  |  |  400|      0|    false)
  |  |  401|       |
  |  |  402|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  403|      0|    CatchClause,
  |  |  404|      0|    Base,
  |  |  405|      0|    NodePtr,
  |  |  406|      0|    param,
  |  |  407|      0|    true,
  |  |  408|      0|    NodePtr,
  |  |  409|      0|    body,
  |  |  410|      0|    false)
  |  |  411|       |
  |  |  412|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|    VariableDeclarator,
  |  |  414|      0|    Base,
  |  |  415|      0|    NodePtr,
  |  |  416|      0|    init,
  |  |  417|      0|    true,
  |  |  418|      0|    NodePtr,
  |  |  419|      0|    id,
  |  |  420|      0|    false)
  |  |  421|       |
  |  |  422|      7|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      7|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      7|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 7, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      7|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  423|      0|    VariableDeclaration,
  |  |  424|      0|    Base,
  |  |  425|      0|    NodeLabel,
  |  |  426|      0|    kind,
  |  |  427|      0|    false,
  |  |  428|      0|    NodeList,
  |  |  429|      0|    declarations,
  |  |  430|      0|    false)
  |  |  431|       |
  |  |  432|  64.8k|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  301|  64.8k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  64.8k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 64.8k, False: 1.32M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  64.8k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  433|      0|                   NodeList, quasis, false,
  |  |  434|      0|                   NodeList, expressions, false)
  |  |  435|       |
  |  |  436|    285|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  301|    285|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|    285|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 285, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|    285|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  437|      0|                   NodePtr, tag, false,
  |  |  438|      0|                   NodePtr, quasi, false)
  |  |  439|       |
  |  |  440|       |// In ESTree, it is defined as {tail : boolean,
  |  |  441|       |//                              value : {cooked : string, raw : string}},
  |  |  442|       |// we flatten the value field.
  |  |  443|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  444|       |// cooked will be null.
  |  |  445|   131k|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  302|   131k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|   131k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 131k, False: 1.25M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|   131k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  446|      0|                   NodeBoolean, tail, false,
  |  |  447|      0|                   NodeString, cooked, true,
  |  |  448|      0|                   NodeLabel, raw, false)
  |  |  449|       |
  |  |  450|  5.97k|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  305|  5.97k|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|  5.97k|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 5.97k, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|  5.97k|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  451|      0|    Property, Base,
  |  |  452|      0|    NodePtr, key, false,
  |  |  453|      0|    NodePtr, value, false,
  |  |  454|      0|    NodeLabel, kind, false,
  |  |  455|      0|    NodeBoolean, computed, false,
  |  |  456|      0|    NodeBoolean, method, false,
  |  |  457|      0|    NodeBoolean, shorthand, false)
  |  |  458|       |
  |  |  459|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  306|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  460|      0|    ClassDeclaration, Base,
  |  |  461|      0|    NodePtr, id, true,
  |  |  462|      0|    NodePtr, typeParameters, true,
  |  |  463|      0|    NodePtr, superClass, true,
  |  |  464|      0|    NodePtr, superTypeParameters, true,
  |  |  465|      0|    NodeList, implements, false,
  |  |  466|      0|    NodeList, decorators, false,
  |  |  467|      0|    NodePtr, body, false)
  |  |  468|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  469|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  470|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  471|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  472|       |
  |  |  473|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  306|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  474|      0|    ClassExpression, Base,
  |  |  475|      0|    NodePtr, id, true,
  |  |  476|      0|    NodePtr, typeParameters, true,
  |  |  477|      0|    NodePtr, superClass, true,
  |  |  478|      0|    NodePtr, superTypeParameters, true,
  |  |  479|      0|    NodeList, implements, false,
  |  |  480|      0|    NodeList, decorators, false,
  |  |  481|      0|    NodePtr, body, false)
  |  |  482|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  483|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  484|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  485|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  486|       |
  |  |  487|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  488|      0|    ClassBody, Base,
  |  |  489|      0|    NodeList, body, false)
  |  |  490|       |
  |  |  491|      0|ESTREE_NODE_9_ARGS(
  |  |  ------------------
  |  |  |  |  308|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  492|      0|    ClassProperty, Base,
  |  |  493|      0|    NodePtr, key, false,
  |  |  494|      0|    NodePtr, value, true,
  |  |  495|      0|    NodeBoolean, computed, false,
  |  |  496|      0|    NodeBoolean, static, false,
  |  |  497|      0|    NodeBoolean, declare, false,
  |  |  498|      0|    NodeBoolean, optional, false,
  |  |  499|      0|    NodePtr, variance, true,
  |  |  500|      0|    NodePtr, typeAnnotation, true,
  |  |  501|      0|    NodePtr, tsModifiers, true)
  |  |  502|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  503|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  506|       |
  |  |  507|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  508|      0|    ClassPrivateProperty, Base,
  |  |  509|      0|    NodePtr, key, false,
  |  |  510|      0|    NodePtr, value, true,
  |  |  511|      0|    NodeBoolean, static, false,
  |  |  512|      0|    NodeBoolean, declare, false,
  |  |  513|      0|    NodeBoolean, optional, false,
  |  |  514|      0|    NodePtr, variance, true,
  |  |  515|      0|    NodePtr, typeAnnotation, true,
  |  |  516|      0|    NodePtr, tsModifiers, true)
  |  |  517|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  521|       |
  |  |  522|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  523|      0|    MethodDefinition, Base,
  |  |  524|      0|    NodePtr, key, false,
  |  |  525|      0|    NodePtr, value, false,
  |  |  526|      0|    NodeLabel, kind, false,
  |  |  527|      0|    NodeBoolean, computed, false,
  |  |  528|      0|    NodeBoolean, static, false)
  |  |  529|       |
  |  |  530|       |// Imports ========================================
  |  |  531|       |
  |  |  532|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  533|      0|    ImportDeclaration, Base,
  |  |  534|      0|    NodeList, specifiers, false,
  |  |  535|      0|    NodePtr, source, false,
  |  |  536|      0|    NodeList, assertions, true,
  |  |  537|      0|    NodeLabel, importKind, false)
  |  |  538|       |
  |  |  539|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  540|      0|    ImportSpecifier, Base,
  |  |  541|      0|    NodePtr, imported, false,
  |  |  542|      0|    NodePtr, local, false,
  |  |  543|      0|    NodeLabel, importKind, false)
  |  |  544|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  545|      0|    ImportDefaultSpecifier, Base,
  |  |  546|      0|    NodePtr, local, false)
  |  |  547|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  548|      0|    ImportNamespaceSpecifier, Base,
  |  |  549|      0|    NodePtr, local, false)
  |  |  550|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  551|      0|    ImportAttribute, Base,
  |  |  552|      0|    NodePtr, key, false,
  |  |  553|      0|    NodePtr, value, false)
  |  |  554|       |
  |  |  555|       |
  |  |  556|       |// ================================================
  |  |  557|       |
  |  |  558|       |// Exports ========================================
  |  |  559|       |
  |  |  560|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  561|      0|    ExportNamedDeclaration, Base,
  |  |  562|      0|    NodePtr, declaration, true,
  |  |  563|      0|    NodeList, specifiers, false,
  |  |  564|      0|    NodePtr, source, true,
  |  |  565|      0|    NodeLabel, exportKind, false)
  |  |  566|       |
  |  |  567|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  568|      0|    ExportSpecifier, Base,
  |  |  569|      0|    NodePtr, exported, false,
  |  |  570|      0|    NodePtr, local, false)
  |  |  571|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  572|      0|    ExportNamespaceSpecifier, Base,
  |  |  573|      0|    NodePtr, exported, false)
  |  |  574|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  575|      0|    ExportDefaultDeclaration, Base,
  |  |  576|      0|    NodePtr, declaration, false)
  |  |  577|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  578|      0|    ExportAllDeclaration, Base,
  |  |  579|      0|    NodePtr, source, false,
  |  |  580|      0|    NodeLabel, exportKind, false)
  |  |  581|       |
  |  |  582|       |// ================================================
  |  |  583|       |
  |  |  584|       |// Patterns =======================================
  |  |  585|      0|ESTREE_FIRST(Pattern, Base)
  |  |  586|       |
  |  |  587|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  588|      0|    ObjectPattern, Pattern,
  |  |  589|      0|    NodeList, properties, false,
  |  |  590|      0|    NodePtr, typeAnnotation, true)
  |  |  591|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  592|       |
  |  |  593|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  594|      0|    ArrayPattern, Pattern,
  |  |  595|      0|    NodeList, elements, false,
  |  |  596|      0|    NodePtr, typeAnnotation, true)
  |  |  597|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  598|       |
  |  |  599|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  600|      0|    RestElement, Pattern,
  |  |  601|      0|    NodePtr, argument, false)
  |  |  602|       |
  |  |  603|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  604|      0|    AssignmentPattern, Pattern,
  |  |  605|      0|    NodePtr, left, false,          // Pattern
  |  |  606|       |    NodePtr, right, false)         // Expression
  |  |  607|       |
  |  |  608|      0|ESTREE_LAST(Pattern)
  |  |  609|       |// ================================================
  |  |  610|       |
  |  |  611|       |// JSX ============================================
  |  |  612|       |
  |  |  613|      0|#if HERMES_PARSE_JSX
  |  |  614|       |
  |  |  615|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  616|      0|    JSXIdentifier, Base,
  |  |  617|      0|    NodeLabel, name, false)
  |  |  618|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  619|      0|    JSXMemberExpression, Base,
  |  |  620|      0|    NodePtr, object, false,
  |  |  621|      0|    NodePtr, property, false)
  |  |  622|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  623|      0|    JSXNamespacedName, Base,
  |  |  624|      0|    NodePtr, namespace, false,
  |  |  625|      0|    NodePtr, name, false)
  |  |  626|       |
  |  |  627|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  628|      0|    JSXEmptyExpression, Base)
  |  |  629|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  630|      0|    JSXExpressionContainer, Base,
  |  |  631|      0|    NodePtr, expression, false)
  |  |  632|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  633|      0|    JSXSpreadChild, Base,
  |  |  634|      0|    NodePtr, expression, false)
  |  |  635|       |
  |  |  636|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  637|      0|    JSXOpeningElement, Base,
  |  |  638|      0|    NodePtr, name, false,
  |  |  639|      0|    NodeList, attributes, false,
  |  |  640|      0|    NodeBoolean, selfClosing, false)
  |  |  641|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  642|      0|    JSXClosingElement, Base,
  |  |  643|      0|    NodePtr, name, false)
  |  |  644|       |
  |  |  645|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|      0|    JSXAttribute, Base,
  |  |  647|      0|    NodePtr, name, false,
  |  |  648|      0|    NodePtr, value, true)
  |  |  649|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  650|      0|    JSXSpreadAttribute, Base,
  |  |  651|      0|    NodePtr, argument, false)
  |  |  652|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  653|      0|    JSXStringLiteral, Base,
  |  |  654|      0|    NodeString, value, false,
  |  |  655|      0|    NodeLabel, raw, false)
  |  |  656|       |
  |  |  657|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  658|      0|    JSXText, Base,
  |  |  659|      0|    NodeString, value, false,
  |  |  660|      0|    NodeLabel, raw, false)
  |  |  661|       |
  |  |  662|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  663|      0|    JSXElement, Base,
  |  |  664|      0|    NodePtr, openingElement, false,
  |  |  665|      0|    NodeList, children, false,
  |  |  666|      0|    NodePtr, closingElement, true)
  |  |  667|       |
  |  |  668|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  669|      0|    JSXFragment, Base,
  |  |  670|      0|    NodePtr, openingFragment, false,
  |  |  671|      0|    NodeList, children, false,
  |  |  672|      0|    NodePtr, closingFragment, false)
  |  |  673|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  674|      0|    JSXOpeningFragment, Base)
  |  |  675|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  676|      0|    JSXClosingFragment, Base)
  |  |  677|       |
  |  |  678|      0|#endif
  |  |  679|       |
  |  |  680|       |// ================================================
  |  |  681|       |
  |  |  682|       |// Types ==========================================
  |  |  683|       |
  |  |  684|      0|#if HERMES_PARSE_FLOW
  |  |  685|       |
  |  |  686|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  687|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  688|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  689|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  690|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  691|      0|    StringLiteralTypeAnnotation, Base,
  |  |  692|      0|    NodeString, value, false,
  |  |  693|      0|    NodeString, raw, false)
  |  |  694|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  695|      0|    NumberLiteralTypeAnnotation, Base,
  |  |  696|      0|    NodeNumber, value, false,
  |  |  697|      0|    NodeLabel, raw, false)
  |  |  698|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|    BigIntLiteralTypeAnnotation, Base,
  |  |  700|      0|    NodeLabel, raw, false)
  |  |  701|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  702|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|      0|    BooleanLiteralTypeAnnotation, Base,
  |  |  704|      0|    NodeBoolean, value, false,
  |  |  705|      0|    NodeLabel, raw, false)
  |  |  706|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  707|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  708|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  709|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  710|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  712|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  713|      0|    FunctionTypeAnnotation, Base,
  |  |  714|      0|    NodeList, params, false,
  |  |  715|      0|    NodePtr, this, true,
  |  |  716|      0|    NodePtr, returnType, false,
  |  |  717|      0|    NodePtr, rest, true,
  |  |  718|      0|    NodePtr, typeParameters, true)
  |  |  719|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  720|      0|    FunctionTypeParam, Base,
  |  |  721|      0|    NodePtr, name, true,
  |  |  722|      0|    NodePtr, typeAnnotation, false,
  |  |  723|      0|    NodeBoolean, optional, false)
  |  |  724|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  725|      0|    NullableTypeAnnotation, Base,
  |  |  726|      0|    NodePtr, typeAnnotation, false)
  |  |  727|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  728|      0|    QualifiedTypeIdentifier, Base,
  |  |  729|      0|    NodePtr, qualification, false,
  |  |  730|      0|    NodePtr, id, false)
  |  |  731|       |
  |  |  732|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  733|      0|    TypeofTypeAnnotation, Base,
  |  |  734|      0|    NodePtr, argument, false)
  |  |  735|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  736|      0|    TupleTypeAnnotation, Base,
  |  |  737|      0|    NodeList, types, false)
  |  |  738|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  739|      0|    ArrayTypeAnnotation, Base,
  |  |  740|      0|    NodePtr, elementType, false)
  |  |  741|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  742|      0|    UnionTypeAnnotation, Base,
  |  |  743|      0|    NodeList, types, false)
  |  |  744|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  745|      0|    IntersectionTypeAnnotation, Base,
  |  |  746|      0|    NodeList, types, false)
  |  |  747|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  748|      0|    GenericTypeAnnotation, Base,
  |  |  749|      0|    NodePtr, id, false,
  |  |  750|      0|    NodePtr, typeParameters, true)
  |  |  751|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  752|      0|    IndexedAccessType, Base,
  |  |  753|      0|    NodePtr, objectType, false,
  |  |  754|      0|    NodePtr, indexType, false)
  |  |  755|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  756|      0|    OptionalIndexedAccessType, Base,
  |  |  757|      0|    NodePtr, objectType, false,
  |  |  758|      0|    NodePtr, indexType, false,
  |  |  759|      0|    NodeBoolean, optional, false)
  |  |  760|       |
  |  |  761|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  762|      0|    InterfaceTypeAnnotation, Base,
  |  |  763|      0|    NodeList, extends, false,
  |  |  764|      0|    NodePtr, body, true)
  |  |  765|       |
  |  |  766|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  767|      0|    TypeAlias, Base,
  |  |  768|      0|    NodePtr, id, false,
  |  |  769|      0|    NodePtr, typeParameters, true,
  |  |  770|      0|    NodePtr, right, false)
  |  |  771|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  772|      0|    OpaqueType, Base,
  |  |  773|      0|    NodePtr, id, false,
  |  |  774|      0|    NodePtr, typeParameters, true,
  |  |  775|      0|    NodePtr, impltype, false,
  |  |  776|      0|    NodePtr, supertype, true)
  |  |  777|       |
  |  |  778|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  779|      0|    InterfaceDeclaration, Base,
  |  |  780|      0|    NodePtr, id, false,
  |  |  781|      0|    NodePtr, typeParameters, true,
  |  |  782|      0|    NodeList, extends, false,
  |  |  783|      0|    NodePtr, body, false)
  |  |  784|       |
  |  |  785|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  786|      0|    DeclareTypeAlias, Base,
  |  |  787|      0|    NodePtr, id, false,
  |  |  788|      0|    NodePtr, typeParameters, true,
  |  |  789|      0|    NodePtr, right, false)
  |  |  790|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  791|      0|    DeclareOpaqueType, Base,
  |  |  792|      0|    NodePtr, id, false,
  |  |  793|      0|    NodePtr, typeParameters, true,
  |  |  794|      0|    NodePtr, impltype, true,
  |  |  795|      0|    NodePtr, supertype, true)
  |  |  796|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  797|      0|    DeclareInterface, Base,
  |  |  798|      0|    NodePtr, id, false,
  |  |  799|      0|    NodePtr, typeParameters, true,
  |  |  800|      0|    NodeList, extends, false,
  |  |  801|      0|    NodePtr, body, false)
  |  |  802|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  305|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  803|      0|    DeclareClass, Base,
  |  |  804|      0|    NodePtr, id, false,
  |  |  805|      0|    NodePtr, typeParameters, true,
  |  |  806|      0|    NodeList, extends, false,
  |  |  807|      0|    NodeList, implements, false,
  |  |  808|      0|    NodeList, mixins, false,
  |  |  809|      0|    NodePtr, body, false)
  |  |  810|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  811|      0|    DeclareFunction, Base,
  |  |  812|      0|    NodePtr, id, false,
  |  |  813|      0|    NodePtr, predicate, true)
  |  |  814|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  815|      0|    DeclareVariable, Base,
  |  |  816|      0|    NodePtr, id, false)
  |  |  817|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  818|      0|    DeclareExportDeclaration, Base,
  |  |  819|      0|    NodePtr, declaration, true,
  |  |  820|      0|    NodeList, specifiers, false,
  |  |  821|      0|    NodePtr, source, true,
  |  |  822|      0|    NodeBoolean, default, false)
  |  |  823|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  824|      0|    DeclareExportAllDeclaration, Base,
  |  |  825|      0|    NodePtr, source, false)
  |  |  826|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  827|      0|    DeclareModule, Base,
  |  |  828|      0|    NodePtr, id, false,
  |  |  829|      0|    NodePtr, body, false,
  |  |  830|      0|    NodeLabel, kind, false)
  |  |  831|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  832|      0|    DeclareModuleExports, Base,
  |  |  833|      0|    NodePtr, typeAnnotation, false)
  |  |  834|       |
  |  |  835|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  836|      0|    InterfaceExtends, Base,
  |  |  837|      0|    NodePtr, id, false,
  |  |  838|      0|    NodePtr, typeParameters, true)
  |  |  839|       |
  |  |  840|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  841|      0|    ClassImplements, Base,
  |  |  842|      0|    NodePtr, id, false,
  |  |  843|      0|    NodePtr, typeParameters, true)
  |  |  844|       |
  |  |  845|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  846|      0|    TypeAnnotation, Base,
  |  |  847|      0|    NodePtr, typeAnnotation, false)
  |  |  848|       |
  |  |  849|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  305|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  850|      0|    ObjectTypeAnnotation, Base,
  |  |  851|      0|    NodeList, properties, false,
  |  |  852|      0|    NodeList, indexers, false,
  |  |  853|      0|    NodeList, callProperties, false,
  |  |  854|      0|    NodeList, internalSlots, false,
  |  |  855|      0|    NodeBoolean, inexact, false,
  |  |  856|      0|    NodeBoolean, exact, false)
  |  |  857|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  858|      0|    ObjectTypeProperty, Base,
  |  |  859|      0|    NodePtr, key, false,
  |  |  860|      0|    NodePtr, value, false,
  |  |  861|      0|    NodeBoolean, method, false,
  |  |  862|      0|    NodeBoolean, optional, false,
  |  |  863|      0|    NodeBoolean, static, false,
  |  |  864|      0|    NodeBoolean, proto, false,
  |  |  865|      0|    NodePtr, variance, true,
  |  |  866|      0|    NodeLabel, kind, false)
  |  |  867|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  868|      0|    ObjectTypeSpreadProperty, Base,
  |  |  869|      0|    NodePtr, argument, false)
  |  |  870|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  871|      0|    ObjectTypeInternalSlot, Base,
  |  |  872|      0|    NodePtr, id, false,
  |  |  873|      0|    NodePtr, value, false,
  |  |  874|      0|    NodeBoolean, optional, false,
  |  |  875|      0|    NodeBoolean, static, false,
  |  |  876|      0|    NodeBoolean, method, false)
  |  |  877|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  878|      0|    ObjectTypeCallProperty, Base,
  |  |  879|      0|    NodePtr, value, false,
  |  |  880|      0|    NodeBoolean, static, false)
  |  |  881|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  882|      0|    ObjectTypeIndexer, Base,
  |  |  883|      0|    NodePtr, id, true,
  |  |  884|      0|    NodePtr, key, false,
  |  |  885|      0|    NodePtr, value, false,
  |  |  886|      0|    NodeBoolean, static, false,
  |  |  887|      0|    NodePtr, variance, true)
  |  |  888|       |
  |  |  889|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  890|      0|    Variance, Base,
  |  |  891|      0|    NodeLabel, kind, false)
  |  |  892|       |
  |  |  893|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  894|      0|    TypeParameterDeclaration, Base,
  |  |  895|      0|    NodeList, params, false)
  |  |  896|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  897|      0|    TypeParameter, Base,
  |  |  898|      0|    NodeLabel, name, false,
  |  |  899|      0|    NodePtr, bound, true,
  |  |  900|      0|    NodePtr, variance, true,
  |  |  901|      0|    NodePtr, default, true)
  |  |  902|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  903|      0|    TypeParameterInstantiation, Base,
  |  |  904|      0|    NodeList, params, false)
  |  |  905|       |
  |  |  906|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  907|      0|    TypeCastExpression, Base,
  |  |  908|      0|    NodePtr, expression, false,
  |  |  909|      0|    NodePtr, typeAnnotation, false)
  |  |  910|       |
  |  |  911|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  912|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  913|      0|    DeclaredPredicate, Base,
  |  |  914|      0|    NodePtr, value, false)
  |  |  915|       |
  |  |  916|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  917|      0|    EnumDeclaration, Base,
  |  |  918|      0|    NodePtr, id, false,
  |  |  919|      0|    NodePtr, body, false)
  |  |  920|       |
  |  |  921|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  922|      0|    EnumStringBody, Base,
  |  |  923|      0|    NodeList, members, false,
  |  |  924|      0|    NodeBoolean, explicitType, false,
  |  |  925|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  926|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  927|      0|    EnumNumberBody, Base,
  |  |  928|      0|    NodeList, members, false,
  |  |  929|      0|    NodeBoolean, explicitType, false,
  |  |  930|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  931|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  932|      0|    EnumBooleanBody, Base,
  |  |  933|      0|    NodeList, members, false,
  |  |  934|      0|    NodeBoolean, explicitType, false,
  |  |  935|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  936|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  937|      0|    EnumSymbolBody, Base,
  |  |  938|      0|    NodeList, members, false,
  |  |  939|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  940|       |
  |  |  941|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  942|      0|    EnumDefaultedMember, Base,
  |  |  943|      0|    NodePtr, id, false)
  |  |  944|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  945|      0|    EnumStringMember, Base,
  |  |  946|      0|    NodePtr, id, false,
  |  |  947|      0|    NodePtr, init, false)
  |  |  948|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  949|      0|    EnumNumberMember, Base,
  |  |  950|      0|    NodePtr, id, false,
  |  |  951|      0|    NodePtr, init, false)
  |  |  952|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  953|      0|    EnumBooleanMember, Base,
  |  |  954|      0|    NodePtr, id, false,
  |  |  955|      0|    NodePtr, init, false)
  |  |  956|       |
  |  |  957|      0|#endif
  |  |  958|       |
  |  |  959|      0|#if HERMES_PARSE_TS
  |  |  960|       |
  |  |  961|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  962|      0|    TSTypeAnnotation, Base,
  |  |  963|      0|    NodePtr, typeAnnotation, false)
  |  |  964|       |
  |  |  965|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  966|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  967|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  968|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  969|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  970|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  971|      0|ESTREE_NODE_0_ARGS(TSThisType, Base)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  972|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  973|      0|    TSLiteralType, Base,
  |  |  974|      0|    NodePtr, literal, false)
  |  |  975|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  976|      0|    TSIndexedAccessType, Base,
  |  |  977|      0|    NodePtr, objectType, false,
  |  |  978|      0|    NodePtr, indexType, false)
  |  |  979|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  980|      0|    TSArrayType, Base,
  |  |  981|      0|    NodePtr, elementType, false)
  |  |  982|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  983|      0|    TSTypeReference, Base,
  |  |  984|      0|    NodePtr, typeName, false,
  |  |  985|      0|    NodePtr, typeParameters, true)
  |  |  986|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  987|      0|    TSQualifiedName, Base,
  |  |  988|      0|    NodePtr, left, false,
  |  |  989|      0|    NodePtr, right, true)
  |  |  990|       |
  |  |  991|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  992|      0|    TSFunctionType, Base,
  |  |  993|      0|    NodeList, params, false,
  |  |  994|      0|    NodePtr, returnType, false,
  |  |  995|      0|    NodePtr, typeParameters, true)
  |  |  996|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  997|      0|    TSConstructorType, Base,
  |  |  998|      0|    NodeList, params, false,
  |  |  999|      0|    NodePtr, returnType, false,
  |  | 1000|      0|    NodePtr, typeParameters, true)
  |  | 1001|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1002|      0|    TSTypePredicate, Base,
  |  | 1003|      0|    NodePtr, parameterName, false,
  |  | 1004|      0|    NodePtr, typeAnnotation, false)
  |  | 1005|       |
  |  | 1006|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1007|      0|    TSTupleType, Base,
  |  | 1008|      0|    NodeList, elementTypes, false)
  |  | 1009|       |
  |  | 1010|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1011|      0|    TSTypeAssertion, Base,
  |  | 1012|      0|    NodePtr, typeAnnotation, false,
  |  | 1013|      0|    NodePtr, expression, false)
  |  | 1014|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1015|      0|    TSAsExpression, Base,
  |  | 1016|      0|    NodePtr, expression, false,
  |  | 1017|      0|    NodePtr, typeAnnotation, false)
  |  | 1018|       |
  |  | 1019|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  304|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1020|      0|    TSParameterProperty, Base,
  |  | 1021|      0|    NodePtr, parameter, false,
  |  | 1022|      0|    NodeLabel, accessibility, true,
  |  | 1023|      0|    NodeBoolean, readonly, false,
  |  | 1024|      0|    NodeBoolean, static, false,
  |  | 1025|      0|    NodeBoolean, export, false)
  |  | 1026|       |
  |  | 1027|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1028|      0|    TSTypeAliasDeclaration, Base,
  |  | 1029|      0|    NodePtr, id, false,
  |  | 1030|      0|    NodePtr, typeParameters, true,
  |  | 1031|      0|    NodePtr, typeAnnotation, false)
  |  | 1032|       |
  |  | 1033|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1034|      0|    TSInterfaceDeclaration, Base,
  |  | 1035|      0|    NodePtr, id, false,
  |  | 1036|      0|    NodePtr, body, false,
  |  | 1037|      0|    NodeList, extends, false,
  |  | 1038|      0|    NodePtr, typeParameters, true)
  |  | 1039|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1040|      0|    TSInterfaceHeritage, Base,
  |  | 1041|      0|    NodePtr, expression, false,
  |  | 1042|      0|    NodePtr, typeParameters, true)
  |  | 1043|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1044|      0|    TSInterfaceBody, Base,
  |  | 1045|      0|    NodeList, body, false)
  |  | 1046|       |
  |  | 1047|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1048|      0|    TSEnumDeclaration, Base,
  |  | 1049|      0|    NodePtr, id, false,
  |  | 1050|      0|    NodeList, members, false)
  |  | 1051|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1052|      0|    TSEnumMember, Base,
  |  | 1053|      0|    NodePtr, id, false,
  |  | 1054|      0|    NodePtr, initializer, true)
  |  | 1055|       |
  |  | 1056|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1057|      0|    TSModuleDeclaration, Base,
  |  | 1058|      0|    NodePtr, id, false,
  |  | 1059|      0|    NodePtr, body, false)
  |  | 1060|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1061|      0|    TSModuleBlock, Base,
  |  | 1062|      0|    NodeList, body, false)
  |  | 1063|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1064|      0|    TSModuleMember, Base,
  |  | 1065|      0|    NodePtr, id, false,
  |  | 1066|      0|    NodePtr, initializer, true)
  |  | 1067|       |
  |  | 1068|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1069|      0|    TSTypeParameterDeclaration, Base,
  |  | 1070|      0|    NodeList, params, false)
  |  | 1071|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1072|      0|    TSTypeParameter, Base,
  |  | 1073|      0|    NodePtr, name, false,
  |  | 1074|      0|    NodePtr, constraint, true,
  |  | 1075|      0|    NodePtr, default, true)
  |  | 1076|       |
  |  | 1077|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1078|      0|    TSTypeParameterInstantiation, Base,
  |  | 1079|      0|    NodeList, params, false)
  |  | 1080|       |
  |  | 1081|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1082|      0|    TSUnionType, Base,
  |  | 1083|      0|    NodeList, types, false)
  |  | 1084|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1085|      0|    TSIntersectionType, Base,
  |  | 1086|      0|    NodeList, types, false)
  |  | 1087|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1088|      0|    TSTypeQuery, Base,
  |  | 1089|      0|    NodePtr, exprName, false)
  |  | 1090|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1091|      0|    TSConditionalType, Base,
  |  | 1092|      0|    NodePtr, extendsType, false,
  |  | 1093|      0|    NodePtr, checkType, false,
  |  | 1094|      0|    NodePtr, trueType, false,
  |  | 1095|      0|    NodePtr, falseTYpe, false)
  |  | 1096|       |
  |  | 1097|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1098|      0|    TSTypeLiteral, Base,
  |  | 1099|      0|    NodeList, members, false)
  |  | 1100|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  307|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1101|      0|    TSPropertySignature, Base,
  |  | 1102|      0|    NodePtr, key, false,
  |  | 1103|      0|    NodePtr, typeAnnotation, true,
  |  | 1104|      0|    NodePtr, initializer, true,
  |  | 1105|      0|    NodeBoolean, optional, false,
  |  | 1106|      0|    NodeBoolean, computed, false,
  |  | 1107|      0|    NodeBoolean, readonly, false,
  |  | 1108|      0|    NodeBoolean, static, false,
  |  | 1109|      0|    NodeBoolean, export, false)
  |  | 1110|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  303|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1111|      0|    TSMethodSignature, Base,
  |  | 1112|      0|    NodePtr, key, false,
  |  | 1113|      0|    NodeList, params, false,
  |  | 1114|      0|    NodePtr, returnType, true,
  |  | 1115|      0|    NodeBoolean, computed, false)
  |  | 1116|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1117|      0|    TSIndexSignature, Base,
  |  | 1118|      0|    NodeList, parameters, false,
  |  | 1119|      0|    NodePtr, typeAnnotation, true)
  |  | 1120|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1121|      0|    TSCallSignatureDeclaration, Base,
  |  | 1122|      0|    NodeList, params, false,
  |  | 1123|      0|    NodePtr, returnType, true)
  |  | 1124|       |
  |  | 1125|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  301|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1126|      0|    TSModifiers, Base,
  |  | 1127|      0|    NodeLabel, accessibility, false,
  |  | 1128|      0|    NodeBoolean, readonly, false)
  |  | 1129|      0|#endif
  |  | 1130|       |
  |  | 1131|       |// ================================================
  |  | 1132|       |
  |  | 1133|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1134|       |
  |  | 1135|      0|ESTREE_FIRST(Cover, Base)
  |  | 1136|       |
  |  | 1137|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1138|      0|ESTREE_NODE_0_ARGS(CoverEmptyArgs, Cover)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1139|       |
  |  | 1140|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1141|       |//      "(" Expression "," ")"
  |  | 1142|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1143|       |// SequenceExpression.
  |  | 1144|      0|ESTREE_NODE_0_ARGS(CoverTrailingComma, Cover)
  |  |  ------------------
  |  |  |  |  299|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1145|       |
  |  | 1146|       |// CoverInitializer
  |  | 1147|       |// This is used for destructuring object assignment with initializers. It
  |  | 1148|       |// will be the value node of a Property.
  |  | 1149|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1150|      0|    CoverInitializer, Cover,
  |  | 1151|      0|    NodePtr, init, false)
  |  | 1152|       |
  |  | 1153|       |// CoverRestElement
  |  | 1154|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1155|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1156|       |// to the actual RestElement.
  |  | 1157|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  300|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1158|      0|    CoverRestElement, Cover,
  |  | 1159|      0|    NodePtr, rest, false)
  |  | 1160|       |
  |  | 1161|       |// CoverTypedIdentifier
  |  | 1162|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1163|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1164|       |// 'left' is the identifier which is typed.
  |  | 1165|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1166|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1167|       |//   with a type annotation.
  |  | 1168|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  302|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  296|      0|  case NodeKind::NAME: \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (296:3): [True: 0, False: 1.38M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  297|      0|    return visitChildren(v, cast<NAME##Node>(node));
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1169|      0|    CoverTypedIdentifier, Cover,
  |  | 1170|      0|    NodePtr, left, false,
  |  | 1171|      0|    NodePtr, right, true,
  |  | 1172|      0|    NodeBoolean, optional, false)
  |  | 1173|       |
  |  | 1174|      0|ESTREE_LAST(Cover)
  |  | 1175|       |
  |  | 1176|      0|#endif
  |  | 1177|       |
  |  | 1178|      0|#undef ESTREE_FIRST
  |  | 1179|      0|#undef ESTREE_LAST
  |  | 1180|      0|#undef ESTREE_WRAP
  |  | 1181|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1182|       |
  |  | 1183|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1184|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1185|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1186|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1187|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1188|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1189|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1190|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1191|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1192|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  311|       |
  312|  1.38M|#undef VISIT
  313|  1.38M|    }
  314|  1.38M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_9EmptyNodeE:
  326|     12|  static void visitChildren(Visitor &v, NAME##Node *) {}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_11ProgramNodeE:
  329|     65|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|     65|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|     65|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     65|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     65|    visit(visitor, field, parent);                           \
  |  |  320|     65|  } else {                                                   \
  |  |  321|     65|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     65|  }
  ------------------
  331|     65|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_RN4llvh12simple_ilistINS0_4NodeEJEEEPS8_:
  227|   284k|  static UnmodifiedT visit(Visitor &v, NodeList &list, Node *parent) {
  228|   284k|    if constexpr (readOnlyVisitor) {
  ------------------
  |  Branch (228:19): [Folded - Ignored]
  ------------------
  229|       |      // Read-only visitors don't need the extra overhead of checking visit's
  230|       |      // return value.
  231|  1.30M|      for (Node &node : list) {
  ------------------
  |  Branch (231:23): [True: 1.30M, False: 284k]
  ------------------
  232|  1.30M|        visit(v, &node, parent);
  233|  1.30M|      }
  234|   284k|    } else {
  235|   284k|      for (auto it = list.begin(), end = list.end(); it != end;) {
  236|   284k|        auto curr = it++;
  237|       |
  238|       |        // Temporarily remove curr from list, which is important in case v
  239|       |        // repurposes the node and inserts it into another list.
  240|   284k|        list.erase(curr);
  241|       |
  242|   284k|        VisitResult res = visit(v, &*curr, parent);
  243|   284k|        if (std::holds_alternative<Node *>(res)) {
  244|       |          // The visitor decided to return a new node; insert it.
  245|   284k|          list.insert(it, *std::get<Node *>(res));
  246|   284k|        } else if (std::holds_alternative<UnmodifiedT>(res)) {
  247|       |          // The visitor didn't do anything to the old node; insert it back.
  248|   284k|          list.insert(it, *curr);
  249|   284k|        } else {
  250|       |          // The visitor decided to remove the node; do nothing, as the node's
  251|       |          // been removed already.
  252|   284k|          assert(
  253|   284k|              std::holds_alternative<RemovedT>(res) &&
  254|   284k|              "Unexpected VisitResult alternative.");
  255|   284k|        }
  256|   284k|      }
  257|   284k|    }
  258|   284k|    return Unmodified;
  259|   284k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_9EmptyNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     12|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     12|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     12|      v.visit(node);
   48|     12|      return Unmodified;
   49|     12|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     12|      return v.visit(node);
   52|     12|    }
   53|     12|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_11ProgramNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     65|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     65|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     65|      v.visit(node);
   48|     65|      return Unmodified;
   49|     65|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     65|      return v.visit(node);
   52|     65|    }
   53|     65|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_27ArrowFunctionExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   114k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   114k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   114k|      v.visit(node);
   48|   114k|      return Unmodified;
   49|   114k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   114k|      return v.visit(node);
   52|   114k|    }
   53|   114k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_23FunctionDeclarationNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    768|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    768|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    768|      v.visit(node);
   48|    768|      return Unmodified;
   49|    768|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|    768|      return v.visit(node);
   52|    768|    }
   53|    768|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18WhileStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      1|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      1|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      1|      v.visit(node);
   48|      1|      return Unmodified;
   49|      1|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|      1|      return v.visit(node);
   52|      1|    }
   53|      1|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18EmptyStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   131k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   131k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   131k|      v.visit(node);
   48|   131k|      return Unmodified;
   49|   131k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   131k|      return v.visit(node);
   52|   131k|    }
   53|   131k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18BlockStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   115k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   115k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   115k|      v.visit(node);
   48|   115k|      return Unmodified;
   49|   115k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   115k|      return v.visit(node);
   52|   115k|    }
   53|   115k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_21ContinueStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      3|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      3|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      3|      v.visit(node);
   48|      3|      return Unmodified;
   49|      3|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|      3|      return v.visit(node);
   52|      3|    }
   53|      3|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19ReturnStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   114k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   114k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   114k|      v.visit(node);
   48|   114k|      return Unmodified;
   49|   114k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   114k|      return v.visit(node);
   52|   114k|    }
   53|   114k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20LabeledStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  42.8k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  42.8k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  42.8k|      v.visit(node);
   48|  42.8k|      return Unmodified;
   49|  42.8k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  42.8k|      return v.visit(node);
   52|  42.8k|    }
   53|  42.8k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_23ExpressionStatementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   143k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   143k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   143k|      v.visit(node);
   48|   143k|      return Unmodified;
   49|   143k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   143k|      return v.visit(node);
   52|   143k|    }
   53|   143k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18BooleanLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  2.01k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  2.01k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  2.01k|      v.visit(node);
   48|  2.01k|      return Unmodified;
   49|  2.01k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  2.01k|      return v.visit(node);
   52|  2.01k|    }
   53|  2.01k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17StringLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  5.98k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  5.98k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  5.98k|      v.visit(node);
   48|  5.98k|      return Unmodified;
   49|  5.98k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  5.98k|      return v.visit(node);
   52|  5.98k|    }
   53|  5.98k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18NumericLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   738k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   738k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   738k|      v.visit(node);
   48|   738k|      return Unmodified;
   49|   738k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   738k|      return v.visit(node);
   52|   738k|    }
   53|   738k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17RegExpLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  11.4k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  11.4k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  11.4k|      v.visit(node);
   48|  11.4k|      return Unmodified;
   49|  11.4k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  11.4k|      return v.visit(node);
   52|  11.4k|    }
   53|  11.4k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_17BigIntLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     11|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     11|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     11|      v.visit(node);
   48|     11|      return Unmodified;
   49|     11|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     11|      return v.visit(node);
   52|     11|    }
   53|     11|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_22SequenceExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    189|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    189|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    189|      v.visit(node);
   48|    189|      return Unmodified;
   49|    189|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|    189|      return v.visit(node);
   52|    189|    }
   53|    189|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20ObjectExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  5.08k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  5.08k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  5.08k|      v.visit(node);
   48|  5.08k|      return Unmodified;
   49|  5.08k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  5.08k|      return v.visit(node);
   52|  5.08k|    }
   53|  5.08k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19ArrayExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  33.4k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  33.4k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  33.4k|      v.visit(node);
   48|  33.4k|      return Unmodified;
   49|  33.4k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  33.4k|      return v.visit(node);
   52|  33.4k|    }
   53|  33.4k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_18CallExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      8|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      8|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      8|      v.visit(node);
   48|      8|      return Unmodified;
   49|      8|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|      8|      return v.visit(node);
   52|      8|    }
   53|      8|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_24AssignmentExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  4.14k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  4.14k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  4.14k|      v.visit(node);
   48|  4.14k|      return Unmodified;
   49|  4.14k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  4.14k|      return v.visit(node);
   52|  4.14k|    }
   53|  4.14k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19UnaryExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  4.09k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  4.09k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  4.09k|      v.visit(node);
   48|  4.09k|      return Unmodified;
   49|  4.09k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  4.09k|      return v.visit(node);
   52|  4.09k|    }
   53|  4.09k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20UpdateExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     28|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     28|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     28|      v.visit(node);
   48|     28|      return Unmodified;
   49|     28|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     28|      return v.visit(node);
   52|     28|    }
   53|     28|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20MemberExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  1.64k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  1.64k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  1.64k|      v.visit(node);
   48|  1.64k|      return Unmodified;
   49|  1.64k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  1.64k|      return v.visit(node);
   52|  1.64k|    }
   53|  1.64k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_28OptionalMemberExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  1.75k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  1.75k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  1.75k|      v.visit(node);
   48|  1.75k|      return Unmodified;
   49|  1.75k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  1.75k|      return v.visit(node);
   52|  1.75k|    }
   53|  1.75k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_21LogicalExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  4.30k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  4.30k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  4.30k|      v.visit(node);
   48|  4.30k|      return Unmodified;
   49|  4.30k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  4.30k|      return v.visit(node);
   52|  4.30k|    }
   53|  4.30k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_25ConditionalExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     90|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     90|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     90|      v.visit(node);
   48|     90|      return Unmodified;
   49|     90|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     90|      return v.visit(node);
   52|     90|    }
   53|     90|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_20BinaryExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  25.8k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  25.8k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  25.8k|      v.visit(node);
   48|  25.8k|      return Unmodified;
   49|  25.8k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  25.8k|      return v.visit(node);
   52|  25.8k|    }
   53|  25.8k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_14IdentifierNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   327k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   327k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   327k|      v.visit(node);
   48|   327k|      return Unmodified;
   49|   327k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   327k|      return v.visit(node);
   52|   327k|    }
   53|   327k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_22VariableDeclaratorNodeEvE4callERS4_PS5_PNS0_4NodeE:
   71|      7|  static auto call(V &v, N *node, Node *parent) {
   72|      7|    if constexpr (std::is_same_v<void, decltype(v.visit(node, parent))>) {
  ------------------
  |  Branch (72:19): [Folded - Ignored]
  ------------------
   73|       |      // Visitor returning void is assumed to preserve the AST.
   74|      7|      v.visit(node, parent);
   75|      7|      return Unmodified;
   76|      7|    } else {
   77|       |      // Visitor returns a status; pipe it back to the caller.
   78|      7|      return v.visit(node, parent);
   79|      7|    }
   80|      7|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_23VariableDeclarationNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|      7|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|      7|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|      7|      v.visit(node);
   48|      7|      return Unmodified;
   49|      7|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|      7|      return v.visit(node);
   52|      7|    }
   53|      7|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19TemplateLiteralNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  64.8k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  64.8k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  64.8k|      v.visit(node);
   48|  64.8k|      return Unmodified;
   49|  64.8k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  64.8k|      return v.visit(node);
   52|  64.8k|    }
   53|  64.8k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_28TaggedTemplateExpressionNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|    285|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|    285|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|    285|      v.visit(node);
   48|    285|      return Unmodified;
   49|    285|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|    285|      return v.visit(node);
   52|    285|    }
   53|    285|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_19TemplateElementNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|   131k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|   131k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|   131k|      v.visit(node);
   48|   131k|      return Unmodified;
   49|   131k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|   131k|      return v.visit(node);
   52|   131k|    }
   53|   131k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_12PropertyNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|  5.97k|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|  5.97k|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|  5.97k|      v.visit(node);
   48|  5.97k|      return Unmodified;
   49|  5.97k|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|  5.97k|      return v.visit(node);
   52|  5.97k|    }
   53|  5.97k|  }
_ZN6hermes6ESTree6detail11VisitCallerINS_3sem17SemanticValidatorENS0_16ArrayPatternNodeEvE4callERS4_PS5_PNS0_4NodeE:
   43|     96|  static auto call(V &v, N *node, Node *) {
   44|       |    // The visitor does not need the parent node.
   45|     96|    if constexpr (std::is_same_v<void, decltype(v.visit(node))>) {
  ------------------
  |  Branch (45:19): [Folded - Ignored]
  ------------------
   46|       |      // Visitor returning void is assumed to preserve the AST.
   47|     96|      v.visit(node);
   48|     96|      return Unmodified;
   49|     96|    } else {
   50|       |      // Visitor returns a status; pipe it back to the caller.
   51|     96|      return v.visit(node);
   52|     96|    }
   53|     96|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_PNS0_4NodeES7_:
  181|  2.15M|  static VisitResult visit(Visitor &v, Node *node, Node *parent) {
  182|  2.15M|    if (!node)
  ------------------
  |  Branch (182:9): [True: 114k, False: 2.03M]
  ------------------
  183|   114k|      return Unmodified;
  184|  2.03M|    if (LLVM_UNLIKELY(!v.incRecursionDepth(node)))
  ------------------
  |  |  189|  2.03M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4.08k, False: 2.03M]
  |  |  ------------------
  ------------------
  185|  4.08k|      return Unmodified;
  186|       |
  187|  2.03M|    VisitResult result;
  188|  2.03M|    switch (node->getKind()) {
  189|      0|      default:
  ------------------
  |  Branch (189:7): [True: 0, False: 2.03M]
  ------------------
  190|      0|        llvm_unreachable("invalid node kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  191|       |
  192|      0|#define VISIT(NAME)                                          \
  193|      0|  case NodeKind::NAME:                                       \
  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  196|      0|    break;
  197|       |
  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  204|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  205|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  206|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  207|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) VISIT(NAME)
  208|       |
  209|  2.03M|#include "hermes/AST/ESTree.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |/// This file defines the ESTree nodes, which are documented in:
  |  |    9|       |/// https://github.com/estree/estree/blob/master/spec.md
  |  |   10|       |///
  |  |   11|       |/// Each parameter is described by three tokens: Type, Name and Optional.
  |  |   12|       |
  |  |   13|     12|#include "hermes/AST/Config.h"
  |  |   14|       |
  |  |   15|       |// clang-format off
  |  |   16|       |
  |  |   17|       |// Defines the start of range of nodes with the same base
  |  |   18|     12|#ifndef ESTREE_FIRST
  |  |   19|     12|#define ESTREE_FIRST(NAME, BASE)
  |  |   20|     12|#endif
  |  |   21|       |
  |  |   22|       |// Defines the end of range of nodes with the same base
  |  |   23|     12|#ifndef ESTREE_LAST
  |  |   24|     12|#define ESTREE_LAST(NAME)
  |  |   25|     12|#endif
  |  |   26|       |
  |  |   27|       |// Ignores the given field if it is "empty" (e.g. nullptr, empty list).
  |  |   28|     12|#ifndef ESTREE_IGNORE_IF_EMPTY
  |  |   29|     12|#define ESTREE_IGNORE_IF_EMPTY(NODE, FIELD)
  |  |   30|     12|#endif
  |  |   31|       |
  |  |   32|     12|ESTREE_NODE_0_ARGS(Empty, Base)
  |  |  ------------------
  |  |  |  |  198|     12|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     12|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 12, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     12|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     12|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     12|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   33|      0|ESTREE_NODE_0_ARGS(Metadata, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   34|       |
  |  |   35|      0|ESTREE_FIRST(FunctionLike, Base)
  |  |   36|     65|ESTREE_NODE_1_ARGS(Program, FunctionLike,
  |  |  ------------------
  |  |  |  |  199|     65|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     65|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 65, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     65|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     65|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     65|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   37|      0|    NodeList, body, false)
  |  |   38|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   39|      0|    FunctionExpression, FunctionLike,
  |  |   40|      0|    NodePtr, id, true,
  |  |   41|      0|    NodeList, params, false,
  |  |   42|      0|    NodePtr, body, false,
  |  |   43|      0|    NodePtr, typeParameters, true,
  |  |   44|      0|    NodePtr, returnType, true,
  |  |   45|      0|    NodePtr, predicate, true,
  |  |   46|      0|    NodeBoolean, generator, false,
  |  |   47|      0|    NodeBoolean, async, false)
  |  |   48|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, typeParameters)
  |  |   49|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, returnType)
  |  |   50|      0|ESTREE_IGNORE_IF_EMPTY(FunctionExpression, predicate)
  |  |   51|   114k|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|   114k|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   114k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 114k, False: 1.91M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   114k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   114k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   114k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   52|      0|    ArrowFunctionExpression, FunctionLike,
  |  |   53|      0|    NodePtr, id, true,
  |  |   54|      0|    NodeList, params, false,
  |  |   55|      0|    NodePtr, body, false,
  |  |   56|      0|    NodePtr, typeParameters, true,
  |  |   57|      0|    NodePtr, returnType, true,
  |  |   58|      0|    NodePtr, predicate, true,
  |  |   59|      0|    NodeBoolean, expression, false,
  |  |   60|      0|    NodeBoolean, async, false)
  |  |   61|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, typeParameters)
  |  |   62|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, returnType)
  |  |   63|      0|ESTREE_IGNORE_IF_EMPTY(ArrowFunctionExpression, predicate)
  |  |   64|    768|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|    768|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    768|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 768, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    768|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    768|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    768|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|      0|    FunctionDeclaration, FunctionLike,
  |  |   66|      0|    NodePtr, id, true,
  |  |   67|      0|    NodeList, params, false,
  |  |   68|      0|    NodePtr, body, false,
  |  |   69|      0|    NodePtr, typeParameters, true,
  |  |   70|      0|    NodePtr, returnType, true,
  |  |   71|      0|    NodePtr, predicate, true,
  |  |   72|      0|    NodeBoolean, generator, false,
  |  |   73|      0|    NodeBoolean, async, false)
  |  |   74|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, typeParameters)
  |  |   75|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, returnType)
  |  |   76|      0|ESTREE_IGNORE_IF_EMPTY(FunctionDeclaration, predicate)
  |  |   77|      0|ESTREE_LAST(FunctionLike)
  |  |   78|       |
  |  |   79|      0|ESTREE_FIRST(Statement, Base)
  |  |   80|       |
  |  |   81|      0|ESTREE_FIRST(LoopStatement, Statement)
  |  |   82|      1|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      1|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      1|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      1|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      1|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      1|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   83|      0|    WhileStatement,
  |  |   84|      0|    LoopStatement,
  |  |   85|      0|    NodePtr,
  |  |   86|      0|    body,
  |  |   87|      0|    false,
  |  |   88|      0|    NodePtr,
  |  |   89|      0|    test,
  |  |   90|      0|    false)
  |  |   91|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   92|      0|    DoWhileStatement,
  |  |   93|      0|    LoopStatement,
  |  |   94|      0|    NodePtr,
  |  |   95|      0|    body,
  |  |   96|      0|    false,
  |  |   97|      0|    NodePtr,
  |  |   98|      0|    test,
  |  |   99|      0|    false)
  |  |  100|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  101|      0|    ForInStatement,
  |  |  102|      0|    LoopStatement,
  |  |  103|      0|    NodePtr,
  |  |  104|      0|    left,
  |  |  105|      0|    false,
  |  |  106|      0|    NodePtr,
  |  |  107|      0|    right,
  |  |  108|      0|    false,
  |  |  109|      0|    NodePtr,
  |  |  110|      0|    body,
  |  |  111|      0|    false)
  |  |  112|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|    ForOfStatement, LoopStatement,
  |  |  114|      0|    NodePtr, left, false,
  |  |  115|      0|    NodePtr, right, false,
  |  |  116|      0|    NodePtr, body, false,
  |  |  117|      0|    NodeBoolean, await, false)
  |  |  118|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      0|    ForStatement,
  |  |  120|      0|    LoopStatement,
  |  |  121|      0|    NodePtr,
  |  |  122|      0|    init,
  |  |  123|      0|    true,
  |  |  124|      0|    NodePtr,
  |  |  125|      0|    test,
  |  |  126|      0|    true,
  |  |  127|      0|    NodePtr,
  |  |  128|      0|    update,
  |  |  129|      0|    true,
  |  |  130|      0|    NodePtr,
  |  |  131|      0|    body,
  |  |  132|      0|    false)
  |  |  133|      0|ESTREE_LAST(LoopStatement)
  |  |  134|       |
  |  |  135|      0|ESTREE_NODE_0_ARGS(DebuggerStatement, Statement)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|   131k|ESTREE_NODE_0_ARGS(EmptyStatement, Statement)
  |  |  ------------------
  |  |  |  |  198|   131k|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   131k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 131k, False: 1.90M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   131k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   131k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   131k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|   115k|ESTREE_NODE_1_ARGS(BlockStatement, Statement, NodeList, body, false)
  |  |  ------------------
  |  |  |  |  199|   115k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   115k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 115k, False: 1.91M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   115k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   115k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   115k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|      0|ESTREE_NODE_1_ARGS(BreakStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|      3|ESTREE_NODE_1_ARGS(ContinueStatement, Statement, NodePtr, label, true)
  |  |  ------------------
  |  |  |  |  199|      3|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      3|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 3, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      3|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      3|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      3|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  140|      0|ESTREE_NODE_1_ARGS(ThrowStatement, Statement, NodePtr, argument, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|   114k|ESTREE_NODE_1_ARGS(ReturnStatement, Statement, NodePtr, argument, true)
  |  |  ------------------
  |  |  |  |  199|   114k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   114k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 114k, False: 1.91M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   114k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   114k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   114k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|      0|    WithStatement,
  |  |  144|      0|    Statement,
  |  |  145|      0|    NodePtr,
  |  |  146|      0|    object,
  |  |  147|      0|    false,
  |  |  148|      0|    NodePtr,
  |  |  149|      0|    body,
  |  |  150|      0|    false)
  |  |  151|       |
  |  |  152|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|      0|    SwitchStatement,
  |  |  154|      0|    Statement,
  |  |  155|      0|    NodePtr,
  |  |  156|      0|    discriminant,
  |  |  157|      0|    false,
  |  |  158|      0|    NodeList,
  |  |  159|      0|    cases,
  |  |  160|      0|    false)
  |  |  161|       |
  |  |  162|  42.8k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|  42.8k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  42.8k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 42.8k, False: 1.98M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  42.8k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  42.8k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  42.8k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|      0|    LabeledStatement,
  |  |  164|      0|    Statement,
  |  |  165|      0|    NodePtr,
  |  |  166|      0|    label,
  |  |  167|      0|    false,
  |  |  168|      0|    NodePtr,
  |  |  169|      0|    body,
  |  |  170|      0|    false)
  |  |  171|       |
  |  |  172|   143k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|   143k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   143k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 143k, False: 1.88M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   143k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   143k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   143k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  173|      0|    ExpressionStatement,
  |  |  174|      0|    Statement,
  |  |  175|      0|    NodePtr,
  |  |  176|      0|    expression,
  |  |  177|      0|    false,
  |  |  178|      0|    NodeString,
  |  |  179|      0|    directive,
  |  |  180|      0|    true)
  |  |  181|       |
  |  |  182|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  183|      0|    TryStatement,
  |  |  184|      0|    Statement,
  |  |  185|      0|    NodePtr,
  |  |  186|      0|    block,
  |  |  187|      0|    false,
  |  |  188|      0|    NodePtr,
  |  |  189|      0|    handler,
  |  |  190|      0|    true,
  |  |  191|      0|    NodePtr,
  |  |  192|      0|    finalizer,
  |  |  193|      0|    true)
  |  |  194|       |
  |  |  195|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  196|      0|    IfStatement,
  |  |  197|      0|    Statement,
  |  |  198|      0|    NodePtr,
  |  |  199|      0|    test,
  |  |  200|      0|    false,
  |  |  201|      0|    NodePtr,
  |  |  202|      0|    consequent,
  |  |  203|      0|    false,
  |  |  204|      0|    NodePtr,
  |  |  205|      0|    alternate,
  |  |  206|      0|    true)
  |  |  207|       |
  |  |  208|      0|ESTREE_LAST(Statement)
  |  |  209|       |
  |  |  210|      0|ESTREE_NODE_0_ARGS(NullLiteral, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  211|  2.01k|ESTREE_NODE_1_ARGS(BooleanLiteral, Base, NodeBoolean, value, false)
  |  |  ------------------
  |  |  |  |  199|  2.01k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  2.01k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 2.01k, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  2.01k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  2.01k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  2.01k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  212|  5.98k|ESTREE_NODE_1_ARGS(StringLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  199|  5.98k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  5.98k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 5.98k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  5.98k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  5.98k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  5.98k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  213|   738k|ESTREE_NODE_1_ARGS(NumericLiteral, Base, NodeNumber, value, false)
  |  |  ------------------
  |  |  |  |  199|   738k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   738k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 738k, False: 1.29M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   738k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   738k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   738k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  214|  11.4k|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|  11.4k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  11.4k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 11.4k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  11.4k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  11.4k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  11.4k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  215|      0|    RegExpLiteral,
  |  |  216|      0|    Base,
  |  |  217|      0|    NodeLabel,
  |  |  218|      0|    pattern,
  |  |  219|      0|    false,
  |  |  220|      0|    NodeLabel,
  |  |  221|      0|    flags,
  |  |  222|      0|    false)
  |  |  223|     11|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|     11|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     11|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 11, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     11|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     11|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     11|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  224|      0|    BigIntLiteral, Base,
  |  |  225|      0|    NodeLabel, bigint, false)
  |  |  226|       |
  |  |  227|      0|ESTREE_NODE_0_ARGS(ThisExpression, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  228|      0|ESTREE_NODE_0_ARGS(Super, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  229|    189|ESTREE_NODE_1_ARGS(SequenceExpression, Base, NodeList, expressions, false)
  |  |  ------------------
  |  |  |  |  199|    189|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    189|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 189, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    189|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    189|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    189|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  230|  5.08k|ESTREE_NODE_1_ARGS(ObjectExpression, Base, NodeList, properties, false)
  |  |  ------------------
  |  |  |  |  199|  5.08k|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  5.08k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 5.08k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  5.08k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  5.08k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  5.08k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  231|  33.4k|ESTREE_NODE_2_ARGS(ArrayExpression, Base,
  |  |  ------------------
  |  |  |  |  200|  33.4k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  33.4k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 33.4k, False: 1.99M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  33.4k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  33.4k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  33.4k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  232|      0|    NodeList, elements, false,
  |  |  233|      0|    NodeBoolean, trailingComma, false)
  |  |  234|       |
  |  |  235|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  236|      0|    SpreadElement, Base,
  |  |  237|      0|    NodePtr, argument, false)
  |  |  238|       |
  |  |  239|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  240|      0|    NewExpression, Base,
  |  |  241|      0|    NodePtr, callee, false,
  |  |  242|      0|    NodePtr, typeArguments, true,
  |  |  243|      0|    NodeList, arguments, false)
  |  |  244|      0|ESTREE_IGNORE_IF_EMPTY(NewExpression, typeArguments)
  |  |  245|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  246|      0|    YieldExpression, Base,
  |  |  247|      0|    NodePtr, argument, true,
  |  |  248|      0|    NodeBoolean, delegate, true)
  |  |  249|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  250|      0|    AwaitExpression, Base,
  |  |  251|      0|    NodePtr, argument, false)
  |  |  252|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  253|      0|    ImportExpression, Base,
  |  |  254|      0|    NodePtr, source, false,
  |  |  255|      0|    NodePtr, attributes, true)
  |  |  256|       |
  |  |  257|      0|ESTREE_FIRST(CallExpressionLike, Base)
  |  |  258|      8|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      8|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      8|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 8, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      8|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      8|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      8|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  259|      0|    CallExpression, CallExpressionLike,
  |  |  260|      0|    NodePtr, callee, false,
  |  |  261|      0|    NodePtr, typeArguments, true,
  |  |  262|      0|    NodeList, arguments, false)
  |  |  263|      0|ESTREE_IGNORE_IF_EMPTY(CallExpression, typeArguments)
  |  |  264|       |
  |  |  265|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  266|      0|    OptionalCallExpression, CallExpressionLike,
  |  |  267|      0|    NodePtr, callee, false,
  |  |  268|      0|    NodePtr, typeArguments, true,
  |  |  269|      0|    NodeList, arguments, false,
  |  |  270|      0|    NodeBoolean, optional, false)
  |  |  271|      0|ESTREE_IGNORE_IF_EMPTY(OptionalCallExpression, typeArguments)
  |  |  272|      0|ESTREE_LAST(CallExpressionLike)
  |  |  273|       |
  |  |  274|  4.14k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  4.14k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  4.14k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 4.14k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  4.14k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  4.14k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  4.14k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  275|      0|    AssignmentExpression,
  |  |  276|      0|    Base,
  |  |  277|      0|    NodeLabel,
  |  |  278|      0|    operator,
  |  |  279|      0|    false,
  |  |  280|      0|    NodePtr,
  |  |  281|      0|    left,
  |  |  282|      0|    false,
  |  |  283|      0|    NodePtr,
  |  |  284|      0|    right,
  |  |  285|      0|    false)
  |  |  286|       |
  |  |  287|  4.09k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  4.09k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  4.09k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 4.09k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  4.09k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  4.09k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  4.09k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  288|      0|    UnaryExpression,
  |  |  289|      0|    Base,
  |  |  290|      0|    NodeLabel,
  |  |  291|      0|    operator,
  |  |  292|      0|    false,
  |  |  293|      0|    NodePtr,
  |  |  294|      0|    argument,
  |  |  295|      0|    false,
  |  |  296|      0|    NodeBoolean,
  |  |  297|      0|    prefix,
  |  |  298|      0|    false)
  |  |  299|       |
  |  |  300|     28|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|     28|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     28|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 28, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     28|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     28|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     28|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  301|      0|    UpdateExpression,
  |  |  302|      0|    Base,
  |  |  303|      0|    NodeLabel,
  |  |  304|      0|    operator,
  |  |  305|      0|    false,
  |  |  306|      0|    NodePtr,
  |  |  307|      0|    argument,
  |  |  308|      0|    false,
  |  |  309|      0|    NodeBoolean,
  |  |  310|      0|    prefix,
  |  |  311|      0|    false)
  |  |  312|       |
  |  |  313|      0|ESTREE_FIRST(MemberExpressionLike, Base)
  |  |  314|  1.64k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  1.64k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  1.64k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1.64k, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  1.64k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  1.64k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  1.64k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  315|      0|    MemberExpression, MemberExpressionLike,
  |  |  316|      0|    NodePtr, object, false,
  |  |  317|      0|    NodePtr, property, false,
  |  |  318|      0|    NodeBoolean, computed, false)
  |  |  319|       |
  |  |  320|  1.75k|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|  1.75k|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  1.75k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 1.75k, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  1.75k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  1.75k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  1.75k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  321|      0|    OptionalMemberExpression, MemberExpressionLike,
  |  |  322|      0|    NodePtr, object, false,
  |  |  323|      0|    NodePtr, property, false,
  |  |  324|      0|    NodeBoolean, computed, false,
  |  |  325|      0|    NodeBoolean, optional, false)
  |  |  326|      0|ESTREE_LAST(MemberExpressionLike)
  |  |  327|       |
  |  |  328|  4.30k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  4.30k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  4.30k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 4.30k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  4.30k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  4.30k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  4.30k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  329|      0|    LogicalExpression,
  |  |  330|      0|    Base,
  |  |  331|      0|    NodePtr,
  |  |  332|      0|    left,
  |  |  333|      0|    false,
  |  |  334|      0|    NodePtr,
  |  |  335|      0|    right,
  |  |  336|      0|    false,
  |  |  337|      0|    NodeLabel,
  |  |  338|      0|    operator,
  |  |  339|      0|    false)
  |  |  340|       |
  |  |  341|     90|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|     90|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     90|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 90, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     90|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     90|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     90|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  342|      0|    ConditionalExpression,
  |  |  343|      0|    Base,
  |  |  344|      0|    NodePtr,
  |  |  345|      0|    test,
  |  |  346|      0|    false,
  |  |  347|      0|    NodePtr,
  |  |  348|      0|    alternate,
  |  |  349|      0|    false,
  |  |  350|      0|    NodePtr,
  |  |  351|      0|    consequent,
  |  |  352|      0|    false)
  |  |  353|       |
  |  |  354|  25.8k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|  25.8k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  25.8k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 25.8k, False: 2.00M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  25.8k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  25.8k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  25.8k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  355|      0|    BinaryExpression,
  |  |  356|      0|    Base,
  |  |  357|      0|    NodePtr,
  |  |  358|      0|    left,
  |  |  359|      0|    false,
  |  |  360|      0|    NodePtr,
  |  |  361|      0|    right,
  |  |  362|      0|    false,
  |  |  363|      0|    NodeLabel,
  |  |  364|      0|    operator,
  |  |  365|      0|    false)
  |  |  366|       |
  |  |  367|      0|ESTREE_NODE_1_ARGS(Directive, Base, NodePtr, value, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  368|      0|ESTREE_NODE_1_ARGS(DirectiveLiteral, Base, NodeString, value, false)
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  369|       |
  |  |  370|   327k|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|   327k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   327k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 327k, False: 1.70M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   327k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   327k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   327k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  371|      0|    Identifier, Base,
  |  |  372|      0|    NodeLabel, name, false,
  |  |  373|      0|    NodePtr, typeAnnotation, true,
  |  |  374|      0|    NodeBoolean, optional, false)
  |  |  375|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, typeAnnotation)
  |  |  376|      0|ESTREE_IGNORE_IF_EMPTY(Identifier, optional)
  |  |  377|       |
  |  |  378|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  379|      0|    PrivateName, Base,
  |  |  380|      0|    NodePtr, id, false)
  |  |  381|       |
  |  |  382|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  383|      0|    MetaProperty,
  |  |  384|      0|    Base,
  |  |  385|      0|    NodePtr,
  |  |  386|      0|    meta,
  |  |  387|      0|    false,
  |  |  388|      0|    NodePtr,
  |  |  389|      0|    property,
  |  |  390|      0|    false)
  |  |  391|       |
  |  |  392|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  393|      0|    SwitchCase,
  |  |  394|      0|    Base,
  |  |  395|      0|    NodePtr,
  |  |  396|      0|    test,
  |  |  397|      0|    true,
  |  |  398|      0|    NodeList,
  |  |  399|      0|    consequent,
  |  |  400|      0|    false)
  |  |  401|       |
  |  |  402|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  403|      0|    CatchClause,
  |  |  404|      0|    Base,
  |  |  405|      0|    NodePtr,
  |  |  406|      0|    param,
  |  |  407|      0|    true,
  |  |  408|      0|    NodePtr,
  |  |  409|      0|    body,
  |  |  410|      0|    false)
  |  |  411|       |
  |  |  412|      7|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      7|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      7|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 7, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      7|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      7|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      7|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  413|      0|    VariableDeclarator,
  |  |  414|      0|    Base,
  |  |  415|      0|    NodePtr,
  |  |  416|      0|    init,
  |  |  417|      0|    true,
  |  |  418|      0|    NodePtr,
  |  |  419|      0|    id,
  |  |  420|      0|    false)
  |  |  421|       |
  |  |  422|      7|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      7|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      7|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 7, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      7|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      7|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      7|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  423|      0|    VariableDeclaration,
  |  |  424|      0|    Base,
  |  |  425|      0|    NodeLabel,
  |  |  426|      0|    kind,
  |  |  427|      0|    false,
  |  |  428|      0|    NodeList,
  |  |  429|      0|    declarations,
  |  |  430|      0|    false)
  |  |  431|       |
  |  |  432|  64.8k|ESTREE_NODE_2_ARGS(TemplateLiteral, Base,
  |  |  ------------------
  |  |  |  |  200|  64.8k|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  64.8k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 64.8k, False: 1.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  64.8k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  64.8k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  64.8k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  433|      0|                   NodeList, quasis, false,
  |  |  434|      0|                   NodeList, expressions, false)
  |  |  435|       |
  |  |  436|    285|ESTREE_NODE_2_ARGS(TaggedTemplateExpression, Base,
  |  |  ------------------
  |  |  |  |  200|    285|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|    285|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 285, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|    285|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|    285|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|    285|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  437|      0|                   NodePtr, tag, false,
  |  |  438|      0|                   NodePtr, quasi, false)
  |  |  439|       |
  |  |  440|       |// In ESTree, it is defined as {tail : boolean,
  |  |  441|       |//                              value : {cooked : string, raw : string}},
  |  |  442|       |// we flatten the value field.
  |  |  443|       |// If the template literal is tagged and the text has an invalid escape,
  |  |  444|       |// cooked will be null.
  |  |  445|   131k|ESTREE_NODE_3_ARGS(TemplateElement, Base,
  |  |  ------------------
  |  |  |  |  201|   131k|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|   131k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 131k, False: 1.90M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|   131k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|   131k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|   131k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  446|      0|                   NodeBoolean, tail, false,
  |  |  447|      0|                   NodeString, cooked, true,
  |  |  448|      0|                   NodeLabel, raw, false)
  |  |  449|       |
  |  |  450|  5.97k|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  204|  5.97k|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|  5.97k|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 5.97k, False: 2.02M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|  5.97k|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|  5.97k|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|  5.97k|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  451|      0|    Property, Base,
  |  |  452|      0|    NodePtr, key, false,
  |  |  453|      0|    NodePtr, value, false,
  |  |  454|      0|    NodeLabel, kind, false,
  |  |  455|      0|    NodeBoolean, computed, false,
  |  |  456|      0|    NodeBoolean, method, false,
  |  |  457|      0|    NodeBoolean, shorthand, false)
  |  |  458|       |
  |  |  459|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  205|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  460|      0|    ClassDeclaration, Base,
  |  |  461|      0|    NodePtr, id, true,
  |  |  462|      0|    NodePtr, typeParameters, true,
  |  |  463|      0|    NodePtr, superClass, true,
  |  |  464|      0|    NodePtr, superTypeParameters, true,
  |  |  465|      0|    NodeList, implements, false,
  |  |  466|      0|    NodeList, decorators, false,
  |  |  467|      0|    NodePtr, body, false)
  |  |  468|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, typeParameters)
  |  |  469|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, superTypeParameters)
  |  |  470|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, implements)
  |  |  471|      0|ESTREE_IGNORE_IF_EMPTY(ClassDeclaration, decorators)
  |  |  472|       |
  |  |  473|      0|ESTREE_NODE_7_ARGS(
  |  |  ------------------
  |  |  |  |  205|      0|#define ESTREE_NODE_7_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  474|      0|    ClassExpression, Base,
  |  |  475|      0|    NodePtr, id, true,
  |  |  476|      0|    NodePtr, typeParameters, true,
  |  |  477|      0|    NodePtr, superClass, true,
  |  |  478|      0|    NodePtr, superTypeParameters, true,
  |  |  479|      0|    NodeList, implements, false,
  |  |  480|      0|    NodeList, decorators, false,
  |  |  481|      0|    NodePtr, body, false)
  |  |  482|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, typeParameters)
  |  |  483|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, superTypeParameters)
  |  |  484|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, implements)
  |  |  485|      0|ESTREE_IGNORE_IF_EMPTY(ClassExpression, decorators)
  |  |  486|       |
  |  |  487|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  488|      0|    ClassBody, Base,
  |  |  489|      0|    NodeList, body, false)
  |  |  490|       |
  |  |  491|      0|ESTREE_NODE_9_ARGS(
  |  |  ------------------
  |  |  |  |  207|      0|#define ESTREE_NODE_9_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  492|      0|    ClassProperty, Base,
  |  |  493|      0|    NodePtr, key, false,
  |  |  494|      0|    NodePtr, value, true,
  |  |  495|      0|    NodeBoolean, computed, false,
  |  |  496|      0|    NodeBoolean, static, false,
  |  |  497|      0|    NodeBoolean, declare, false,
  |  |  498|      0|    NodeBoolean, optional, false,
  |  |  499|      0|    NodePtr, variance, true,
  |  |  500|      0|    NodePtr, typeAnnotation, true,
  |  |  501|      0|    NodePtr, tsModifiers, true)
  |  |  502|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, variance)
  |  |  503|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, optional)
  |  |  504|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, typeAnnotation)
  |  |  505|      0|ESTREE_IGNORE_IF_EMPTY(ClassProperty, tsModifiers)
  |  |  506|       |
  |  |  507|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  508|      0|    ClassPrivateProperty, Base,
  |  |  509|      0|    NodePtr, key, false,
  |  |  510|      0|    NodePtr, value, true,
  |  |  511|      0|    NodeBoolean, static, false,
  |  |  512|      0|    NodeBoolean, declare, false,
  |  |  513|      0|    NodeBoolean, optional, false,
  |  |  514|      0|    NodePtr, variance, true,
  |  |  515|      0|    NodePtr, typeAnnotation, true,
  |  |  516|      0|    NodePtr, tsModifiers, true)
  |  |  517|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, variance)
  |  |  518|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, optional)
  |  |  519|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, typeAnnotation)
  |  |  520|      0|ESTREE_IGNORE_IF_EMPTY(ClassPrivateProperty, tsModifiers)
  |  |  521|       |
  |  |  522|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  523|      0|    MethodDefinition, Base,
  |  |  524|      0|    NodePtr, key, false,
  |  |  525|      0|    NodePtr, value, false,
  |  |  526|      0|    NodeLabel, kind, false,
  |  |  527|      0|    NodeBoolean, computed, false,
  |  |  528|      0|    NodeBoolean, static, false)
  |  |  529|       |
  |  |  530|       |// Imports ========================================
  |  |  531|       |
  |  |  532|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  533|      0|    ImportDeclaration, Base,
  |  |  534|      0|    NodeList, specifiers, false,
  |  |  535|      0|    NodePtr, source, false,
  |  |  536|      0|    NodeList, assertions, true,
  |  |  537|      0|    NodeLabel, importKind, false)
  |  |  538|       |
  |  |  539|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  540|      0|    ImportSpecifier, Base,
  |  |  541|      0|    NodePtr, imported, false,
  |  |  542|      0|    NodePtr, local, false,
  |  |  543|      0|    NodeLabel, importKind, false)
  |  |  544|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  545|      0|    ImportDefaultSpecifier, Base,
  |  |  546|      0|    NodePtr, local, false)
  |  |  547|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  548|      0|    ImportNamespaceSpecifier, Base,
  |  |  549|      0|    NodePtr, local, false)
  |  |  550|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  551|      0|    ImportAttribute, Base,
  |  |  552|      0|    NodePtr, key, false,
  |  |  553|      0|    NodePtr, value, false)
  |  |  554|       |
  |  |  555|       |
  |  |  556|       |// ================================================
  |  |  557|       |
  |  |  558|       |// Exports ========================================
  |  |  559|       |
  |  |  560|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  561|      0|    ExportNamedDeclaration, Base,
  |  |  562|      0|    NodePtr, declaration, true,
  |  |  563|      0|    NodeList, specifiers, false,
  |  |  564|      0|    NodePtr, source, true,
  |  |  565|      0|    NodeLabel, exportKind, false)
  |  |  566|       |
  |  |  567|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  568|      0|    ExportSpecifier, Base,
  |  |  569|      0|    NodePtr, exported, false,
  |  |  570|      0|    NodePtr, local, false)
  |  |  571|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  572|      0|    ExportNamespaceSpecifier, Base,
  |  |  573|      0|    NodePtr, exported, false)
  |  |  574|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  575|      0|    ExportDefaultDeclaration, Base,
  |  |  576|      0|    NodePtr, declaration, false)
  |  |  577|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  578|      0|    ExportAllDeclaration, Base,
  |  |  579|      0|    NodePtr, source, false,
  |  |  580|      0|    NodeLabel, exportKind, false)
  |  |  581|       |
  |  |  582|       |// ================================================
  |  |  583|       |
  |  |  584|       |// Patterns =======================================
  |  |  585|      0|ESTREE_FIRST(Pattern, Base)
  |  |  586|       |
  |  |  587|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  588|      0|    ObjectPattern, Pattern,
  |  |  589|      0|    NodeList, properties, false,
  |  |  590|      0|    NodePtr, typeAnnotation, true)
  |  |  591|      0|ESTREE_IGNORE_IF_EMPTY(ObjectPattern, typeAnnotation)
  |  |  592|       |
  |  |  593|     96|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|     96|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|     96|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 96, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|     96|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|     96|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|     96|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  594|      0|    ArrayPattern, Pattern,
  |  |  595|      0|    NodeList, elements, false,
  |  |  596|      0|    NodePtr, typeAnnotation, true)
  |  |  597|      0|ESTREE_IGNORE_IF_EMPTY(ArrayPattern, typeAnnotation)
  |  |  598|       |
  |  |  599|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  600|      0|    RestElement, Pattern,
  |  |  601|      0|    NodePtr, argument, false)
  |  |  602|       |
  |  |  603|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  604|      0|    AssignmentPattern, Pattern,
  |  |  605|      0|    NodePtr, left, false,          // Pattern
  |  |  606|       |    NodePtr, right, false)         // Expression
  |  |  607|       |
  |  |  608|      0|ESTREE_LAST(Pattern)
  |  |  609|       |// ================================================
  |  |  610|       |
  |  |  611|       |// JSX ============================================
  |  |  612|       |
  |  |  613|      0|#if HERMES_PARSE_JSX
  |  |  614|       |
  |  |  615|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  616|      0|    JSXIdentifier, Base,
  |  |  617|      0|    NodeLabel, name, false)
  |  |  618|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  619|      0|    JSXMemberExpression, Base,
  |  |  620|      0|    NodePtr, object, false,
  |  |  621|      0|    NodePtr, property, false)
  |  |  622|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  623|      0|    JSXNamespacedName, Base,
  |  |  624|      0|    NodePtr, namespace, false,
  |  |  625|      0|    NodePtr, name, false)
  |  |  626|       |
  |  |  627|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  628|      0|    JSXEmptyExpression, Base)
  |  |  629|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  630|      0|    JSXExpressionContainer, Base,
  |  |  631|      0|    NodePtr, expression, false)
  |  |  632|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  633|      0|    JSXSpreadChild, Base,
  |  |  634|      0|    NodePtr, expression, false)
  |  |  635|       |
  |  |  636|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  637|      0|    JSXOpeningElement, Base,
  |  |  638|      0|    NodePtr, name, false,
  |  |  639|      0|    NodeList, attributes, false,
  |  |  640|      0|    NodeBoolean, selfClosing, false)
  |  |  641|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  642|      0|    JSXClosingElement, Base,
  |  |  643|      0|    NodePtr, name, false)
  |  |  644|       |
  |  |  645|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|      0|    JSXAttribute, Base,
  |  |  647|      0|    NodePtr, name, false,
  |  |  648|      0|    NodePtr, value, true)
  |  |  649|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  650|      0|    JSXSpreadAttribute, Base,
  |  |  651|      0|    NodePtr, argument, false)
  |  |  652|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  653|      0|    JSXStringLiteral, Base,
  |  |  654|      0|    NodeString, value, false,
  |  |  655|      0|    NodeLabel, raw, false)
  |  |  656|       |
  |  |  657|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  658|      0|    JSXText, Base,
  |  |  659|      0|    NodeString, value, false,
  |  |  660|      0|    NodeLabel, raw, false)
  |  |  661|       |
  |  |  662|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  663|      0|    JSXElement, Base,
  |  |  664|      0|    NodePtr, openingElement, false,
  |  |  665|      0|    NodeList, children, false,
  |  |  666|      0|    NodePtr, closingElement, true)
  |  |  667|       |
  |  |  668|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  669|      0|    JSXFragment, Base,
  |  |  670|      0|    NodePtr, openingFragment, false,
  |  |  671|      0|    NodeList, children, false,
  |  |  672|      0|    NodePtr, closingFragment, false)
  |  |  673|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  674|      0|    JSXOpeningFragment, Base)
  |  |  675|      0|ESTREE_NODE_0_ARGS(
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  676|      0|    JSXClosingFragment, Base)
  |  |  677|       |
  |  |  678|      0|#endif
  |  |  679|       |
  |  |  680|       |// ================================================
  |  |  681|       |
  |  |  682|       |// Types ==========================================
  |  |  683|       |
  |  |  684|      0|#if HERMES_PARSE_FLOW
  |  |  685|       |
  |  |  686|      0|ESTREE_NODE_0_ARGS(ExistsTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  687|      0|ESTREE_NODE_0_ARGS(EmptyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  688|      0|ESTREE_NODE_0_ARGS(StringTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  689|      0|ESTREE_NODE_0_ARGS(NumberTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  690|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  691|      0|    StringLiteralTypeAnnotation, Base,
  |  |  692|      0|    NodeString, value, false,
  |  |  693|      0|    NodeString, raw, false)
  |  |  694|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  695|      0|    NumberLiteralTypeAnnotation, Base,
  |  |  696|      0|    NodeNumber, value, false,
  |  |  697|      0|    NodeLabel, raw, false)
  |  |  698|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  699|      0|    BigIntLiteralTypeAnnotation, Base,
  |  |  700|      0|    NodeLabel, raw, false)
  |  |  701|      0|ESTREE_NODE_0_ARGS(BooleanTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  702|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|      0|    BooleanLiteralTypeAnnotation, Base,
  |  |  704|      0|    NodeBoolean, value, false,
  |  |  705|      0|    NodeLabel, raw, false)
  |  |  706|      0|ESTREE_NODE_0_ARGS(NullLiteralTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  707|      0|ESTREE_NODE_0_ARGS(SymbolTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  708|      0|ESTREE_NODE_0_ARGS(AnyTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  709|      0|ESTREE_NODE_0_ARGS(MixedTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  710|      0|ESTREE_NODE_0_ARGS(BigIntTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  711|      0|ESTREE_NODE_0_ARGS(VoidTypeAnnotation, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  712|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  713|      0|    FunctionTypeAnnotation, Base,
  |  |  714|      0|    NodeList, params, false,
  |  |  715|      0|    NodePtr, this, true,
  |  |  716|      0|    NodePtr, returnType, false,
  |  |  717|      0|    NodePtr, rest, true,
  |  |  718|      0|    NodePtr, typeParameters, true)
  |  |  719|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  720|      0|    FunctionTypeParam, Base,
  |  |  721|      0|    NodePtr, name, true,
  |  |  722|      0|    NodePtr, typeAnnotation, false,
  |  |  723|      0|    NodeBoolean, optional, false)
  |  |  724|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  725|      0|    NullableTypeAnnotation, Base,
  |  |  726|      0|    NodePtr, typeAnnotation, false)
  |  |  727|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  728|      0|    QualifiedTypeIdentifier, Base,
  |  |  729|      0|    NodePtr, qualification, false,
  |  |  730|      0|    NodePtr, id, false)
  |  |  731|       |
  |  |  732|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  733|      0|    TypeofTypeAnnotation, Base,
  |  |  734|      0|    NodePtr, argument, false)
  |  |  735|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  736|      0|    TupleTypeAnnotation, Base,
  |  |  737|      0|    NodeList, types, false)
  |  |  738|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  739|      0|    ArrayTypeAnnotation, Base,
  |  |  740|      0|    NodePtr, elementType, false)
  |  |  741|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  742|      0|    UnionTypeAnnotation, Base,
  |  |  743|      0|    NodeList, types, false)
  |  |  744|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  745|      0|    IntersectionTypeAnnotation, Base,
  |  |  746|      0|    NodeList, types, false)
  |  |  747|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  748|      0|    GenericTypeAnnotation, Base,
  |  |  749|      0|    NodePtr, id, false,
  |  |  750|      0|    NodePtr, typeParameters, true)
  |  |  751|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  752|      0|    IndexedAccessType, Base,
  |  |  753|      0|    NodePtr, objectType, false,
  |  |  754|      0|    NodePtr, indexType, false)
  |  |  755|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  756|      0|    OptionalIndexedAccessType, Base,
  |  |  757|      0|    NodePtr, objectType, false,
  |  |  758|      0|    NodePtr, indexType, false,
  |  |  759|      0|    NodeBoolean, optional, false)
  |  |  760|       |
  |  |  761|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  762|      0|    InterfaceTypeAnnotation, Base,
  |  |  763|      0|    NodeList, extends, false,
  |  |  764|      0|    NodePtr, body, true)
  |  |  765|       |
  |  |  766|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  767|      0|    TypeAlias, Base,
  |  |  768|      0|    NodePtr, id, false,
  |  |  769|      0|    NodePtr, typeParameters, true,
  |  |  770|      0|    NodePtr, right, false)
  |  |  771|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  772|      0|    OpaqueType, Base,
  |  |  773|      0|    NodePtr, id, false,
  |  |  774|      0|    NodePtr, typeParameters, true,
  |  |  775|      0|    NodePtr, impltype, false,
  |  |  776|      0|    NodePtr, supertype, true)
  |  |  777|       |
  |  |  778|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  779|      0|    InterfaceDeclaration, Base,
  |  |  780|      0|    NodePtr, id, false,
  |  |  781|      0|    NodePtr, typeParameters, true,
  |  |  782|      0|    NodeList, extends, false,
  |  |  783|      0|    NodePtr, body, false)
  |  |  784|       |
  |  |  785|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  786|      0|    DeclareTypeAlias, Base,
  |  |  787|      0|    NodePtr, id, false,
  |  |  788|      0|    NodePtr, typeParameters, true,
  |  |  789|      0|    NodePtr, right, false)
  |  |  790|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  791|      0|    DeclareOpaqueType, Base,
  |  |  792|      0|    NodePtr, id, false,
  |  |  793|      0|    NodePtr, typeParameters, true,
  |  |  794|      0|    NodePtr, impltype, true,
  |  |  795|      0|    NodePtr, supertype, true)
  |  |  796|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  797|      0|    DeclareInterface, Base,
  |  |  798|      0|    NodePtr, id, false,
  |  |  799|      0|    NodePtr, typeParameters, true,
  |  |  800|      0|    NodeList, extends, false,
  |  |  801|      0|    NodePtr, body, false)
  |  |  802|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  204|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  803|      0|    DeclareClass, Base,
  |  |  804|      0|    NodePtr, id, false,
  |  |  805|      0|    NodePtr, typeParameters, true,
  |  |  806|      0|    NodeList, extends, false,
  |  |  807|      0|    NodeList, implements, false,
  |  |  808|      0|    NodeList, mixins, false,
  |  |  809|      0|    NodePtr, body, false)
  |  |  810|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  811|      0|    DeclareFunction, Base,
  |  |  812|      0|    NodePtr, id, false,
  |  |  813|      0|    NodePtr, predicate, true)
  |  |  814|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  815|      0|    DeclareVariable, Base,
  |  |  816|      0|    NodePtr, id, false)
  |  |  817|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  818|      0|    DeclareExportDeclaration, Base,
  |  |  819|      0|    NodePtr, declaration, true,
  |  |  820|      0|    NodeList, specifiers, false,
  |  |  821|      0|    NodePtr, source, true,
  |  |  822|      0|    NodeBoolean, default, false)
  |  |  823|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  824|      0|    DeclareExportAllDeclaration, Base,
  |  |  825|      0|    NodePtr, source, false)
  |  |  826|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  827|      0|    DeclareModule, Base,
  |  |  828|      0|    NodePtr, id, false,
  |  |  829|      0|    NodePtr, body, false,
  |  |  830|      0|    NodeLabel, kind, false)
  |  |  831|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  832|      0|    DeclareModuleExports, Base,
  |  |  833|      0|    NodePtr, typeAnnotation, false)
  |  |  834|       |
  |  |  835|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  836|      0|    InterfaceExtends, Base,
  |  |  837|      0|    NodePtr, id, false,
  |  |  838|      0|    NodePtr, typeParameters, true)
  |  |  839|       |
  |  |  840|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  841|      0|    ClassImplements, Base,
  |  |  842|      0|    NodePtr, id, false,
  |  |  843|      0|    NodePtr, typeParameters, true)
  |  |  844|       |
  |  |  845|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  846|      0|    TypeAnnotation, Base,
  |  |  847|      0|    NodePtr, typeAnnotation, false)
  |  |  848|       |
  |  |  849|      0|ESTREE_NODE_6_ARGS(
  |  |  ------------------
  |  |  |  |  204|      0|#define ESTREE_NODE_6_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  850|      0|    ObjectTypeAnnotation, Base,
  |  |  851|      0|    NodeList, properties, false,
  |  |  852|      0|    NodeList, indexers, false,
  |  |  853|      0|    NodeList, callProperties, false,
  |  |  854|      0|    NodeList, internalSlots, false,
  |  |  855|      0|    NodeBoolean, inexact, false,
  |  |  856|      0|    NodeBoolean, exact, false)
  |  |  857|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  858|      0|    ObjectTypeProperty, Base,
  |  |  859|      0|    NodePtr, key, false,
  |  |  860|      0|    NodePtr, value, false,
  |  |  861|      0|    NodeBoolean, method, false,
  |  |  862|      0|    NodeBoolean, optional, false,
  |  |  863|      0|    NodeBoolean, static, false,
  |  |  864|      0|    NodeBoolean, proto, false,
  |  |  865|      0|    NodePtr, variance, true,
  |  |  866|      0|    NodeLabel, kind, false)
  |  |  867|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  868|      0|    ObjectTypeSpreadProperty, Base,
  |  |  869|      0|    NodePtr, argument, false)
  |  |  870|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  871|      0|    ObjectTypeInternalSlot, Base,
  |  |  872|      0|    NodePtr, id, false,
  |  |  873|      0|    NodePtr, value, false,
  |  |  874|      0|    NodeBoolean, optional, false,
  |  |  875|      0|    NodeBoolean, static, false,
  |  |  876|      0|    NodeBoolean, method, false)
  |  |  877|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  878|      0|    ObjectTypeCallProperty, Base,
  |  |  879|      0|    NodePtr, value, false,
  |  |  880|      0|    NodeBoolean, static, false)
  |  |  881|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  882|      0|    ObjectTypeIndexer, Base,
  |  |  883|      0|    NodePtr, id, true,
  |  |  884|      0|    NodePtr, key, false,
  |  |  885|      0|    NodePtr, value, false,
  |  |  886|      0|    NodeBoolean, static, false,
  |  |  887|      0|    NodePtr, variance, true)
  |  |  888|       |
  |  |  889|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  890|      0|    Variance, Base,
  |  |  891|      0|    NodeLabel, kind, false)
  |  |  892|       |
  |  |  893|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  894|      0|    TypeParameterDeclaration, Base,
  |  |  895|      0|    NodeList, params, false)
  |  |  896|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  897|      0|    TypeParameter, Base,
  |  |  898|      0|    NodeLabel, name, false,
  |  |  899|      0|    NodePtr, bound, true,
  |  |  900|      0|    NodePtr, variance, true,
  |  |  901|      0|    NodePtr, default, true)
  |  |  902|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  903|      0|    TypeParameterInstantiation, Base,
  |  |  904|      0|    NodeList, params, false)
  |  |  905|       |
  |  |  906|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  907|      0|    TypeCastExpression, Base,
  |  |  908|      0|    NodePtr, expression, false,
  |  |  909|      0|    NodePtr, typeAnnotation, false)
  |  |  910|       |
  |  |  911|      0|ESTREE_NODE_0_ARGS(InferredPredicate, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  912|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  913|      0|    DeclaredPredicate, Base,
  |  |  914|      0|    NodePtr, value, false)
  |  |  915|       |
  |  |  916|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  917|      0|    EnumDeclaration, Base,
  |  |  918|      0|    NodePtr, id, false,
  |  |  919|      0|    NodePtr, body, false)
  |  |  920|       |
  |  |  921|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  922|      0|    EnumStringBody, Base,
  |  |  923|      0|    NodeList, members, false,
  |  |  924|      0|    NodeBoolean, explicitType, false,
  |  |  925|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  926|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  927|      0|    EnumNumberBody, Base,
  |  |  928|      0|    NodeList, members, false,
  |  |  929|      0|    NodeBoolean, explicitType, false,
  |  |  930|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  931|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  932|      0|    EnumBooleanBody, Base,
  |  |  933|      0|    NodeList, members, false,
  |  |  934|      0|    NodeBoolean, explicitType, false,
  |  |  935|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  936|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  937|      0|    EnumSymbolBody, Base,
  |  |  938|      0|    NodeList, members, false,
  |  |  939|      0|    NodeBoolean, hasUnknownMembers, false)
  |  |  940|       |
  |  |  941|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  942|      0|    EnumDefaultedMember, Base,
  |  |  943|      0|    NodePtr, id, false)
  |  |  944|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  945|      0|    EnumStringMember, Base,
  |  |  946|      0|    NodePtr, id, false,
  |  |  947|      0|    NodePtr, init, false)
  |  |  948|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  949|      0|    EnumNumberMember, Base,
  |  |  950|      0|    NodePtr, id, false,
  |  |  951|      0|    NodePtr, init, false)
  |  |  952|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  953|      0|    EnumBooleanMember, Base,
  |  |  954|      0|    NodePtr, id, false,
  |  |  955|      0|    NodePtr, init, false)
  |  |  956|       |
  |  |  957|      0|#endif
  |  |  958|       |
  |  |  959|      0|#if HERMES_PARSE_TS
  |  |  960|       |
  |  |  961|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  962|      0|    TSTypeAnnotation, Base,
  |  |  963|      0|    NodePtr, typeAnnotation, false)
  |  |  964|       |
  |  |  965|      0|ESTREE_NODE_0_ARGS(TSAnyKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  966|      0|ESTREE_NODE_0_ARGS(TSNumberKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  967|      0|ESTREE_NODE_0_ARGS(TSBooleanKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  968|      0|ESTREE_NODE_0_ARGS(TSStringKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  969|      0|ESTREE_NODE_0_ARGS(TSSymbolKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  970|      0|ESTREE_NODE_0_ARGS(TSVoidKeyword, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  971|      0|ESTREE_NODE_0_ARGS(TSThisType, Base)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  972|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  973|      0|    TSLiteralType, Base,
  |  |  974|      0|    NodePtr, literal, false)
  |  |  975|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  976|      0|    TSIndexedAccessType, Base,
  |  |  977|      0|    NodePtr, objectType, false,
  |  |  978|      0|    NodePtr, indexType, false)
  |  |  979|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  980|      0|    TSArrayType, Base,
  |  |  981|      0|    NodePtr, elementType, false)
  |  |  982|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  983|      0|    TSTypeReference, Base,
  |  |  984|      0|    NodePtr, typeName, false,
  |  |  985|      0|    NodePtr, typeParameters, true)
  |  |  986|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  987|      0|    TSQualifiedName, Base,
  |  |  988|      0|    NodePtr, left, false,
  |  |  989|      0|    NodePtr, right, true)
  |  |  990|       |
  |  |  991|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  992|      0|    TSFunctionType, Base,
  |  |  993|      0|    NodeList, params, false,
  |  |  994|      0|    NodePtr, returnType, false,
  |  |  995|      0|    NodePtr, typeParameters, true)
  |  |  996|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  997|      0|    TSConstructorType, Base,
  |  |  998|      0|    NodeList, params, false,
  |  |  999|      0|    NodePtr, returnType, false,
  |  | 1000|      0|    NodePtr, typeParameters, true)
  |  | 1001|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1002|      0|    TSTypePredicate, Base,
  |  | 1003|      0|    NodePtr, parameterName, false,
  |  | 1004|      0|    NodePtr, typeAnnotation, false)
  |  | 1005|       |
  |  | 1006|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1007|      0|    TSTupleType, Base,
  |  | 1008|      0|    NodeList, elementTypes, false)
  |  | 1009|       |
  |  | 1010|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1011|      0|    TSTypeAssertion, Base,
  |  | 1012|      0|    NodePtr, typeAnnotation, false,
  |  | 1013|      0|    NodePtr, expression, false)
  |  | 1014|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1015|      0|    TSAsExpression, Base,
  |  | 1016|      0|    NodePtr, expression, false,
  |  | 1017|      0|    NodePtr, typeAnnotation, false)
  |  | 1018|       |
  |  | 1019|      0|ESTREE_NODE_5_ARGS(
  |  |  ------------------
  |  |  |  |  203|      0|#define ESTREE_NODE_5_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1020|      0|    TSParameterProperty, Base,
  |  | 1021|      0|    NodePtr, parameter, false,
  |  | 1022|      0|    NodeLabel, accessibility, true,
  |  | 1023|      0|    NodeBoolean, readonly, false,
  |  | 1024|      0|    NodeBoolean, static, false,
  |  | 1025|      0|    NodeBoolean, export, false)
  |  | 1026|       |
  |  | 1027|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1028|      0|    TSTypeAliasDeclaration, Base,
  |  | 1029|      0|    NodePtr, id, false,
  |  | 1030|      0|    NodePtr, typeParameters, true,
  |  | 1031|      0|    NodePtr, typeAnnotation, false)
  |  | 1032|       |
  |  | 1033|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1034|      0|    TSInterfaceDeclaration, Base,
  |  | 1035|      0|    NodePtr, id, false,
  |  | 1036|      0|    NodePtr, body, false,
  |  | 1037|      0|    NodeList, extends, false,
  |  | 1038|      0|    NodePtr, typeParameters, true)
  |  | 1039|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1040|      0|    TSInterfaceHeritage, Base,
  |  | 1041|      0|    NodePtr, expression, false,
  |  | 1042|      0|    NodePtr, typeParameters, true)
  |  | 1043|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1044|      0|    TSInterfaceBody, Base,
  |  | 1045|      0|    NodeList, body, false)
  |  | 1046|       |
  |  | 1047|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1048|      0|    TSEnumDeclaration, Base,
  |  | 1049|      0|    NodePtr, id, false,
  |  | 1050|      0|    NodeList, members, false)
  |  | 1051|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1052|      0|    TSEnumMember, Base,
  |  | 1053|      0|    NodePtr, id, false,
  |  | 1054|      0|    NodePtr, initializer, true)
  |  | 1055|       |
  |  | 1056|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1057|      0|    TSModuleDeclaration, Base,
  |  | 1058|      0|    NodePtr, id, false,
  |  | 1059|      0|    NodePtr, body, false)
  |  | 1060|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1061|      0|    TSModuleBlock, Base,
  |  | 1062|      0|    NodeList, body, false)
  |  | 1063|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1064|      0|    TSModuleMember, Base,
  |  | 1065|      0|    NodePtr, id, false,
  |  | 1066|      0|    NodePtr, initializer, true)
  |  | 1067|       |
  |  | 1068|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1069|      0|    TSTypeParameterDeclaration, Base,
  |  | 1070|      0|    NodeList, params, false)
  |  | 1071|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1072|      0|    TSTypeParameter, Base,
  |  | 1073|      0|    NodePtr, name, false,
  |  | 1074|      0|    NodePtr, constraint, true,
  |  | 1075|      0|    NodePtr, default, true)
  |  | 1076|       |
  |  | 1077|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1078|      0|    TSTypeParameterInstantiation, Base,
  |  | 1079|      0|    NodeList, params, false)
  |  | 1080|       |
  |  | 1081|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1082|      0|    TSUnionType, Base,
  |  | 1083|      0|    NodeList, types, false)
  |  | 1084|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1085|      0|    TSIntersectionType, Base,
  |  | 1086|      0|    NodeList, types, false)
  |  | 1087|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1088|      0|    TSTypeQuery, Base,
  |  | 1089|      0|    NodePtr, exprName, false)
  |  | 1090|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1091|      0|    TSConditionalType, Base,
  |  | 1092|      0|    NodePtr, extendsType, false,
  |  | 1093|      0|    NodePtr, checkType, false,
  |  | 1094|      0|    NodePtr, trueType, false,
  |  | 1095|      0|    NodePtr, falseTYpe, false)
  |  | 1096|       |
  |  | 1097|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1098|      0|    TSTypeLiteral, Base,
  |  | 1099|      0|    NodeList, members, false)
  |  | 1100|      0|ESTREE_NODE_8_ARGS(
  |  |  ------------------
  |  |  |  |  206|      0|#define ESTREE_NODE_8_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1101|      0|    TSPropertySignature, Base,
  |  | 1102|      0|    NodePtr, key, false,
  |  | 1103|      0|    NodePtr, typeAnnotation, true,
  |  | 1104|      0|    NodePtr, initializer, true,
  |  | 1105|      0|    NodeBoolean, optional, false,
  |  | 1106|      0|    NodeBoolean, computed, false,
  |  | 1107|      0|    NodeBoolean, readonly, false,
  |  | 1108|      0|    NodeBoolean, static, false,
  |  | 1109|      0|    NodeBoolean, export, false)
  |  | 1110|      0|ESTREE_NODE_4_ARGS(
  |  |  ------------------
  |  |  |  |  202|      0|#define ESTREE_NODE_4_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1111|      0|    TSMethodSignature, Base,
  |  | 1112|      0|    NodePtr, key, false,
  |  | 1113|      0|    NodeList, params, false,
  |  | 1114|      0|    NodePtr, returnType, true,
  |  | 1115|      0|    NodeBoolean, computed, false)
  |  | 1116|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1117|      0|    TSIndexSignature, Base,
  |  | 1118|      0|    NodeList, parameters, false,
  |  | 1119|      0|    NodePtr, typeAnnotation, true)
  |  | 1120|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1121|      0|    TSCallSignatureDeclaration, Base,
  |  | 1122|      0|    NodeList, params, false,
  |  | 1123|      0|    NodePtr, returnType, true)
  |  | 1124|       |
  |  | 1125|      0|ESTREE_NODE_2_ARGS(
  |  |  ------------------
  |  |  |  |  200|      0|#define ESTREE_NODE_2_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1126|      0|    TSModifiers, Base,
  |  | 1127|      0|    NodeLabel, accessibility, false,
  |  | 1128|      0|    NodeBoolean, readonly, false)
  |  | 1129|      0|#endif
  |  | 1130|       |
  |  | 1131|       |// ================================================
  |  | 1132|       |
  |  | 1133|      0|#ifndef ESTREE_DEFINE_COVER_NODES
  |  | 1134|       |
  |  | 1135|      0|ESTREE_FIRST(Cover, Base)
  |  | 1136|       |
  |  | 1137|       |// CoverParenthesizedExpressionAndArrowParameterList: "(" ")"
  |  | 1138|      0|ESTREE_NODE_0_ARGS(CoverEmptyArgs, Cover)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1139|       |
  |  | 1140|       |// CoverParenthesizedExpressionAndArrowParameterList:
  |  | 1141|       |//      "(" Expression "," ")"
  |  | 1142|       |// This is the dummy "empty expression" for the last comma inside a
  |  | 1143|       |// SequenceExpression.
  |  | 1144|      0|ESTREE_NODE_0_ARGS(CoverTrailingComma, Cover)
  |  |  ------------------
  |  |  |  |  198|      0|#define ESTREE_NODE_0_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1145|       |
  |  | 1146|       |// CoverInitializer
  |  | 1147|       |// This is used for destructuring object assignment with initializers. It
  |  | 1148|       |// will be the value node of a Property.
  |  | 1149|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1150|      0|    CoverInitializer, Cover,
  |  | 1151|      0|    NodePtr, init, false)
  |  | 1152|       |
  |  | 1153|       |// CoverRestElement
  |  | 1154|       |// This is used for parsing "...elem" in "()" and in SequenceExpression, so it
  |  | 1155|       |// can later be reparsed as an arrow function rest parameter. "rest" will point
  |  | 1156|       |// to the actual RestElement.
  |  | 1157|      0|ESTREE_NODE_1_ARGS(
  |  |  ------------------
  |  |  |  |  199|      0|#define ESTREE_NODE_1_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1158|      0|    CoverRestElement, Cover,
  |  | 1159|      0|    NodePtr, rest, false)
  |  | 1160|       |
  |  | 1161|       |// CoverTypedIdentifier
  |  | 1162|       |// This is used for parsing "ident: type" as either a type cast expression
  |  | 1163|       |// or a typed parameter in the parameters list of an arrow function.
  |  | 1164|       |// 'left' is the identifier which is typed.
  |  | 1165|       |// 'right' is the type which is either the cast target or the type annotation,
  |  | 1166|       |//   which may be null if the identifier was simply given a '?' and no ':'
  |  | 1167|       |//   with a type annotation.
  |  | 1168|      0|ESTREE_NODE_3_ARGS(
  |  |  ------------------
  |  |  |  |  201|      0|#define ESTREE_NODE_3_ARGS(NAME, ...) VISIT(NAME)
  |  |  |  |  ------------------
  |  |  |  |  |  |  193|      0|  case NodeKind::NAME:                                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (193:3): [True: 0, False: 2.03M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  194|      0|    result = detail::VisitCaller<Visitor, NAME##Node>::call( \
  |  |  |  |  |  |  195|      0|        v, cast<NAME##Node>(node), parent);                  \
  |  |  |  |  |  |  196|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1169|      0|    CoverTypedIdentifier, Cover,
  |  | 1170|      0|    NodePtr, left, false,
  |  | 1171|      0|    NodePtr, right, true,
  |  | 1172|      0|    NodeBoolean, optional, false)
  |  | 1173|       |
  |  | 1174|      0|ESTREE_LAST(Cover)
  |  | 1175|       |
  |  | 1176|      0|#endif
  |  | 1177|       |
  |  | 1178|      0|#undef ESTREE_FIRST
  |  | 1179|      0|#undef ESTREE_LAST
  |  | 1180|      0|#undef ESTREE_WRAP
  |  | 1181|      0|#undef ESTREE_IGNORE_IF_EMPTY
  |  | 1182|       |
  |  | 1183|      0|#undef ESTREE_NODE_0_ARGS
  |  | 1184|      0|#undef ESTREE_NODE_1_ARGS
  |  | 1185|      0|#undef ESTREE_NODE_2_ARGS
  |  | 1186|      0|#undef ESTREE_NODE_3_ARGS
  |  | 1187|      0|#undef ESTREE_NODE_4_ARGS
  |  | 1188|      0|#undef ESTREE_NODE_5_ARGS
  |  | 1189|      0|#undef ESTREE_NODE_6_ARGS
  |  | 1190|      0|#undef ESTREE_NODE_7_ARGS
  |  | 1191|      0|#undef ESTREE_NODE_8_ARGS
  |  | 1192|      0|#undef ESTREE_NODE_9_ARGS
  ------------------
  210|       |
  211|  2.03M|#undef VISIT
  212|  2.03M|    }
  213|  2.03M|    v.decRecursionDepth();
  214|  2.03M|    return result;
  215|  2.03M|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_bPNS0_4NodeE:
  220|   194k|  static UnmodifiedT visit(Visitor &, NodeBoolean, Node *) {
  221|   194k|    return Unmodified;
  222|   194k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18WhileStatementNodeE:
  335|      1|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|      1|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      1|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      1|    visit(visitor, field, parent);                           \
  |  |  320|      1|  } else {                                                   \
  |  |  321|      1|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      1|  }
  ------------------
  337|      1|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|      1|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      1|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      1|    visit(visitor, field, parent);                           \
  |  |  320|      1|  } else {                                                   \
  |  |  321|      1|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      1|  }
  ------------------
  338|      1|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18EmptyStatementNodeE:
  326|   131k|  static void visitChildren(Visitor &v, NAME##Node *) {}
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18BlockStatementNodeE:
  329|   115k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|   115k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|   115k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   115k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   115k|    visit(visitor, field, parent);                           \
  |  |  320|   115k|  } else {                                                   \
  |  |  321|   115k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   115k|  }
  ------------------
  331|   115k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_21ContinueStatementNodeE:
  329|      3|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|      3|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|      3|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      3|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      3|    visit(visitor, field, parent);                           \
  |  |  320|      3|  } else {                                                   \
  |  |  321|      3|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      3|  }
  ------------------
  331|      3|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19ReturnStatementNodeE:
  329|   114k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|   114k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|   114k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   114k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   114k|    visit(visitor, field, parent);                           \
  |  |  320|   114k|  } else {                                                   \
  |  |  321|   114k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   114k|  }
  ------------------
  331|   114k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20LabeledStatementNodeE:
  335|  42.8k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  42.8k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  42.8k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  42.8k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  42.8k|    visit(visitor, field, parent);                           \
  |  |  320|  42.8k|  } else {                                                   \
  |  |  321|  42.8k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  42.8k|  }
  ------------------
  337|  42.8k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  42.8k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  42.8k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  42.8k|    visit(visitor, field, parent);                           \
  |  |  320|  42.8k|  } else {                                                   \
  |  |  321|  42.8k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  42.8k|  }
  ------------------
  338|  42.8k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_23ExpressionStatementNodeE:
  335|   143k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|   143k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|   143k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   143k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   143k|    visit(visitor, field, parent);                           \
  |  |  320|   143k|  } else {                                                   \
  |  |  321|   143k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   143k|  }
  ------------------
  337|   143k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|   143k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   143k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   143k|    visit(visitor, field, parent);                           \
  |  |  320|   143k|  } else {                                                   \
  |  |  321|   143k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   143k|  }
  ------------------
  338|   143k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_PNS_12UniqueStringEPNS0_4NodeE:
  217|   476k|  static UnmodifiedT visit(Visitor &, NodeLabel, Node *) {
  218|   476k|    return Unmodified;
  219|   476k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18BooleanLiteralNodeE:
  329|  2.01k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|  2.01k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|  2.01k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  2.01k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  2.01k|    visit(visitor, field, parent);                           \
  |  |  320|  2.01k|  } else {                                                   \
  |  |  321|  2.01k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  2.01k|  }
  ------------------
  331|  2.01k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17StringLiteralNodeE:
  329|  5.98k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|  5.98k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|  5.98k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.98k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.98k|    visit(visitor, field, parent);                           \
  |  |  320|  5.98k|  } else {                                                   \
  |  |  321|  5.98k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.98k|  }
  ------------------
  331|  5.98k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18NumericLiteralNodeE:
  329|   738k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|   738k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|   738k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   738k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   738k|    visit(visitor, field, parent);                           \
  |  |  320|   738k|  } else {                                                   \
  |  |  321|   738k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   738k|  }
  ------------------
  331|   738k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE5visitERS3_RdPNS0_4NodeE:
  223|   738k|  static UnmodifiedT visit(Visitor &, NodeNumber &, Node *) {
  224|   738k|    return Unmodified;
  225|   738k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17RegExpLiteralNodeE:
  335|  11.4k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  11.4k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  11.4k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  11.4k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  11.4k|    visit(visitor, field, parent);                           \
  |  |  320|  11.4k|  } else {                                                   \
  |  |  321|  11.4k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  11.4k|  }
  ------------------
  337|  11.4k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  11.4k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  11.4k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  11.4k|    visit(visitor, field, parent);                           \
  |  |  320|  11.4k|  } else {                                                   \
  |  |  321|  11.4k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  11.4k|  }
  ------------------
  338|  11.4k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_17BigIntLiteralNodeE:
  329|     11|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|     11|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|     11|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     11|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     11|    visit(visitor, field, parent);                           \
  |  |  320|     11|  } else {                                                   \
  |  |  321|     11|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     11|  }
  ------------------
  331|     11|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_22SequenceExpressionNodeE:
  329|    189|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|    189|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|    189|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    189|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    189|    visit(visitor, field, parent);                           \
  |  |  320|    189|  } else {                                                   \
  |  |  321|    189|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    189|  }
  ------------------
  331|    189|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20ObjectExpressionNodeE:
  329|  5.08k|  static void visitChildren(Visitor &v, NAME##Node *node) {     \
  330|  5.08k|    VISIT(v, node->_##ARG0NM, node);                            \
  ------------------
  |  |  317|  5.08k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.08k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.08k|    visit(visitor, field, parent);                           \
  |  |  320|  5.08k|  } else {                                                   \
  |  |  321|  5.08k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.08k|  }
  ------------------
  331|  5.08k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19ArrayExpressionNodeE:
  335|  33.4k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  33.4k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  33.4k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  33.4k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  33.4k|    visit(visitor, field, parent);                           \
  |  |  320|  33.4k|  } else {                                                   \
  |  |  321|  33.4k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  33.4k|  }
  ------------------
  337|  33.4k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  33.4k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  33.4k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  33.4k|    visit(visitor, field, parent);                           \
  |  |  320|  33.4k|  } else {                                                   \
  |  |  321|  33.4k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  33.4k|  }
  ------------------
  338|  33.4k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_18CallExpressionNodeE:
  352|      8|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|      8|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|      8|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      8|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      8|    visit(visitor, field, parent);                           \
  |  |  320|      8|  } else {                                                   \
  |  |  321|      8|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      8|  }
  ------------------
  354|      8|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|      8|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      8|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      8|    visit(visitor, field, parent);                           \
  |  |  320|      8|  } else {                                                   \
  |  |  321|      8|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      8|  }
  ------------------
  355|      8|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|      8|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      8|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      8|    visit(visitor, field, parent);                           \
  |  |  320|      8|  } else {                                                   \
  |  |  321|      8|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      8|  }
  ------------------
  356|      8|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_24AssignmentExpressionNodeE:
  352|    153|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|    153|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|    153|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    153|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    153|    visit(visitor, field, parent);                           \
  |  |  320|    153|  } else {                                                   \
  |  |  321|    153|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    153|  }
  ------------------
  354|    153|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|    153|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    153|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    153|    visit(visitor, field, parent);                           \
  |  |  320|    153|  } else {                                                   \
  |  |  321|    153|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    153|  }
  ------------------
  355|    153|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|    153|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    153|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    153|    visit(visitor, field, parent);                           \
  |  |  320|    153|  } else {                                                   \
  |  |  321|    153|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    153|  }
  ------------------
  356|    153|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19UnaryExpressionNodeE:
  352|  4.09k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  4.09k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  4.09k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.09k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.09k|    visit(visitor, field, parent);                           \
  |  |  320|  4.09k|  } else {                                                   \
  |  |  321|  4.09k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.09k|  }
  ------------------
  354|  4.09k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  4.09k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.09k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.09k|    visit(visitor, field, parent);                           \
  |  |  320|  4.09k|  } else {                                                   \
  |  |  321|  4.09k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.09k|  }
  ------------------
  355|  4.09k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  4.09k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.09k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.09k|    visit(visitor, field, parent);                           \
  |  |  320|  4.09k|  } else {                                                   \
  |  |  321|  4.09k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.09k|  }
  ------------------
  356|  4.09k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20UpdateExpressionNodeE:
  352|     28|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|     28|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|     28|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     28|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     28|    visit(visitor, field, parent);                           \
  |  |  320|     28|  } else {                                                   \
  |  |  321|     28|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     28|  }
  ------------------
  354|     28|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|     28|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     28|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     28|    visit(visitor, field, parent);                           \
  |  |  320|     28|  } else {                                                   \
  |  |  321|     28|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     28|  }
  ------------------
  355|     28|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|     28|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     28|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     28|    visit(visitor, field, parent);                           \
  |  |  320|     28|  } else {                                                   \
  |  |  321|     28|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     28|  }
  ------------------
  356|     28|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20MemberExpressionNodeE:
  352|  1.64k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  1.64k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  1.64k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.64k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.64k|    visit(visitor, field, parent);                           \
  |  |  320|  1.64k|  } else {                                                   \
  |  |  321|  1.64k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.64k|  }
  ------------------
  354|  1.64k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  1.64k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.64k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.64k|    visit(visitor, field, parent);                           \
  |  |  320|  1.64k|  } else {                                                   \
  |  |  321|  1.64k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.64k|  }
  ------------------
  355|  1.64k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  1.64k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.64k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.64k|    visit(visitor, field, parent);                           \
  |  |  320|  1.64k|  } else {                                                   \
  |  |  321|  1.64k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.64k|  }
  ------------------
  356|  1.64k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_28OptionalMemberExpressionNodeE:
  373|  1.75k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  374|  1.75k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  1.75k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.75k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.75k|    visit(visitor, field, parent);                           \
  |  |  320|  1.75k|  } else {                                                   \
  |  |  321|  1.75k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.75k|  }
  ------------------
  375|  1.75k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  1.75k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.75k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.75k|    visit(visitor, field, parent);                           \
  |  |  320|  1.75k|  } else {                                                   \
  |  |  321|  1.75k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.75k|  }
  ------------------
  376|  1.75k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  1.75k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.75k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.75k|    visit(visitor, field, parent);                           \
  |  |  320|  1.75k|  } else {                                                   \
  |  |  321|  1.75k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.75k|  }
  ------------------
  377|  1.75k|    VISIT(v, node->_##ARG3NM, node);                        \
  ------------------
  |  |  317|  1.75k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  1.75k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  1.75k|    visit(visitor, field, parent);                           \
  |  |  320|  1.75k|  } else {                                                   \
  |  |  321|  1.75k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  1.75k|  }
  ------------------
  378|  1.75k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_21LogicalExpressionNodeE:
  352|  4.30k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  4.30k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  4.30k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.30k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.30k|    visit(visitor, field, parent);                           \
  |  |  320|  4.30k|  } else {                                                   \
  |  |  321|  4.30k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.30k|  }
  ------------------
  354|  4.30k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  4.30k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.30k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.30k|    visit(visitor, field, parent);                           \
  |  |  320|  4.30k|  } else {                                                   \
  |  |  321|  4.30k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.30k|  }
  ------------------
  355|  4.30k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  4.30k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  4.30k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  4.30k|    visit(visitor, field, parent);                           \
  |  |  320|  4.30k|  } else {                                                   \
  |  |  321|  4.30k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  4.30k|  }
  ------------------
  356|  4.30k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_25ConditionalExpressionNodeE:
  352|     90|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|     90|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|     90|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     90|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     90|    visit(visitor, field, parent);                           \
  |  |  320|     90|  } else {                                                   \
  |  |  321|     90|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     90|  }
  ------------------
  354|     90|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|     90|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     90|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     90|    visit(visitor, field, parent);                           \
  |  |  320|     90|  } else {                                                   \
  |  |  321|     90|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     90|  }
  ------------------
  355|     90|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|     90|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     90|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     90|    visit(visitor, field, parent);                           \
  |  |  320|     90|  } else {                                                   \
  |  |  321|     90|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     90|  }
  ------------------
  356|     90|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_20BinaryExpressionNodeE:
  352|  25.6k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|  25.6k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  25.6k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  25.6k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.6k|    visit(visitor, field, parent);                           \
  |  |  320|  25.6k|  } else {                                                   \
  |  |  321|  25.6k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.6k|  }
  ------------------
  354|  25.6k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  25.6k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  25.6k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.6k|    visit(visitor, field, parent);                           \
  |  |  320|  25.6k|  } else {                                                   \
  |  |  321|  25.6k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.6k|  }
  ------------------
  355|  25.6k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  25.6k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  25.6k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  25.6k|    visit(visitor, field, parent);                           \
  |  |  320|  25.6k|  } else {                                                   \
  |  |  321|  25.6k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  25.6k|  }
  ------------------
  356|  25.6k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_22VariableDeclaratorNodeE:
  335|      7|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|      7|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|      7|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      7|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      7|    visit(visitor, field, parent);                           \
  |  |  320|      7|  } else {                                                   \
  |  |  321|      7|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      7|  }
  ------------------
  337|      7|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|      7|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      7|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      7|    visit(visitor, field, parent);                           \
  |  |  320|      7|  } else {                                                   \
  |  |  321|      7|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      7|  }
  ------------------
  338|      7|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_23VariableDeclarationNodeE:
  335|      7|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|      7|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|      7|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      7|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      7|    visit(visitor, field, parent);                           \
  |  |  320|      7|  } else {                                                   \
  |  |  321|      7|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      7|  }
  ------------------
  337|      7|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|      7|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|      7|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|      7|    visit(visitor, field, parent);                           \
  |  |  320|      7|  } else {                                                   \
  |  |  321|      7|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|      7|  }
  ------------------
  338|      7|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19TemplateLiteralNodeE:
  335|  64.8k|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|  64.8k|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|  64.8k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  64.8k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  64.8k|    visit(visitor, field, parent);                           \
  |  |  320|  64.8k|  } else {                                                   \
  |  |  321|  64.8k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  64.8k|  }
  ------------------
  337|  64.8k|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|  64.8k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  64.8k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  64.8k|    visit(visitor, field, parent);                           \
  |  |  320|  64.8k|  } else {                                                   \
  |  |  321|  64.8k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  64.8k|  }
  ------------------
  338|  64.8k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_28TaggedTemplateExpressionNodeE:
  335|    285|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|    285|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|    285|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    285|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    285|    visit(visitor, field, parent);                           \
  |  |  320|    285|  } else {                                                   \
  |  |  321|    285|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    285|  }
  ------------------
  337|    285|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|    285|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|    285|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|    285|    visit(visitor, field, parent);                           \
  |  |  320|    285|  } else {                                                   \
  |  |  321|    285|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|    285|  }
  ------------------
  338|    285|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_19TemplateElementNodeE:
  352|   131k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  353|   131k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|   131k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   131k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   131k|    visit(visitor, field, parent);                           \
  |  |  320|   131k|  } else {                                                   \
  |  |  321|   131k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   131k|  }
  ------------------
  354|   131k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|   131k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   131k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   131k|    visit(visitor, field, parent);                           \
  |  |  320|   131k|  } else {                                                   \
  |  |  321|   131k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   131k|  }
  ------------------
  355|   131k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|   131k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|   131k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|   131k|    visit(visitor, field, parent);                           \
  |  |  320|   131k|  } else {                                                   \
  |  |  321|   131k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|   131k|  }
  ------------------
  356|   131k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_12PropertyNodeE:
  427|  5.97k|  static void visitChildren(Visitor &v, NAME##Node *node) { \
  428|  5.97k|    VISIT(v, node->_##ARG0NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  429|  5.97k|    VISIT(v, node->_##ARG1NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  430|  5.97k|    VISIT(v, node->_##ARG2NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  431|  5.97k|    VISIT(v, node->_##ARG3NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  432|  5.97k|    VISIT(v, node->_##ARG4NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  433|  5.97k|    VISIT(v, node->_##ARG5NM, node);                        \
  ------------------
  |  |  317|  5.97k|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|  5.97k|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|  5.97k|    visit(visitor, field, parent);                           \
  |  |  320|  5.97k|  } else {                                                   \
  |  |  321|  5.97k|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|  5.97k|  }
  ------------------
  434|  5.97k|  }
_ZN6hermes6ESTree24RecursiveVisitorDispatchINS_3sem17SemanticValidatorELb1EE13visitChildrenERS3_PNS0_16ArrayPatternNodeE:
  335|     96|  static void visitChildren(Visitor &v, NAME##Node *node) {       \
  336|     96|    VISIT(v, node->_##ARG0NM, node);                              \
  ------------------
  |  |  317|     96|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     96|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     96|    visit(visitor, field, parent);                           \
  |  |  320|     96|  } else {                                                   \
  |  |  321|     96|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     96|  }
  ------------------
  337|     96|    VISIT(v, node->_##ARG1NM, node);                              \
  ------------------
  |  |  317|     96|  if constexpr (readOnlyVisitor) {                           \
  |  |  ------------------
  |  |  |  Branch (317:17): [Folded - Ignored]
  |  |  ------------------
  |  |  318|     96|    /* Read-only visitors don't need post-visit procesing */ \
  |  |  319|     96|    visit(visitor, field, parent);                           \
  |  |  320|     96|  } else {                                                   \
  |  |  321|     96|    postVisit(&(field), visit(visitor, field, parent));      \
  |  |  322|     96|  }
  ------------------
  338|     96|  }
_ZN6hermes6ESTree15visitESTreeNodeINS_3sem17SemanticValidatorEEEvRT_PNS0_4NodeES7_:
  559|   418k|void visitESTreeNode(Visitor &v, Node *node, Node *parent = nullptr) {
  560|   418k|  RecursiveVisitorDispatch<Visitor>::visit(v, node, parent);
  561|   418k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_11ProgramNodeEEEvRT_PT0_:
  565|     65|void visitESTreeChildren(Visitor &v, Node *node) {
  566|     65|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|     65|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_22VariableDeclaratorNodeEEEvRT_PT0_:
  565|      7|void visitESTreeChildren(Visitor &v, Node *node) {
  566|      7|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|      7|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20BinaryExpressionNodeEEEvRT_PT0_:
  565|  25.6k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  25.6k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  25.6k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_24AssignmentExpressionNodeEEEvRT_PT0_:
  565|    153|void visitESTreeChildren(Visitor &v, Node *node) {
  566|    153|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|    153|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20UpdateExpressionNodeEEEvRT_PT0_:
  565|     28|void visitESTreeChildren(Visitor &v, Node *node) {
  566|     28|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|     28|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_20LabeledStatementNodeEEEvRT_PT0_:
  565|  42.8k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  42.8k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  42.8k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_17RegExpLiteralNodeEEEvRT_PT0_:
  565|  11.4k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  11.4k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  11.4k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_18WhileStatementNodeEEEvRT_PT0_:
  565|      1|void visitESTreeChildren(Visitor &v, Node *node) {
  566|      1|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|      1|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_21ContinueStatementNodeEEEvRT_PT0_:
  565|      3|void visitESTreeChildren(Visitor &v, Node *node) {
  566|      3|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|      3|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_19ReturnStatementNodeEEEvRT_PT0_:
  565|   114k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|   114k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|   114k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_19UnaryExpressionNodeEEEvRT_PT0_:
  565|  4.09k|void visitESTreeChildren(Visitor &v, Node *node) {
  566|  4.09k|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|  4.09k|}
_ZN6hermes6ESTree19visitESTreeChildrenINS_3sem17SemanticValidatorENS0_16ArrayPatternNodeEEEvRT_PT0_:
  565|     96|void visitESTreeChildren(Visitor &v, Node *node) {
  566|     96|  RecursiveVisitorDispatch<Visitor>::visitChildren(v, node);
  567|     96|}

_ZN6hermes3sem12FunctionInfo13allocateLabelEv:
   68|  42.8k|  unsigned allocateLabel() {
   69|  42.8k|    return labelCount++;
   70|  42.8k|  }
_ZN6hermes3sem10SemContext14createFunctionEv:
   79|   114k|  FunctionInfo *createFunction() {
   80|   114k|    functions_.emplace_back();
   81|   114k|    return &functions_.back();
   82|   114k|  }

_ZN6hermes17CatchCoverageInfoC2Ei:
   35|     12|  explicit CatchCoverageInfo(int location) : catchLocation{location} {}
_ZNK6hermes20ExceptionHandlerInfoltERKS0_:
   50|      6|  bool operator<(const ExceptionHandlerInfo &rhs) const {
   51|      6|    assert(
   52|      6|        (this == &rhs || depth != rhs.depth || start != rhs.start) &&
   53|      6|        "two handlers with equal depth and start");
   54|      6|    return depth > rhs.depth || (depth == rhs.depth && start < rhs.start);
  ------------------
  |  Branch (54:12): [True: 0, False: 6]
  |  Branch (54:34): [True: 6, False: 0]
  |  Branch (54:56): [True: 4, False: 2]
  ------------------
   55|      6|  }
_ZN6hermes17CatchCoverageInfoC2Ev:
   36|     12|  explicit CatchCoverageInfo() = default;

_ZN6hermes3hbc16BytecodeFunctionC2EONSt3__16vectorIhNS2_9allocatorIhEEEEONS0_14FunctionHeaderEONS3_INS0_23HBCExceptionHandlerInfoENS4_ISA_EEEE:
   69|   114k|        exceptions_(std::move(exceptionHandlers)) {}
_ZNK6hermes3hbc16BytecodeFunction9getHeaderEv:
   71|  1.51k|  const FunctionHeader &getHeader() const {
   72|  1.51k|    return header_;
   73|  1.51k|  }
_ZNK6hermes3hbc16BytecodeFunction14getOpcodeArrayEv:
   96|    163|  ArrayRef<opcode_atom_t> getOpcodeArray() const {
   97|    163|    return opcodesAndJumpTables_;
   98|    163|  }
_ZNK6hermes3hbc16BytecodeFunction20getExceptionHandlersEv:
  118|     24|  ArrayRef<HBCExceptionHandlerInfo> getExceptionHandlers() const {
  119|     24|    return exceptions_;
  120|     24|  }
_ZNK6hermes3hbc16BytecodeFunction12hasDebugInfoEv:
  122|   114k|  bool hasDebugInfo() const {
  123|   114k|    return debugOffsets_.sourceLocations != DebugOffsets::NO_OFFSET ||
  ------------------
  |  Branch (123:12): [True: 114k, False: 0]
  ------------------
  124|   114k|        debugOffsets_.lexicalData != DebugOffsets::NO_OFFSET;
  ------------------
  |  Branch (124:9): [True: 0, False: 0]
  ------------------
  125|   114k|  }
_ZNK6hermes3hbc16BytecodeFunction15getDebugOffsetsEv:
  127|     28|  const DebugOffsets *getDebugOffsets() const {
  128|     28|    return &debugOffsets_;
  129|     28|  }
_ZN6hermes3hbc16BytecodeFunction15setDebugOffsetsENS0_12DebugOffsetsE:
  131|   114k|  void setDebugOffsets(DebugOffsets offsets) {
  132|   114k|    debugOffsets_ = offsets;
  133|   114k|    header_.flags.hasDebugInfo = hasDebugInfo();
  134|   114k|  }
_ZN6hermes3hbc16BytecodeFunction22setLazyCompilationDataENSt3__110unique_ptrINS0_19LazyCompilationDataENS2_14default_deleteIS4_EEEE:
  140|    674|  void setLazyCompilationData(std::unique_ptr<LazyCompilationData> data) {
  141|    674|    lazyCompilationData_ = std::move(data);
  142|    674|  }
_ZNK6hermes3hbc16BytecodeFunction6isLazyEv:
  145|    837|  bool isLazy() const {
  146|    837|    return (bool)lazyCompilationData_;
  147|    837|  }
_ZN6hermes3hbc14BytecodeModuleC2EjONSt3__16vectorINS_10StringKind5EntryENS2_9allocatorIS5_EEEEONS3_IjNS6_IjEEEEONS3_INS_16StringTableEntryENS6_ISD_EEEEONS3_IhNS6_IhEEEEONS3_INS_6bigint16BigIntTableEntryENS6_ISL_EEEESJ_ONS3_INS_16RegExpTableEntryENS6_ISP_EEEESJ_jSJ_SJ_SJ_jONS3_INS2_4pairIjjEENS6_ISU_EEEESX_SX_NS0_15BytecodeOptionsE:
  264|     56|        options_(options) {
  265|     56|    functions_.resize(functionCount);
  266|     56|  }
_ZNK6hermes3hbc14BytecodeModule15getNumFunctionsEv:
  276|   116k|  uint32_t getNumFunctions() const {
  277|   116k|    return functions_.size();
  278|   116k|  }
_ZNK6hermes3hbc14BytecodeModule22getGlobalFunctionIndexEv:
  280|     56|  uint32_t getGlobalFunctionIndex() const {
  281|     56|    return globalFunctionIndex_;
  282|     56|  }
_ZNK6hermes3hbc14BytecodeModule14getStringKindsEv:
  293|     56|  llvh::ArrayRef<StringKind::Entry> getStringKinds() const {
  294|     56|    return stringKinds_;
  295|     56|  }
_ZNK6hermes3hbc14BytecodeModule19getIdentifierHashesEv:
  302|     56|  llvh::ArrayRef<uint32_t> getIdentifierHashes() const {
  303|     56|    return identifierHashes_;
  304|     56|  }
_ZNK6hermes3hbc14BytecodeModule14getStringTableEv:
  310|    942|  StringTableEntry::StringTableRefTy getStringTable() const {
  311|    942|    return stringTable_;
  312|    942|  }
_ZNK6hermes3hbc14BytecodeModule16getStringStorageEv:
  318|     56|  StringTableEntry::StringStorageRefTy getStringStorage() const {
  319|     56|    return stringStorage_;
  320|     56|  }
_ZNK6hermes3hbc14BytecodeModule14getBigIntTableEv:
  322|     56|  llvh::ArrayRef<bigint::BigIntTableEntry> getBigIntTable() const {
  323|     56|    return bigIntTable_;
  324|     56|  }
_ZNK6hermes3hbc14BytecodeModule16getBigIntStorageEv:
  326|     56|  llvh::ArrayRef<uint8_t> getBigIntStorage() const {
  327|     56|    return bigIntStorage_;
  328|     56|  }
_ZNK6hermes3hbc14BytecodeModule14getRegExpTableEv:
  330|     56|  llvh::ArrayRef<RegExpTableEntry> getRegExpTable() const {
  331|     56|    return regExpTable_;
  332|     56|  }
_ZNK6hermes3hbc14BytecodeModule16getRegExpStorageEv:
  334|     56|  llvh::ArrayRef<unsigned char> getRegExpStorage() const {
  335|     56|    return regExpStorage_;
  336|     56|  }
_ZNK6hermes3hbc14BytecodeModule12getSegmentIDEv:
  338|     56|  uint32_t getSegmentID() const {
  339|     56|    return segmentID_;
  340|     56|  }
_ZNK6hermes3hbc14BytecodeModule17getCJSModuleTableEv:
  342|     56|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getCJSModuleTable() const {
  343|     56|    return cjsModuleTable_;
  344|     56|  }
_ZNK6hermes3hbc14BytecodeModule23getCJSModuleTableStaticEv:
  347|     56|      const {
  348|     56|    return cjsModuleTableStatic_;
  349|     56|  }
_ZNK6hermes3hbc14BytecodeModule22getFunctionSourceTableEv:
  351|     56|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getFunctionSourceTable() const {
  352|     56|    return functionSourceTable_;
  353|     56|  }
_ZN6hermes3hbc14BytecodeModule12getDebugInfoEv:
  355|     56|  DebugInfo &getDebugInfo() {
  356|     56|    return debugInfo_;
  357|     56|  }
_ZN6hermes3hbc14BytecodeModule12setDebugInfoENS0_9DebugInfoE:
  359|     56|  void setDebugInfo(DebugInfo info) {
  360|     56|    debugInfo_ = std::move(info);
  361|     56|  }
_ZNK6hermes3hbc14BytecodeModule14getArrayBufferEv:
  367|     56|  ArrayRef<unsigned char> getArrayBuffer() const {
  368|     56|    return arrayBuffer_;
  369|     56|  }
_ZNK6hermes3hbc14BytecodeModule15getObjectBufferEv:
  384|    112|      const {
  385|    112|    return {
  386|    112|        ArrayRef<unsigned char>(objKeyBuffer_),
  387|    112|        ArrayRef<unsigned char>(objValBuffer_)};
  388|    112|  }
_ZNK6hermes3hbc14BytecodeModule18getBytecodeOptionsEv:
  402|     56|  BytecodeOptions getBytecodeOptions() const {
  403|     56|    return options_;
  404|     56|  }

_ZN6hermes3hbc20BCProviderFromBuffer16isBytecodeStreamEN4llvh8ArrayRefIhEE:
  388|    198|  static bool isBytecodeStream(llvh::ArrayRef<uint8_t> aref) {
  389|    198|    const auto *header =
  390|    198|        reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
  391|    198|    return (
  392|    198|        aref.size() >= sizeof(hbc::BytecodeFileHeader) &&
  ------------------
  |  Branch (392:9): [True: 198, False: 0]
  ------------------
  393|    198|        header->magic == hbc::MAGIC);
  ------------------
  |  Branch (393:9): [True: 0, False: 198]
  ------------------
  394|    198|  }
_ZN6hermes3hbc20BCProviderFromBuffer26createBCProviderFromBufferENSt3__110unique_ptrIKNS_6BufferENS2_14default_deleteIS5_EEEENS0_12BytecodeFormE:
  380|    198|      BytecodeForm form = BytecodeForm::Execution) {
  381|    198|    auto ret = std::unique_ptr<BCProviderFromBuffer>(
  382|    198|        new BCProviderFromBuffer(std::move(buffer), form));
  383|    198|    auto errstr = ret->getErrorStr();
  384|    198|    return {errstr.empty() ? std::move(ret) : nullptr, errstr};
  ------------------
  |  Branch (384:13): [True: 198, False: 0]
  ------------------
  385|    198|  }
_ZNK6hermes3hbc14BCProviderBase11getErrorStrEv:
  217|    198|  const std::string getErrorStr() const {
  218|    198|    return errstr_;
  219|    198|  }
_ZN6hermes3hbc20BCProviderFromBufferD2Ev:
  505|    198|  ~BCProviderFromBuffer() override {
  506|    198|    stopWarmup();
  507|    198|    delete debugInfo_;
  508|    198|  }
_ZN6hermes3hbc14BCProviderBaseD2Ev:
  269|    928|  virtual ~BCProviderBase() = default;
_ZNK6hermes3hbc14BCProviderBase12getRawBufferEv:
  305|    786|  virtual llvh::ArrayRef<uint8_t> getRawBuffer() const {
  306|    786|    return llvh::ArrayRef<uint8_t>();
  307|    786|  }
_ZN6hermes3hbc21RuntimeFunctionHeaderC2EPKNS0_15SmallFuncHeaderE:
   55|  7.72k|      : ptr_(reinterpret_cast<const char *>(smallHeader)) {
   56|  7.72k|    assert(!isLarge());
   57|  7.72k|  }
_ZN6hermes3hbc21RuntimeFunctionHeaderC2EPKNS0_14FunctionHeaderE:
   59|    837|      : ptr_(reinterpret_cast<const char *>(large) + 1) {
   60|    837|    assert(isLarge());
   61|    837|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader6offsetEv:
   64|  3.86k|  api_type name() const {                                       \
   65|  3.86k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  3.86k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.86k]
  |  |  ------------------
  ------------------
   66|  3.86k|      return asLarge()->name;                                   \
   67|  3.86k|    else                                                        \
   68|  3.86k|      return asSmall()->name;                                   \
   69|  3.86k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader10paramCountEv:
   64|    222|  api_type name() const {                                       \
   65|    222|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 24, False: 198]
  |  |  ------------------
  ------------------
   66|    222|      return asLarge()->name;                                   \
   67|    222|    else                                                        \
   68|    222|      return asSmall()->name;                                   \
   69|    222|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader19bytecodeSizeInBytesEv:
   64|   441k|  api_type name() const {                                       \
   65|   441k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|   441k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 400k, False: 40.9k]
  |  |  ------------------
  ------------------
   66|   441k|      return asLarge()->name;                                   \
   67|   441k|    else                                                        \
   68|   441k|      return asSmall()->name;                                   \
   69|   441k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader12functionNameEv:
   64|    222|  api_type name() const {                                       \
   65|    222|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 24, False: 198]
  |  |  ------------------
  ------------------
   66|    222|      return asLarge()->name;                                   \
   67|    222|    else                                                        \
   68|    222|      return asSmall()->name;                                   \
   69|    222|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader9frameSizeEv:
   64|  6.33k|  api_type name() const {                                       \
   65|  6.33k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  6.33k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 893, False: 5.44k]
  |  |  ------------------
  ------------------
   66|  6.33k|      return asLarge()->name;                                   \
   67|  6.33k|    else                                                        \
   68|  6.33k|      return asSmall()->name;                                   \
   69|  6.33k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader15environmentSizeEv:
   64|    452|  api_type name() const {                                       \
   65|    452|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|    452|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56, False: 396]
  |  |  ------------------
  ------------------
   66|    452|      return asLarge()->name;                                   \
   67|    452|    else                                                        \
   68|    452|      return asSmall()->name;                                   \
   69|    452|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader21highestReadCacheIndexEv:
   64|  4.69k|  api_type name() const {                                       \
   65|  4.69k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  4.69k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 837, False: 3.86k]
  |  |  ------------------
  ------------------
   66|  4.69k|      return asLarge()->name;                                   \
   67|  4.69k|    else                                                        \
   68|  4.69k|      return asSmall()->name;                                   \
   69|  4.69k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader22highestWriteCacheIndexEv:
   64|  4.69k|  api_type name() const {                                       \
   65|  4.69k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  4.69k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 837, False: 3.86k]
  |  |  ------------------
  ------------------
   66|  4.69k|      return asLarge()->name;                                   \
   67|  4.69k|    else                                                        \
   68|  4.69k|      return asSmall()->name;                                   \
   69|  4.69k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader5flagsEv:
   64|  5.20k|  api_type name() const {                                       \
   65|  5.20k|    if (LLVM_UNLIKELY(isLarge()))                               \
  ------------------
  |  |  189|  5.20k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 160, False: 5.04k]
  |  |  ------------------
  ------------------
   66|  5.20k|      return asLarge()->name;                                   \
   67|  5.20k|    else                                                        \
   68|  5.20k|      return asSmall()->name;                                   \
   69|  5.20k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7isLargeEv:
   79|   942k|  bool isLarge() const {
   80|   942k|    return reinterpret_cast<uintptr_t>(ptr_) & 1;
   81|   942k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7asSmallEv:
   83|  63.8k|  const hbc::SmallFuncHeader *asSmall() const {
   84|  63.8k|    assert(!isLarge());
   85|      0|    return reinterpret_cast<const hbc::SmallFuncHeader *>(ptr_);
   86|  63.8k|  }
_ZNK6hermes3hbc21RuntimeFunctionHeader7asLargeEv:
   88|   403k|  const hbc::FunctionHeader *asLarge() const {
   89|   403k|    assert(isLarge());
   90|      0|    return reinterpret_cast<const hbc::FunctionHeader *>(ptr_ - 1);
   91|   403k|  }
_ZNK6hermes3hbc14BCProviderBase18getBytecodeOptionsEv:
  159|    310|  BytecodeOptions getBytecodeOptions() const {
  160|    310|    return options_;
  161|    310|  }
_ZNK6hermes3hbc14BCProviderBase16getFunctionCountEv:
  162|    508|  uint32_t getFunctionCount() const {
  163|    508|    return functionCount_;
  164|    508|  }
_ZNK6hermes3hbc14BCProviderBase22getGlobalFunctionIndexEv:
  165|    155|  uint32_t getGlobalFunctionIndex() const {
  166|    155|    return globalFunctionIndex_;
  167|    155|  }
_ZNK6hermes3hbc14BCProviderBase14getStringCountEv:
  168|    254|  uint32_t getStringCount() const {
  169|    254|    return stringCount_;
  170|    254|  }
_ZNK6hermes3hbc14BCProviderBase14getStringKindsEv:
  174|    254|  llvh::ArrayRef<StringKind::Entry> getStringKinds() const {
  175|    254|    return stringKinds_;
  176|    254|  }
_ZNK6hermes3hbc14BCProviderBase19getIdentifierHashesEv:
  177|    254|  llvh::ArrayRef<uint32_t> getIdentifierHashes() const {
  178|    254|    return identifierHashes_;
  179|    254|  }
_ZNK6hermes3hbc14BCProviderBase16getStringStorageEv:
  180|  8.21k|  llvh::ArrayRef<unsigned char> getStringStorage() const {
  181|  8.21k|    return stringStorage_;
  182|  8.21k|  }
_ZNK6hermes3hbc14BCProviderBase14getArrayBufferEv:
  183|  10.9k|  llvh::ArrayRef<unsigned char> getArrayBuffer() const {
  184|  10.9k|    return arrayBuffer_;
  185|  10.9k|  }
_ZNK6hermes3hbc14BCProviderBase18getObjectKeyBufferEv:
  186|  1.10k|  llvh::ArrayRef<unsigned char> getObjectKeyBuffer() const {
  187|  1.10k|    return objKeyBuffer_;
  188|  1.10k|  }
_ZNK6hermes3hbc14BCProviderBase20getObjectValueBufferEv:
  189|    877|  llvh::ArrayRef<unsigned char> getObjectValueBuffer() const {
  190|    877|    return objValueBuffer_;
  191|    877|  }
_ZNK6hermes3hbc14BCProviderBase14getRegExpTableEv:
  198|    484|  llvh::ArrayRef<RegExpTableEntry> getRegExpTable() const {
  199|    484|    return regExpTable_;
  200|    484|  }
_ZNK6hermes3hbc14BCProviderBase16getRegExpStorageEv:
  201|    242|  llvh::ArrayRef<unsigned char> getRegExpStorage() const {
  202|    242|    return regExpStorage_;
  203|    242|  }
_ZNK6hermes3hbc14BCProviderBase17getCJSModuleTableEv:
  207|    310|  llvh::ArrayRef<std::pair<uint32_t, uint32_t>> getCJSModuleTable() const {
  208|    310|    return cjsModuleTable_;
  209|    310|  }
_ZNK6hermes3hbc14BCProviderBase23getCJSModuleTableStaticEv:
  211|    310|      const {
  212|    310|    return cjsModuleTableStatic_;
  213|    310|  }
_ZNK6hermes3hbc14BCProviderBase12getDebugInfoEv:
  231|     52|  const hbc::DebugInfo *getDebugInfo() const {
  232|     52|    if (!debugInfo_) {
  ------------------
  |  Branch (232:9): [True: 0, False: 52]
  ------------------
  233|      0|      const_cast<BCProviderBase *>(this)->createDebugInfo();
  234|      0|    }
  235|     52|    return debugInfo_;
  236|     52|  }
_ZNK6hermes3hbc20BCProviderFromBuffer17getFunctionHeaderEj:
  435|  7.72k|  RuntimeFunctionHeader getFunctionHeader(uint32_t functionID) const override {
  436|  7.72k|    const hbc::SmallFuncHeader &smallHeader = functionHeaders_[functionID];
  437|  7.72k|    if (LLVM_UNLIKELY(smallHeader.flags.overflowed)) {
  ------------------
  |  |  189|  7.72k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.72k]
  |  |  ------------------
  ------------------
  438|      0|      auto large = reinterpret_cast<const hbc::FunctionHeader *>(
  439|      0|          bufferPtr_ + smallHeader.getLargeHeaderOffset());
  440|      0|      return RuntimeFunctionHeader(large);
  441|  7.72k|    } else {
  442|  7.72k|      return RuntimeFunctionHeader(&smallHeader);
  443|  7.72k|    }
  444|  7.72k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer19getStringTableEntryEj:
  459|  7.32k|  StringTableEntry getStringTableEntry(uint32_t index) const override {
  460|  7.32k|    auto &smallHeader = stringTableEntries_[index];
  461|  7.32k|    if (LLVM_UNLIKELY(smallHeader.isOverflowed())) {
  ------------------
  |  |  189|  7.32k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.32k]
  |  |  ------------------
  ------------------
  462|      0|      auto overflow = overflowStringTableEntries_[smallHeader.offset];
  463|      0|      StringTableEntry entry(
  464|      0|          overflow.offset, overflow.length, smallHeader.isUTF16);
  465|      0|      return entry;
  466|      0|    }
  467|  7.32k|    StringTableEntry entry(
  468|  7.32k|        smallHeader.offset, smallHeader.length, smallHeader.isUTF16);
  469|  7.32k|    return entry;
  470|  7.32k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer11getBytecodeEj:
  472|  3.86k|  const uint8_t *getBytecode(uint32_t functionID) const override {
  473|  3.86k|    return bufferPtr_ + getFunctionHeader(functionID).offset();
  474|  3.86k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer12getRawBufferEv:
  501|    297|  llvh::ArrayRef<uint8_t> getRawBuffer() const override {
  502|    297|    return llvh::ArrayRef<uint8_t>(bufferPtr_, buffer_->size());
  503|    297|  }
_ZNK6hermes3hbc20BCProviderFromBuffer14isFunctionLazyEj:
  510|  3.86k|  bool isFunctionLazy(uint32_t functionID) const override {
  511|  3.86k|    return false;
  512|  3.86k|  }
_ZNK6hermes3hbc20BCProviderFromBuffer6isLazyEv:
  514|  3.86k|  bool isLazy() const override {
  515|  3.86k|    return false;
  516|  3.86k|  }

_ZN6hermes3hbc15BytecodeOptionsC2Ev:
   58|  1.08k|  BytecodeOptions() : _flags(0) {}
_ZN6hermes3hbc18BytecodeFileHeaderC2EmjRKNSt3__15arrayIhLm20EEEjjjjjjjjjjjjjjjjjjjNS0_15BytecodeOptionsE:
  145|     99|        options(options) {
  146|     99|    std::copy(sourceHash.begin(), sourceHash.end(), this->sourceHash);
  147|     99|    std::fill(padding, padding + sizeof(padding), 0);
  148|     99|  }
_ZN6hermes3hbc18BytecodeFileFooterC2ERKNSt3__15arrayIhLm20EEE:
  161|     99|  BytecodeFileFooter(const SHA1 &fileHash) {
  162|     99|    std::copy(fileHash.begin(), fileHash.end(), this->fileHash);
  163|     99|  }
_ZNK6hermes3hbc21SmallStringTableEntry12isOverflowedEv:
  184|  7.32k|  bool isOverflowed() const {
  185|  7.32k|    return length == INVALID_LENGTH;
  186|  7.32k|  }
_ZN6hermes3hbc18FunctionHeaderFlagC2Ev:
  237|   115k|  FunctionHeaderFlag() {
  238|   115k|    flags = 0;
  239|   115k|    prohibitInvoke = ProhibitNone;
  240|   115k|  }
_ZNK6hermes3hbc18FunctionHeaderFlag16isCallProhibitedEb:
  244|  1.86k|  bool isCallProhibited(bool construct) const {
  245|  1.86k|    return prohibitInvoke == (uint8_t)construct;
  246|  1.86k|  }
_ZN6hermes3hbc14FunctionHeaderC2Ejjjjjhh:
  301|   115k|        highestWriteCacheIndex(hiWCacheIndex) {}
_ZN6hermes3hbc15SmallFuncHeaderC2ERKNS0_14FunctionHeaderE:
  324|    198|  SmallFuncHeader(const FunctionHeader &large) {
  325|    198|    std::memset(this, 0, sizeof(SmallFuncHeader)); // Avoid leaking junk.
  326|    198|    flags = large.flags;
  327|    198|#define CHECK_COPY_FIELD(api_type, store_type, name, bits) \
  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  329|    198|    setLargeHeaderOffset(large.infoOffset);                \
  330|    198|    return;                                                \
  331|    198|  }                                                        \
  332|    198|  name = large.name;
  333|    198|#pragma GCC diagnostic push
  334|    198|#pragma GCC diagnostic ignored "-Wtype-limits"
  335|  1.78k|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  ------------------
  |  |  260|    198|  V(uint32_t, uint32_t, offset, 25)              \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  261|    198|  V(uint32_t, uint32_t, paramCount, 7)           \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  262|    198|  /* second word */                              \
  |  |  263|    198|  V(uint32_t, uint32_t, bytecodeSizeInBytes, 15) \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  264|    198|  V(uint32_t, uint32_t, functionName, 17)        \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  265|    198|  /* third word */                               \
  |  |  266|    198|  V(uint32_t, uint32_t, infoOffset, 25)          \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  267|    198|  V(uint32_t, uint32_t, frameSize, 7)            \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|    198|  /* fourth word, with flags below */            \
  |  |  269|    198|  V(uint32_t, uint8_t, environmentSize, 8)       \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  270|    198|  V(uint8_t, uint8_t, highestReadCacheIndex, 8)  \
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  271|    198|  V(uint8_t, uint8_t, highestWriteCacheIndex, 8)
  |  |  ------------------
  |  |  |  |  335|    198|    FUNC_HEADER_FIELDS(CHECK_COPY_FIELD)
  |  |  |  |  ------------------
  |  |  |  |  |  |  328|    198|  if (large.name > (1U << bits) - 1) {                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (328:7): [True: 0, False: 198]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  329|      0|    setLargeHeaderOffset(large.infoOffset);                \
  |  |  |  |  |  |  330|      0|    return;                                                \
  |  |  |  |  |  |  331|      0|  }                                                        \
  |  |  |  |  |  |  332|    198|  name = large.name;
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  336|  1.78k|#pragma GCC diagnostic pop
  337|  1.78k|#undef CHECK_COPY_FIELD
  338|  1.78k|    assert(!flags.overflowed);
  339|  1.78k|  }
_ZN6hermes3hbc28visitBytecodeSegmentsInOrderIZNS0_18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEENS0_12BytecodeFormEE27BytecodeFileFieldsPopulatorEEvRT_:
  407|    198|void visitBytecodeSegmentsInOrder(Visitor &visitor) {
  408|    198|  visitor.visitFunctionHeaders();
  409|    198|  visitor.visitStringKinds();
  410|    198|  visitor.visitIdentifierHashes();
  411|    198|  visitor.visitSmallStringTable();
  412|    198|  visitor.visitOverflowStringTable();
  413|    198|  visitor.visitStringStorage();
  414|    198|  visitor.visitArrayBuffer();
  415|    198|  visitor.visitObjectKeyBuffer();
  416|    198|  visitor.visitObjectValueBuffer();
  417|    198|  visitor.visitBigIntTable();
  418|    198|  visitor.visitBigIntStorage();
  419|    198|  visitor.visitRegExpTable();
  420|    198|  visitor.visitRegExpStorage();
  421|    198|  visitor.visitCJSModuleTable();
  422|    198|  visitor.visitFunctionSourceTable();
  423|    198|}

_ZN6hermes3hbc23BytecodeModuleGeneratorC2ENS_25BytecodeGenerationOptionsE:
  365|     56|      : options_(options) {}
_ZN6hermes3hbc23BytecodeModuleGenerator18setEntryPointIndexEi:
  381|     56|  void setEntryPointIndex(int index) {
  382|     56|    entryPointIndex_ = index;
  383|     56|  }
_ZNK6hermes3hbc23BytecodeModuleGenerator18getEntryPointIndexEv:
  376|     56|  int getEntryPointIndex() const {
  377|     56|    return entryPointIndex_;
  378|     56|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator6createERNS0_23BytecodeModuleGeneratorEj:
  117|   114k|      uint32_t frameSize) {
  118|   114k|    return std::unique_ptr<BytecodeFunctionGenerator>(
  119|   114k|        new BytecodeFunctionGenerator(BMGen, frameSize));
  120|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGeneratorC2ERNS0_23BytecodeModuleGeneratorEj:
  112|   114k|      : BytecodeInstructionGenerator(), BMGen_(BMGen), frameSize_(frameSize) {}
_ZN6hermes3hbc25BytecodeFunctionGenerator17setSourceLocationERKNS0_19DebugSourceLocationE:
  165|   114k|  void setSourceLocation(const DebugSourceLocation &location) {
  166|   114k|    assert(
  167|   114k|        !complete_ &&
  168|   114k|        "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
  169|      0|    sourceLocation_ = location;
  170|   114k|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator17getSourceLocationEv:
  172|   114k|  const DebugSourceLocation &getSourceLocation() const {
  173|   114k|    return sourceLocation_;
  174|   114k|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator17getDebugLocationsEv:
  178|   114k|  const std::vector<DebugSourceLocation> &getDebugLocations() const {
  179|   114k|    return debugLocations_;
  180|   114k|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator12hasDebugInfoEv:
  182|   114k|  bool hasDebugInfo() const {
  183|   114k|    return !debugLocations_.empty() || lexicalParentID_ ||
  ------------------
  |  Branch (183:12): [True: 114k, False: 674]
  |  Branch (183:40): [True: 0, False: 674]
  ------------------
  184|   114k|        !debugVariableNamesUTF8_.empty() || !textifiedCallees_.empty();
  ------------------
  |  Branch (184:9): [True: 0, False: 674]
  |  Branch (184:45): [True: 0, False: 674]
  ------------------
  185|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator22addDebugTextfiedCalleeERKNS0_20DebugTextifiedCalleeE:
  188|      8|  void addDebugTextfiedCallee(const DebugTextifiedCallee &tCallee) {
  189|      8|    textifiedCallees_.emplace_back(tCallee);
  190|      8|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator19getTextifiedCalleesEv:
  192|   114k|  llvh::ArrayRef<DebugTextifiedCallee> getTextifiedCallees() const {
  193|   114k|    return textifiedCallees_;
  194|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator25setDebugVariableNamesUTF8ENSt3__16vectorINS_10IdentifierENS2_9allocatorIS4_EEEE:
  197|   114k|  void setDebugVariableNamesUTF8(std::vector<Identifier> names) {
  198|   114k|    assert(
  199|   114k|        !complete_ &&
  200|   114k|        "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
  201|      0|    debugVariableNamesUTF8_ = std::move(names);
  202|   114k|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator25getDebugVariableNamesUTF8Ev:
  205|   114k|  llvh::ArrayRef<Identifier> getDebugVariableNamesUTF8() const {
  206|   114k|    return debugVariableNamesUTF8_;
  207|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator18setLexicalParentIDENS_8OptValueIjEE:
  210|   114k|  void setLexicalParentID(OptValue<uint32_t> parentID) {
  211|   114k|    assert(
  212|   114k|        !complete_ &&
  213|   114k|        "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
  214|      0|    lexicalParentID_ = parentID;
  215|   114k|  }
_ZNK6hermes3hbc25BytecodeFunctionGenerator18getLexicalParentIDEv:
  220|   114k|  OptValue<uint32_t> getLexicalParentID() const {
  221|   114k|    return lexicalParentID_;
  222|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator15longToShortJumpEj:
  242|    108|  inline void longToShortJump(offset_t loc) {
  243|    108|    switch (opcodes_[loc]) {
  244|      0|#define DEFINE_JUMP_LONG_VARIANT(shortName, longName) \
  245|      0|  case longName##Op:                                  \
  246|      0|    opcodes_[loc] = shortName##Op;                    \
  247|      0|    break;
  248|      0|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|     40|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|     40|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|     40|#endif
  |  |   12|     40|#ifndef DEFINE_OPCODE_0
  |  |   13|     40|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|     40|#endif
  |  |   15|     40|#ifndef DEFINE_OPCODE_1
  |  |   16|     40|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|     40|#endif
  |  |   18|     40|#ifndef DEFINE_OPCODE_2
  |  |   19|     40|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|     40|#endif
  |  |   21|     40|#ifndef DEFINE_OPCODE_3
  |  |   22|     40|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|     40|#endif
  |  |   24|     40|#ifndef DEFINE_OPCODE_4
  |  |   25|     40|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|     40|#endif
  |  |   27|     40|#ifndef DEFINE_OPCODE_5
  |  |   28|     40|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|     40|#endif
  |  |   30|     40|#ifndef DEFINE_OPCODE_6
  |  |   31|     40|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|     40|#endif
  |  |   33|     40|#ifndef DEFINE_OPCODE
  |  |   34|     40|#define DEFINE_OPCODE(...)
  |  |   35|     40|#endif
  |  |   36|       |#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|       |#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|       |#endif
  |  |   39|     40|#ifndef DEFINE_RET_TARGET
  |  |   40|     40|#define DEFINE_RET_TARGET(...)
  |  |   41|     40|#endif
  |  |   42|     40|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|     40|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|     40|#endif
  |  |   45|     40|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|     40|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|     40|#endif
  |  |   48|     40|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|     40|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|     40|#endif
  |  |   51|     40|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|     40|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|     40|#endif
  |  |   54|     40|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|     40|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|     40|#endif
  |  |   57|     40|#ifndef OPERAND_BIGINT_ID
  |  |   58|     40|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|     40|#endif
  |  |   60|     40|#ifndef OPERAND_FUNCTION_ID
  |  |   61|     40|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|     40|#endif
  |  |   63|     40|#ifndef OPERAND_STRING_ID
  |  |   64|     40|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|     40|#endif
  |  |   66|       |
  |  |   67|     40|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|     40|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|     40|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|     40|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|     40|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|     40|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|     40|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|     40|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|     40|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|     40|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|     40|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|     40|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|     40|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|     40|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|     40|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|     40|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|     40|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|     40|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|     40|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|     40|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|     40|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|     40|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|     40|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|     40|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|     40|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|     40|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|     40|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|     40|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|     40|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|     40|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|     40|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|     40|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|     40|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|     40|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|     40|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|     40|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|     40|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|     40|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|     40|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|     40|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|     40|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|     40|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|     40|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|     40|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|     40|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|     40|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|     40|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|     40|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|     40|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|     40|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|     40|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|     40|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|     40|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|     40|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|     40|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|     40|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|     40|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|     40|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|     40|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|     40|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|     40|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|     40|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|     40|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|     40|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|     40|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|     40|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|     40|OPERAND_STRING_ID(GetById, 4)
  |  |  261|     40|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|     40|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|     40|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|     40|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|     40|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|     40|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|     40|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|     40|OPERAND_STRING_ID(PutById, 4)
  |  |  276|     40|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|     40|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|     40|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|     40|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|     40|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|     40|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|     40|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|     40|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|     40|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|     40|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|     40|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|     40|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|     40|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|     40|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|     40|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|     40|ASSERT_MONOTONE_INCREASING(
  |  |  314|     40|    PutNewOwnByIdShort,
  |  |  315|     40|    PutNewOwnById,
  |  |  316|     40|    PutNewOwnByIdLong,
  |  |  317|     40|    PutNewOwnNEById,
  |  |  318|     40|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|     40|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|     40|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|     40|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|     40|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|     40|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|     40|OPERAND_STRING_ID(DelById, 3)
  |  |  341|     40|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|     40|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|     40|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|     40|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|     40|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|     40|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|     40|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|     40|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|     40|DEFINE_RET_TARGET(Call)
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|     40|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|     40|DEFINE_RET_TARGET(Construct)
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|     40|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|     40|DEFINE_RET_TARGET(Call1)
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|     40|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|     40|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|     40|DEFINE_RET_TARGET(CallDirect)
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|     40|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|     40|DEFINE_RET_TARGET(Call2)
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|     40|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|     40|DEFINE_RET_TARGET(Call3)
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|     40|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|     40|DEFINE_RET_TARGET(Call4)
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|     40|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|     40|DEFINE_RET_TARGET(CallLong)
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|     40|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|     40|DEFINE_RET_TARGET(ConstructLong)
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|     40|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|     40|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|     40|ASSERT_MONOTONE_INCREASING(
  |  |  464|     40|    Call,
  |  |  465|     40|    Construct,
  |  |  466|     40|    Call1,
  |  |  467|     40|    CallDirect,
  |  |  468|     40|    Call2,
  |  |  469|     40|    Call3,
  |  |  470|     40|    Call4,
  |  |  471|     40|    CallLong,
  |  |  472|     40|    ConstructLong,
  |  |  473|     40|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|     40|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|     40|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|     40|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|     40|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|     40|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|     40|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|     40|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|     40|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|     40|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|     40|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|     40|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|     40|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|     40|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|     40|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|     40|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|     40|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|     40|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|     40|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|     40|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|     40|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|     40|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|     40|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|     40|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|     40|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|     40|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|     40|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|     40|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|     40|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|     40|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|     40|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|     40|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|     40|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|     40|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|     40|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|     40|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|     40|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|     40|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|     40|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|     40|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|     40|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|     40|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|     40|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|     40|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|     40|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|     40|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|     40|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|     40|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|     40|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|     40|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|     40|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|     40|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|     40|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|     40|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|     40|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|     40|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|     40|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|     40|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|     40|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|     40|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|     40|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|     40|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|     40|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|     40|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|     40|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|     40|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|     40|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|     40|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|     40|#define DEFINE_JUMP_1(name)           \
  |  |  751|     40|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|     40|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|     40|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|     40|#define DEFINE_JUMP_2(name)                 \
  |  |  756|     40|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|     40|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|     40|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|     40|#define DEFINE_JUMP_3(name)                       \
  |  |  761|     40|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|     40|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|     40|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|     40|DEFINE_JUMP_1(Jmp)
  |  |  ------------------
  |  |  |  |  751|     40|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  752|     40|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  753|     40|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|     40|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 40, False: 68]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|     40|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|     40|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|     65|DEFINE_JUMP_2(JmpTrue)
  |  |  ------------------
  |  |  |  |  756|     65|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  757|     65|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  758|     65|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|     65|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 65, False: 43]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|     65|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|     65|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  769|     65|DEFINE_JUMP_2(JmpFalse)
  |  |  ------------------
  |  |  |  |  756|      3|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  757|      3|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  758|      3|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      3|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 3, False: 105]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      3|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      3|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|      3|DEFINE_JUMP_2(JmpUndefined)
  |  |  ------------------
  |  |  |  |  756|      0|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  757|      0|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  758|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|      0|DEFINE_JUMP_1(SaveGenerator)
  |  |  ------------------
  |  |  |  |  751|      0|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  752|      0|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  753|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|      0|DEFINE_JUMP_3(JLess)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  785|      0|DEFINE_JUMP_3(JNotLess)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  786|      0|DEFINE_JUMP_3(JLessN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  787|      0|DEFINE_JUMP_3(JNotLessN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  788|      0|DEFINE_JUMP_3(JLessEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  789|      0|DEFINE_JUMP_3(JNotLessEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  790|      0|DEFINE_JUMP_3(JLessEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  791|      0|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  792|      0|DEFINE_JUMP_3(JGreater)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  793|      0|DEFINE_JUMP_3(JNotGreater)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  794|      0|DEFINE_JUMP_3(JGreaterN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  795|      0|DEFINE_JUMP_3(JNotGreaterN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  796|      0|DEFINE_JUMP_3(JGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  797|      0|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  798|      0|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  799|      0|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  800|      0|DEFINE_JUMP_3(JEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  801|      0|DEFINE_JUMP_3(JNotEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  802|      0|DEFINE_JUMP_3(JStrictEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  803|      0|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  |  |  ------------------
  |  |  |  |  |  |  245|      0|  case longName##Op:                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (245:3): [True: 0, False: 108]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  246|      0|    opcodes_[loc] = shortName##Op;                    \
  |  |  |  |  |  |  247|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|      0|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|      0|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|      0|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|      0|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|      0|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|      0|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|      0|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|      0|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|      0|#undef DEFINE_JUMP_1
  |  |  854|      0|#undef DEFINE_JUMP_2
  |  |  855|      0|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|      0|#undef DEFINE_OPERAND_TYPE
  |  |  859|      0|#undef DEFINE_OPCODE_0
  |  |  860|      0|#undef DEFINE_OPCODE_1
  |  |  861|      0|#undef DEFINE_OPCODE_2
  |  |  862|      0|#undef DEFINE_OPCODE_3
  |  |  863|      0|#undef DEFINE_OPCODE_4
  |  |  864|      0|#undef DEFINE_OPCODE_5
  |  |  865|      0|#undef DEFINE_OPCODE_6
  |  |  866|      0|#undef DEFINE_OPCODE
  |  |  867|      0|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|      0|#undef DEFINE_RET_TARGET
  |  |  869|      0|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|      0|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|      0|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|      0|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|      0|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|      0|#undef OPERAND_BIGINT_ID
  |  |  875|      0|#undef OPERAND_FUNCTION_ID
  |  |  876|      0|#undef OPERAND_STRING_ID
  ------------------
  249|      0|      default:
  ------------------
  |  Branch (249:7): [True: 0, False: 108]
  ------------------
  250|      0|        llvm_unreachable("Unknown jump opcode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  251|    108|    }
  252|    108|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator24setHighestReadCacheIndexEh:
  259|   114k|  void setHighestReadCacheIndex(uint8_t sz) {
  260|   114k|    assert(
  261|   114k|        !complete_ &&
  262|   114k|        "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
  263|      0|    this->highestReadCacheIndex_ = sz;
  264|   114k|  }
_ZN6hermes3hbc25BytecodeFunctionGenerator25setHighestWriteCacheIndexEh:
  265|   114k|  void setHighestWriteCacheIndex(uint8_t sz) {
  266|   114k|    assert(
  267|   114k|        !complete_ &&
  268|   114k|        "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
  269|      0|    this->highestWriteCacheIndex_ = sz;
  270|   114k|  }
_ZN6hermes3hbc23BytecodeModuleGenerator26serializedLiteralOffsetForEPKNS_11InstructionE:
  470|  21.0k|  LiteralOffset serializedLiteralOffsetFor(const Instruction *inst) {
  471|  21.0k|    assert(
  472|  21.0k|        literalOffsetMap_.count(inst) &&
  473|  21.0k|        "instruction has no serialized literal");
  474|      0|    return literalOffsetMap_[inst];
  475|  21.0k|  }
_ZN6hermes3hbc15AllocationTableIPNS_8FunctionEE8allocateES3_:
   48|   343k|  unsigned allocate(T val) {
   49|   343k|    auto it = indexMap_.find(val);
   50|   343k|    if (it != indexMap_.end()) {
  ------------------
  |  Branch (50:9): [True: 228k, False: 114k]
  ------------------
   51|   228k|      return it->second;
   52|   228k|    }
   53|   114k|    auto nextId = indexMap_.size();
   54|   114k|    indexMap_[val] = nextId;
   55|   114k|    elements_.push_back(val);
   56|   114k|    return nextId;
   57|   343k|  }
_ZNK6hermes3hbc15AllocationTableIPNS_8FunctionEE11getElementsEv:
   59|    112|  const ArrayRef<T> getElements() const {
   60|    112|    return elements_;
   61|    112|  }

_ZNK6hermes3hbc28BytecodeInstructionGenerator16hasEncodingErrorEv:
   54|   229k|  bool hasEncodingError() const {
   55|   229k|    return encodingError_;
   56|   229k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator18getCurrentLocationEv:
   59|  2.82M|  offset_t getCurrentLocation() {
   60|  2.82M|    return opcodes_.size();
   61|  2.82M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitOpcodeENS0_8OperatorE:
   63|  1.63M|  offset_t emitOpcode(Operator op) {
   64|  1.63M|    auto loc = getCurrentLocation();
   65|  1.63M|    emitUInt8(op);
   66|  1.63M|    return loc;
   67|  1.63M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitOperandEli:
   69|  5.13M|  void emitOperand(param_t t, int size) {
   70|  12.2M|    while (size--) {
  ------------------
  |  Branch (70:12): [True: 7.07M, False: 5.13M]
  ------------------
   71|  7.07M|      opcodes_.push_back((opcode_atom_t)t);
   72|  7.07M|      t >>= 8;
   73|  7.07M|    }
   74|  5.13M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator15acquireBytecodeEv:
   77|    198|  std::vector<opcode_atom_t> acquireBytecode() {
   78|    198|    return std::move(opcodes_);
   79|    198|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitReg8El:
   89|  2.25M|  void emit##name(param_t value) {                        \
   90|  2.25M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 2.25M]
  ------------------
   91|  2.25M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  2.25M|    emitOperand(value, sizeof(ctype));                    \
   93|  2.25M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitReg32El:
   89|   274k|  void emit##name(param_t value) {                        \
   90|   274k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 274k]
  ------------------
   91|   274k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|   274k|    emitOperand(value, sizeof(ctype));                    \
   93|   274k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitUInt8El:
   89|  2.01M|  void emit##name(param_t value) {                        \
   90|  2.01M|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 2.01M]
  ------------------
   91|  2.01M|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|  2.01M|    emitOperand(value, sizeof(ctype));                    \
   93|  2.01M|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitUInt16El:
   89|   327k|  void emit##name(param_t value) {                        \
   90|   327k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 327k]
  ------------------
   91|   327k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|   327k|    emitOperand(value, sizeof(ctype));                    \
   93|   327k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitUInt32El:
   89|   261k|  void emit##name(param_t value) {                        \
   90|   261k|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 261k]
  ------------------
   91|   261k|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|   261k|    emitOperand(value, sizeof(ctype));                    \
   93|   261k|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitAddr32El:
   89|    111|  void emit##name(param_t value) {                        \
   90|    111|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 111]
  ------------------
   91|    111|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|    111|    emitOperand(value, sizeof(ctype));                    \
   93|    111|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitImm32El:
   89|    131|  void emit##name(param_t value) {                        \
   90|    131|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 0, False: 131]
  ------------------
   91|    131|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|    131|    emitOperand(value, sizeof(ctype));                    \
   93|    131|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitDoubleEl:
   89|     80|  void emit##name(param_t value) {                        \
   90|     80|    encodingError_ |= ((param_t)(ctype)value) != value && \
  ------------------
  |  Branch (90:23): [True: 47, False: 33]
  ------------------
   91|     80|        !std::is_floating_point<ctype>::value;            \
  ------------------
  |  Branch (91:9): [Folded - Ignored]
  ------------------
   92|     80|    emitOperand(value, sizeof(ctype));                    \
   93|     80|  }
_ZN6hermes3hbc28BytecodeInstructionGenerator23emitNewObjectWithBufferElllll:
  137|    880|      param_t p1, param_t p2, param_t p3, param_t p4, param_t p5) { \
  138|    880|    auto loc = emitOpcode(name##Op);                                \
  139|    880|    emit##t1(p1);                                                   \
  140|    880|    emit##t2(p2);                                                   \
  141|    880|    emit##t3(p3);                                                   \
  142|    880|    emit##t4(p4);                                                   \
  143|    880|    emit##t5(p5);                                                   \
  144|    880|    return loc;                                                     \
  145|    880|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitNewObjectEl:
  106|  4.16k|  offset_t emit##name(param_t p1) {  \
  107|  4.16k|    auto loc = emitOpcode(name##Op); \
  108|  4.16k|    emit##t1(p1);                    \
  109|  4.16k|    return loc;                      \
  110|  4.16k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitNewArrayWithBufferEllll:
  127|  20.1k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|  20.1k|    auto loc = emitOpcode(name##Op);                                    \
  129|  20.1k|    emit##t1(p1);                                                       \
  130|  20.1k|    emit##t2(p2);                                                       \
  131|  20.1k|    emit##t3(p3);                                                       \
  132|  20.1k|    emit##t4(p4);                                                       \
  133|  20.1k|    return loc;                                                         \
  134|  20.1k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitNewArrayEll:
  112|  13.2k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  13.2k|    auto loc = emitOpcode(name##Op);            \
  114|  13.2k|    emit##t1(p1);                               \
  115|  13.2k|    emit##t2(p2);                               \
  116|  13.2k|    return loc;                                 \
  117|  13.2k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitMovEll:
  112|   130k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   130k|    auto loc = emitOpcode(name##Op);            \
  114|   130k|    emit##t1(p1);                               \
  115|   130k|    emit##t2(p2);                               \
  116|   130k|    return loc;                                 \
  117|   130k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitMovLongEll:
  112|   137k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   137k|    auto loc = emitOpcode(name##Op);            \
  114|   137k|    emit##t1(p1);                               \
  115|   137k|    emit##t2(p2);                               \
  116|   137k|    return loc;                                 \
  117|   137k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitNegateEll:
  112|  3.98k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|  3.98k|    auto loc = emitOpcode(name##Op);            \
  114|  3.98k|    emit##t1(p1);                               \
  115|  3.98k|    emit##t2(p2);                               \
  116|  3.98k|    return loc;                                 \
  117|  3.98k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitNotEll:
  112|      7|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      7|    auto loc = emitOpcode(name##Op);            \
  114|      7|    emit##t1(p1);                               \
  115|      7|    emit##t2(p2);                               \
  116|      7|    return loc;                                 \
  117|      7|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitBitNotEll:
  112|      4|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      4|    auto loc = emitOpcode(name##Op);            \
  114|      4|    emit##t1(p1);                               \
  115|      4|    emit##t2(p2);                               \
  116|      4|    return loc;                                 \
  117|      4|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator6emitEqElll:
  119|      1|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      1|    auto loc = emitOpcode(name##Op);                        \
  121|      1|    emit##t1(p1);                                           \
  122|      1|    emit##t2(p2);                                           \
  123|      1|    emit##t3(p3);                                           \
  124|      1|    return loc;                                             \
  125|      1|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitStrictEqElll:
  119|      6|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      6|    auto loc = emitOpcode(name##Op);                        \
  121|      6|    emit##t1(p1);                                           \
  122|      6|    emit##t2(p2);                                           \
  123|      6|    emit##t3(p3);                                           \
  124|      6|    return loc;                                             \
  125|      6|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitLessElll:
  119|  3.73k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  3.73k|    auto loc = emitOpcode(name##Op);                        \
  121|  3.73k|    emit##t1(p1);                                           \
  122|  3.73k|    emit##t2(p2);                                           \
  123|  3.73k|    emit##t3(p3);                                           \
  124|  3.73k|    return loc;                                             \
  125|  3.73k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitGreaterElll:
  119|  5.08k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  5.08k|    auto loc = emitOpcode(name##Op);                        \
  121|  5.08k|    emit##t1(p1);                                           \
  122|  5.08k|    emit##t2(p2);                                           \
  123|  5.08k|    emit##t3(p3);                                           \
  124|  5.08k|    return loc;                                             \
  125|  5.08k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitAddElll:
  119|  41.1k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  41.1k|    auto loc = emitOpcode(name##Op);                        \
  121|  41.1k|    emit##t1(p1);                                           \
  122|  41.1k|    emit##t2(p2);                                           \
  123|  41.1k|    emit##t3(p3);                                           \
  124|  41.1k|    return loc;                                             \
  125|  41.1k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitMulElll:
  119|    190|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    190|    auto loc = emitOpcode(name##Op);                        \
  121|    190|    emit##t1(p1);                                           \
  122|    190|    emit##t2(p2);                                           \
  123|    190|    emit##t3(p3);                                           \
  124|    190|    return loc;                                             \
  125|    190|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitDivElll:
  119|  7.57k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  7.57k|    auto loc = emitOpcode(name##Op);                        \
  121|  7.57k|    emit##t1(p1);                                           \
  122|  7.57k|    emit##t2(p2);                                           \
  123|  7.57k|    emit##t3(p3);                                           \
  124|  7.57k|    return loc;                                             \
  125|  7.57k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitDivNElll:
  119|      8|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      8|    auto loc = emitOpcode(name##Op);                        \
  121|      8|    emit##t1(p1);                                           \
  122|      8|    emit##t2(p2);                                           \
  123|      8|    emit##t3(p3);                                           \
  124|      8|    return loc;                                             \
  125|      8|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitModElll:
  119|  7.03k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  7.03k|    auto loc = emitOpcode(name##Op);                        \
  121|  7.03k|    emit##t1(p1);                                           \
  122|  7.03k|    emit##t2(p2);                                           \
  123|  7.03k|    emit##t3(p3);                                           \
  124|  7.03k|    return loc;                                             \
  125|  7.03k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitSubElll:
  119|      2|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      2|    auto loc = emitOpcode(name##Op);                        \
  121|      2|    emit##t1(p1);                                           \
  122|      2|    emit##t2(p2);                                           \
  123|      2|    emit##t3(p3);                                           \
  124|      2|    return loc;                                             \
  125|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitRShiftElll:
  119|      1|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      1|    auto loc = emitOpcode(name##Op);                        \
  121|      1|    emit##t1(p1);                                           \
  122|      1|    emit##t2(p2);                                           \
  123|      1|    emit##t3(p3);                                           \
  124|      1|    return loc;                                             \
  125|      1|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator10emitBitAndElll:
  119|      6|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      6|    auto loc = emitOpcode(name##Op);                        \
  121|      6|    emit##t1(p1);                                           \
  122|      6|    emit##t2(p2);                                           \
  123|      6|    emit##t3(p3);                                           \
  124|      6|    return loc;                                             \
  125|      6|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitBitOrElll:
  119|    222|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    222|    auto loc = emitOpcode(name##Op);                        \
  121|    222|    emit##t1(p1);                                           \
  122|    222|    emit##t2(p2);                                           \
  123|    222|    emit##t3(p3);                                           \
  124|    222|    return loc;                                             \
  125|    222|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitIncEll:
  112|      2|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      2|    auto loc = emitOpcode(name##Op);            \
  114|      2|    emit##t1(p1);                               \
  115|      2|    emit##t2(p2);                               \
  116|      2|    return loc;                                 \
  117|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitStoreToEnvironmentElll:
  119|   114k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   114k|    auto loc = emitOpcode(name##Op);                        \
  121|   114k|    emit##t1(p1);                                           \
  122|   114k|    emit##t2(p2);                                           \
  123|   114k|    emit##t3(p3);                                           \
  124|   114k|    return loc;                                             \
  125|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator24emitStoreNPToEnvironmentElll:
  119|      7|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      7|    auto loc = emitOpcode(name##Op);                        \
  121|      7|    emit##t1(p1);                                           \
  122|      7|    emit##t2(p2);                                           \
  123|      7|    emit##t3(p3);                                           \
  124|      7|    return loc;                                             \
  125|      7|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator23emitLoadFromEnvironmentElll:
  119|  10.8k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  10.8k|    auto loc = emitOpcode(name##Op);                        \
  121|  10.8k|    emit##t1(p1);                                           \
  122|  10.8k|    emit##t2(p2);                                           \
  123|  10.8k|    emit##t3(p3);                                           \
  124|  10.8k|    return loc;                                             \
  125|  10.8k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitGetGlobalObjectEl:
  106|  62.6k|  offset_t emit##name(param_t p1) {  \
  107|  62.6k|    auto loc = emitOpcode(name##Op); \
  108|  62.6k|    emit##t1(p1);                    \
  109|  62.6k|    return loc;                      \
  110|  62.6k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetNewTargetEl:
  106|      5|  offset_t emit##name(param_t p1) {  \
  107|      5|    auto loc = emitOpcode(name##Op); \
  108|      5|    emit##t1(p1);                    \
  109|      5|    return loc;                      \
  110|      5|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator21emitCreateEnvironmentEl:
  106|   114k|  offset_t emit##name(param_t p1) {  \
  107|   114k|    auto loc = emitOpcode(name##Op); \
  108|   114k|    emit##t1(p1);                    \
  109|   114k|    return loc;                      \
  110|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator20emitDeclareGlobalVarEl:
  106|      2|  offset_t emit##name(param_t p1) {  \
  107|      2|    auto loc = emitOpcode(name##Op); \
  108|      2|    emit##t1(p1);                    \
  109|      2|    return loc;                      \
  110|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitGetByIdShortEllll:
  127|     20|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|     20|    auto loc = emitOpcode(name##Op);                                    \
  129|     20|    emit##t1(p1);                                                       \
  130|     20|    emit##t2(p2);                                                       \
  131|     20|    emit##t3(p3);                                                       \
  132|     20|    emit##t4(p4);                                                       \
  133|     20|    return loc;                                                         \
  134|     20|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitTryGetByIdEllll:
  127|   131k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|   131k|    auto loc = emitOpcode(name##Op);                                    \
  129|   131k|    emit##t1(p1);                                                       \
  130|   131k|    emit##t2(p2);                                                       \
  131|   131k|    emit##t3(p3);                                                       \
  132|   131k|    emit##t4(p4);                                                       \
  133|   131k|    return loc;                                                         \
  134|   131k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitPutByIdEllll:
  127|  3.78k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|  3.78k|    auto loc = emitOpcode(name##Op);                                    \
  129|  3.78k|    emit##t1(p1);                                                       \
  130|  3.78k|    emit##t2(p2);                                                       \
  131|  3.78k|    emit##t3(p3);                                                       \
  132|  3.78k|    emit##t4(p4);                                                       \
  133|  3.78k|    return loc;                                                         \
  134|  3.78k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitPutNewOwnByIdShortElll:
  119|  4.16k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  4.16k|    auto loc = emitOpcode(name##Op);                        \
  121|  4.16k|    emit##t1(p1);                                           \
  122|  4.16k|    emit##t2(p2);                                           \
  123|  4.16k|    emit##t3(p3);                                           \
  124|  4.16k|    return loc;                                             \
  125|  4.16k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitPutOwnByIndexElll:
  119|  3.75k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|  3.75k|    auto loc = emitOpcode(name##Op);                        \
  121|  3.75k|    emit##t1(p1);                                           \
  122|  3.75k|    emit##t2(p2);                                           \
  123|  3.75k|    emit##t3(p3);                                           \
  124|  3.75k|    return loc;                                             \
  125|  3.75k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitPutOwnByIndexLElll:
  119|   226k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   226k|    auto loc = emitOpcode(name##Op);                        \
  121|   226k|    emit##t1(p1);                                           \
  122|   226k|    emit##t2(p2);                                           \
  123|   226k|    emit##t3(p3);                                           \
  124|   226k|    return loc;                                             \
  125|   226k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitGetByValElll:
  119|      2|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      2|    auto loc = emitOpcode(name##Op);                        \
  121|      2|    emit##t1(p1);                                           \
  122|      2|    emit##t2(p2);                                           \
  123|      2|    emit##t3(p3);                                           \
  124|      2|    return loc;                                             \
  125|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator8emitCallElll:
  119|    286|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    286|    auto loc = emitOpcode(name##Op);                        \
  121|    286|    emit##t1(p1);                                           \
  122|    286|    emit##t2(p2);                                           \
  123|    286|    emit##t3(p3);                                           \
  124|    286|    return loc;                                             \
  125|    286|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitCallLongElll:
  119|      5|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      5|    auto loc = emitOpcode(name##Op);                        \
  121|      5|    emit##t1(p1);                                           \
  122|      5|    emit##t2(p2);                                           \
  123|      5|    emit##t3(p3);                                           \
  124|      5|    return loc;                                             \
  125|      5|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator15emitCallBuiltinElll:
  119|    278|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|    278|    auto loc = emitOpcode(name##Op);                        \
  121|    278|    emit##t1(p1);                                           \
  122|    278|    emit##t2(p2);                                           \
  123|    278|    emit##t3(p3);                                           \
  124|    278|    return loc;                                             \
  125|    278|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitCallBuiltinLongElll:
  119|      5|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      5|    auto loc = emitOpcode(name##Op);                        \
  121|      5|    emit##t1(p1);                                           \
  122|      5|    emit##t2(p2);                                           \
  123|      5|    emit##t3(p3);                                           \
  124|      5|    return loc;                                             \
  125|      5|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator7emitRetEl:
  106|   114k|  offset_t emit##name(param_t p1) {  \
  107|   114k|    auto loc = emitOpcode(name##Op); \
  108|   114k|    emit##t1(p1);                    \
  109|   114k|    return loc;                      \
  110|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitCatchEl:
  106|     12|  offset_t emit##name(param_t p1) {  \
  107|     12|    auto loc = emitOpcode(name##Op); \
  108|     12|    emit##t1(p1);                    \
  109|     12|    return loc;                      \
  110|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator9emitThrowEl:
  106|      6|  offset_t emit##name(param_t p1) {  \
  107|      6|    auto loc = emitOpcode(name##Op); \
  108|      6|    emit##t1(p1);                    \
  109|      6|    return loc;                      \
  110|      6|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitAsyncBreakCheckEv:
  101|   114k|  offset_t emit##name() {            \
  102|   114k|    auto loc = emitOpcode(name##Op); \
  103|   114k|    return loc;                      \
  104|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitCreateClosureElll:
  119|   114k|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|   114k|    auto loc = emitOpcode(name##Op);                        \
  121|   114k|    emit##t1(p1);                                           \
  122|   114k|    emit##t2(p2);                                           \
  123|   114k|    emit##t3(p3);                                           \
  124|   114k|    return loc;                                             \
  125|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitLoadParamEll:
  112|   114k|  offset_t emit##name(param_t p1, param_t p2) { \
  113|   114k|    auto loc = emitOpcode(name##Op);            \
  114|   114k|    emit##t1(p1);                               \
  115|   114k|    emit##t2(p2);                               \
  116|   114k|    return loc;                                 \
  117|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitLoadConstUInt8Ell:
  112|    248|  offset_t emit##name(param_t p1, param_t p2) { \
  113|    248|    auto loc = emitOpcode(name##Op);            \
  114|    248|    emit##t1(p1);                               \
  115|    248|    emit##t2(p2);                               \
  116|    248|    return loc;                                 \
  117|    248|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitLoadConstIntEll:
  112|    131|  offset_t emit##name(param_t p1, param_t p2) { \
  113|    131|    auto loc = emitOpcode(name##Op);            \
  114|    131|    emit##t1(p1);                               \
  115|    131|    emit##t2(p2);                               \
  116|    131|    return loc;                                 \
  117|    131|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitLoadConstDoubleEll:
  112|     80|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     80|    auto loc = emitOpcode(name##Op);            \
  114|     80|    emit##t1(p1);                               \
  115|     80|    emit##t2(p2);                               \
  116|     80|    return loc;                                 \
  117|     80|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator19emitLoadConstStringEll:
  112|    212|  offset_t emit##name(param_t p1, param_t p2) { \
  113|    212|    auto loc = emitOpcode(name##Op);            \
  114|    212|    emit##t1(p1);                               \
  115|    212|    emit##t2(p2);                               \
  116|    212|    return loc;                                 \
  117|    212|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator22emitLoadConstUndefinedEl:
  106|   114k|  offset_t emit##name(param_t p1) {  \
  107|   114k|    auto loc = emitOpcode(name##Op); \
  108|   114k|    emit##t1(p1);                    \
  109|   114k|    return loc;                      \
  110|   114k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitLoadConstTrueEl:
  106|     12|  offset_t emit##name(param_t p1) {  \
  107|     12|    auto loc = emitOpcode(name##Op); \
  108|     12|    emit##t1(p1);                    \
  109|     12|    return loc;                      \
  110|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitLoadConstFalseEl:
  106|     12|  offset_t emit##name(param_t p1) {  \
  107|     12|    auto loc = emitOpcode(name##Op); \
  108|     12|    emit##t1(p1);                    \
  109|     12|    return loc;                      \
  110|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitLoadConstZeroEl:
  106|     32|  offset_t emit##name(param_t p1) {  \
  107|     32|    auto loc = emitOpcode(name##Op); \
  108|     32|    emit##t1(p1);                    \
  109|     32|    return loc;                      \
  110|     32|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator14emitLoadThisNSEl:
  106|      5|  offset_t emit##name(param_t p1) {  \
  107|      5|    auto loc = emitOpcode(name##Op); \
  108|      5|    emit##t1(p1);                    \
  109|      5|    return loc;                      \
  110|      5|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator12emitToNumberEll:
  112|      4|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      4|    auto loc = emitOpcode(name##Op);            \
  114|      4|    emit##t1(p1);                               \
  115|      4|    emit##t2(p2);                               \
  116|      4|    return loc;                                 \
  117|      4|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator13emitToNumericEll:
  112|      2|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      2|    auto loc = emitOpcode(name##Op);            \
  114|      2|    emit##t1(p1);                               \
  115|      2|    emit##t2(p2);                               \
  116|      2|    return loc;                                 \
  117|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator18emitReifyArgumentsEl:
  106|      2|  offset_t emit##name(param_t p1) {  \
  107|      2|    auto loc = emitOpcode(name##Op); \
  108|      2|    emit##t1(p1);                    \
  109|      2|    return loc;                      \
  110|      2|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitCreateRegExpEllll:
  127|  11.4k|  offset_t emit##name(param_t p1, param_t p2, param_t p3, param_t p4) { \
  128|  11.4k|    auto loc = emitOpcode(name##Op);                                    \
  129|  11.4k|    emit##t1(p1);                                                       \
  130|  11.4k|    emit##t2(p2);                                                       \
  131|  11.4k|    emit##t3(p3);                                                       \
  132|  11.4k|    emit##t4(p4);                                                       \
  133|  11.4k|    return loc;                                                         \
  134|  11.4k|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitIteratorBeginEll:
  112|     12|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     12|    auto loc = emitOpcode(name##Op);            \
  114|     12|    emit##t1(p1);                               \
  115|     12|    emit##t2(p2);                               \
  116|     12|    return loc;                                 \
  117|     12|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitIteratorNextElll:
  119|      6|  offset_t emit##name(param_t p1, param_t p2, param_t p3) { \
  120|      6|    auto loc = emitOpcode(name##Op);                        \
  121|      6|    emit##t1(p1);                                           \
  122|      6|    emit##t2(p2);                                           \
  123|      6|    emit##t3(p3);                                           \
  124|      6|    return loc;                                             \
  125|      6|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator17emitIteratorCloseEll:
  112|     18|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     18|    auto loc = emitOpcode(name##Op);            \
  114|     18|    emit##t1(p1);                               \
  115|     18|    emit##t2(p2);                               \
  116|     18|    return loc;                                 \
  117|     18|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator11emitJmpLongEl:
  106|     40|  offset_t emit##name(param_t p1) {  \
  107|     40|    auto loc = emitOpcode(name##Op); \
  108|     40|    emit##t1(p1);                    \
  109|     40|    return loc;                      \
  110|     40|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator15emitJmpTrueLongEll:
  112|     68|  offset_t emit##name(param_t p1, param_t p2) { \
  113|     68|    auto loc = emitOpcode(name##Op);            \
  114|     68|    emit##t1(p1);                               \
  115|     68|    emit##t2(p2);                               \
  116|     68|    return loc;                                 \
  117|     68|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator16emitJmpFalseLongEll:
  112|      3|  offset_t emit##name(param_t p1, param_t p2) { \
  113|      3|    auto loc = emitOpcode(name##Op);            \
  114|      3|    emit##t1(p1);                               \
  115|      3|    emit##t2(p2);                               \
  116|      3|    return loc;                                 \
  117|      3|  };
_ZN6hermes3hbc28BytecodeInstructionGenerator25emitLoadConstDoubleDirectEld:
  168|     80|  offset_t emitLoadConstDoubleDirect(param_t dst, double value) {
  169|     80|    return emitLoadConstDouble(dst, llvh::DoubleToBits(value));
  170|     80|  }

_ZN6hermes3hbc17BCProviderFromSrc23createBCProviderFromSrcENSt3__110unique_ptrINS0_14BytecodeModuleENS2_14default_deleteIS4_EEEE:
  108|     56|      std::unique_ptr<hbc::BytecodeModule> module) {
  109|     56|    return std::unique_ptr<BCProviderFromSrc>(
  110|     56|        new BCProviderFromSrc(std::move(module)));
  111|     56|  }
_ZNK6hermes3hbc17BCProviderFromSrc17getFunctionHeaderEj:
  172|    163|  RuntimeFunctionHeader getFunctionHeader(uint32_t functionID) const override {
  173|    163|    return RuntimeFunctionHeader(&module_->getFunction(functionID).getHeader());
  174|    163|  }
_ZNK6hermes3hbc17BCProviderFromSrc19getStringTableEntryEj:
  176|    886|  StringTableEntry getStringTableEntry(uint32_t index) const override {
  177|    886|    assert(index < stringCount_ && "invalid string table index");
  178|      0|    return module_->getStringTable()[index];
  179|    886|  }
_ZNK6hermes3hbc17BCProviderFromSrc11getBytecodeEj:
  181|    163|  const uint8_t *getBytecode(uint32_t functionID) const override {
  182|    163|    return module_->getFunction(functionID).getOpcodeArray().data();
  183|    163|  }
_ZNK6hermes3hbc17BCProviderFromSrc17getExceptionTableEj:
  186|     24|      uint32_t functionID) const override {
  187|     24|    return module_->getFunction(functionID).getExceptionHandlers();
  188|     24|  }
_ZNK6hermes3hbc17BCProviderFromSrc15getDebugOffsetsEj:
  190|     28|  const hbc::DebugOffsets *getDebugOffsets(uint32_t functionID) const override {
  191|     28|    return module_->getFunction(functionID).getDebugOffsets();
  192|     28|  }
_ZNK6hermes3hbc17BCProviderFromSrc14isFunctionLazyEj:
  194|    837|  bool isFunctionLazy(uint32_t functionID) const override {
  195|    837|    return module_->getFunction(functionID).isLazy();
  196|    837|  }
_ZNK6hermes3hbc17BCProviderFromSrc6isLazyEv:
  198|    837|  bool isLazy() const override {
  199|    837|    return false;
  200|    837|  }
_ZN6hermes3hbc17BCProviderFromSrc17getBytecodeModuleEv:
  206|    674|  hbc::BytecodeModule *getBytecodeModule() {
  207|    674|    return module_.get();
  208|    674|  }
_ZN6hermes3hbc14BCProviderLazy20createBCProviderLazyEPNS0_16BytecodeFunctionE:
  227|    674|      hbc::BytecodeFunction *bytecodeFunction) {
  228|    674|    return std::unique_ptr<BCProviderBase>(
  229|    674|        new BCProviderLazy(bytecodeFunction));
  230|    674|  }
_ZNK6hermes3hbc14BCProviderLazy17getFunctionHeaderEj:
  232|    674|  RuntimeFunctionHeader getFunctionHeader(uint32_t) const override {
  233|    674|    return RuntimeFunctionHeader(&bytecodeFunction_->getHeader());
  234|    674|  }
_ZNK6hermes3hbc14BCProviderLazy6isLazyEv:
  257|    674|  bool isLazy() const override {
  258|    674|    return true;
  259|    674|  }

_ZNK6hermes3hbc24ConsecutiveStringStorage16ensureTableValidEv:
   63|   285k|  inline void ensureTableValid() const {
   64|   285k|    assert(isTableValid_ && "String Table no longer valid");
   65|   285k|  }
_ZNK6hermes3hbc24ConsecutiveStringStorage18ensureStorageValidEv:
   66|  1.87k|  inline void ensureStorageValid() const {
   67|  1.87k|    assert(isStorageValid_ && "String Storage no longer valid");
   68|  1.87k|  }
_ZN6hermes3hbc24ConsecutiveStringStorageC2EN4llvh8ArrayRefINS2_9StringRefEEEb:
   91|     56|            optimize) {}
_ZNK6hermes3hbc24ConsecutiveStringStorage18getStringTableViewEv:
  100|    168|  StringTableRefTy getStringTableView() const {
  101|    168|    ensureTableValid();
  102|    168|    return strTable_;
  103|    168|  }
_ZN6hermes3hbc24ConsecutiveStringStorage18getStringTableViewEv:
  105|     56|  MutStringTableRefTy getStringTableView() {
  106|     56|    ensureTableValid();
  107|     56|    return strTable_;
  108|     56|  }
_ZNK6hermes3hbc24ConsecutiveStringStorage5countEv:
  111|   283k|  size_t count() const {
  112|   283k|    ensureTableValid();
  113|   283k|    return strTable_.size();
  114|   283k|  }
_ZN6hermes3hbc24ConsecutiveStringStorage18acquireStringTableEv:
  119|    112|  std::vector<StringTableEntry> acquireStringTable() {
  120|    112|    ensureTableValid();
  121|    112|    isTableValid_ = false;
  122|    112|    return std::move(strTable_);
  123|    112|  };
_ZN6hermes3hbc24ConsecutiveStringStorage20acquireStringStorageEv:
  128|    280|  std::vector<unsigned char> acquireStringStorage() {
  129|    280|    ensureStorageValid();
  130|    280|    isStorageValid_ = false;
  131|    280|    return std::move(storage_);
  132|    280|  }
_ZN6hermes3hbc24ConsecutiveStringStorageC2Ev:
   71|    112|  ConsecutiveStringStorage() = default;
_ZN6hermes3hbc24ConsecutiveStringStorageC2EOS1_:
   72|    168|  ConsecutiveStringStorage(ConsecutiveStringStorage &&) = default;
_ZN6hermes3hbc24ConsecutiveStringStorageaSEOS1_:
   73|    112|  ConsecutiveStringStorage &operator=(ConsecutiveStringStorage &&) = default;

_ZN6hermes3hbc19DebugSourceLocationC2Ev:
   53|   229k|  DebugSourceLocation() {}
_ZN6hermes3hbc12DebugOffsetsC2Ejjj:
  104|   114k|      : sourceLocations(src), lexicalData(lex), textifiedCallees(tCallee) {}
_ZN6hermes3hbc9DebugInfoC2EONS0_24ConsecutiveStringStorageEON4llvh11SmallVectorINS0_15DebugFileRegionELj1EEEjjjONS0_12StreamVectorIhEE:
  179|     56|        data_(std::move(data)) {}
_ZNK6hermes3hbc9DebugInfo15getFilenameByIDEj:
  213|     24|  std::string getFilenameByID(uint32_t id) const {
  214|     24|    assert(id < filenameTable_.size() && "Filename ID out of bounds");
  215|      0|    std::string utf8Storage;
  216|     24|    return getStringFromEntry(filenameTable_[id], filenameStorage_, utf8Storage)
  217|     24|        .str();
  218|     24|  }
_ZNK6hermes3hbc9DebugInfo23getStringTableSizeBytesEv:
  263|      4|  uint32_t getStringTableSizeBytes() const {
  264|      4|    return stringTableOffset_ - textifiedCalleeOffset_;
  265|      4|  }
_ZNK6hermes3hbc9DebugInfo19textifiedCalleeDataEv:
  286|      4|  llvh::ArrayRef<uint8_t> textifiedCalleeData() const {
  287|      4|    return data_.getData().slice(
  288|      4|        textifiedCalleeOffset_, getStringTableSizeBytes());
  289|      4|  }
_ZNK6hermes3hbc9DebugInfo15stringTableDataEv:
  292|      8|  llvh::ArrayRef<uint8_t> stringTableData() const {
  293|      8|    return data_.getData().slice(stringTableOffset_);
  294|      8|  }
_ZN6hermes3hbc18DebugInfoGenerator5deltaEjj:
  365|  3.39M|  int32_t delta(uint32_t to, uint32_t from) {
  366|  3.39M|    int64_t diff = (int64_t)to - from;
  367|       |    // It's unlikely that lines or columns will ever jump from 0 to 3 billion,
  368|       |    // but if it ever happens we can extend to 64bit types.
  369|  3.39M|    assert(
  370|  3.39M|        diff <= INT32_MAX && diff >= INT32_MIN &&
  371|  3.39M|        "uint32_t delta too large when encoding debug info");
  372|      0|    return (int32_t)diff;
  373|  3.39M|  }
_ZN6hermes3hbc9DebugInfoC2Ev:
  163|     56|  explicit DebugInfo() = default;
_ZN6hermes3hbc9DebugInfoaSEOS1_:
  197|     56|  DebugInfo &operator=(DebugInfo &&that) = default;
_ZN6hermes3hbc12DebugOffsetsC2Ev:
  102|   114k|  DebugOffsets() = default;

_ZN6hermes3hbc20HVMRegisterAllocatorC2EPNS_8FunctionE:
   35|   114k|  explicit HVMRegisterAllocator(Function *func) : RegisterAllocator(func) {}
_ZN6hermes3hbc20HVMRegisterAllocator19getMaxRegisterUsageEv:
   42|   229k|  unsigned getMaxRegisterUsage() override {
   43|   229k|    return getMaxInstructionRegister() + spill_count_ + max_parameter_count_;
   44|   229k|  }
_ZN6hermes3hbc20HVMRegisterAllocator25getMaxInstructionRegisterEv:
   48|   229k|  unsigned getMaxInstructionRegister() {
   49|   229k|    return RegisterAllocator::getMaxRegisterUsage();
   50|   229k|  }
_ZN6hermes3hbc20HVMRegisterAllocator15getLastRegisterEv:
   37|  1.14k|  Register getLastRegister() {
   38|  1.14k|    return Register(getMaxRegisterUsage() - 1);
   39|  1.14k|  }
_ZN6hermes3hbc20HVMRegisterAllocator22allocateParameterCountEj:
   52|    574|  void allocateParameterCount(unsigned count) {
   53|    574|    if (max_parameter_count_ < count) {
  ------------------
  |  Branch (53:9): [True: 25, False: 549]
  ------------------
   54|     25|      max_parameter_count_ = count;
   55|     25|    }
   56|    574|  }
_ZN6hermes3hbc20HVMRegisterAllocator22allocateSpillTempCountEj:
   57|      5|  void allocateSpillTempCount(unsigned count) {
   58|      5|    spill_count_ = count;
   59|      5|  }

_ZN6hermes3hbc7HBCISelC2EPNS_8FunctionEPNS0_25BytecodeFunctionGeneratorERNS0_20HVMRegisterAllocatorERNS_21FunctionScopeAnalysisERNS_21ScopeRegisterAnalysisERKNS_25BytecodeGenerationOptionsE:
  200|   114k|        bytecodeGenerationOptions_(options) {
  201|   114k|    protoIdent_ = F->getContext().getIdentifier("__proto__");
  202|   114k|  }
_ZN6hermes3hbc7HBCISel18populateDebugCacheENS0_17HBCISelDebugCacheE:
  231|   114k|  void populateDebugCache(HBCISelDebugCache cache) {
  232|   114k|    debugIdCache_ = cache;
  233|   114k|  }
_ZN6hermes3hbc7HBCISel13getDebugCacheEv:
  227|   114k|  HBCISelDebugCache getDebugCache() {
  228|   114k|    return debugIdCache_;
  229|   114k|  }

_ZN6hermes3hbc23LowerLoadStoreFrameInstC2Ev:
   58|     56|      : FunctionPass("LowerLoadStoreFrameInst") {}
_ZN6hermes3hbc17LowerConstructionC2Ev:
   85|     56|  explicit LowerConstruction() : FunctionPass("LowerConstruction") {}
_ZN6hermes3hbc19LowerArgumentsArrayC2Ev:
   69|     56|  explicit LowerArgumentsArray() : FunctionPass("LowerArgumentsArray") {}
_ZN6hermes3hbc19DedupReifyArgumentsC2Ev:
   78|     56|  explicit DedupReifyArguments() : FunctionPass("DedupReifyArguments") {}
_ZN6hermes3hbc25LowerSwitchIntoJumpTablesC2Ev:
  183|     56|      : FunctionPass("LowerSwitchIntoJumpTables") {}
_ZN6hermes3hbc13LoadConstantsC2Eb:
   34|     56|        optimizationEnabled_(optimizationEnabled) {}
_ZN6hermes3hbc14LoadParametersC2Ev:
   45|     56|  explicit LoadParameters() : FunctionPass("LoadParameters") {}
_ZN6hermes3hbc10LowerCallsC2ERNS0_20HVMRegisterAllocatorE:
   95|   114k|      : FunctionPass("LowerCalls"), RA_(RA) {}
_ZN6hermes3hbc14SpillRegistersC2ERNS0_20HVMRegisterAllocatorE:
  139|   114k|      : FunctionPass("SpillRegisters"), RA_(RA) {}
_ZN6hermes3hbc14SpillRegisters7isShortENS_8RegisterE:
  155|  8.26k|  bool isShort(Register reg) {
  156|  8.26k|    return reg.getIndex() < boundary_;
  157|  8.26k|  }
_ZN6hermes3hbc14SpillRegisters11getReservedEi:
  158|  2.87k|  Register getReserved(int i) {
  159|  2.87k|    assert(i < reserved_ && "Using too many reserved regs.");
  160|      0|    return Register(i);
  161|  2.87k|  }
_ZN6hermes3hbc14SpillRegisters19reserveLowRegistersEPNS_8FunctionE:
  163|      5|  void reserveLowRegisters(Function *F) {
  164|      5|    RA_.allocateSpillTempCount(reserved_);
  165|      5|    for (auto &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (165:19): [True: 5, False: 5]
  ------------------
  166|   138k|      for (auto &inst : BB) {
  ------------------
  |  Branch (166:23): [True: 138k, False: 5]
  ------------------
  167|   138k|        if (RA_.isAllocated(&inst)) {
  ------------------
  |  Branch (167:13): [True: 138k, False: 0]
  ------------------
  168|   138k|          auto reg = RA_.getRegister(&inst);
  169|   138k|          RA_.updateRegister(&inst, reg.getConsecutive(reserved_));
  170|   138k|        }
  171|   138k|      }
  172|      5|    }
  173|      5|  }

_ZN6hermes3hbc17LowerBuiltinCallsC2Ev:
   20|     56|  explicit LowerBuiltinCalls() : FunctionPass("LowerBuiltinCalls") {}

_ZN6hermes3hbc26SerializedLiteralGeneratorC2ERNS0_23BytecodeModuleGeneratorE:
   60|     56|  SerializedLiteralGenerator(BytecodeModuleGenerator &BMGen) : BMGen_(BMGen) {}

_ZN6hermes3hbc27SerializedLiteralParserBaseC2EN4llvh8ArrayRefIhEEj:
   56|  12.9k|      : buffer_(buff), elemsLeft_(totalLen) {}
_ZNK6hermes3hbc27SerializedLiteralParserBase7hasNextEv:
   59|   932k|  bool hasNext() const {
   60|   932k|    return elemsLeft_ != 0;
   61|   932k|  }

_ZN6hermes3hbc21SimpleBytecodeBuilder11addFunctionEjjONSt3__16vectorIhNS2_9allocatorIhEEEE:
   58|    198|      std::vector<opcode_atom_t> &&opcodes) {
   59|    198|    functions_.emplace_back(paramCount, frameSize, std::move(opcodes));
   60|    198|  }
_ZN6hermes3hbc21SimpleBytecodeBuilder14SimpleFunctionC2EjjONSt3__16vectorIhNS3_9allocatorIhEEEE:
   43|    198|          opcodes(std::move(opcodes)) {
   44|    198|      assert(paramCount > 0 && "paramCount must include 'this'");
   45|    198|    }

_ZN6hermes3hbc16StackFrameLayout23callerOutgoingRegistersEj:
  144|   407k|  static uint32_t callerOutgoingRegisters(uint32_t numArgsExcludingThis) {
  145|       |    // The >= pattern is specially recognized as an overflow check.
  146|   407k|    uint32_t totalCount = CallerExtraRegistersAtEnd + numArgsExcludingThis + 1;
  147|   407k|    return totalCount >= numArgsExcludingThis ? totalCount : UINT32_MAX;
  ------------------
  |  Branch (147:12): [True: 407k, False: 0]
  ------------------
  148|   407k|  }

_ZNK6hermes3hbc12StreamVectorIhE7getDataEv:
   55|     36|  const llvh::ArrayRef<T> &getData() const {
   56|     36|    return ref_;
   57|     36|  }
_ZNK6hermes3hbc12StreamVectorIhE4sizeEv:
   59|     24|  size_t size() const {
   60|     24|    return ref_.size();
   61|     24|  }
_ZN6hermes3hbc12StreamVectorIhEC2Ev:
   51|     56|  explicit StreamVector() {}
_ZN6hermes3hbc12StreamVectorIhEaSEOS2_:
   53|     56|  StreamVector &operator=(StreamVector &&that) = default;
_ZN6hermes3hbc12StreamVectorIhEC2EOS2_:
   38|     56|  explicit StreamVector(StreamVector &&SV) = default;
_ZN6hermes3hbc12StreamVectorIhEC2EONSt3__16vectorIhNS3_9allocatorIhEEEE:
   49|     56|      : vec_(std::move(data)), ref_(vec_) {}

_ZNK6hermes10StringKind5Entry4kindEv:
   82|  1.16k|inline StringKind::Kind StringKind::Entry::kind() const {
   83|  1.16k|  return static_cast<Kind>(datum_ & ~MaxCount);
   84|  1.16k|}
_ZNK6hermes10StringKind5Entry5countEv:
   86|  9.59k|inline uint32_t StringKind::Entry::count() const {
   87|  9.59k|  return datum_ & MaxCount;
   88|  9.59k|}
_ZNO6hermes10StringKind11Accumulator7entriesEv:
   95|     56|inline std::vector<StringKind::Entry> StringKind::Accumulator::entries() && {
   96|     56|  return std::move(entries_);
   97|     56|}

_ZN6hermes3hbc18StringLiteralTableC2Ev:
   53|     56|  StringLiteralTable() = default;
_ZN6hermes3hbc22StringLiteralIDMappingC2Ev:
   27|    112|  StringLiteralIDMapping() = default;
_ZN6hermes3hbc32UniquingStringLiteralAccumulatorC2Ev:
   92|     56|  UniquingStringLiteralAccumulator() = default;
_ZN6hermes3hbc32UniquingStringLiteralAccumulator9addStringEN4llvh9StringRefEb:
  148|   279k|    bool isIdentifier) {
  149|   279k|  assert(strings_.size() == isIdentifier_.size());
  150|      0|  const auto fresh = strings_.size();
  151|   279k|  auto id = strings_.insert(str);
  152|   279k|  if (id == fresh) {
  ------------------
  |  Branch (152:7): [True: 924, False: 278k]
  ------------------
  153|    924|    isIdentifier_.push_back(false);
  154|    924|    numIdentifierRefs_.push_back(0);
  155|    924|  }
  156|       |
  157|   279k|  if (isIdentifier) {
  ------------------
  |  Branch (157:7): [True: 141k, False: 137k]
  ------------------
  158|   141k|    isIdentifier_[id] = true;
  159|   141k|    if (id >= storage_.count()) {
  ------------------
  |  Branch (159:9): [True: 141k, False: 0]
  ------------------
  160|       |      // We only track the frequency of new strings, so the ID needs to be
  161|       |      // translated.
  162|   141k|      numIdentifierRefs_[id - storage_.count()]++;
  163|   141k|    }
  164|   141k|  }
  165|   279k|}
_ZNK6hermes3hbc22StringLiteralIDMapping5emptyEv:
  113|     56|inline bool StringLiteralIDMapping::empty() const {
  114|     56|  return strings_.size() == 0;
  115|     56|}
_ZNK6hermes3hbc18StringLiteralTable11getStringIDEN4llvh9StringRefE:
  117|   281k|inline uint32_t StringLiteralTable::getStringID(llvh::StringRef str) const {
  118|   281k|  auto iter = strings_.find(str);
  119|   281k|  assert(
  120|   281k|      iter != strings_.end() &&
  121|   281k|      "The requested string is not in the mapping.  Is the part of the IR that "
  122|   281k|      "introduces it being traversed by one of the functions in "
  123|   281k|      "TraverseLiteralStrings.h ?");
  124|      0|  return std::distance(strings_.begin(), iter);
  125|   281k|}
_ZNK6hermes3hbc18StringLiteralTable15getIdentifierIDEN4llvh9StringRefE:
  127|   143k|inline uint32_t StringLiteralTable::getIdentifierID(llvh::StringRef str) const {
  128|   143k|  auto idx = getStringID(str);
  129|   143k|  assert(
  130|   143k|      isIdentifier_[idx] &&
  131|   143k|      "The requested string exists in the mapping but was not marked as an "
  132|   143k|      "identifier.  When it was added to the mapping during a call to one "
  133|   143k|      "of the traversal functions in TraverseLiteralStrings.h, was the usage "
  134|   143k|      "of the string as an identifier correctly traversed?");
  135|      0|  return idx;
  136|   143k|}
_ZN6hermes3hbc18StringLiteralTable18acquireStringTableEv:
  138|     56|inline std::vector<StringTableEntry> StringLiteralTable::acquireStringTable() {
  139|     56|  return storage_.acquireStringTable();
  140|     56|}
_ZN6hermes3hbc18StringLiteralTable20acquireStringStorageEv:
  142|     56|inline std::vector<unsigned char> StringLiteralTable::acquireStringStorage() {
  143|     56|  return storage_.acquireStringStorage();
  144|     56|}

_ZN6hermes27LowerExponentiationOperatorC2Ev:
  148|     56|      : FunctionPass("LowerExponentiationOperator") {}
_ZN6hermes22LowerNumericPropertiesC2Ev:
   98|     56|  explicit LowerNumericProperties() : FunctionPass("LowerNumericProperties") {}
_ZN6hermes23LowerAllocObjectLiteralC2Ev:
   71|     56|      : FunctionPass("LowerAllocObjectLiteral") {}
_ZN6hermes15LimitAllocArrayC2Ej:
  120|     56|      : FunctionPass("LimitAllocArray"), maxSize_(maxSizeInclusive) {}
_ZN6hermes14SwitchLoweringC2Ev:
   25|     56|  explicit SwitchLowering() : FunctionPass("SwitchLowering") {}
_ZN6hermes16LowerStoreInstrsC2ERNS_17RegisterAllocatorE:
   86|   114k|      : FunctionPass("LowerStoreInstrs"), RA_(RA) {}

_ZN6hermes17RegisterAllocatorC2EPNS_8FunctionE:
  352|   114k|  explicit RegisterAllocator(Function *func) : F(func) {}
_ZN6hermes12RegisterFileC2Ev:
   89|   114k|  RegisterFile() = default;
_ZN6hermes17RegisterAllocatorD2Ev:
  354|   114k|  virtual ~RegisterAllocator() = default;
_ZN6hermes17RegisterAllocator19getMaxRegisterUsageEv:
  419|   229k|  virtual unsigned getMaxRegisterUsage() {
  420|   229k|    return file.getMaxRegisterUsage();
  421|   229k|  }
_ZN6hermes12RegisterFile19getMaxRegisterUsageEv:
  113|   229k|  unsigned getMaxRegisterUsage() {
  114|   229k|    return registers.size();
  115|   229k|  }
_ZN6hermes17RegisterAllocator20setFastPassThresholdEj:
  360|   114k|  void setFastPassThreshold(unsigned maxInstCount) {
  361|   114k|    fastPassThreshold = maxInstCount;
  362|   114k|  }
_ZN6hermes17RegisterAllocator14setMemoryLimitEm:
  364|   114k|  void setMemoryLimit(uint64_t memoryLimitInBytes) {
  365|   114k|    memoryLimit = memoryLimitInBytes;
  366|   114k|  }
_ZN6hermes8RegisterC2Ej:
   32|  3.49M|  explicit Register(unsigned val = InvalidRegister) : value(val) {}
_ZNK6hermes8Register8getIndexEv:
   40|  7.82M|  unsigned getIndex() const {
   41|  7.82M|    return value;
   42|  7.82M|  }
_ZN6hermes8Register14getConsecutiveEj:
   68|   252k|  Register getConsecutive(unsigned count = 1) {
   69|   252k|    return Register(getIndex() + count);
   70|   252k|  }
_ZN6hermes7SegmentC2Emm:
  136|  1.57M|  explicit Segment(size_t start, size_t end) : start_(start), end_(end) {
  137|  1.57M|    assert(end_ >= start_ && "invalid segment range");
  138|  1.57M|  }
_ZNK6hermes7Segment10intersectsES0_:
  156|  2.04M|  bool intersects(Segment other) const {
  157|  2.04M|    return !(other.start_ >= end_ || start_ >= other.end_);
  ------------------
  |  Branch (157:14): [True: 441k, False: 1.60M]
  |  Branch (157:38): [True: 0, False: 1.60M]
  ------------------
  158|  2.04M|  }
_ZNK6hermes7Segment7touchesES0_:
  161|   441k|  bool touches(Segment other) const {
  162|   441k|    return other.start_ == end_ || start_ == other.end_;
  ------------------
  |  Branch (162:12): [True: 441k, False: 0]
  |  Branch (162:36): [True: 0, False: 0]
  ------------------
  163|   441k|  }
_ZN6hermes7Segment5mergeES0_:
  166|  1.02M|  void merge(Segment other) {
  167|  1.02M|    assert(
  168|  1.02M|        (intersects(other) || touches(other)) &&
  169|  1.02M|        "merging non overlapping segment");
  170|      0|    start_ = std::min(start_, other.start_);
  171|  1.02M|    end_ = std::max(end_, other.end_);
  172|  1.02M|  }
_ZN6hermes8IntervalC2Emm:
  182|   547k|  explicit Interval(size_t start, size_t end) {
  183|   547k|    add(Segment(start, end));
  184|   547k|  }
_ZN6hermes8Interval3addENS_7SegmentE:
  212|  1.57M|  void add(Segment other) {
  213|  1.57M|    for (auto &s : segments_) {
  ------------------
  |  Branch (213:18): [True: 1.02M, False: 547k]
  ------------------
  214|  1.02M|      if (s.intersects(other) || s.touches(other)) {
  ------------------
  |  Branch (214:11): [True: 802k, False: 220k]
  |  Branch (214:34): [True: 220k, False: 0]
  ------------------
  215|  1.02M|        s.merge(other);
  216|  1.02M|        return;
  217|  1.02M|      }
  218|  1.02M|    }
  219|   547k|    segments_.push_back(other);
  220|   547k|  }
_ZNK6hermes8Interval4sizeEv:
  232|  1.09M|  size_t size() const {
  233|  1.09M|    if (segments_.size())
  ------------------
  |  Branch (233:9): [True: 1.09M, False: 0]
  ------------------
  234|  1.09M|      return end() - start();
  235|       |
  236|      0|    return 0;
  237|  1.09M|  }
_ZNK6hermes8Interval5startEv:
  239|  13.1M|  size_t start() const {
  240|  13.1M|    assert(segments_.size() && "No segments in interval!");
  241|      0|    size_t start = segments_[0].start_;
  242|  13.1M|    for (auto &S : segments_) {
  ------------------
  |  Branch (242:18): [True: 13.1M, False: 13.1M]
  ------------------
  243|  13.1M|      start = std::min(start, S.start_);
  244|  13.1M|    }
  245|  13.1M|    return start;
  246|  13.1M|  }
_ZNK6hermes8Interval3endEv:
  248|  77.1M|  size_t end() const {
  249|  77.1M|    assert(segments_.size() && "No segments in interval!");
  250|      0|    size_t start = segments_[0].end_;
  251|  77.1M|    for (auto &S : segments_) {
  ------------------
  |  Branch (251:18): [True: 77.1M, False: 77.1M]
  ------------------
  252|  77.1M|      start = std::max(start, S.end_);
  253|  77.1M|    }
  254|  77.1M|    return start;
  255|  77.1M|  }
_ZN6hermes17RegisterAllocator17BlockLifetimeInfo4initEj:
  264|    202|    void init(unsigned size) {
  265|    202|      gen_.resize(size);
  266|    202|      kill_.resize(size);
  267|    202|      liveIn_.resize(size);
  268|    202|      liveOut_.resize(size);
  269|    202|      maskIn_.resize(size);
  270|    202|    }
_ZN6hermes17RegisterAllocator16getMaxInstrIndexEv:
  297|     78|  unsigned getMaxInstrIndex() {
  298|     78|    return instructionsByNumbers_.size();
  299|     78|  }
_ZN6hermes8IntervalC2Ev:
  180|   547k|  explicit Interval() = default;
_ZN6hermes17RegisterAllocator17BlockLifetimeInfoC2Ev:
  263|    202|    BlockLifetimeInfo() = default;

_ZN6hermes15isNativeBuiltinEj:
   40|    283|inline bool isNativeBuiltin(unsigned method) {
   41|    283|  assert(method < BuiltinMethod::_count && "out of bound BuiltinMethod index");
   42|      0|  return method < BuiltinMethod::_firstJS;
   43|    283|};

_ZN6hermes21FunctionScopeAnalysisC2EPNS_8FunctionE:
  177|     56|  explicit FunctionScopeAnalysis(Function *entryPoint) {
  178|     56|    ScopeData data =
  179|     56|        calculateFunctionScopeData(entryPoint->getFunctionScopeDesc(), 0);
  180|     56|    assert(!data.orphaned && data.depth == 0);
  181|      0|    (void)data;
  182|     56|  }
_ZN6hermes17PostOrderAnalysis6rbeginEv:
   60|   342k|  inline reverse_iterator rbegin() {
   61|   342k|    return Order.rbegin();
   62|   342k|  }
_ZN6hermes17PostOrderAnalysis4rendEv:
   63|   342k|  inline reverse_iterator rend() {
   64|   342k|    return Order.rend();
   65|   342k|  }
_ZN6hermes21FunctionScopeAnalysis9ScopeDataC2EPNS_8FunctionEib:
  152|   342k|        : parent(parent), depth(depth), orphaned(orphaned) {}
_ZN6hermes21FunctionScopeAnalysis9ScopeData6orphanEv:
  155|   114k|    static ScopeData orphan() {
  156|   114k|      return ScopeData(nullptr, 0, true);
  157|   114k|    }

_ZN6hermes10succ_beginEPNS_10BasicBlockE:
  142|   501k|inline succ_iterator succ_begin(BasicBlock *BB) {
  143|   501k|  return succ_iterator(BB->getTerminator());
  144|   501k|}
_ZN6hermes10succ_beginEPKNS_10BasicBlockE:
  146|   153k|inline succ_const_iterator succ_begin(const BasicBlock *BB) {
  147|   153k|  return succ_const_iterator(BB->getTerminator());
  148|   153k|}
_ZN6hermes8succ_endEPNS_10BasicBlockE:
  150|   501k|inline succ_iterator succ_end(BasicBlock *BB) {
  151|   501k|  return succ_iterator(BB->getTerminator(), true);
  152|   501k|}
_ZN6hermes8succ_endEPKNS_10BasicBlockE:
  154|   153k|inline succ_const_iterator succ_end(const BasicBlock *BB) {
  155|   153k|  return succ_const_iterator(BB->getTerminator(), true);
  156|   153k|}
_ZN6hermes10successorsEPNS_10BasicBlockE:
  162|  39.6k|inline succ_range successors(BasicBlock *BB) {
  163|  39.6k|  return succ_range(succ_begin(BB), succ_end(BB));
  164|  39.6k|}
_ZN6hermes10successorsEPKNS_10BasicBlockE:
  166|   153k|inline succ_const_range successors(const BasicBlock *BB) {
  167|   153k|  return succ_const_range(succ_begin(BB), succ_end(BB));
  168|   153k|}
_ZN4llvh11GraphTraitsIPN6hermes10BasicBlockEE11child_beginES3_:
  196|    160|  static ChildIteratorType child_begin(NodeType *N) {
  197|    160|    return succ_begin(N);
  198|    160|  }
_ZN4llvh11GraphTraitsIPN6hermes10BasicBlockEE9child_endES3_:
  199|    160|  static ChildIteratorType child_end(NodeType *N) {
  200|    160|    return succ_end(N);
  201|    160|  }
_ZN4llvh11GraphTraitsIPN6hermes8FunctionEE12getEntryNodeES3_:
  227|      2|  static NodeType *getEntryNode(GraphType F) {
  228|      2|    return &F->front();
  229|      2|  }

_ZN6hermes4TypeC2Ett:
  129|  1.05M|      : bitmask_(mask), numBitmask_(numMask) {}
_ZN6hermes4Type7unionTyES0_S0_:
  134|      2|  static constexpr Type unionTy(Type A, Type B) {
  135|      2|    return Type(A.bitmask_ | B.bitmask_, A.numBitmask_ | B.numBitmask_);
  136|      2|  }
_ZNK6hermes4Type8isNoTypeEv:
  148|   141k|  constexpr bool isNoType() const {
  149|   141k|    return bitmask_ == 0;
  150|   141k|  }
_ZN6hermes4Type12createNoTypeEv:
  152|   367k|  static constexpr Type createNoType() {
  153|   367k|    return Type(0);
  154|   367k|  }
_ZN6hermes4Type11createEmptyEv:
  159|     56|  static constexpr Type createEmpty() {
  160|     56|    return Type(BIT_TO_VAL(Empty));
  ------------------
  |  |   94|     56|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  161|     56|  }
_ZN6hermes4Type15createUndefinedEv:
  162|     56|  static constexpr Type createUndefined() {
  163|     56|    return Type(BIT_TO_VAL(Undefined));
  ------------------
  |  |   94|     56|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  164|     56|  }
_ZN6hermes4Type10createNullEv:
  165|     56|  static constexpr Type createNull() {
  166|     56|    return Type(BIT_TO_VAL(Null));
  ------------------
  |  |   94|     56|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  167|     56|  }
_ZN6hermes4Type13createBooleanEv:
  168|    112|  static constexpr Type createBoolean() {
  169|    112|    return Type(BIT_TO_VAL(Boolean));
  ------------------
  |  |   94|    112|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  170|    112|  }
_ZN6hermes4Type12createStringEv:
  171|  4.10k|  static constexpr Type createString() {
  172|  4.10k|    return Type(BIT_TO_VAL(String));
  ------------------
  |  |   94|  4.10k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  173|  4.10k|  }
_ZN6hermes4Type12createObjectEv:
  174|   220k|  static constexpr Type createObject() {
  175|   220k|    return Type(BIT_TO_VAL(Object));
  ------------------
  |  |   94|   220k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  176|   220k|  }
_ZN6hermes4Type12createNumberEv:
  177|     87|  static constexpr Type createNumber() {
  178|     87|    return Type(BIT_TO_VAL(Number));
  ------------------
  |  |   94|     87|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  179|     87|  }
_ZN6hermes4Type12createBigIntEv:
  180|      2|  static constexpr Type createBigInt() {
  181|      2|    return Type(BIT_TO_VAL(BigInt));
  ------------------
  |  |   94|      2|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  182|      2|  }
_ZN6hermes4Type13createNumericEv:
  183|      2|  static constexpr Type createNumeric() {
  184|      2|    return unionTy(createNumber(), createBigInt());
  185|      2|  }
_ZN6hermes4Type13createClosureEv:
  186|   229k|  static constexpr Type createClosure() {
  187|   229k|    return Type(BIT_TO_VAL(Closure));
  ------------------
  |  |   94|   229k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  188|   229k|  }
_ZN6hermes4Type12createRegExpEv:
  189|  11.4k|  static constexpr Type createRegExp() {
  190|  11.4k|    return Type(BIT_TO_VAL(RegExp));
  ------------------
  |  |   94|  11.4k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
  191|  11.4k|  }
_ZN6hermes4Type11createInt32Ev:
  192|   220k|  static constexpr Type createInt32() {
  193|   220k|    return Type(BIT_TO_VAL(Number), NUM_BIT_TO_VAL(Int32));
  ------------------
  |  |   94|   220k|#define BIT_TO_VAL(XX) (1 << TypeKind::XX)
  ------------------
                  return Type(BIT_TO_VAL(Number), NUM_BIT_TO_VAL(Int32));
  ------------------
  |  |   97|   220k|#define NUM_BIT_TO_VAL(XX) (1 << NumTypeKind::XX)
  ------------------
  194|   220k|  }
_ZNK6hermes4Type12isObjectTypeEv:
  216|  4.16k|  bool isObjectType() const {
  217|       |    // One or more of OBJECT_BITS must be set, and no other bit must be set.
  218|  4.16k|    return bitmask_ && !(bitmask_ & ~OBJECT_BITS);
  ------------------
  |  Branch (218:12): [True: 4.16k, False: 0]
  |  Branch (218:24): [True: 4.16k, False: 0]
  ------------------
  219|  4.16k|  }
_ZNK6hermes4Type12isNumberTypeEv:
  221|  65.0k|  constexpr bool isNumberType() const {
  222|  65.0k|    return IS_VAL(Number);
  ------------------
  |  |   95|  65.0k|#define IS_VAL(XX) (bitmask_ == (1 << TypeKind::XX))
  ------------------
  223|  65.0k|  }
_ZNK6hermes4Type8isNonPtrEv:
  255|   114k|  constexpr bool isNonPtr() const {
  256|       |    // One or more of NONPTR_BITS must be set, and no other bit must be set.
  257|   114k|    return bitmask_ && !(bitmask_ & ~NONPTR_BITS);
  ------------------
  |  Branch (257:12): [True: 114k, False: 0]
  |  Branch (257:24): [True: 7, False: 114k]
  ------------------
  258|   114k|  }
_ZN6hermes5ValuedlEPv:
  472|  3.34M|  void operator delete(void *p) {
  473|  3.34M|    ::operator delete(p);
  474|  3.34M|  }
_ZN6hermes5ValueC2ENS_9ValueKindE:
  478|  3.34M|  explicit Value(ValueKind k) {
  479|  3.34M|    Kind = k;
  480|  3.34M|  }
_ZNK6hermes5Value7getKindEv:
  518|   117M|  ValueKind getKind() const {
  519|   117M|    return Kind;
  520|   117M|  }
_ZN6hermes5Value7setTypeENS_4TypeE:
  526|  1.43M|  void setType(Type type) {
  527|  1.43M|    valueType = type;
  528|  1.43M|  }
_ZNK6hermes5Value7getTypeEv:
  531|   705k|  Type getType() const {
  532|   705k|    return valueType;
  533|   705k|  }
_ZN6hermes9ScopeDescC2EPS0_:
  570|   114k|      : Value(ValueKind::ScopeDescKind), parent_(p) {}
_ZN6hermes9ScopeDesc16createInnerScopeEv:
  578|   114k|  ScopeDesc *createInnerScope() {
  579|   114k|    auto *S = new ScopeDesc(this);
  580|   114k|    innerScopes_.emplace_back(S);
  581|   114k|    return S;
  582|   114k|  }
_ZNK6hermes9ScopeDesc9getParentEv:
  584|   117k|  ScopeDesc *getParent() const {
  585|   117k|    return parent_;
  586|   117k|  }
_ZNK6hermes9ScopeDesc12getVariablesEv:
  596|   355k|  const VariableListType &getVariables() const {
  597|   355k|    return variables_;
  598|   355k|  }
_ZN6hermes9ScopeDesc11addVariableEPNS_8VariableE:
  600|   114k|  void addVariable(Variable *V) {
  601|   114k|    variables_.emplace_back(V);
  602|   114k|  }
_ZNK6hermes9ScopeDesc11hasFunctionEv:
  607|   228k|  bool hasFunction() const {
  608|   228k|    return function_;
  609|   228k|  }
_ZNK6hermes9ScopeDesc18getSerializedScopeEv:
  620|  1.34k|  SerializedScopePtr getSerializedScope() const {
  621|  1.34k|    return serializedScope_;
  622|  1.34k|  }
_ZN6hermes9ScopeDesc7classofEPKNS_5ValueE:
  624|   812k|  static bool classof(const Value *V) {
  625|   812k|    return V->getKind() == ValueKind::ScopeDescKind;
  626|   812k|  }
_ZN6hermes9Parameter7classofEPKNS_5ValueE:
  673|   228k|  static bool classof(const Value *V) {
  674|   228k|    return V->getKind() == ValueKind::ParameterKind;
  675|   228k|  }
_ZN6hermes13EmptySentinelC2Ev:
  684|     56|  explicit EmptySentinel() : Value(ValueKind::EmptySentinelKind) {}
_ZN6hermes13EmptySentinel7classofEPKNS_5ValueE:
  686|  8.32k|  static bool classof(const Value *V) {
  687|  8.32k|    return V->getKind() == ValueKind::EmptySentinelKind;
  688|  8.32k|  }
_ZN6hermes5LabelC2ENS_10IdentifierE:
  708|    129|  explicit Label(Identifier txt) : Value(ValueKind::LabelKind), text(txt) {}
_ZN6hermes7LiteralC2ENS_9ValueKindE:
  724|   224k|  explicit Literal(ValueKind k) : Value(k) {}
_ZN6hermes7Literal7classofEPKNS_5ValueE:
  726|  4.20M|  static bool classof(const Value *V) {
  727|  4.20M|    return kindIsA(V->getKind(), ValueKind::LiteralKind);
  728|  4.20M|  }
_ZN6hermes12LiteralEmptyC2Ev:
  736|     56|  explicit LiteralEmpty() : Literal(ValueKind::LiteralEmptyKind) {
  737|     56|    setType(Type::createEmpty());
  738|     56|  }
_ZN6hermes11LiteralNullC2Ev:
  750|     56|  explicit LiteralNull() : Literal(ValueKind::LiteralNullKind) {
  751|     56|    setType(Type::createNull());
  752|     56|  }
_ZN6hermes11LiteralNull7classofEPKNS_5ValueE:
  754|  7.79k|  static bool classof(const Value *V) {
  755|  7.79k|    return V->getKind() == ValueKind::LiteralNullKind;
  756|  7.79k|  }
_ZN6hermes16LiteralUndefinedC2Ev:
  764|     56|  explicit LiteralUndefined() : Literal(ValueKind::LiteralUndefinedKind) {
  765|     56|    setType(Type::createUndefined());
  766|     56|  }
_ZN6hermes16LiteralUndefined7classofEPKNS_5ValueE:
  768|    283|  static bool classof(const Value *V) {
  769|    283|    return V->getKind() == ValueKind::LiteralUndefinedKind;
  770|    283|  }
_ZNK6hermes13LiteralNumber8getValueEv:
  809|    930|  double getValue() const {
  810|    930|    return value;
  811|    930|  }
_ZNK6hermes13LiteralNumber14isPositiveZeroEv:
  837|    491|  bool isPositiveZero() const {
  838|    491|    return value == 0.0 && !std::signbit(value);
  ------------------
  |  Branch (838:12): [True: 32, False: 459]
  |  Branch (838:28): [True: 32, False: 0]
  ------------------
  839|    491|  }
_ZNK6hermes13LiteralNumber20isUInt8RepresentibleEv:
  843|    459|  bool isUInt8Representible() const {
  844|    459|    return isIntTypeRepresentible<uint8_t>().hasValue();
  845|    459|  }
_ZNK6hermes13LiteralNumber20isInt32RepresentibleEv:
  849|   220k|  bool isInt32Representible() const {
  850|   220k|    return isIntTypeRepresentible<int32_t>().hasValue();
  851|   220k|  }
_ZNK6hermes13LiteralNumber21isUInt32RepresentibleEv:
  855|  5.04k|  bool isUInt32Representible() const {
  856|  5.04k|    return isIntTypeRepresentible<uint32_t>().hasValue();
  857|  5.04k|  }
_ZNK6hermes13LiteralNumber7asUInt8Ev:
  861|    248|  uint32_t asUInt8() const {
  862|    248|    auto tmp = isIntTypeRepresentible<uint8_t>();
  863|    248|    assert(tmp && "Cannot convert to uint8_t");
  864|      0|    return tmp.getValue();
  865|    248|  }
_ZNK6hermes13LiteralNumber7asInt32Ev:
  869|    414|  int32_t asInt32() const {
  870|    414|    auto tmp = isIntTypeRepresentible<int32_t>();
  871|    414|    assert(tmp && "Cannot convert to int32_t");
  872|      0|    return tmp.getValue();
  873|    414|  }
_ZNK6hermes13LiteralNumber8asUInt32Ev:
  877|   148k|  uint32_t asUInt32() const {
  878|   148k|    auto tmp = isIntTypeRepresentible<uint32_t>();
  879|   148k|    assert(tmp && "Cannot convert to uint32_t");
  880|      0|    return tmp.getValue();
  881|   148k|  }
_ZNK6hermes13LiteralNumber19convertToArrayIndexEv:
  895|   461k|  OptValue<uint32_t> convertToArrayIndex() const {
  896|   461k|    return doubleToArrayIndex(value);
  897|   461k|  }
_ZN6hermes13LiteralNumberC2Ed:
  900|   220k|      : Literal(ValueKind::LiteralNumberKind), value(val) {
  901|   220k|    if (isInt32Representible()) {
  ------------------
  |  Branch (901:9): [True: 220k, False: 81]
  ------------------
  902|   220k|      setType(Type::createInt32());
  903|   220k|    } else {
  904|     81|      setType(Type::createNumber());
  905|     81|    }
  906|   220k|  }
_ZN6hermes13LiteralNumber7ProfileERN4llvh16FoldingSetNodeIDEd:
  908|  2.94M|  static void Profile(llvh::FoldingSetNodeID &ID, double value) {
  909|  2.94M|    ID.AddInteger(llvh::DoubleToBits(value));
  910|  2.94M|  }
_ZNK6hermes13LiteralNumber7ProfileERN4llvh16FoldingSetNodeIDE:
  912|  1.82M|  void Profile(llvh::FoldingSetNodeID &ID) const {
  913|  1.82M|    LiteralNumber::Profile(ID, value);
  914|  1.82M|  }
_ZN6hermes13LiteralNumber7classofEPKNS_5ValueE:
  916|  2.25M|  static bool classof(const Value *V) {
  917|  2.25M|    return V->getKind() == ValueKind::LiteralNumberKind;
  918|  2.25M|  }
_ZNK6hermes13LiteralString8getValueEv:
  927|   498k|  Identifier getValue() const {
  928|   498k|    return value;
  929|   498k|  }
_ZN6hermes13LiteralStringC2ENS_10IdentifierE:
  932|  4.10k|      : Literal(ValueKind::LiteralStringKind), value(val) {
  933|  4.10k|    setType(Type::createString());
  934|  4.10k|  }
_ZN6hermes13LiteralString7ProfileERN4llvh16FoldingSetNodeIDENS_10IdentifierE:
  936|   650k|  static void Profile(llvh::FoldingSetNodeID &ID, Identifier value) {
  937|   650k|    ID.AddPointer(value.getUnderlyingPointer());
  938|   650k|  }
_ZNK6hermes13LiteralString7ProfileERN4llvh16FoldingSetNodeIDE:
  940|   328k|  void Profile(llvh::FoldingSetNodeID &ID) const {
  941|   328k|    LiteralString::Profile(ID, value);
  942|   328k|  }
_ZN6hermes13LiteralString7classofEPKNS_5ValueE:
  944|  4.49M|  static bool classof(const Value *V) {
  945|  4.49M|    return V->getKind() == ValueKind::LiteralStringKind;
  946|  4.49M|  }
_ZNK6hermes11LiteralBool8getValueEv:
  955|   467k|  bool getValue() const {
  956|   467k|    return value;
  957|   467k|  }
_ZN6hermes11LiteralBoolC2Eb:
  960|    112|      : Literal(ValueKind::LiteralBoolKind), value(val) {
  961|    112|    setType(Type::createBoolean());
  962|    112|  }
_ZN6hermes11LiteralBool7classofEPKNS_5ValueE:
  964|   475k|  static bool classof(const Value *V) {
  965|   475k|    return V->getKind() == ValueKind::LiteralBoolKind;
  966|   475k|  }
_ZN6hermes12GlobalObjectC2Ev:
  976|     56|  explicit GlobalObject() : Literal(ValueKind::GlobalObjectKind) {
  977|     56|    setType(Type::createObject());
  978|     56|  }
_ZN6hermes12GlobalObject7classofEPKNS_5ValueE:
  980|   309k|  static bool classof(const Value *V) {
  981|   309k|    return V->getKind() == ValueKind::GlobalObjectKind;
  982|   309k|  }
_ZN6hermes8VariableC2EPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
 1012|   114k|      : Variable(ValueKind::VariableKind, scope, declKind, txt){};
_ZNK6hermes8Variable7getNameEv:
 1020|   114k|  Identifier getName() const {
 1021|   114k|    return text;
 1022|   114k|  }
_ZNK6hermes8Variable9getParentEv:
 1023|   125k|  ScopeDesc *getParent() const {
 1024|   125k|    return parent;
 1025|   125k|  }
_ZNK6hermes8Variable11getObeysTDZEv:
 1027|  11.6k|  bool getObeysTDZ() const {
 1028|  11.6k|    return declKind != DeclKind::Var;
 1029|  11.6k|  }
_ZN6hermes8Variable7classofEPKNS_5ValueE:
 1034|  1.01M|  static bool classof(const Value *V) {
 1035|  1.01M|    return V->getKind() == ValueKind::VariableKind;
 1036|  1.01M|  }
_ZN6hermes20GlobalObjectPropertyC2EPNS_6ModuleEPNS_13LiteralStringEb:
 1055|  3.40k|        declared_(declared) {}
_ZN6hermes20GlobalObjectProperty7classofEPKNS_5ValueE:
 1057|   424k|  static bool classof(const Value *v) {
 1058|   424k|    return v->getKind() == ValueKind::GlobalObjectPropertyKind;
 1059|   424k|  }
_ZNK6hermes20GlobalObjectProperty7getNameEv:
 1065|   138k|  LiteralString *getName() const {
 1066|   138k|    return name_;
 1067|   138k|  }
_ZNK6hermes20GlobalObjectProperty10isDeclaredEv:
 1069|   142k|  bool isDeclared() const {
 1070|   142k|    return declared_;
 1071|   142k|  }
_ZN6hermes11InstructionC2ENS_9ValueKindE:
 1101|  2.27M|  explicit Instruction(ValueKind kind) : Value(kind), Parent(nullptr) {}
_ZN6hermes11Instruction11setLocationEN4llvh5SMLocE:
 1126|  2.27M|  void setLocation(SMLoc loc) {
 1127|  2.27M|    location_ = loc;
 1128|  2.27M|  }
_ZNK6hermes11Instruction11getLocationEv:
 1129|  2.27M|  SMLoc getLocation() const {
 1130|  2.27M|    return location_;
 1131|  2.27M|  }
_ZNK6hermes11Instruction11hasLocationEv:
 1132|  2.44M|  bool hasLocation() const {
 1133|  2.44M|    return location_.isValid();
 1134|  2.44M|  }
_ZN6hermes11Instruction19setSourceLevelScopeEPNS_9ScopeDescE:
 1136|  2.27M|  void setSourceLevelScope(ScopeDesc *sourceLevelScope) {
 1137|  2.27M|    SourceLevelScope = sourceLevelScope;
 1138|  2.27M|  }
_ZNK6hermes11Instruction19getSourceLevelScopeEv:
 1139|  1.38M|  ScopeDesc *getSourceLevelScope() const {
 1140|  1.38M|    return SourceLevelScope;
 1141|  1.38M|  }
_ZN6hermes11Instruction17setStatementIndexEj:
 1145|  2.27M|  void setStatementIndex(uint32_t statementIndex) {
 1146|  2.27M|    statementIndex_ = statementIndex;
 1147|  2.27M|  }
_ZNK6hermes11Instruction17getStatementIndexEv:
 1149|  1.83M|  uint32_t getStatementIndex() const {
 1150|  1.83M|    return statementIndex_;
 1151|  1.83M|  }
_ZNK6hermes11Instruction9getParentEv:
 1194|  5.77M|  BasicBlock *getParent() const {
 1195|  5.77M|    return Parent;
 1196|  5.77M|  }
_ZN6hermes11Instruction9setParentEPNS_10BasicBlockE:
 1197|  2.27M|  void setParent(BasicBlock *parent) {
 1198|  2.27M|    Parent = parent;
 1199|  2.27M|  }
_ZN6hermes11Instruction7classofEPKNS_5ValueE:
 1201|  10.5M|  static bool classof(const Value *V) {
 1202|  10.5M|    return kindIsA(V->getKind(), ValueKind::InstructionKind);
 1203|  10.5M|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes11InstructionEE10deleteNodeEPS2_:
 1247|  2.27M|  static void deleteNode(::hermes::Instruction *V) {
 1248|  2.27M|    ::hermes::Value::destroy(V);
 1249|  2.27M|  }
_ZN6hermes10BasicBlock11getInstListEv:
 1283|  4.06M|  InstListType &getInstList() {
 1284|  4.06M|    return InstList;
 1285|  4.06M|  }
_ZNK6hermes10BasicBlock9getParentEv:
 1294|  3.28M|  Function *getParent() const {
 1295|  3.28M|    return Parent;
 1296|  3.28M|  }
_ZN6hermes10BasicBlock5beginEv:
 1317|  4.82M|  inline iterator begin() {
 1318|  4.82M|    return InstList.begin();
 1319|  4.82M|  }
_ZN6hermes10BasicBlock3endEv:
 1320|  5.31M|  inline iterator end() {
 1321|  5.31M|    return InstList.end();
 1322|  5.31M|  }
_ZNK6hermes10BasicBlock5emptyEv:
 1344|   114k|  inline bool empty() const {
 1345|   114k|    return InstList.empty();
 1346|   114k|  }
_ZN6hermes10BasicBlock5frontEv:
 1347|  39.3k|  inline Instruction &front() {
 1348|  39.3k|    return InstList.front();
 1349|  39.3k|  }
_ZN6hermes10BasicBlock7classofEPKNS_5ValueE:
 1360|   738k|  static bool classof(const Value *V) {
 1361|   738k|    return V->getKind() == ValueKind::BasicBlockKind;
 1362|   738k|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes10BasicBlockEE10deleteNodeEPS2_:
 1375|   267k|  static void deleteNode(::hermes::BasicBlock *V) {
 1376|   267k|    ::hermes::Value::destroy(V);
 1377|   267k|  }
_ZN6hermes8FunctionC2EPNS_6ModuleEPNS_9ScopeDescENS_10IdentifierENS0_14DefinitionKindEbNS_16SourceVisibilityEbN4llvh7SMRangeEPS0_:
 1516|   114k|            insertBefore) {}
_ZNK6hermes8Function9getParentEv:
 1520|  1.64M|  Module *getParent() const {
 1521|  1.64M|    return parent_;
 1522|  1.64M|  }
_ZNK6hermes8Function20getFunctionScopeDescEv:
 1524|  1.15M|  ScopeDesc *getFunctionScopeDesc() const {
 1525|  1.15M|    return scopeDesc_;
 1526|  1.15M|  }
_ZNK6hermes8Function13isGlobalScopeEv:
 1529|   344k|  bool isGlobalScope() const {
 1530|   344k|    return isGlobal_;
 1531|   344k|  }
_ZNK6hermes8Function25getOriginalOrInferredNameEv:
 1567|   231k|  const Identifier getOriginalOrInferredName() const {
 1568|   231k|    return originalOrInferredName_;
 1569|   231k|  }
_ZN6hermes8Function17getBasicBlockListEv:
 1580|   456k|  BasicBlockListType &getBasicBlockList() {
 1581|   456k|    return BasicBlockList;
 1582|   456k|  }
_ZNK6hermes8Function17getDefinitionKindEv:
 1594|   114k|  DefinitionKind getDefinitionKind() const {
 1595|   114k|    return definitionKind_;
 1596|   114k|  }
_ZNK6hermes8Function12isStrictModeEv:
 1599|   118k|  bool isStrictMode() const {
 1600|   118k|    return strictMode_;
 1601|   118k|  }
_ZNK6hermes8Function14getSourceRangeEv:
 1604|   342k|  SMRange getSourceRange() const {
 1605|   342k|    return SourceRange;
 1606|   342k|  }
_ZNK6hermes8Function19getSourceVisibilityEv:
 1609|   229k|  SourceVisibility getSourceVisibility() const {
 1610|   229k|    return sourceVisibility_;
 1611|   229k|  }
_ZNK6hermes8Function17getStatementCountEv:
 1613|  2.27M|  OptValue<uint32_t> getStatementCount() const {
 1614|  2.27M|    return statementCount_;
 1615|  2.27M|  }
_ZN6hermes8Function23incrementStatementCountEv:
 1623|   530k|  void incrementStatementCount() {
 1624|   530k|    assert(
 1625|   530k|        statementCount_.hasValue() &&
 1626|   530k|        "cannot incrementStatementCount after clearing it");
 1627|      0|    statementCount_ = *statementCount_ + 1;
 1628|   530k|  }
_ZN6hermes8Function19clearStatementCountEv:
 1630|   114k|  void clearStatementCount() {
 1631|   114k|    statementCount_ = llvh::None;
 1632|   114k|  }
_ZN6hermes8Function13getParametersEv:
 1634|   114k|  ParameterListType &getParameters() {
 1635|   114k|    return Parameters;
 1636|   114k|  }
_ZN6hermes8Function34setExpectedParamCountIncludingThisEj:
 1638|   114k|  void setExpectedParamCountIncludingThis(uint32_t count) {
 1639|   114k|    expectedParamCountIncludingThis_ = count;
 1640|   114k|  }
_ZNK6hermes8Function34getExpectedParamCountIncludingThisEv:
 1642|   114k|  uint32_t getExpectedParamCountIncludingThis() const {
 1643|   114k|    return expectedParamCountIncludingThis_;
 1644|   114k|  }
_ZN6hermes8Function16setThisParameterEPNS_9ParameterE:
 1646|   114k|  void setThisParameter(Parameter *thisParam) {
 1647|   114k|    assert(!thisParameter && "This parameter can only be created once");
 1648|      0|    thisParameter = thisParam;
 1649|   114k|  }
_ZNK6hermes8Function16getThisParameterEv:
 1650|   114k|  Parameter *getThisParameter() const {
 1651|   114k|    return thisParameter;
 1652|   114k|  }
_ZN6hermes8Function13getLazySourceEv:
 1655|  4.04k|  LazySource &getLazySource() {
 1656|  4.04k|    return lazySource_;
 1657|  4.04k|  }
_ZN6hermes8Function12setLazyScopeENSt3__110shared_ptrIKNS_15SerializedScopeEEE:
 1659|    674|  void setLazyScope(SerializedScopePtr vars) {
 1660|    674|    lazyScope_ = std::move(vars);
 1661|    674|  }
_ZNK6hermes8Function12getLazyScopeEv:
 1662|    674|  SerializedScopePtr getLazyScope() const {
 1663|    674|    return lazyScope_;
 1664|    674|  }
_ZN6hermes8Function19setLazyClosureAliasEPNS_8VariableE:
 1666|    768|  void setLazyClosureAlias(Variable *var) {
 1667|    768|    lazyClosureAlias_ = var;
 1668|    768|  }
_ZNK6hermes8Function19getLazyClosureAliasEv:
 1669|  1.34k|  Variable *getLazyClosureAlias() const {
 1670|  1.34k|    return lazyClosureAlias_;
 1671|  1.34k|  }
_ZNK6hermes8Function6isLazyEv:
 1675|  2.29M|  bool isLazy() const {
 1676|       |#ifdef HERMESVM_LEAN
 1677|       |    return false;
 1678|       |#else
 1679|  2.29M|    return lazySource_.nodeKind != ESTree::NodeKind::Empty;
 1680|  2.29M|#endif
 1681|  2.29M|  }
_ZN6hermes8Function5beginEv:
 1691|  1.71M|  inline iterator begin() {
 1692|  1.71M|    return BasicBlockList.begin();
 1693|  1.71M|  }
_ZN6hermes8Function3endEv:
 1694|  1.37M|  inline iterator end() {
 1695|  1.37M|    return BasicBlockList.end();
 1696|  1.37M|  }
_ZN6hermes8Function5frontEv:
 1733|   724k|  inline BasicBlock &front() {
 1734|   724k|    return BasicBlockList.front();
 1735|   724k|  }
_ZN6hermes8Function7classofEPKNS_5ValueE:
 1742|   574k|  static bool classof(const Value *V) {
 1743|   574k|    return kindIsA(V->getKind(), ValueKind::FunctionKind);
 1744|   574k|  }
_ZN6hermes17GeneratorFunction7classofEPKNS_5ValueE:
 1771|   114k|  static bool classof(const Value *V) {
 1772|   114k|    return kindIsA(V->getKind(), ValueKind::GeneratorFunctionKind);
 1773|   114k|  }
_ZN6hermes22GeneratorInnerFunction7classofEPKNS_5ValueE:
 1803|   342k|  static bool classof(const Value *V) {
 1804|   342k|    return kindIsA(V->getKind(), ValueKind::GeneratorInnerFunctionKind);
 1805|   342k|  }
_ZN6hermes13AsyncFunction7classofEPKNS_5ValueE:
 1832|   458k|  static bool classof(const Value *V) {
 1833|   458k|    return kindIsA(V->getKind(), ValueKind::AsyncFunctionKind);
 1834|   458k|  }
_ZN4llvh18ilist_alloc_traitsIN6hermes8FunctionEE10deleteNodeEPS2_:
 1847|   114k|  static void deleteNode(::hermes::Function *V) {
 1848|   114k|    ::hermes::Value::destroy(V);
 1849|   114k|  }
_ZNK6hermes6Module14HashRawStringsclERKNSt3__16vectorIPNS_13LiteralStringENS2_9allocatorIS5_EEEE:
 1941|    283|    std::size_t operator()(const RawStringList &rawStrings) const {
 1942|    283|      return llvh::hash_combine_range(rawStrings.begin(), rawStrings.end());
 1943|    283|    }
_ZN6hermes6ModuleC2ENSt3__110shared_ptrINS_7ContextEEE:
 1955|     56|      : Value(ValueKind::ModuleKind), Ctx(std::move(ctx)) {}
_ZNK6hermes6Module10getContextEv:
 1959|  4.10M|  Context &getContext() const {
 1960|  4.10M|    return *Ctx;
 1961|  4.10M|  }
_ZNK6hermes6Module12shareContextEv:
 1963|    674|  std::shared_ptr<Context> shareContext() const {
 1964|    674|    return Ctx;
 1965|    674|  }
_ZN6hermes6Module19setTopLevelFunctionEPNS_8FunctionE:
 1989|     56|  void setTopLevelFunction(Function *topLevelFunction) {
 1990|     56|    assert(
 1991|     56|        topLevelFunction->getParent() == this &&
 1992|     56|        "topLevelFunction from a different module");
 1993|      0|    topLevelFunction_ = topLevelFunction;
 1994|     56|  }
_ZN6hermes6Module19getTopLevelFunctionEv:
 1997|     56|  Function *getTopLevelFunction() {
 1998|     56|    assert(
 1999|     56|        !FunctionList.empty() && "top-level function hasn't been created yet");
 2000|       |    // If the top level function hasn't been overridden, return the first
 2001|       |    // function.
 2002|     56|    return !topLevelFunction_ ? &*FunctionList.begin() : topLevelFunction_;
  ------------------
  |  Branch (2002:12): [True: 0, False: 56]
  ------------------
 2003|     56|  }
_ZN6hermes6Module19getGlobalPropertiesEv:
 2007|    112|  llvh::iterator_range<GlobalObjectPropertyIterator> getGlobalProperties() {
 2008|    112|    return {globalPropertyList_.begin(), globalPropertyList_.end()};
 2009|    112|  }
_ZN6hermes6Module19getLiteralUndefinedEv:
 2039|   229k|  LiteralUndefined *getLiteralUndefined() {
 2040|   229k|    return &literalUndefined;
 2041|   229k|  }
_ZN6hermes6Module15getInitialScopeEv:
 2048|     56|  ScopeDesc *getInitialScope() {
 2049|     56|    return &initialScope_;
 2050|     56|  }
_ZN6hermes6Module15getGlobalObjectEv:
 2057|   135k|  GlobalObject *getGlobalObject() {
 2058|   135k|    return &globalObject_;
 2059|   135k|  }
_ZN6hermes6Module16getEmptySentinelEv:
 2062|  4.16k|  EmptySentinel *getEmptySentinel() {
 2063|  4.16k|    return &emptySentinel_;
 2064|  4.16k|  }
_ZNK6hermes6Module13findCJSModuleEPNS_8FunctionE:
 2092|   343k|  const CJSModule *findCJSModule(Function *function) const {
 2093|   343k|    auto it = cjsModuleFunctionMap_.find(function);
 2094|   343k|    return it == cjsModuleFunctionMap_.end() ? nullptr : it->second;
  ------------------
  |  Branch (2094:12): [True: 343k, False: 0]
  ------------------
 2095|   343k|  }
_ZNK6hermes6Module21getCJSModulesResolvedEv:
 2113|     56|  bool getCJSModulesResolved() const {
 2114|     56|    return cjsModulesResolved_;
 2115|     56|  }
_ZNK6hermes6Module9isLoweredEv:
 2130|     56|  bool isLowered() const {
 2131|     56|    return isLowered_;
 2132|     56|  }
_ZN6hermes6Module10setLoweredEb:
 2134|     56|  void setLowered(bool isLowered) {
 2135|     56|    isLowered_ = isLowered;
 2136|     56|  }
_ZN6hermes6Module5beginEv:
 2138|  1.12k|  inline iterator begin() {
 2139|  1.12k|    return FunctionList.begin();
 2140|  1.12k|  }
_ZN6hermes6Module3endEv:
 2141|  1.12k|  inline iterator end() {
 2142|  1.12k|    return FunctionList.end();
 2143|  1.12k|  }
_ZNK6hermes9ScopeDesc11getFunctionEv:
 2188|   697k|Function *ScopeDesc::getFunction() const {
 2189|   697k|  assert(function_ && "function not set. Is this the initial scope?");
 2190|      0|  return function_;
 2191|   697k|}
_ZN6hermes9ScopeDesc11setFunctionEPNS_8FunctionE:
 2193|   114k|void ScopeDesc::setFunction(Function *F) {
 2194|   114k|  assert(!function_ && "Scopes shouldn't change functions.");
 2195|      0|  function_ = F;
 2196|   114k|}
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIhEEN4llvh8OptionalIT_EEv:
  817|    707|  llvh::Optional<T> isIntTypeRepresentible() const {
  818|       |    // Check the value is within the bounds of T.
  819|       |    // Converting double to int when it's out of bound is undefined behavior.
  820|       |    // Although it is harmless in this scenario, we should still avoid it.
  821|    707|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (821:9): [True: 211, False: 496]
  ------------------
  822|    707|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (822:9): [True: 0, False: 496]
  ------------------
  823|    211|      return llvh::None;
  824|    211|    }
  825|    496|    if (std::isnan(value)) {
  ------------------
  |  Branch (825:9): [True: 0, False: 496]
  ------------------
  826|      0|      return llvh::None;
  827|      0|    }
  828|       |    // Check the value is integer and is not -0.
  829|    496|    T valAsInt = static_cast<T>(value);
  830|    496|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (830:9): [True: 496, False: 0]
  |  Branch (830:31): [True: 496, False: 0]
  |  Branch (830:43): [True: 0, False: 0]
  ------------------
  831|    496|      return valAsInt;
  832|    496|    }
  833|      0|    return llvh::None;
  834|    496|  }
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIiEEN4llvh8OptionalIT_EEv:
  817|  1.17M|  llvh::Optional<T> isIntTypeRepresentible() const {
  818|       |    // Check the value is within the bounds of T.
  819|       |    // Converting double to int when it's out of bound is undefined behavior.
  820|       |    // Although it is harmless in this scenario, we should still avoid it.
  821|  1.17M|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (821:9): [True: 160, False: 1.16M]
  ------------------
  822|  1.17M|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (822:9): [True: 0, False: 1.16M]
  ------------------
  823|    160|      return llvh::None;
  824|    160|    }
  825|  1.16M|    if (std::isnan(value)) {
  ------------------
  |  Branch (825:9): [True: 0, False: 1.16M]
  ------------------
  826|      0|      return llvh::None;
  827|      0|    }
  828|       |    // Check the value is integer and is not -0.
  829|  1.16M|    T valAsInt = static_cast<T>(value);
  830|  1.16M|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (830:9): [True: 1.16M, False: 3]
  |  Branch (830:31): [True: 453k, False: 716k]
  |  Branch (830:43): [True: 716k, False: 0]
  ------------------
  831|  1.16M|      return valAsInt;
  832|  1.16M|    }
  833|      3|    return llvh::None;
  834|  1.16M|  }
_ZNK6hermes13LiteralNumber22isIntTypeRepresentibleIjEEN4llvh8OptionalIT_EEv:
  817|   153k|  llvh::Optional<T> isIntTypeRepresentible() const {
  818|       |    // Check the value is within the bounds of T.
  819|       |    // Converting double to int when it's out of bound is undefined behavior.
  820|       |    // Although it is harmless in this scenario, we should still avoid it.
  821|   153k|    if (value > std::numeric_limits<T>::max() ||
  ------------------
  |  Branch (821:9): [True: 0, False: 153k]
  ------------------
  822|   153k|        value < std::numeric_limits<T>::min()) {
  ------------------
  |  Branch (822:9): [True: 0, False: 153k]
  ------------------
  823|      0|      return llvh::None;
  824|      0|    }
  825|   153k|    if (std::isnan(value)) {
  ------------------
  |  Branch (825:9): [True: 0, False: 153k]
  ------------------
  826|      0|      return llvh::None;
  827|      0|    }
  828|       |    // Check the value is integer and is not -0.
  829|   153k|    T valAsInt = static_cast<T>(value);
  830|   153k|    if (valAsInt == value && (valAsInt || !std::signbit(value))) {
  ------------------
  |  Branch (830:9): [True: 153k, False: 0]
  |  Branch (830:31): [True: 140k, False: 13.2k]
  |  Branch (830:43): [True: 13.2k, False: 0]
  ------------------
  831|   153k|      return valAsInt;
  832|   153k|    }
  833|      0|    return llvh::None;
  834|   153k|  }
_ZN6hermes4TypeC2Ev:
  132|  3.34M|  constexpr Type() = default;
HBC.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  15.1M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  15.1M|  switch (base) {
  381|  10.9M|    default:
  ------------------
  |  Branch (381:5): [True: 10.9M, False: 4.20M]
  ------------------
  382|  10.9M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  10.9M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|  4.20M|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|  4.20M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 4.20M, False: 10.9M]
  |  |  |  |  ------------------
  |  |  |  |  386|  4.20M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 3.06M, False: 1.13M]
  |  |  |  |  ------------------
  |  |  |  |  387|  4.20M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 2.51M, False: 548k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 15.1M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  15.1M|#undef INCLUDE_ALL_INSTRS
  390|  15.1M|  }
  391|  15.1M|}
ISel.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  76.8M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  76.8M|  switch (base) {
  381|  45.1M|    default:
  ------------------
  |  Branch (381:5): [True: 45.1M, False: 31.7M]
  ------------------
  382|  45.1M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  45.1M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 76.8M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|  10.5M|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|  10.5M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 10.5M, False: 66.2M]
  |  |  |  |  ------------------
  |  |  |  |  386|  10.5M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 10.5M, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|  10.5M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 8.21M, False: 2.36M]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|  10.5M|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|  1.64M|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|  1.64M|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|  1.64M|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|  1.64M|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  1.64M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 1.64M, False: 75.2M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  1.64M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 1.64M, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  1.64M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 228k, False: 1.41M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 76.8M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|  2.89M|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  2.89M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 2.89M, False: 73.9M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  2.89M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 2.46M, False: 431k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  2.89M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 18.9k, False: 2.44M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|  4.99M|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  4.99M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 4.99M, False: 71.8M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  4.99M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 4.55M, False: 443k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  4.99M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 2.31M, False: 2.23M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|  3.01M|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  3.01M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 3.01M, False: 73.8M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  3.01M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 2.36M, False: 654k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  3.01M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 395k, False: 1.96M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|   114k|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   114k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 114k, False: 76.7M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   114k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 114k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   114k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 114k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|  3.37M|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  3.37M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 3.37M, False: 73.4M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  3.37M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 3.23M, False: 144k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  3.37M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 3.23M, False: 20]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|  4.51M|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  4.51M|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 4.51M, False: 72.3M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  4.51M|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 194k, False: 4.31M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  4.51M|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 4.02k, False: 190k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|  4.51M|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|  4.51M|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|  4.51M|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|  4.51M|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|  4.51M|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|  4.51M|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|  4.51M|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|  4.51M|#endif
  |  |  |  |  134|  4.51M|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|  4.51M|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|  4.51M|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|  4.51M|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|  4.51M|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|  4.51M|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|  4.51M|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|  4.51M|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|  4.51M|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|  4.51M|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|  4.51M|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|  4.51M|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|  4.51M|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|  4.51M|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 76.8M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|   574k|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|   574k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 574k, False: 76.2M]
  |  |  |  |  ------------------
  |  |  |  |  386|   574k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 574k, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|   574k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 574k, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|   574k|DEF_VALUE(Function, Value)
  |  |   52|   574k|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|   574k|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|   574k|DEF_VALUE(AsyncFunction, Function)
  |  |   55|   574k|MARK_LAST(Function)
  |  |   56|   574k|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|   574k|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|   574k|#undef DEF_VALUE
  |  |   61|   574k|#undef MARK_FIRST
  |  |   62|   574k|#undef MARK_LAST
  |  |   63|   574k|#undef MARK_VALUE
  ------------------
  389|  76.8M|#undef INCLUDE_ALL_INSTRS
  390|  76.8M|  }
  391|  76.8M|}
Passes.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  1.28M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  1.28M|  switch (base) {
  381|  1.15M|    default:
  ------------------
  |  Branch (381:5): [True: 1.15M, False: 126k]
  ------------------
  382|  1.15M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  1.15M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|   125k|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|   125k|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|   125k|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|   125k|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   125k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 125k, False: 1.15M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   125k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 125k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   125k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 125k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|    889|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|    889|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 889, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|    889|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 889, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|    889|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 596, False: 293]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.28M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  1.28M|#undef INCLUDE_ALL_INSTRS
  390|  1.28M|  }
  391|  1.28M|}
RegAlloc.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  1.79M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  1.79M|  switch (base) {
  381|  1.79M|    default:
  ------------------
  |  Branch (381:5): [True: 1.79M, False: 0]
  ------------------
  382|  1.79M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  1.79M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.79M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  1.79M|#undef INCLUDE_ALL_INSTRS
  390|  1.79M|  }
  391|  1.79M|}
Lowering.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|   194k|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|   194k|  switch (base) {
  381|   194k|    default:
  ------------------
  |  Branch (381:5): [True: 194k, False: 0]
  ------------------
  382|   194k|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|   194k|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 194k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|   194k|#undef INCLUDE_ALL_INSTRS
  390|   194k|  }
  391|   194k|}
Exceptions.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  39.3k|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  39.3k|  switch (base) {
  381|  39.3k|    default:
  ------------------
  |  Branch (381:5): [True: 39.3k, False: 0]
  ------------------
  382|  39.3k|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  39.3k|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 39.3k]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  39.3k|#undef INCLUDE_ALL_INSTRS
  390|  39.3k|  }
  391|  39.3k|}
IR.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  1.71M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  1.71M|  switch (base) {
  381|  1.36M|    default:
  ------------------
  |  Branch (381:5): [True: 1.36M, False: 349k]
  ------------------
  382|  1.36M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  1.36M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|  3.78k|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|  3.78k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 3.78k, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|  3.78k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 3.78k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|  3.78k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 3.78k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|   230k|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   230k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 230k, False: 1.48M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   230k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 230k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   230k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 230k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|   114k|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|   114k|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 114k, False: 1.60M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|   114k|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 114k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|   114k|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 114k, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|    291|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|    291|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 291, False: 1.71M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|    291|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 291, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|    291|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 291, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|    291|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|    291|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|    291|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|    291|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|    291|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|    291|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|    291|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|    291|#endif
  |  |  |  |  134|    291|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|    291|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|    291|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|    291|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|    291|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|    291|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|    291|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|    291|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|    291|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|    291|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|    291|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|    291|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|    291|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|    291|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 1.71M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  1.71M|#undef INCLUDE_ALL_INSTRS
  390|  1.71M|  }
  391|  1.71M|}
Instrs.cpp:_ZN6hermesL7kindIsAENS_9ValueKindES0_:
  379|  2.56M|static inline bool kindIsA(ValueKind kind, ValueKind base) {
  380|  2.56M|  switch (base) {
  381|  2.56M|    default:
  ------------------
  |  Branch (381:5): [True: 2.56M, False: 0]
  ------------------
  382|  2.56M|      return kind == base;
  383|      0|#define INCLUDE_ALL_INSTRS
  384|      0|#define MARK_FIRST(CLASS)                            \
  385|      0|  case ValueKind::CLASS##Kind:                       \
  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  388|  2.56M|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|      0|#ifndef DEF_VALUE
  |  |    9|      0|#define DEF_VALUE(NAME, PARENT)
  |  |   10|      0|#endif
  |  |   11|       |#ifndef MARK_FIRST
  |  |   12|       |#define MARK_FIRST(NAME)
  |  |   13|       |#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |   45|      0|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |   57|      0|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |   36|      0|DEF_VALUE(LiteralNumber, Literal)
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |   38|      0|DEF_VALUE(LiteralString, Literal)
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|      0|DEF_VALUE(ScopeDesc, Value)
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |   46|      0|DEF_VALUE(GlobalObjectProperty, Value)
  |  |   47|      0|DEF_VALUE(Variable, Value)
  |  |   48|      0|DEF_VALUE(Parameter, Value)
  |  |   49|      0|DEF_VALUE(BasicBlock, Value)
  |  |   50|      0|MARK_FIRST(Function)
  |  |  ------------------
  |  |  |  |  385|      0|  case ValueKind::CLASS##Kind:                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (385:3): [True: 0, False: 2.56M]
  |  |  |  |  ------------------
  |  |  |  |  386|      0|    return kind >= ValueKind::First_##CLASS##Kind && \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (386:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  387|      0|        kind <= ValueKind::Last_##CLASS##Kind;
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (387:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(Function, Value)
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
  389|  2.56M|#undef INCLUDE_ALL_INSTRS
  390|  2.56M|  }
  391|  2.56M|}

_ZN6hermes9IRBuilderC2EPNS_6ModuleE:
   45|   114k|  explicit IRBuilder(Module *Mod) : M(Mod), InsertionPoint(nullptr) {}
_ZN6hermes9IRBuilderC2EPNS_8FunctionE:
   47|  1.39M|      : M(F->getParent()), InsertionPoint(nullptr) {}
_ZN6hermes9IRBuilder9getModuleEv:
   55|  11.4k|  Module *getModule() {
   56|  11.4k|    return M;
   57|  11.4k|  }
_ZN6hermes9IRBuilder11getFunctionEv:
  223|  3.04M|  Function *getFunction() {
  224|  3.04M|    assert(Block && "Builder has no current function");
  225|      0|    return Block->getParent();
  226|  3.04M|  }
_ZN6hermes9IRBuilder11setLocationEN4llvh5SMLocE:
  243|  5.31M|  void setLocation(SMLoc loc) {
  244|  5.31M|    Location = loc;
  245|  5.31M|  }
_ZN6hermes9IRBuilder13clearLocationEv:
  246|   114k|  void clearLocation() {
  247|   114k|    Location = SMLoc{};
  248|   114k|  }
_ZNK6hermes9IRBuilder11getLocationEv:
  249|  1.88M|  SMLoc getLocation() const {
  250|  1.88M|    return Location;
  251|  1.88M|  }
_ZN6hermes9IRBuilder26setCurrentSourceLevelScopeEPNS_9ScopeDescE:
  253|  1.72M|  void setCurrentSourceLevelScope(ScopeDesc *sourceLevelScope) {
  254|  1.72M|    CurrentSourceLevelScope = sourceLevelScope;
  255|  1.72M|  }
_ZN6hermes9IRBuilder20ScopedLocationChangeC2ERS0_N4llvh5SMLocE:
  605|  1.76M|        : builder_(builder), oldLocation_(builder.getLocation()) {
  606|  1.76M|      builder_.setLocation(location);
  607|  1.76M|    }
_ZN6hermes9IRBuilder20ScopedLocationChangeD2Ev:
  610|  1.76M|    ~ScopedLocationChange() {
  611|  1.76M|      builder_.setLocation(oldLocation_);
  612|  1.76M|    }
_ZN6hermes9IRBuilder11SaveRestoreC2ERS0_:
  634|   114k|          Location(builder.getLocation()) {
  635|   114k|      builder.clearLocation();
  636|   114k|    }
_ZN6hermes9IRBuilder11SaveRestoreD2Ev:
  639|   114k|    ~SaveRestore() {
  640|   114k|      Builder.setInsertionBlock(BB);
  641|   114k|      Builder.setLocation(Location);
  642|   114k|    }
_ZN6hermes9IRBuilder20InstructionDestroyer14hasInstructionEPNS_11InstructionE:
  658|   128k|    bool hasInstruction(Instruction *A) {
  659|   128k|      return std::find(list.begin(), list.end(), A) != list.end();
  660|   128k|    }
_ZN6hermes9IRBuilder20InstructionDestroyer3addEPNS_11InstructionE:
  663|   128k|    void add(Instruction *A) {
  664|   128k|#ifndef NDEBUG
  665|   128k|      assert(!hasInstruction(A) && "Instruction already in list!");
  666|      0|#endif
  667|      0|      list.push_back(A);
  668|   128k|    }
_ZN6hermes9IRBuilder20InstructionDestroyerD2Ev:
  670|   496k|    ~InstructionDestroyer() {
  671|   496k|      for (auto *I : list) {
  ------------------
  |  Branch (671:20): [True: 128k, False: 496k]
  ------------------
  672|   128k|        I->eraseFromParent();
  673|   128k|      }
  674|   496k|    }
_ZN6hermes9IRBuilder20InstructionDestroyerC2Ev:
  653|   496k|    explicit InstructionDestroyer() = default;

_ZN6hermes17ScopeCreationInstC2ENS_9ValueKindEPNS_9ScopeDescE:
   47|   228k|      : Instruction(kind) {
   48|   228k|    pushOperand(scopeDesc);
   49|   228k|  }
_ZNK6hermes17ScopeCreationInst19getCreatedScopeDescEv:
   65|   697k|  ScopeDesc *getCreatedScopeDesc() const {
   66|   697k|    return cast<ScopeDesc>(getOperand(CreatedScopeIdx));
   67|   697k|  }
_ZN6hermes17ScopeCreationInst7classofEPKNS_5ValueE:
   77|  1.77M|  static bool classof(const Value *V) {
   78|  1.77M|    return kindIsA(V->getKind(), ValueKind::ScopeCreationInstKind);
   79|  1.77M|  }
_ZN6hermes17SingleOperandInstC2ENS_9ValueKindEPNS_5ValueE:
   92|   500k|  explicit SingleOperandInst(ValueKind K, Value *Op) : Instruction(K) {
   93|   500k|    pushOperand(Op);
   94|   500k|  }
_ZNK6hermes17SingleOperandInst16getSingleOperandEv:
  106|   500k|  Value *getSingleOperand() const {
  107|   500k|    return getOperand(0);
  108|   500k|  }
_ZN6hermes14TerminatorInstC2ENS_9ValueKindE:
  130|   267k|  explicit TerminatorInst(ValueKind K) : Instruction(K) {}
_ZN6hermes14TerminatorInst7classofEPKNS_5ValueE:
  150|  3.37M|  static bool classof(const Value *V) {
  151|  3.37M|    return kindIsA(V->getKind(), ValueKind::TerminatorInstKind);
  152|  3.37M|  }
_ZNK6hermes10BranchInst13getBranchDestEv:
  190|   236k|  BasicBlock *getBranchDest() const {
  191|   236k|    return cast<BasicBlock>(getOperand(BranchDestIdx));
  192|   236k|  }
_ZN6hermes10BranchInstC2EPNS_10BasicBlockES2_:
  195|  39.4k|      : TerminatorInst(ValueKind::BranchInstKind) {
  196|  39.4k|    pushOperand(dest);
  197|  39.4k|  }
_ZN6hermes10BranchInst7classofEPKNS_5ValueE:
  209|  1.72M|  static bool classof(const Value *V) {
  210|  1.72M|    return kindIsA(V->getKind(), ValueKind::BranchInstKind);
  211|  1.72M|  }
_ZNK6hermes10BranchInst16getNumSuccessorsEv:
  213|   394k|  unsigned getNumSuccessors() const {
  214|   394k|    return 1;
  215|   394k|  }
_ZNK6hermes10BranchInst12getSuccessorEj:
  216|   197k|  BasicBlock *getSuccessor(unsigned idx) const {
  217|   197k|    assert(idx == 0 && "BranchInst only have 1 successor!");
  218|      0|    return getBranchDest();
  219|   197k|  }
_ZN6hermes12AsNumberInstC2EPNS_5ValueE:
  259|      4|      : SingleOperandInst(ValueKind::AsNumberInstKind, value) {
  260|      4|    setType(Type::createNumber());
  261|      4|  }
_ZN6hermes12AsNumberInst7classofEPKNS_5ValueE:
  275|      8|  static bool classof(const Value *V) {
  276|      8|    return kindIsA(V->getKind(), ValueKind::AsNumberInstKind);
  277|      8|  }
_ZN6hermes13AsNumericInstC2EPNS_5ValueE:
  286|      2|      : SingleOperandInst(ValueKind::AsNumericInstKind, value) {
  287|      2|    setType(Type::createNumeric());
  288|      2|  }
_ZN6hermes13AsNumericInst7classofEPKNS_5ValueE:
  302|      4|  static bool classof(const Value *V) {
  303|      4|    return kindIsA(V->getKind(), ValueKind::AsNumericInstKind);
  304|      4|  }
_ZNK6hermes14CondBranchInst12getConditionEv:
  339|     71|  Value *getCondition() const {
  340|     71|    return getOperand(ConditionIdx);
  341|     71|  }
_ZNK6hermes14CondBranchInst11getTrueDestEv:
  342|    425|  BasicBlock *getTrueDest() const {
  343|    425|    return cast<BasicBlock>(getOperand(TrueBlockIdx));
  344|    425|  }
_ZNK6hermes14CondBranchInst12getFalseDestEv:
  345|    425|  BasicBlock *getFalseDest() const {
  346|    425|    return cast<BasicBlock>(getOperand(FalseBlockIdx));
  347|    425|  }
_ZN6hermes14CondBranchInstC2EPNS_10BasicBlockEPNS_5ValueES2_S2_:
  354|     71|      : TerminatorInst(ValueKind::CondBranchInstKind) {
  355|     71|    pushOperand(cond);
  356|     71|    pushOperand(trueBlock);
  357|     71|    pushOperand(falseBlock);
  358|     71|  }
_ZN6hermes14CondBranchInst7classofEPKNS_5ValueE:
  372|  3.92k|  static bool classof(const Value *V) {
  373|  3.92k|    return kindIsA(V->getKind(), ValueKind::CondBranchInstKind);
  374|  3.92k|  }
_ZNK6hermes14CondBranchInst16getNumSuccessorsEv:
  376|  1.06k|  unsigned getNumSuccessors() const {
  377|  1.06k|    return 2;
  378|  1.06k|  }
_ZNK6hermes14CondBranchInst12getSuccessorEj:
  379|    708|  BasicBlock *getSuccessor(unsigned idx) const {
  380|    708|    if (idx == 0)
  ------------------
  |  Branch (380:9): [True: 354, False: 354]
  ------------------
  381|    354|      return getTrueDest();
  382|    354|    if (idx == 1)
  ------------------
  |  Branch (382:9): [True: 354, False: 0]
  ------------------
  383|    354|      return getFalseDest();
  384|      0|    llvm_unreachable("CondBranchInst only have 2 successors!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  385|    354|  }
_ZNK6hermes10ReturnInst8getValueEv:
  399|   114k|  Value *getValue() const {
  400|   114k|    return getOperand(ReturnValueIdx);
  401|   114k|  }
_ZN6hermes10ReturnInstC2EPNS_5ValueE:
  403|   228k|  explicit ReturnInst(Value *val) : TerminatorInst(ValueKind::ReturnInstKind) {
  404|   228k|    pushOperand(val);
  405|   228k|  }
_ZN6hermes10ReturnInst7classofEPKNS_5ValueE:
  417|  1.25M|  static bool classof(const Value *V) {
  418|  1.25M|    return kindIsA(V->getKind(), ValueKind::ReturnInstKind);
  419|  1.25M|  }
_ZNK6hermes10ReturnInst16getNumSuccessorsEv:
  421|   456k|  unsigned getNumSuccessors() const {
  422|   456k|    return 0;
  423|   456k|  }
_ZN6hermes14AllocStackInstC2ENS_10IdentifierE:
  442|    129|      : Instruction(ValueKind::AllocStackInstKind), variableName(varName) {
  443|    129|    pushOperand(&variableName);
  444|    129|  }
_ZN6hermes14AllocStackInst7classofEPKNS_5ValueE:
  465|   129k|  static bool classof(const Value *V) {
  466|   129k|    return kindIsA(V->getKind(), ValueKind::AllocStackInstKind);
  467|   129k|  }
_ZN6hermes13LoadStackInstC2EPNS_14AllocStackInstE:
  476|    105|      : SingleOperandInst(ValueKind::LoadStackInstKind, alloc) {}
_ZN6hermes13LoadStackInst7classofEPKNS_5ValueE:
  494|    210|  static bool classof(const Value *V) {
  495|    210|    return kindIsA(V->getKind(), ValueKind::LoadStackInstKind);
  496|    210|  }
_ZNK6hermes14StoreStackInst8getValueEv:
  506|   128k|  Value *getValue() const {
  507|   128k|    return getOperand(StoredValueIdx);
  508|   128k|  }
_ZNK6hermes14StoreStackInst6getPtrEv:
  509|   128k|  AllocStackInst *getPtr() const {
  510|   128k|    return cast<AllocStackInst>(getOperand(PtrIdx));
  511|   128k|  }
_ZN6hermes14StoreStackInstC2EPNS_5ValueEPNS_14AllocStackInstE:
  514|   128k|      : Instruction(ValueKind::StoreStackInstKind) {
  515|   128k|    setType(Type::createNoType());
  516|   128k|    pushOperand(storedValue);
  517|   128k|    pushOperand(ptr);
  518|   128k|  }
_ZN6hermes14StoreStackInst7classofEPKNS_5ValueE:
  532|  1.67M|  static bool classof(const Value *V) {
  533|  1.67M|    return kindIsA(V->getKind(), ValueKind::StoreStackInstKind);
  534|  1.67M|  }
_ZN6hermes13LoadFrameInstC2EPNS_8VariableEPNS_17ScopeCreationInstE:
  545|  10.8k|      : Instruction(ValueKind::LoadFrameInstKind) {
  546|  10.8k|    pushOperand(alloc);
  547|  10.8k|    pushOperand(environment);
  548|  10.8k|  }
_ZNK6hermes13LoadFrameInst15getLoadVariableEv:
  555|  10.8k|  Variable *getLoadVariable() const {
  556|  10.8k|    return cast<Variable>(getOperand(LoadVariableIdx));
  557|  10.8k|  }
_ZNK6hermes13LoadFrameInst14getEnvironmentEv:
  559|  10.8k|  ScopeCreationInst *getEnvironment() const {
  560|  10.8k|    return cast<ScopeCreationInst>(getOperand(EnvIdx));
  561|  10.8k|  }
_ZN6hermes13LoadFrameInst7classofEPKNS_5ValueE:
  571|  21.7k|  static bool classof(const Value *V) {
  572|  21.7k|    return kindIsA(V->getKind(), ValueKind::LoadFrameInstKind);
  573|  21.7k|  }
_ZNK6hermes14StoreFrameInst8getValueEv:
  583|   114k|  Value *getValue() const {
  584|   114k|    return getOperand(StoredValueIdx);
  585|   114k|  }
_ZNK6hermes14StoreFrameInst11getVariableEv:
  586|   114k|  Variable *getVariable() const {
  587|   114k|    return cast<Variable>(getOperand(VariableIdx));
  588|   114k|  }
_ZNK6hermes14StoreFrameInst14getEnvironmentEv:
  589|   114k|  ScopeCreationInst *getEnvironment() const {
  590|   114k|    return cast<ScopeCreationInst>(getOperand(EnvIdx));
  591|   114k|  }
_ZN6hermes14StoreFrameInstC2EPNS_5ValueEPNS_8VariableEPNS_17ScopeCreationInstE:
  597|   114k|      : Instruction(ValueKind::StoreFrameInstKind) {
  598|   114k|    pushOperand(storedValue);
  599|   114k|    pushOperand(ptr);
  600|   114k|    pushOperand(environment);
  601|   114k|  }
_ZN6hermes14StoreFrameInst7classofEPKNS_5ValueE:
  615|   229k|  static bool classof(const Value *V) {
  616|   229k|    return kindIsA(V->getKind(), ValueKind::StoreFrameInstKind);
  617|   229k|  }
_ZN6hermes15CreateScopeInstC2EPNS_9ScopeDescE:
  626|   114k|      : ScopeCreationInst(ValueKind::CreateScopeInstKind, scopeDesc) {}
_ZN6hermes15CreateScopeInst7classofEPKNS_5ValueE:
  641|  1.44M|  static bool classof(const Value *V) {
  642|  1.44M|    return kindIsA(V->getKind(), ValueKind::CreateScopeInstKind);
  643|  1.44M|  }
_ZN6hermes18CreateFunctionInstC2ENS_9ValueKindEPNS_8FunctionEPNS_5ValueE:
  655|   229k|      : Instruction(kind) {
  656|   229k|    setType(Type::createClosure());
  657|   229k|    pushOperand(code);
  658|       |    // N.B.: All non-HBC CreateFunctionInst have a ScopeCreationInst as the
  659|       |    // environment, but that is not necessarily true about the HBC variants; the
  660|       |    // environment could be an HBCSpillMov.
  661|   229k|    pushOperand(environment);
  662|   229k|  }
_ZN6hermes18CreateFunctionInstC2EPNS_8FunctionEPNS_17ScopeCreationInstE:
  671|   114k|            environment) {}
_ZNK6hermes18CreateFunctionInst15getFunctionCodeEv:
  677|   459k|  Function *getFunctionCode() const {
  678|   459k|    return cast<Function>(getOperand(FunctionCodeIdx));
  679|   459k|  }
_ZNK6hermes18CreateFunctionInst14getEnvironmentEv:
  681|   229k|  Value *getEnvironment() const {
  682|   229k|    return getOperand(EnvIdx);
  683|   229k|  }
_ZN6hermes18CreateFunctionInst7classofEPKNS_5ValueE:
  693|   229k|  static bool classof(const Value *V) {
  694|   229k|    return kindIsA(V->getKind(), ValueKind::CreateFunctionInstKind);
  695|   229k|  }
_ZNK6hermes8CallInst18getTextifiedCalleeEv:
  724|    574|  LiteralString *getTextifiedCallee() const {
  725|    574|    return textifiedCallee;
  726|    574|  }
_ZNK6hermes8CallInst9getCalleeEv:
  727|    865|  Value *getCallee() const {
  728|    865|    return getOperand(CalleeIdx);
  729|    865|  }
_ZN6hermes8CallInst11getArgumentEj:
  735|   271k|  Value *getArgument(unsigned idx) {
  736|   271k|    return getOperand(ThisIdx + idx);
  737|   271k|  }
_ZN6hermes8CallInst11setArgumentEPNS_5ValueEj:
  739|   135k|  void setArgument(Value *V, unsigned idx) {
  740|   135k|    setOperand(V, ThisIdx + idx);
  741|   135k|  }
_ZNK6hermes8CallInst15getNumArgumentsEv:
  743|  2.87k|  unsigned getNumArguments() const {
  744|  2.87k|    return getNumOperands() - ThisIdx;
  745|  2.87k|  }
_ZN6hermes8CallInstC2ENS_9ValueKindEPNS_13LiteralStringEPNS_5ValueES5_N4llvh8ArrayRefIS5_EE:
  753|    574|      : Instruction(kind), textifiedCallee(textifiedCallee) {
  754|    574|    pushOperand(callee);
  755|    574|    pushOperand(thisValue);
  756|   135k|    for (const auto &arg : args) {
  ------------------
  |  Branch (756:26): [True: 135k, False: 574]
  ------------------
  757|   135k|      pushOperand(arg);
  758|   135k|    }
  759|    574|  }
_ZN6hermes8CallInst7classofEPKNS_5ValueE:
  771|  4.51M|  static bool classof(const Value *V) {
  772|  4.51M|    return kindIsA(V->getKind(), ValueKind::CallInstKind);
  773|  4.51M|  }
_ZN6hermes13ConstructInst7classofEPKNS_5ValueE:
  809|  1.22M|  static bool classof(const Value *V) {
  810|  1.22M|    return kindIsA(V->getKind(), ValueKind::ConstructInstKind);
  811|  1.22M|  }
_ZN6hermes15CallBuiltinInstC2EPNS_13LiteralNumberEPNS_16LiteralUndefinedEN4llvh8ArrayRefIPNS_5ValueEEE:
  837|    283|            args) {
  838|    283|    assert(
  839|    283|        callee->getValue() == (int)callee->getValue() &&
  840|    283|        callee->getValue() < (double)BuiltinMethod::_count &&
  841|    283|        "invalid builtin call");
  842|    283|  }
_ZNK6hermes15CallBuiltinInst15getBuiltinIndexEv:
  848|    283|  BuiltinMethod::Enum getBuiltinIndex() const {
  849|    283|    return (BuiltinMethod::Enum)cast<LiteralNumber>(getCallee())->asInt32();
  850|    283|  }
_ZN6hermes15CallBuiltinInst7classofEPKNS_5ValueE:
  852|  1.64M|  static bool classof(const Value *V) {
  853|  1.64M|    return kindIsA(V->getKind(), ValueKind::CallBuiltinInstKind);
  854|  1.64M|  }
_ZN6hermes21GetBuiltinClosureInst7classofEPKNS_5ValueE:
  891|  1.64M|  static bool classof(const Value *V) {
  892|  1.64M|    return kindIsA(V->getKind(), ValueKind::GetBuiltinClosureInstKind);
  893|  1.64M|  }
_ZN6hermes12HBCCallNInst7classofEPKNS_5ValueE:
  985|   136k|  static bool classof(const Value *V) {
  986|   136k|    return V->getKind() == ValueKind::HBCCallNInstKind;
  987|   136k|  }
_ZN6hermes22HBCGetGlobalObjectInstC2Ev:
  996|  62.5k|      : Instruction(ValueKind::HBCGetGlobalObjectInstKind) {
  997|  62.5k|    setType(Type::createObject());
  998|  62.5k|  }
_ZN6hermes22HBCGetGlobalObjectInst7classofEPKNS_5ValueE:
 1012|   125k|  static bool classof(const Value *V) {
 1013|   125k|    return kindIsA(V->getKind(), ValueKind::HBCGetGlobalObjectInstKind);
 1014|   125k|  }
_ZN6hermes17StorePropertyInstC2ENS_9ValueKindEPNS_5ValueES3_S3_:
 1027|  3.78k|      : Instruction(kind) {
 1028|  3.78k|    setType(Type::createNoType());
 1029|  3.78k|    pushOperand(storedValue);
 1030|  3.78k|    pushOperand(object);
 1031|  3.78k|    pushOperand(property);
 1032|  3.78k|  }
_ZNK6hermes17StorePropertyInst14getStoredValueEv:
 1037|  3.78k|  Value *getStoredValue() const {
 1038|  3.78k|    return getOperand(StoredValueIdx);
 1039|  3.78k|  }
_ZNK6hermes17StorePropertyInst9getObjectEv:
 1040|  3.78k|  Value *getObject() const {
 1041|  3.78k|    return getOperand(ObjectIdx);
 1042|  3.78k|  };
_ZNK6hermes17StorePropertyInst11getPropertyEv:
 1043|  3.78k|  Value *getProperty() const {
 1044|  3.78k|    return getOperand(PropertyIdx);
 1045|  3.78k|  }
_ZN6hermes17StorePropertyInstC2EPNS_5ValueES2_S2_:
 1052|  3.78k|            property) {}
_ZN6hermes17StorePropertyInst7classofEPKNS_5ValueE:
 1066|  2.89M|  static bool classof(const Value *V) {
 1067|  2.89M|    return kindIsA(V->getKind(), ValueKind::StorePropertyInstKind);
 1068|  2.89M|  }
_ZN6hermes20StoreOwnPropertyInstC2ENS_9ValueKindEPNS_5ValueES3_S3_PNS_11LiteralBoolE:
 1123|   234k|      : Instruction(kind) {
 1124|   234k|    setType(Type::createNoType());
 1125|   234k|    pushOperand(storedValue);
 1126|   234k|    pushOperand(object);
 1127|   234k|    pushOperand(property);
 1128|   234k|    pushOperand(isEnumerable);
 1129|   234k|  }
_ZNK6hermes20StoreOwnPropertyInst14getStoredValueEv:
 1134|   234k|  Value *getStoredValue() const {
 1135|   234k|    return getOperand(StoredValueIdx);
 1136|   234k|  }
_ZNK6hermes20StoreOwnPropertyInst9getObjectEv:
 1137|   234k|  Value *getObject() const {
 1138|   234k|    return getOperand(ObjectIdx);
 1139|   234k|  }
_ZNK6hermes20StoreOwnPropertyInst11getPropertyEv:
 1140|   234k|  Value *getProperty() const {
 1141|   234k|    return getOperand(PropertyIdx);
 1142|   234k|  }
_ZNK6hermes20StoreOwnPropertyInst15getIsEnumerableEv:
 1143|   465k|  bool getIsEnumerable() const {
 1144|   465k|    return cast<LiteralBool>(getOperand(IsEnumerableIdx))->getValue();
 1145|   465k|  }
_ZN6hermes20StoreOwnPropertyInstC2EPNS_5ValueES2_S2_PNS_11LiteralBoolE:
 1157|   230k|            isEnumerable) {}
_ZN6hermes20StoreOwnPropertyInst7classofEPKNS_5ValueE:
 1172|  5.22M|  static bool classof(const Value *V) {
 1173|  5.22M|    return kindIsA(V->getKind(), ValueKind::StoreOwnPropertyInstKind);
 1174|  5.22M|  }
_ZN6hermes23StoreNewOwnPropertyInstC2EPNS_5ValueES2_PNS_7LiteralEPNS_11LiteralBoolE:
 1192|  4.16k|            isEnumerable) {
 1193|  4.16k|    assert(
 1194|  4.16k|        (llvh::isa<LiteralString>(property) ||
 1195|  4.16k|         llvh::isa<LiteralNumber>(property)) &&
 1196|  4.16k|        "Invalid property literal.");
 1197|      0|    assert(
 1198|  4.16k|        object->getType().isObjectType() &&
 1199|  4.16k|        "object operand must be known to be an object");
 1200|  4.16k|  }
_ZN6hermes23StoreNewOwnPropertyInst7classofEPKNS_5ValueE:
 1207|   243k|  static bool classof(const Value *V) {
 1208|   243k|    return kindIsA(V->getKind(), ValueKind::StoreNewOwnPropertyInstKind);
 1209|   243k|  }
_ZN6hermes21StoreGetterSetterInst7classofEPKNS_5ValueE:
 1268|  2.54M|  static bool classof(const Value *V) {
 1269|  2.54M|    return kindIsA(V->getKind(), ValueKind::StoreGetterSetterInstKind);
 1270|  2.54M|  }
_ZN6hermes18DeletePropertyInst7classofEPKNS_5ValueE:
 1305|  2.54M|  static bool classof(const Value *V) {
 1306|  2.54M|    return kindIsA(V->getKind(), ValueKind::DeletePropertyInstKind);
 1307|  2.54M|  }
_ZN6hermes16LoadPropertyInstC2ENS_9ValueKindEPNS_5ValueES3_:
 1316|   131k|      : Instruction(kind) {
 1317|   131k|    pushOperand(object);
 1318|   131k|    pushOperand(property);
 1319|   131k|  }
_ZNK6hermes16LoadPropertyInst9getObjectEv:
 1324|   132k|  Value *getObject() const {
 1325|   132k|    return getOperand(ObjectIdx);
 1326|   132k|  };
_ZNK6hermes16LoadPropertyInst11getPropertyEv:
 1327|   132k|  Value *getProperty() const {
 1328|   132k|    return getOperand(PropertyIdx);
 1329|   132k|  }
_ZN6hermes16LoadPropertyInstC2EPNS_5ValueES2_:
 1332|     22|      : LoadPropertyInst(ValueKind::LoadPropertyInstKind, object, property) {}
_ZN6hermes16LoadPropertyInst7classofEPKNS_5ValueE:
 1346|  3.02M|  static bool classof(const Value *V) {
 1347|  3.02M|    return kindIsA(V->getKind(), ValueKind::LoadPropertyInstKind);
 1348|  3.02M|  }
_ZNK6hermes25TryLoadGlobalPropertyInst11getPropertyEv:
 1356|   131k|  LiteralString *getProperty() const {
 1357|   131k|    return cast<LiteralString>(LoadPropertyInst::getProperty());
 1358|   131k|  }
_ZN6hermes25TryLoadGlobalPropertyInstC2EPNS_5ValueEPNS_13LiteralStringE:
 1366|   131k|            property) {
 1367|   131k|    assert(
 1368|   131k|        (llvh::isa<GlobalObject>(globalObject) ||
 1369|   131k|         llvh::isa<HBCGetGlobalObjectInst>(globalObject)) &&
 1370|   131k|        "globalObject must refer to the global object");
 1371|   131k|  }
_ZN6hermes25TryLoadGlobalPropertyInst7classofEPKNS_5ValueE:
 1385|   263k|  static bool classof(const Value *V) {
 1386|   263k|    return kindIsA(V->getKind(), ValueKind::TryLoadGlobalPropertyInstKind);
 1387|   263k|  }
_ZNK6hermes15AllocObjectInst15getParentObjectEv:
 1401|  4.16k|  Value *getParentObject() const {
 1402|  4.16k|    return getOperand(ParentObjectIdx);
 1403|  4.16k|  }
_ZN6hermes15AllocObjectInstC2EPNS_13LiteralNumberEPNS_5ValueE:
 1406|  4.16k|      : Instruction(ValueKind::AllocObjectInstKind) {
 1407|  4.16k|    setType(Type::createObject());
 1408|  4.16k|    assert(size->isUInt32Representible() && "size must be uint32");
 1409|      0|    pushOperand(size);
 1410|  4.16k|    pushOperand(parentObject);
 1411|  4.16k|  }
_ZN6hermes15AllocObjectInst7classofEPKNS_5ValueE:
 1425|  2.76M|  static bool classof(const Value *V) {
 1426|  2.76M|    return kindIsA(V->getKind(), ValueKind::AllocObjectInstKind);
 1427|  2.76M|  }
_ZN6hermes28HBCAllocObjectFromBufferInstC2EPNS_13LiteralNumberERKN4llvh11SmallVectorINSt3__14pairIPNS_7LiteralES8_EELj4EEE:
 1446|    880|      : Instruction(ValueKind::HBCAllocObjectFromBufferInstKind) {
 1447|    880|    setType(Type::createObject());
 1448|    880|    assert(sizeHint->isUInt32Representible() && "size hint must be uint32");
 1449|      0|    pushOperand(sizeHint);
 1450|  2.69k|    for (size_t i = 0; i < prop_map.size(); i++) {
  ------------------
  |  Branch (1450:24): [True: 1.81k, False: 880]
  ------------------
 1451|  1.81k|      pushOperand(prop_map[i].first);
 1452|  1.81k|      pushOperand(prop_map[i].second);
 1453|  1.81k|    }
 1454|    880|  }
_ZNK6hermes28HBCAllocObjectFromBufferInst20getKeyValuePairCountEv:
 1469|  1.76k|  unsigned getKeyValuePairCount() const {
 1470|  1.76k|    return (getNumOperands() - FirstKeyIdx) / 2;
 1471|  1.76k|  }
_ZNK6hermes28HBCAllocObjectFromBufferInst15getKeyValuePairEj:
 1474|  1.81k|  std::pair<Literal *, Literal *> getKeyValuePair(unsigned index) const {
 1475|  1.81k|    return std::pair<Literal *, Literal *>{
 1476|  1.81k|        cast<Literal>(getOperand(FirstKeyIdx + 2 * index)),
 1477|  1.81k|        cast<Literal>(getOperand(FirstKeyIdx + 1 + 2 * index))};
 1478|  1.81k|  }
_ZNK6hermes28HBCAllocObjectFromBufferInst11getSizeHintEv:
 1480|    880|  LiteralNumber *getSizeHint() const {
 1481|    880|    return cast<LiteralNumber>(getOperand(SizeIdx));
 1482|    880|  }
_ZN6hermes28HBCAllocObjectFromBufferInst7classofEPKNS_5ValueE:
 1484|  4.76M|  static bool classof(const Value *V) {
 1485|  4.76M|    return kindIsA(V->getKind(), ValueKind::HBCAllocObjectFromBufferInstKind);
 1486|  4.76M|  }
_ZN6hermes22AllocObjectLiteralInstC2ERKN4llvh11SmallVectorINSt3__14pairIPNS_13LiteralStringEPNS_5ValueEEELj4EEE:
 1498|  5.04k|      : Instruction(ValueKind::AllocObjectLiteralInstKind) {
 1499|  5.04k|    setType(Type::createObject());
 1500|  11.0k|    for (size_t i = 0; i < propMap.size(); i++) {
  ------------------
  |  Branch (1500:24): [True: 5.97k, False: 5.04k]
  ------------------
 1501|  5.97k|      pushOperand(propMap[i].first);
 1502|  5.97k|      pushOperand(propMap[i].second);
 1503|  5.97k|    }
 1504|  5.04k|  }
_ZNK6hermes22AllocObjectLiteralInst20getKeyValuePairCountEv:
 1519|  36.2k|  unsigned getKeyValuePairCount() const {
 1520|  36.2k|    return getNumOperands() / 2;
 1521|  36.2k|  }
_ZN6hermes22AllocObjectLiteralInst7classofEPKNS_5ValueE:
 1523|  2.10M|  static bool classof(const Value *V) {
 1524|  2.10M|    return kindIsA(V->getKind(), ValueKind::AllocObjectLiteralInstKind);
 1525|  2.10M|  }
_ZNK6hermes22AllocObjectLiteralInst6getKeyEj:
 1527|  11.9k|  Literal *getKey(unsigned index) const {
 1528|  11.9k|    return cast<Literal>(getOperand(2 * index));
 1529|  11.9k|  }
_ZNK6hermes22AllocObjectLiteralInst8getValueEj:
 1531|  11.9k|  Value *getValue(unsigned index) const {
 1532|  11.9k|    return getOperand(2 * index + 1);
 1533|  11.9k|  }
_ZN6hermes14AllocArrayInstC2ERN4llvh11SmallVectorIPNS_5ValueELj4EEEPNS_13LiteralNumberE:
 1546|  33.4k|      : Instruction(ValueKind::AllocArrayInstKind) {
 1547|       |    // TODO: refine this type annotation to "array" ?.
 1548|  33.4k|    setType(Type::createObject());
 1549|  33.4k|    pushOperand(sizeHint);
 1550|   494k|    for (auto val : val_list) {
  ------------------
  |  Branch (1550:19): [True: 494k, False: 33.4k]
  ------------------
 1551|   494k|      pushOperand(val);
 1552|   494k|    }
 1553|  33.4k|  }
_ZNK6hermes14AllocArrayInst11getSizeHintEv:
 1560|  33.4k|  LiteralNumber *getSizeHint() const {
 1561|  33.4k|    return cast<LiteralNumber>(getOperand(SizeHintIdx));
 1562|  33.4k|  }
_ZNK6hermes14AllocArrayInst15getElementCountEv:
 1565|   160k|  unsigned getElementCount() const {
 1566|   160k|    return getNumOperands() - 1;
 1567|   160k|  }
_ZNK6hermes14AllocArrayInst15getArrayElementEj:
 1571|   474k|  Value *getArrayElement(unsigned index) const {
 1572|   474k|    return getOperand(ElementStartIdx + index);
 1573|   474k|  }
_ZN6hermes14AllocArrayInst7classofEPKNS_5ValueE:
 1598|  6.16M|  static bool classof(const Value *V) {
 1599|  6.16M|    return kindIsA(V->getKind(), ValueKind::AllocArrayInstKind);
 1600|  6.16M|  }
_ZN6hermes19CreateArgumentsInstC2Ev:
 1609|   114k|      : Instruction(ValueKind::CreateArgumentsInstKind) {
 1610|   114k|    setType(Type::createObject());
 1611|   114k|  }
_ZN6hermes19CreateArgumentsInst7classofEPKNS_5ValueE:
 1625|  1.06M|  static bool classof(const Value *V) {
 1626|  1.06M|    return kindIsA(V->getKind(), ValueKind::CreateArgumentsInstKind);
 1627|  1.06M|  }
_ZNK6hermes16CreateRegExpInst10getPatternEv:
 1637|  22.8k|  LiteralString *getPattern() const {
 1638|  22.8k|    return cast<LiteralString>(getOperand(PatternIdx));
 1639|  22.8k|  }
_ZNK6hermes16CreateRegExpInst8getFlagsEv:
 1640|  22.8k|  LiteralString *getFlags() const {
 1641|  22.8k|    return cast<LiteralString>(getOperand(FlagsIdx));
 1642|  22.8k|  }
_ZN6hermes16CreateRegExpInstC2EPNS_13LiteralStringES2_:
 1645|  11.4k|      : Instruction(ValueKind::CreateRegExpInstKind) {
 1646|  11.4k|    setType(Type::createRegExp());
 1647|  11.4k|    pushOperand(pattern);
 1648|  11.4k|    pushOperand(flags);
 1649|  11.4k|  }
_ZN6hermes16CreateRegExpInst7classofEPKNS_5ValueE:
 1663|  1.69M|  static bool classof(const Value *V) {
 1664|  1.69M|    return kindIsA(V->getKind(), ValueKind::CreateRegExpInstKind);
 1665|  1.69M|  }
_ZNK6hermes17UnaryOperatorInst15getOperatorKindEv:
 1697|  4.00k|  OpKind getOperatorKind() const {
 1698|  4.00k|    return op_;
 1699|  4.00k|  }
_ZN6hermes17UnaryOperatorInstC2EPNS_5ValueENS0_6OpKindE:
 1712|  4.00k|        op_(opKind) {}
_ZN6hermes17UnaryOperatorInst22getChangedOperandsImplEv:
 1720|     23|  WordBitSet<> getChangedOperandsImpl() {
 1721|     23|    return {};
 1722|     23|  }
_ZN6hermes17UnaryOperatorInst7classofEPKNS_5ValueE:
 1724|  8.02k|  static bool classof(const Value *V) {
 1725|  8.02k|    return kindIsA(V->getKind(), ValueKind::UnaryOperatorInstKind);
 1726|  8.02k|  }
_ZNK6hermes18BinaryOperatorInst15getOperatorKindEv:
 1781|   130k|  OpKind getOperatorKind() const {
 1782|   130k|    return op_;
 1783|   130k|  }
_ZNK6hermes18BinaryOperatorInst15getLeftHandSideEv:
 1785|   130k|  Value *getLeftHandSide() const {
 1786|   130k|    return getOperand(LeftHandSideIdx);
 1787|   130k|  }
_ZNK6hermes18BinaryOperatorInst16getRightHandSideEv:
 1788|  65.0k|  Value *getRightHandSide() const {
 1789|  65.0k|    return getOperand(RightHandSideIdx);
 1790|  65.0k|  }
_ZN6hermes18BinaryOperatorInstC2EPNS_5ValueES2_NS0_6OpKindE:
 1810|  65.0k|      : Instruction(ValueKind::BinaryOperatorInstKind), op_(opKind) {
 1811|  65.0k|    pushOperand(left);
 1812|  65.0k|    pushOperand(right);
 1813|  65.0k|  }
_ZN6hermes18BinaryOperatorInst22getChangedOperandsImplEv:
 1826|      5|  WordBitSet<> getChangedOperandsImpl() {
 1827|      5|    return {};
 1828|      5|  }
_ZN6hermes18BinaryOperatorInst7classofEPKNS_5ValueE:
 1830|  1.41M|  static bool classof(const Value *V) {
 1831|  1.41M|    return kindIsA(V->getKind(), ValueKind::BinaryOperatorInstKind);
 1832|  1.41M|  }
_ZN6hermes9CatchInstC2Ev:
 1845|     12|  explicit CatchInst() : Instruction(ValueKind::CatchInstKind) {}
_ZN6hermes9CatchInst7classofEPKNS_5ValueE:
 1857|     86|  static bool classof(const Value *V) {
 1858|     86|    return kindIsA(V->getKind(), ValueKind::CatchInstKind);
 1859|     86|  }
_ZN6hermes9ThrowInstC2EPNS_5ValueE:
 1870|      6|      : TerminatorInst(ValueKind::ThrowInstKind) {
 1871|      6|    pushOperand(thrownValue);
 1872|      6|  }
_ZNK6hermes9ThrowInst14getThrownValueEv:
 1884|      6|  Value *getThrownValue() const {
 1885|      6|    return getOperand(ThrownValueIdx);
 1886|      6|  }
_ZN6hermes9ThrowInst7classofEPKNS_5ValueE:
 1888|  2.08k|  static bool classof(const Value *V) {
 1889|  2.08k|    return kindIsA(V->getKind(), ValueKind::ThrowInstKind);
 1890|  2.08k|  }
_ZNK6hermes9ThrowInst16getNumSuccessorsEv:
 1892|     30|  unsigned getNumSuccessors() const {
 1893|     30|    return 0;
 1894|     30|  }
_ZN6hermes10SwitchInst7classofEPKNS_5ValueE:
 1942|  5.22M|  static bool classof(const Value *V) {
 1943|  5.22M|    return kindIsA(V->getKind(), ValueKind::SwitchInstKind);
 1944|  5.22M|  }
_ZN6hermes13GetPNamesInst7classofEPKNS_5ValueE:
 2004|    240|  static bool classof(const Value *V) {
 2005|    240|    return kindIsA(V->getKind(), ValueKind::GetPNamesInstKind);
 2006|    240|  }
_ZN6hermes16GetNextPNameInst7classofEPKNS_5ValueE:
 2069|    240|  static bool classof(const Value *V) {
 2070|    240|    return kindIsA(V->getKind(), ValueKind::GetNextPNameInstKind);
 2071|    240|  }
_ZN6hermes20CheckHasInstanceInst7classofEPKNS_5ValueE:
 2147|    240|  static bool classof(const Value *V) {
 2148|    240|    return kindIsA(V->getKind(), ValueKind::CheckHasInstanceInstKind);
 2149|    240|  }
_ZN6hermes12TryStartInstC2EPNS_10BasicBlockES2_:
 2196|     12|      : TerminatorInst(ValueKind::TryStartInstKind) {
 2197|     12|    pushOperand(catchTargetBlock);
 2198|     12|    pushOperand(tryBodyBlock);
 2199|     12|  }
_ZNK6hermes12TryStartInst10getTryBodyEv:
 2205|     24|  BasicBlock *getTryBody() const {
 2206|     24|    return cast<BasicBlock>(getOperand(TryBodyBlockIdx));
 2207|     24|  }
_ZNK6hermes12TryStartInst14getCatchTargetEv:
 2208|     24|  BasicBlock *getCatchTarget() const {
 2209|     24|    return cast<BasicBlock>(getOperand(CatchTargetBlockIdx));
 2210|     24|  }
_ZN6hermes12TryStartInst7classofEPKNS_5ValueE:
 2220|  39.8k|  static bool classof(const Value *V) {
 2221|  39.8k|    return kindIsA(V->getKind(), ValueKind::TryStartInstKind);
 2222|  39.8k|  }
_ZNK6hermes12TryStartInst16getNumSuccessorsEv:
 2224|    144|  unsigned getNumSuccessors() const {
 2225|    144|    return 2;
 2226|    144|  }
_ZNK6hermes12TryStartInst12getSuccessorEj:
 2227|     96|  BasicBlock *getSuccessor(unsigned idx) const {
 2228|     96|    return cast<BasicBlock>(getOperand(idx));
 2229|     96|  }
_ZN6hermes10TryEndInstC2Ev:
 2240|     12|  explicit TryEndInst() : Instruction(ValueKind::TryEndInstKind) {}
_ZN6hermes10TryEndInst7classofEPKNS_5ValueE:
 2252|  39.3k|  static bool classof(const Value *V) {
 2253|  39.3k|    return kindIsA(V->getKind(), ValueKind::TryEndInstKind);
 2254|  39.3k|  }
_ZN6hermes7PhiInst7classofEPKNS_5ValueE:
 2300|  3.93M|  static bool classof(const Value *V) {
 2301|  3.93M|    return kindIsA(V->getKind(), ValueKind::PhiInstKind);
 2302|  3.93M|  }
_ZN6hermes7MovInstC2EPNS_5ValueE:
 2311|   264k|      : SingleOperandInst(ValueKind::MovInstKind, input) {
 2312|   264k|    setType(input->getType());
 2313|   264k|  }
_ZN6hermes7MovInst7classofEPKNS_5ValueE:
 2325|  1.62M|  static bool classof(const Value *V) {
 2326|  1.62M|    return kindIsA(V->getKind(), ValueKind::MovInstKind);
 2327|  1.62M|  }
_ZN6hermes15ImplicitMovInstC2EPNS_5ValueE:
 2337|    283|      : SingleOperandInst(ValueKind::ImplicitMovInstKind, input) {
 2338|    283|    setType(input->getType());
 2339|    283|  }
_ZN6hermes15ImplicitMovInst7classofEPKNS_5ValueE:
 2354|    566|  static bool classof(const Value *V) {
 2355|    566|    return kindIsA(V->getKind(), ValueKind::ImplicitMovInstKind);
 2356|    566|  }
_ZN6hermes16GetNewTargetInstC2Ev:
 2417|      5|  explicit GetNewTargetInst() : Instruction(ValueKind::GetNewTargetInstKind) {}
_ZN6hermes16GetNewTargetInst7classofEPKNS_5ValueE:
 2431|     10|  static bool classof(const Value *V) {
 2432|     10|    return kindIsA(V->getKind(), ValueKind::GetNewTargetInstKind);
 2433|     10|  }
_ZN6hermes21HBCResolveEnvironment7classofEPKNS_5ValueE:
 2501|  1.53M|  static bool classof(const Value *V) {
 2502|  1.53M|    return kindIsA(V->getKind(), ValueKind::HBCResolveEnvironmentKind);
 2503|  1.53M|  }
_ZN6hermes25HBCStoreToEnvironmentInstC2EPNS_5ValueES2_PNS_8VariableE:
 2514|   114k|      : Instruction(ValueKind::HBCStoreToEnvironmentInstKind) {
 2515|   114k|    pushOperand(env);
 2516|   114k|    pushOperand(toPut);
 2517|   114k|    pushOperand(var);
 2518|   114k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst15getResolvedNameEv:
 2524|   114k|  Variable *getResolvedName() const {
 2525|   114k|    return cast<Variable>(getOperand(NameIdx));
 2526|   114k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst14getEnvironmentEv:
 2527|   114k|  Value *getEnvironment() const {
 2528|   114k|    return getOperand(EnvIdx);
 2529|   114k|  }
_ZNK6hermes25HBCStoreToEnvironmentInst14getStoredValueEv:
 2530|   229k|  Value *getStoredValue() const {
 2531|   229k|    return getOperand(ValueIdx);
 2532|   229k|  }
_ZN6hermes25HBCStoreToEnvironmentInst7classofEPKNS_5ValueE:
 2542|   229k|  static bool classof(const Value *V) {
 2543|   229k|    return kindIsA(V->getKind(), ValueKind::HBCStoreToEnvironmentInstKind);
 2544|   229k|  }
_ZN6hermes26HBCLoadFromEnvironmentInstC2EPNS_5ValueEPNS_8VariableE:
 2555|  10.8k|      : Instruction(ValueKind::HBCLoadFromEnvironmentInstKind) {
 2556|  10.8k|    pushOperand(env);
 2557|  10.8k|    pushOperand(var);
 2558|  10.8k|  }
_ZNK6hermes26HBCLoadFromEnvironmentInst15getResolvedNameEv:
 2564|  10.8k|  Variable *getResolvedName() const {
 2565|  10.8k|    return cast<Variable>(getOperand(NameIdx));
 2566|  10.8k|  }
_ZNK6hermes26HBCLoadFromEnvironmentInst14getEnvironmentEv:
 2567|  10.8k|  Value *getEnvironment() const {
 2568|  10.8k|    return getOperand(EnvIdx);
 2569|  10.8k|  }
_ZN6hermes26HBCLoadFromEnvironmentInst7classofEPKNS_5ValueE:
 2579|  21.7k|  static bool classof(const Value *V) {
 2580|  21.7k|    return kindIsA(V->getKind(), ValueKind::HBCLoadFromEnvironmentInstKind);
 2581|  21.7k|  }
_ZN6hermes13SwitchImmInst7classofEPKNS_5ValueE:
 2655|  1.64M|  static bool classof(const Value *V) {
 2656|  1.64M|    return kindIsA(V->getKind(), ValueKind::SwitchImmInstKind);
 2657|  1.64M|  }
_ZN6hermes24HBCCreateEnvironmentInstC2EPNS_9ScopeDescE:
 2744|   114k|      : ScopeCreationInst(ValueKind::HBCCreateEnvironmentInstKind, scopeDesc) {}
_ZN6hermes24HBCCreateEnvironmentInst7classofEPKNS_5ValueE:
 2758|  1.15M|  static bool classof(const Value *V) {
 2759|  1.15M|    return kindIsA(V->getKind(), ValueKind::HBCCreateEnvironmentInstKind);
 2760|  1.15M|  }
_ZN6hermes16HBCLoadConstInstC2EPNS_7LiteralE:
 2802|   114k|      : SingleOperandInst(ValueKind::HBCLoadConstInstKind, input) {
 2803|   114k|    setType(input->getType());
 2804|   114k|  }
_ZNK6hermes16HBCLoadConstInst8getConstEv:
 2810|   114k|  Literal *getConst() const {
 2811|   114k|    return cast<Literal>(getSingleOperand());
 2812|   114k|  }
_ZN6hermes16HBCLoadConstInst7classofEPKNS_5ValueE:
 2822|  3.49M|  static bool classof(const Value *V) {
 2823|  3.49M|    return kindIsA(V->getKind(), ValueKind::HBCLoadConstInstKind);
 2824|  3.49M|  }
_ZN6hermes16HBCLoadParamInstC2EPNS_13LiteralNumberE:
 2835|   114k|      : SingleOperandInst(ValueKind::HBCLoadParamInstKind, input) {}
_ZNK6hermes16HBCLoadParamInst8getIndexEv:
 2841|   114k|  LiteralNumber *getIndex() const {
 2842|   114k|    return cast<LiteralNumber>(getSingleOperand());
 2843|   114k|  }
_ZN6hermes16HBCLoadParamInst7classofEPKNS_5ValueE:
 2853|  3.49M|  static bool classof(const Value *V) {
 2854|  3.49M|    return kindIsA(V->getKind(), ValueKind::HBCLoadParamInstKind);
 2855|  3.49M|  }
_ZN6hermes16HBCGetThisNSInstC2Ev:
 2866|      5|  explicit HBCGetThisNSInst() : Instruction(ValueKind::HBCGetThisNSInstKind) {}
_ZN6hermes16HBCGetThisNSInst7classofEPKNS_5ValueE:
 2880|     10|  static bool classof(const Value *V) {
 2881|     10|    return kindIsA(V->getKind(), ValueKind::HBCGetThisNSInstKind);
 2882|     10|  }
_ZN6hermes21HBCReifyArgumentsInstC2EPNS_14AllocStackInstE:
 2961|      2|      : SingleOperandInst(ValueKind::HBCReifyArgumentsInstKind, reg) {
 2962|      2|    setType(Type::createNoType());
 2963|      2|  }
_ZNK6hermes21HBCReifyArgumentsInst15getLazyRegisterEv:
 2969|      2|  Value *getLazyRegister() const {
 2970|      2|    return getSingleOperand();
 2971|      2|  }
_ZN6hermes21HBCReifyArgumentsInst7classofEPKNS_5ValueE:
 2981|  1.24M|  static bool classof(const Value *V) {
 2982|  1.24M|    return kindIsA(V->getKind(), ValueKind::HBCReifyArgumentsInstKind);
 2983|  1.24M|  }
_ZN6hermes21HBCCreateFunctionInstC2EPNS_8FunctionEPNS_5ValueE:
 3145|   114k|            environment) {}
_ZN6hermes21HBCCreateFunctionInst7classofEPKNS_5ValueE:
 3151|   229k|  static bool classof(const Value *V) {
 3152|   229k|    return kindIsA(V->getKind(), ValueKind::HBCCreateFunctionInstKind);
 3153|   229k|  }
_ZN6hermes15HBCSpillMovInstC2EPNS_11InstructionE:
 3164|  2.87k|      : SingleOperandInst(ValueKind::HBCSpillMovInstKind, value) {}
_ZNK6hermes15HBCSpillMovInst8getValueEv:
 3170|  2.87k|  Instruction *getValue() const {
 3171|  2.87k|    return cast<Instruction>(getSingleOperand());
 3172|  2.87k|  }
_ZN6hermes15HBCSpillMovInst7classofEPKNS_5ValueE:
 3182|  5.75k|  static bool classof(const Value *V) {
 3183|  5.75k|    return kindIsA(V->getKind(), ValueKind::HBCSpillMovInstKind);
 3184|  5.75k|  }
_ZN6hermes17IteratorBeginInstC2EPNS_14AllocStackInstE:
 3381|     12|      : Instruction(ValueKind::IteratorBeginInstKind) {
 3382|     12|    pushOperand(sourceOrNext);
 3383|     12|  }
_ZNK6hermes17IteratorBeginInst15getSourceOrNextEv:
 3397|     12|  Value *getSourceOrNext() const {
 3398|     12|    return getOperand(SourceOrNextIdx);
 3399|     12|  }
_ZN6hermes17IteratorBeginInst7classofEPKNS_5ValueE:
 3401|     24|  static bool classof(const Value *V) {
 3402|     24|    return kindIsA(V->getKind(), ValueKind::IteratorBeginInstKind);
 3403|     24|  }
_ZN6hermes16IteratorNextInstC2EPNS_14AllocStackInstES2_:
 3416|      6|      : Instruction(ValueKind::IteratorNextInstKind) {
 3417|      6|    pushOperand(iterator);
 3418|      6|    pushOperand(sourceOrNext);
 3419|      6|  }
_ZNK6hermes16IteratorNextInst11getIteratorEv:
 3433|      6|  Value *getIterator() const {
 3434|      6|    return getOperand(IteratorIdx);
 3435|      6|  }
_ZNK6hermes16IteratorNextInst15getSourceOrNextEv:
 3436|      6|  Value *getSourceOrNext() const {
 3437|      6|    return getOperand(SourceOrNextIdx);
 3438|      6|  }
_ZN6hermes16IteratorNextInst7classofEPKNS_5ValueE:
 3440|     12|  static bool classof(const Value *V) {
 3441|     12|    return kindIsA(V->getKind(), ValueKind::IteratorNextInstKind);
 3442|     12|  }
_ZN6hermes17IteratorCloseInstC2EPNS_14AllocStackInstEPNS_11LiteralBoolE:
 3457|     18|      : Instruction(ValueKind::IteratorCloseInstKind) {
 3458|     18|    pushOperand(iterator);
 3459|     18|    pushOperand(ignoreInnerException);
 3460|     18|  }
_ZNK6hermes17IteratorCloseInst11getIteratorEv:
 3474|     18|  Value *getIterator() const {
 3475|     18|    return getOperand(IteratorIdx);
 3476|     18|  }
_ZNK6hermes17IteratorCloseInst23getIgnoreInnerExceptionEv:
 3478|     18|  bool getIgnoreInnerException() const {
 3479|     18|    return cast<LiteralBool>(getOperand(IgnoreInnerExceptionIdx))->getValue();
 3480|     18|  }
_ZN6hermes17IteratorCloseInst7classofEPKNS_5ValueE:
 3482|  1.64M|  static bool classof(const Value *V) {
 3483|  1.64M|    return kindIsA(V->getKind(), ValueKind::IteratorCloseInstKind);
 3484|  1.64M|  }

_ZN6hermes12FunctionPassC2EN4llvh9StringRefE:
   60|   343k|      : Pass(Pass::PassKind::Function, name) {}
_ZN6hermes4PassC2ENS0_8PassKindEN4llvh9StringRefE:
   42|   343k|  explicit Pass(Pass::PassKind K, llvh::StringRef name) : kind(K), name(name) {}
_ZN6hermes4PassD2Ev:
   44|   343k|  virtual ~Pass() = default;
_ZNK6hermes4Pass7getKindEv:
   47|   686k|  PassKind getKind() const {
   48|   686k|    return kind;
   49|   686k|  }
_ZNK6hermes4Pass7getNameEv:
   52|   686k|  llvh::StringRef getName() const {
   53|   686k|    return name;
   54|   686k|  }
_ZN6hermes12FunctionPass7classofEPKNS_4PassE:
   67|   686k|  static bool classof(const Pass *S) {
   68|   686k|    return S->getKind() == PassKind::Function;
   69|   686k|  }

_ZN6hermes11PassManager7addPassINS_3hbc23LowerLoadStoreFrameInstEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_27LowerExponentiationOperatorEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc17LowerBuiltinCallsEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_22LowerNumericPropertiesEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_23LowerAllocObjectLiteralEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc17LowerConstructionEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc19LowerArgumentsArrayEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_15LimitAllocArrayEJiEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc19DedupReifyArgumentsEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc25LowerSwitchIntoJumpTablesEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_14SwitchLoweringEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc13LoadConstantsEJRKbEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager7addPassINS_3hbc14LoadParametersEJEEEvDpOT0_:
   64|     56|  void addPass(Args &&...args) {
   65|     56|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|     56|  }
_ZN6hermes11PassManager22addHoistStartGeneratorEv:
   37|     56|  void add##ID() {                                        \
   38|     56|    addPass(std::unique_ptr<Pass>(hermes::create##ID())); \
   39|     56|  }
_ZN6hermes11PassManager7addPassINS_16LowerStoreInstrsEJRNS_3hbc20HVMRegisterAllocatorEEEEvDpOT0_:
   64|   114k|  void addPass(Args &&...args) {
   65|   114k|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|   114k|  }
_ZN6hermes11PassManager7addPassINS_3hbc10LowerCallsEJRNS2_20HVMRegisterAllocatorEEEEvDpOT0_:
   64|   114k|  void addPass(Args &&...args) {
   65|   114k|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|   114k|  }
_ZN6hermes11PassManager7addPassINS_3hbc14SpillRegistersEJRNS2_20HVMRegisterAllocatorEEEEvDpOT0_:
   64|   114k|  void addPass(Args &&...args) {
   65|   114k|    addPass(std::make_unique<Pass>(std::forward<Args>(args)...));
   66|   114k|  }

_ZN6hermes19HoistStartGeneratorC2Ev:
   22|     56|  explicit HoistStartGenerator() : FunctionPass("HoistStartGenerator") {}

_ZN6hermes6parser13RegExpLiteralC2EPNS_12UniqueStringES3_:
   66|  34.1k|      : body_(body), flags_(flags) {}
_ZNK6hermes6parser13RegExpLiteral7getBodyEv:
   68|  34.1k|  UniqueString *getBody() const {
   69|  34.1k|    return body_;
   70|  34.1k|  }
_ZNK6hermes6parser13RegExpLiteral8getFlagsEv:
   71|  34.1k|  UniqueString *getFlags() const {
   72|  34.1k|    return flags_;
   73|  34.1k|  }
_ZNK6hermes6parser5Token7getKindEv:
  111|   155M|  TokenKind getKind() const {
  112|   155M|    return kind_;
  113|   155M|  }
_ZNK6hermes6parser5Token9isResWordEv:
  114|  3.32k|  bool isResWord() const {
  115|  3.32k|    return kind_ > TokenKind::_first_resword &&
  ------------------
  |  Branch (115:12): [True: 3.32k, False: 0]
  ------------------
  116|  3.32k|        kind_ < TokenKind::_last_resword;
  ------------------
  |  Branch (116:9): [True: 3.32k, False: 0]
  ------------------
  117|  3.32k|  }
_ZNK6hermes6parser5Token17isTemplateLiteralEv:
  118|  2.69M|  bool isTemplateLiteral() const {
  119|  2.69M|    return getKind() == TokenKind::no_substitution_template ||
  ------------------
  |  Branch (119:12): [True: 2.22M, False: 467k]
  ------------------
  120|  2.69M|        getKind() == TokenKind::template_head ||
  ------------------
  |  Branch (120:9): [True: 42, False: 467k]
  ------------------
  121|  2.69M|        getKind() == TokenKind::template_middle ||
  ------------------
  |  Branch (121:9): [True: 467k, False: 30]
  ------------------
  122|  2.69M|        getKind() == TokenKind::template_tail;
  ------------------
  |  Branch (122:9): [True: 30, False: 0]
  ------------------
  123|  2.69M|  }
_ZNK6hermes6parser5Token11getStartLocEv:
  125|  37.8M|  SMLoc getStartLoc() const {
  126|  37.8M|    return range_.Start;
  127|  37.8M|  }
_ZNK6hermes6parser5Token9getEndLocEv:
  128|  12.6M|  SMLoc getEndLoc() const {
  129|  12.6M|    return range_.End;
  130|  12.6M|  }
_ZNK6hermes6parser5Token14getSourceRangeEv:
  131|  8.14M|  SMRange getSourceRange() const {
  132|  8.14M|    return range_;
  133|  8.14M|  }
_ZNK6hermes6parser5Token17getNumericLiteralEv:
  141|  1.79M|  double getNumericLiteral() const {
  142|  1.79M|    assert(getKind() == TokenKind::numeric_literal);
  143|      0|    return numeric_;
  144|  1.79M|  }
_ZNK6hermes6parser5Token13getIdentifierEv:
  146|  7.49M|  UniqueString *getIdentifier() const {
  147|  7.49M|    assert(getKind() == TokenKind::identifier);
  148|      0|    return ident_;
  149|  7.49M|  }
_ZNK6hermes6parser5Token22getResWordOrIdentifierEv:
  158|  19.3k|  UniqueString *getResWordOrIdentifier() const {
  159|  19.3k|    assert(getKind() == TokenKind::identifier || isResWord());
  160|      0|    return ident_;
  161|  19.3k|  }
_ZNK6hermes6parser5Token16getStringLiteralEv:
  163|  15.5k|  UniqueString *getStringLiteral() const {
  164|  15.5k|    assert(getKind() == TokenKind::string_literal);
  165|      0|    return stringLiteral_;
  166|  15.5k|  }
_ZNK6hermes6parser5Token31getStringLiteralContainsEscapesEv:
  171|      1|  bool getStringLiteralContainsEscapes() const {
  172|      1|    assert(getKind() == TokenKind::string_literal);
  173|      0|    return stringLiteralContainsEscapes_;
  174|      1|  }
_ZNK6hermes6parser5Token36getTemplateLiteralContainsNotEscapesEv:
  179|   898k|  bool getTemplateLiteralContainsNotEscapes() const {
  180|   898k|    assert(isTemplateLiteral());
  181|      0|    return stringLiteral_ == nullptr;
  182|   898k|  }
_ZNK6hermes6parser5Token16getTemplateValueEv:
  184|   898k|  UniqueString *getTemplateValue() const {
  185|   898k|    assert(isTemplateLiteral());
  186|      0|    return stringLiteral_;
  187|   898k|  }
_ZNK6hermes6parser5Token19getTemplateRawValueEv:
  189|   898k|  UniqueString *getTemplateRawValue() const {
  190|   898k|    assert(isTemplateLiteral());
  191|      0|    return rawString_;
  192|   898k|  }
_ZNK6hermes6parser5Token16getBigIntLiteralEv:
  194|     24|  UniqueString *getBigIntLiteral() const {
  195|     24|    assert(getKind() == TokenKind::bigint_literal);
  196|      0|    return rawString_;
  197|     24|  }
_ZNK6hermes6parser5Token16getRegExpLiteralEv:
  199|  68.3k|  RegExpLiteral *getRegExpLiteral() const {
  200|  68.3k|    assert(getKind() == TokenKind::regexp_literal);
  201|      0|    return regExpLiteral_;
  202|  68.3k|  }
_ZN6hermes6parser5Token8setStartEPKc:
  215|  8.28M|  void setStart(const char *start) {
  216|  8.28M|    range_.Start = SMLoc::getFromPointer(start);
  217|  8.28M|  }
_ZN6hermes6parser5Token6setEndEPKc:
  218|  8.28M|  void setEnd(const char *end) {
  219|  8.28M|    range_.End = SMLoc::getFromPointer(end);
  220|  8.28M|  }
_ZN6hermes6parser5Token13setPunctuatorENS0_9TokenKindE:
  226|  4.21M|  void setPunctuator(TokenKind kind) {
  227|  4.21M|    kind_ = kind;
  228|  4.21M|  }
_ZN6hermes6parser5Token6setEofEv:
  229|    256|  void setEof() {
  230|    256|    kind_ = TokenKind::eof;
  231|    256|  }
_ZN6hermes6parser5Token16setBigIntLiteralEPNS_12UniqueStringE:
  233|     24|  void setBigIntLiteral(UniqueString *raw) {
  234|     24|    kind_ = TokenKind::bigint_literal;
  235|     24|    rawString_ = raw;
  236|     24|  }
_ZN6hermes6parser5Token17setNumericLiteralEd:
  237|  1.79M|  void setNumericLiteral(double literal) {
  238|  1.79M|    kind_ = TokenKind::numeric_literal;
  239|  1.79M|    numeric_ = literal;
  240|  1.79M|  }
_ZN6hermes6parser5Token13setIdentifierEPNS_12UniqueStringE:
  241|  1.31M|  void setIdentifier(UniqueString *ident) {
  242|  1.31M|    kind_ = TokenKind::identifier;
  243|  1.31M|    ident_ = ident;
  244|  1.31M|  }
_ZN6hermes6parser5Token16setStringLiteralEPNS_12UniqueStringEb:
  249|  15.5k|  void setStringLiteral(UniqueString *literal, bool containsEscapes) {
  250|  15.5k|    kind_ = TokenKind::string_literal;
  251|  15.5k|    stringLiteral_ = literal;
  252|  15.5k|    stringLiteralContainsEscapes_ = containsEscapes;
  253|  15.5k|  }
_ZN6hermes6parser5Token16setRegExpLiteralEPNS0_13RegExpLiteralE:
  260|  34.1k|  void setRegExpLiteral(RegExpLiteral *literal) {
  261|  34.1k|    kind_ = TokenKind::regexp_literal;
  262|  34.1k|    regExpLiteral_ = literal;
  263|  34.1k|  }
_ZN6hermes6parser5Token10setResWordENS0_9TokenKindEPNS_12UniqueStringE:
  264|  12.1k|  void setResWord(TokenKind kind, UniqueString *ident) {
  265|  12.1k|    assert(kind > TokenKind::_first_resword && kind < TokenKind::_last_resword);
  266|      0|    kind_ = kind;
  267|  12.1k|    ident_ = ident;
  268|  12.1k|  }
_ZN6hermes6parser5Token18setTemplateLiteralENS0_9TokenKindEPNS_12UniqueStringES4_:
  271|   898k|  setTemplateLiteral(TokenKind kind, UniqueString *cooked, UniqueString *raw) {
  272|   898k|    assert(
  273|   898k|        kind == TokenKind::no_substitution_template ||
  274|   898k|        kind == TokenKind::template_head ||
  275|   898k|        kind == TokenKind::template_middle || kind == TokenKind::template_tail);
  276|      0|    kind_ = kind;
  277|   898k|    stringLiteral_ = cooked;
  278|   898k|    rawString_ = raw;
  279|   898k|  }
_ZN6hermes6parser7JSLexer12resWordIdentENS0_9TokenKindE:
  417|  23.7k|  UniqueString *&resWordIdent(TokenKind kind) {
  418|  23.7k|    assert(
  419|  23.7k|        kind >= TokenKind::_first_resword && kind <= TokenKind::_last_resword);
  420|      0|    return resWordIdent_[ord(kind) - ord(TokenKind::_first_resword)];
  421|  23.7k|  }
_ZN6hermes6parser7JSLexer12getSourceMgrEv:
  483|    243|  SourceErrorManager &getSourceMgr() {
  484|    243|    return sm_;
  485|    243|  }
_ZNK6hermes6parser7JSLexer12isStrictModeEv:
  494|   483k|  bool isStrictMode() const {
  495|   483k|    return strictMode_;
  496|   483k|  }
_ZN6hermes6parser7JSLexer13setStrictModeEb:
  498|   246k|  void setStrictMode(bool strictMode) {
  499|   246k|    strictMode_ = strictMode;
  500|   246k|  }
_ZNK6hermes6parser7JSLexer27isNewLineBeforeCurrentTokenEv:
  524|   616k|  bool isNewLineBeforeCurrentToken() const {
  525|   616k|    return newLineBeforeCurrentToken_;
  526|   616k|  }
_ZNK6hermes6parser7JSLexer18getPrevTokenEndLocEv:
  539|  4.57M|  SMLoc getPrevTokenEndLoc() const {
  540|  4.57M|    return prevTokenEndLoc_;
  541|  4.57M|  }
_ZN6hermes6parser7JSLexer8forceEOFEv:
  544|     36|  void forceEOF() {
  545|     36|    curCharPtr_ = bufferEnd_;
  546|     36|  }
_ZN6hermes6parser7JSLexer13getIdentifierEN4llvh9StringRefE:
  599|  1.37M|  UniqueString *getIdentifier(llvh::StringRef name) {
  600|  1.37M|    return strTab_.getString(name);
  601|  1.37M|  }
_ZN6hermes6parser7JSLexer16getStringLiteralEN4llvh9StringRefE:
  603|  1.88M|  UniqueString *getStringLiteral(llvh::StringRef str) {
  604|  1.88M|    if (LLVM_UNLIKELY(convertSurrogates_)) {
  ------------------
  |  |  189|  1.88M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.88M]
  |  |  ------------------
  ------------------
  605|      0|      return convertSurrogatesInString(str);
  606|      0|    }
  607|  1.88M|    return strTab_.getString(str);
  608|  1.88M|  }
_ZN6hermes6parser7JSLexer4seekEN4llvh5SMLocE:
  613|    692|  void seek(SMLoc loc) {
  614|    692|    curCharPtr_ = loc.getPointer();
  615|    692|  }
_ZN6hermes6parser7JSLexer11getBufferIdEv:
  618|    674|  uint32_t getBufferId() {
  619|    674|    return bufId_;
  620|    674|  }
_ZN6hermes6parser7JSLexer22appendUnicodeToStorageEj:
  736|  26.9k|  inline void appendUnicodeToStorage(uint32_t cp) {
  737|  26.9k|    appendUnicodeToStorage(cp, tmpStorage_);
  738|  26.9k|  }
_ZN6hermes6parser7JSLexer31scanIdentifierFastPathInContextEPKcNS1_14GrammarContextE:
  876|  1.32M|      GrammarContext grammarContext) {
  877|  1.32M|    if (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|  2.65M|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  878|  1.32M|        LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)) {
  ------------------
  |  |  189|  1.32M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.32M]
  |  |  ------------------
  ------------------
  879|      0|      scanIdentifierFastPath<IdentifierMode::JSX>(start);
  880|  1.32M|    } else if (
  881|  1.32M|        HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  2.65M|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  882|  1.32M|        LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|  1.32M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.32M]
  |  |  ------------------
  ------------------
  883|      0|      scanIdentifierFastPath<IdentifierMode::Flow>(start);
  884|  1.32M|    } else {
  885|  1.32M|      scanIdentifierFastPath<IdentifierMode::JS>(start);
  886|  1.32M|    }
  887|  1.32M|  }
_ZN6hermes6parser7JSLexer28scanIdentifierPartsInContextENS1_14GrammarContextE:
  891|     18|  void scanIdentifierPartsInContext(GrammarContext grammarContext) {
  892|     18|    if (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|     36|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  893|     18|        LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  894|      0|      scanIdentifierParts<IdentifierMode::JSX>();
  895|     18|    } else if (
  896|     18|        HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|     36|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  897|     18|        LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  898|      0|      scanIdentifierParts<IdentifierMode::Flow>();
  899|     18|    } else {
  900|     18|      scanIdentifierParts<IdentifierMode::JS>();
  901|     18|    }
  902|     18|  }
_ZN6hermes6parser7JSLexer19scanStringInContextENS1_14GrammarContextE:
  911|  15.5k|  void scanStringInContext(GrammarContext grammarContext) {
  912|  15.5k|#if HERMES_PARSE_JSX
  913|  15.5k|    LLVM_UNLIKELY(grammarContext == GrammarContext::AllowJSXIdentifier)
  ------------------
  |  |  189|  15.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15.5k]
  |  |  ------------------
  ------------------
  914|  15.5k|    ? scanString<true>() :
  915|  15.5k|#endif
  916|  15.5k|    scanString<false>();
  917|  15.5k|  }
_ZN6hermes6parser7JSLexer11finishTokenEPKc:
  950|  8.28M|  inline void finishToken(const char *end) {
  951|  8.28M|    prevTokenEndLoc_ = token_.getEndLoc();
  952|  8.28M|    token_.setEnd(end);
  953|  8.28M|    if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|  8.28M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8.28M]
  |  |  ------------------
  ------------------
  954|      0|      storeCurrentToken();
  955|      0|    }
  956|  8.28M|  }
_ZN6hermes6parser7JSLexer10errorRangeEN4llvh5SMLocERKNS2_5TwineE:
  965|     27|  bool errorRange(SMLoc startLoc, const llvh::Twine &msg) {
  966|     27|    return error({startLoc, SMLoc::getFromPointer(curCharPtr_)}, msg);
  967|     27|  }
_ZN6hermes6parser3ordENS0_9TokenKindE:
   39|  47.4k|inline constexpr int ord(TokenKind kind) {
   40|  47.4k|  return static_cast<int>(kind);
   41|  47.4k|}
_ZN6hermes6parser7JSLexer15initStorageWithEPKcS3_:
  993|  1.79k|inline void JSLexer::initStorageWith(const char *begin, const char *end) {
  994|  1.79k|  tmpStorage_.clear();
  995|  1.79k|  tmpStorage_.append(begin, end);
  996|  1.79k|}
_ZN6hermes6parser7JSLexer22appendUnicodeToStorageEjRN4llvh15SmallVectorImplIcEE:
 1000|  43.0k|    llvh::SmallVectorImpl<char> &storage) {
 1001|       |  // Sized to allow for two 16-bit values to be encoded.
 1002|       |  // A 16-bit value takes up to three bytes encoded in UTF-8.
 1003|  43.0k|  char buf[8];
 1004|  43.0k|  char *d = buf;
 1005|       |  // We need to normalize code points which would be encoded with a surrogate
 1006|       |  // pair. Note that this produces technically invalid UTF-8.
 1007|  43.0k|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|  43.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 40.0k, False: 2.97k]
  |  |  ------------------
  ------------------
 1008|  40.0k|    hermes::encodeUTF8(d, cp);
 1009|  40.0k|  } else {
 1010|  2.97k|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
 1011|      0|    cp -= 0x10000;
 1012|  2.97k|    hermes::encodeUTF8(d, UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF));
 1013|  2.97k|    hermes::encodeUTF8(d, UTF16_LOW_SURROGATE + (cp & 0x3FF));
 1014|  2.97k|  }
 1015|      0|  storage.append(buf, d);
 1016|  43.0k|}
_ZN6hermes6parser7JSLexer10decodeUTF8Ev:
 1018|    107|inline uint32_t JSLexer::decodeUTF8() {
 1019|    107|  const char *saveStart = curCharPtr_;
 1020|    107|  return hermes::decodeUTF8<false>(curCharPtr_, [=](const Twine &msg) {
 1021|    107|    error(SMLoc::getFromPointer(saveStart), msg);
 1022|    107|  });
 1023|    107|}
_ZN6hermes6parser7JSLexer19_decodeUTF8SlowPathERPKc:
 1025|  19.0k|inline uint32_t JSLexer::_decodeUTF8SlowPath(const char *&at) {
 1026|  19.0k|  return hermes::_decodeUTF8SlowPath<false>(
 1027|  19.0k|      at, [=](const Twine &msg) { error(SMLoc::getFromPointer(at), msg); });
 1028|  19.0k|}
_ZNK6hermes6parser7JSLexer9_peekUTF8EPKc:
 1031|  5.64k|    const char *at) const {
 1032|  5.64k|  uint32_t ch =
 1033|  5.64k|      hermes::_decodeUTF8SlowPath<false>(at, [](const llvh::Twine &) {});
 1034|  5.64k|  return std::make_pair(ch, at);
 1035|  5.64k|}
_ZNK6hermes6parser7JSLexer9_peekUTF8Ev:
 1037|  3.84k|inline std::pair<uint32_t, const char *> JSLexer::_peekUTF8() const {
 1038|  3.84k|  return _peekUTF8(curCharPtr_);
 1039|  3.84k|}
_ZN6hermes6parser5TokenC2Ev:
  108|    263|  Token() = default;
_ZZN6hermes6parser7JSLexer10decodeUTF8EvENKUlRKN4llvh5TwineEE_clES5_:
 1020|     21|  return hermes::decodeUTF8<false>(curCharPtr_, [=](const Twine &msg) {
 1021|     21|    error(SMLoc::getFromPointer(saveStart), msg);
 1022|     21|  });
_ZZN6hermes6parser7JSLexer19_decodeUTF8SlowPathERPKcENKUlRKN4llvh5TwineEE_clES8_:
 1027|    982|      at, [=](const Twine &msg) { error(SMLoc::getFromPointer(at), msg); });
_ZZNK6hermes6parser7JSLexer9_peekUTF8EPKcENKUlRKN4llvh5TwineEE_clES7_:
 1033|      3|      hermes::_decodeUTF8SlowPath<false>(at, [](const llvh::Twine &) {});

_ZN6hermes6parser9SMLocInfo11getEmptyKeyEv:
   23|  4.17k|  static inline SMLoc getEmptyKey() {
   24|  4.17k|    return SMLoc::getFromPointer(0);
   25|  4.17k|  }
_ZN6hermes6parser9SMLocInfo15getTombstoneKeyEv:
   26|  3.38k|  static inline SMLoc getTombstoneKey() {
   27|  3.38k|    return SMLoc::getFromPointer((const char *)1);
   28|  3.38k|  }
_ZN6hermes6parser9SMLocInfo7isEqualERKN4llvh5SMLocES5_:
   29|  25.5k|  static inline bool isEqual(const SMLoc &a, const SMLoc &b) {
   30|  25.5k|    return a == b;
   31|  25.5k|  }
_ZN6hermes6parser9SMLocInfo12getHashValueERKN4llvh5SMLocE:
   32|  3.37k|  static unsigned getHashValue(const SMLoc &Val) {
   33|  3.37k|    return (unsigned)(uintptr_t)Val.getPointer();
   34|  3.37k|  }
_ZN6hermes6parser13PreParsedData13getBufferInfoEj:
   65|    164|  PreParsedBufferInfo *getBufferInfo(uint32_t bufferId) {
   66|    164|    if (bufferInfo.size() < bufferId + 1) {
  ------------------
  |  Branch (66:9): [True: 99, False: 65]
  ------------------
   67|     99|      bufferInfo.resize(bufferId + 1);
   68|     99|    }
   69|    164|    if (!bufferInfo[bufferId]) {
  ------------------
  |  Branch (69:9): [True: 99, False: 65]
  ------------------
   70|     99|      bufferInfo[bufferId] = std::make_unique<PreParsedBufferInfo>();
   71|     99|    }
   72|    164|    return bufferInfo[bufferId].get();
   73|    164|  }

_ZN6hermes13isMemberOfBMPEj:
   48|     18|inline bool isMemberOfBMP(uint32_t cp) {
   49|     18|  return cp <= UNICODE_LAST_BMP;
   50|     18|}
_ZN6hermes15isHighSurrogateEj:
   53|     22|inline bool isHighSurrogate(uint32_t cp) {
   54|     22|  return UNICODE_SURROGATE_FIRST <= cp && cp < UTF16_LOW_SURROGATE;
  ------------------
  |  Branch (54:10): [True: 0, False: 22]
  |  Branch (54:43): [True: 0, False: 0]
  ------------------
   55|     22|}
_ZN6hermes14isLowSurrogateEj:
   58|     22|inline bool isLowSurrogate(uint32_t cp) {
   59|     22|  return UTF16_LOW_SURROGATE <= cp && cp <= UNICODE_SURROGATE_LAST;
  ------------------
  |  Branch (59:10): [True: 0, False: 22]
  |  Branch (59:39): [True: 0, False: 0]
  ------------------
   60|     22|}
_ZN6hermes22isASCIIIdentifierStartEj:
   82|  5.64k|inline bool isASCIIIdentifierStart(uint32_t ch) {
   83|  5.64k|  return ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z');
  ------------------
  |  Branch (83:10): [True: 0, False: 5.64k]
  |  Branch (83:23): [True: 0, False: 5.64k]
  |  Branch (83:37): [True: 5.64k, False: 0]
  |  Branch (83:57): [True: 0, False: 5.64k]
  ------------------
   84|  5.64k|}
_ZN6hermes16isUnicodeIDStartEj:
   87|  5.64k|inline bool isUnicodeIDStart(uint32_t cp) {
   88|  5.64k|  return isASCIIIdentifierStart(cp) || isUnicodeOnlyLetter(cp);
  ------------------
  |  Branch (88:10): [True: 0, False: 5.64k]
  |  Branch (88:40): [True: 5.63k, False: 4]
  ------------------
   89|  5.64k|}
_ZN6hermes19isUnicodeIDContinueEj:
   92|  5.63k|inline bool isUnicodeIDContinue(uint32_t cp) {
   93|       |  // TODO: clearly this has to be optimized somehow
   94|  5.63k|  return isUnicodeIDStart(cp) || isUnicodeCombiningMark(cp) ||
  ------------------
  |  Branch (94:10): [True: 5.63k, False: 1]
  |  Branch (94:34): [True: 0, False: 1]
  ------------------
   95|  5.63k|      isUnicodeDigit(cp) || isUnicodeConnectorPunctuation(cp) ||
  ------------------
  |  Branch (95:7): [True: 0, False: 1]
  |  Branch (95:29): [True: 0, False: 1]
  ------------------
   96|  5.63k|      cp == UNICODE_ZWNJ || cp == UNICODE_ZWJ;
  ------------------
  |  Branch (96:7): [True: 0, False: 1]
  |  Branch (96:29): [True: 0, False: 1]
  ------------------
   97|  5.63k|}

_ZNK6hermes14CodePointRange3endEv:
   28|  4.48k|  uint32_t end() const {
   29|  4.48k|    assert(first + length >= first && "Range overflowed");
   30|      0|    return first + length;
   31|  4.48k|  }
_ZN6hermes14CodePointRange8overlapsERKS0_:
   34|  1.29k|  bool overlaps(const CodePointRange &rhs) {
   35|  1.29k|    return this->first < rhs.end() && rhs.first < this->end();
  ------------------
  |  Branch (35:12): [True: 1.16k, False: 138]
  |  Branch (35:39): [True: 580, False: 581]
  ------------------
   36|  1.29k|  }
_ZN6hermes14CodePointRange5abutsERKS0_:
   39|    719|  bool abuts(const CodePointRange &rhs) {
   40|    719|    return this->first == rhs.end() || rhs.first == this->end();
  ------------------
  |  Branch (40:12): [True: 7, False: 712]
  |  Branch (40:40): [True: 9, False: 703]
  ------------------
   41|    719|  }
_ZN6hermes12CodePointSet3addENS_14CodePointRangeE:
   58|    302|  void add(CodePointRange r) {
   59|    302|    if (r.length == 0)
  ------------------
  |  Branch (59:9): [True: 0, False: 302]
  ------------------
   60|      0|      return;
   61|       |
   62|       |    // Use equal_range to find the subarray which we overlap, treating
   63|       |    // overlapping or abutting as equality.
   64|    302|    auto cmp = [](CodePointRange lhs, CodePointRange rhs) {
   65|    302|      if (lhs.overlaps(rhs) || lhs.abuts(rhs))
   66|    302|        return false;
   67|    302|      return lhs.first < rhs.first;
   68|    302|    };
   69|    302|    auto pair = std::equal_range(ranges_.begin(), ranges_.end(), r, cmp);
   70|       |
   71|    302|    if (pair.first == pair.second) {
  ------------------
  |  Branch (71:9): [True: 5, False: 297]
  ------------------
   72|       |      // There was no overlap, just insert.
   73|      5|      ranges_.insert(pair.first, r);
   74|    297|    } else {
   75|       |      // We overlapped with at least one existing range. Extend the first such
   76|       |      // range with the total overlap, and erase any subsequent overlapping
   77|       |      // ranges.
   78|       |      // The beginning of the merged range is the smaller of the first overlap's
   79|       |      // left, and our range's left. The end of the merged range is the larger
   80|       |      // of the last overlaps's end, and our range's end.
   81|    297|      uint32_t start = std::min(r.first, pair.first->first);
   82|    297|      uint32_t end = std::max(r.end(), (pair.second - 1)->end());
   83|    297|      *pair.first = CodePointRange{start, end - start};
   84|    297|      ranges_.erase(pair.first + 1, pair.second);
   85|    297|    }
   86|    302|  }
_ZN6hermes12CodePointSet3addEj:
   89|    302|  void add(uint32_t cp) {
   90|    302|    add(CodePointRange{cp, 1});
   91|    302|  }
_ZNK6hermes12CodePointSet6rangesEv:
  109|      4|  llvh::ArrayRef<CodePointRange> ranges() const {
  110|      4|    return ranges_;
  111|      4|  }
_ZZN6hermes12CodePointSet3addENS_14CodePointRangeEENKUlS1_S1_E_clES1_S1_:
   64|  1.29k|    auto cmp = [](CodePointRange lhs, CodePointRange rhs) {
   65|  1.29k|      if (lhs.overlaps(rhs) || lhs.abuts(rhs))
  ------------------
  |  Branch (65:11): [True: 580, False: 719]
  |  Branch (65:32): [True: 16, False: 703]
  ------------------
   66|    596|        return false;
   67|    703|      return lhs.first < rhs.first;
   68|  1.29k|    };

_ZNK6hermes5regex13CapturedRange7matchedEv:
   50|   404k|  bool matched() const {
   51|   404k|    return start != kNotMatched;
   52|   404k|  }

_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEEC2EN4llvh8ArrayRefIDsEES6_:
  161|  11.4k|      const llvh::ArrayRef<char16_t> flags = {}) {
  162|       |    // Compute the SyntaxFlags based on the flags string.
  163|  11.4k|    auto sflags = SyntaxFlags::fromString(flags);
  164|  11.4k|    if (!sflags) {
  ------------------
  |  Branch (164:9): [True: 0, False: 11.4k]
  ------------------
  165|      0|      error_ = constants::ErrorType::InvalidFlags;
  166|      0|      return;
  167|      0|    }
  168|  11.4k|    flags_ = *sflags;
  169|  11.4k|    error_ = parse(pattern.begin(), pattern.end());
  170|  11.4k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5parseIPKDsEENS0_9constants9ErrorTypeET_S9_:
  280|  11.4k|    ForwardIterator last) {
  281|  11.4k|  uint32_t maxBackRef = 0;
  282|  11.4k|  bool hasNamedGroups = flags_.unicode;
  283|  11.4k|  auto result = parseWithBackRefLimit(
  284|  11.4k|      first,
  285|  11.4k|      last,
  286|  11.4k|      constants::kMaxCaptureGroupCount,
  287|  11.4k|      hasNamedGroups,
  288|  11.4k|      &maxBackRef);
  289|       |
  290|       |  // Validate loop and capture group count.
  291|  11.4k|  if (loopCount_ > constants::kMaxLoopCount) {
  ------------------
  |  Branch (291:7): [True: 0, False: 11.4k]
  ------------------
  292|      0|    return constants::ErrorType::PatternExceedsParseLimits;
  293|      0|  }
  294|       |
  295|       |  // See comment --DecimalEscape--
  296|       |  // We parsed without a backreference limit because we had to parse to discover
  297|       |  // the limit. Now we know that we wrongly interpreted a decimal escape as a
  298|       |  // backreference. See ES6 Annex B.1.4 DecimalEscape "but only if the integer
  299|       |  // value DecimalEscape is <= NCapturingParens". Now that we know the true
  300|       |  // capture group count, either produce an error (if Unicode) or re-parse with
  301|       |  // that as the limit so overlarge decimal escapes will be ignored.
  302|  11.4k|  bool reparseForNumberedBackref =
  303|  11.4k|      result == constants::ErrorType::None && maxBackRef > markedCount_;
  ------------------
  |  Branch (303:7): [True: 11.4k, False: 0]
  |  Branch (303:47): [True: 0, False: 11.4k]
  ------------------
  304|       |  // We must also reparse if there were any named capture groups used and it is
  305|       |  // not unicode mode.
  306|  11.4k|  bool reparseForNamedBackref = false;
  307|  11.4k|  if (!flags_.unicode && nameMapping_.size() > 0 &&
  ------------------
  |  Branch (307:7): [True: 11.4k, False: 0]
  |  Branch (307:26): [True: 0, False: 11.4k]
  ------------------
  308|  11.4k|      sawNamedBackrefBeforeGroup_) {
  ------------------
  |  Branch (308:7): [True: 0, False: 0]
  ------------------
  309|      0|    reparseForNamedBackref = true;
  310|      0|    hasNamedGroups = true;
  311|      0|  }
  312|       |
  313|  11.4k|  if (reparseForNumberedBackref || reparseForNamedBackref) {
  ------------------
  |  Branch (313:7): [True: 0, False: 11.4k]
  |  Branch (313:36): [True: 0, False: 11.4k]
  ------------------
  314|      0|    if (flags_.unicode) {
  ------------------
  |  Branch (314:9): [True: 0, False: 0]
  ------------------
  315|      0|      return constants::ErrorType::EscapeInvalid;
  316|      0|    }
  317|       |
  318|      0|    uint32_t backRefLimit = markedCount_;
  319|      0|    uint32_t reparsedMaxBackRef = 0;
  320|      0|    loopCount_ = 0;
  321|      0|    markedCount_ = 0;
  322|      0|    matchConstraints_ = 0;
  323|      0|    nameMapping_.clear();
  324|      0|    orderedGroupNames_.clear();
  325|      0|    result = parseWithBackRefLimit(
  326|      0|        first, last, backRefLimit, hasNamedGroups, &reparsedMaxBackRef);
  327|      0|    assert(
  328|      0|        reparsedMaxBackRef <= backRefLimit &&
  329|      0|        "invalid backreference generated");
  330|      0|    (void)reparsedMaxBackRef;
  331|      0|  }
  332|  11.4k|  return result;
  333|  11.4k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE21parseWithBackRefLimitIPKDsEENS0_9constants9ErrorTypeET_S9_jbPj:
  342|  11.4k|    uint32_t *outMaxBackRef) {
  343|       |  // Initialize our node list with a single no-op node (it must never be empty.)
  344|  11.4k|  nodes_.clear();
  345|  11.4k|  appendNode<Node>();
  346|  11.4k|  auto result = parseRegex(
  347|  11.4k|      first, last, this, flags_, backRefLimit, hasNamedGroups, outMaxBackRef);
  348|       |
  349|       |  // If we succeeded, add a goal node as the last node and perform optimizations
  350|       |  // on the list.
  351|  11.4k|  if (result == constants::ErrorType::None) {
  ------------------
  |  Branch (351:7): [True: 11.4k, False: 0]
  ------------------
  352|  11.4k|    appendNode<GoalNode>();
  353|  11.4k|    Node::optimizeNodeList(nodes_, flags_, nodeHolder_);
  354|  11.4k|    if (!resolveNamedBackRefs()) {
  ------------------
  |  Branch (354:9): [True: 0, False: 11.4k]
  ------------------
  355|      0|      return constants::ErrorType::NonexistentNamedCaptureReference;
  356|      0|    }
  357|  11.4k|  }
  358|       |
  359|       |  // Compute any match constraints.
  360|  11.4k|  matchConstraints_ = Node::matchConstraintsForList(nodes_);
  361|       |
  362|  11.4k|  return result;
  363|  11.4k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_4NodeEJEEEPT_DpOT0_:
   85|  11.4k|  NodeType *appendNode(Args &&...args) {
   86|  11.4k|    std::unique_ptr<NodeType> node =
   87|  11.4k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|  11.4k|    NodeType *nodePtr = node.get();
   89|  11.4k|    nodeHolder_.push_back(std::move(node));
   90|  11.4k|    nodes_.push_back(nodePtr);
   91|  11.4k|    return nodePtr;
   92|  11.4k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_8GoalNodeEJEEEPT_DpOT0_:
   85|  11.4k|  NodeType *appendNode(Args &&...args) {
   86|  11.4k|    std::unique_ptr<NodeType> node =
   87|  11.4k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|  11.4k|    NodeType *nodePtr = node.get();
   89|  11.4k|    nodeHolder_.push_back(std::move(node));
   90|  11.4k|    nodes_.push_back(nodePtr);
   91|  11.4k|    return nodePtr;
   92|  11.4k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE20resolveNamedBackRefsEv:
  366|  11.4k|bool Regex<Traits>::resolveNamedBackRefs() {
  367|  11.4k|  for (auto &[name, backRef] : unresolvedNamedBackRefs_) {
  ------------------
  |  Branch (367:30): [True: 0, False: 11.4k]
  ------------------
  368|      0|    auto search = nameMapping_.find(name);
  369|      0|    if (search == nameMapping_.end()) {
  ------------------
  |  Branch (369:9): [True: 0, False: 0]
  ------------------
  370|      0|      return false;
  371|      0|    }
  372|      0|    auto groupNum = search->second;
  373|      0|    backRef->setBackRef(groupNum - 1);
  374|      0|  }
  375|  11.4k|  return true;
  376|  11.4k|}
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5validEv:
  214|  22.9k|  bool valid() const {
  215|  22.9k|    return error_ == constants::ErrorType::None;
  216|  22.9k|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE7compileEv:
  135|  11.4k|  std::vector<uint8_t> compile() const {
  136|  11.4k|    assert(valid() && "Cannot compile invalid regex.");
  137|       |    // TODO: add validation for the loop and reduce the size of loopCount_ to
  138|       |    // uint16_t.
  139|      0|    assert(
  140|  11.4k|        markedCount_ <= constants::kMaxCaptureGroupCount &&
  141|  11.4k|        "Too many capture groups");
  142|      0|    assert(loopCount_ <= constants::kMaxLoopCount && "Too many loops");
  143|      0|    RegexBytecodeHeader header = {
  144|  11.4k|        markedCount_,
  145|  11.4k|        static_cast<uint16_t>(loopCount_),
  146|  11.4k|        flags_.toByte(),
  147|  11.4k|        matchConstraints_};
  148|  11.4k|    RegexBytecodeStream bcs(header);
  149|  11.4k|    Node::compile(nodes_, bcs);
  150|  11.4k|    return bcs.acquireBytecode();
  151|  11.4k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE11currentNodeEv:
   95|   894k|  Node *currentNode() {
   96|   894k|    return nodes_.back();
   97|   894k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE9spliceOutEPNS0_4NodeE:
  115|    513|  NodeList spliceOut(Node *splicePoint) {
  116|    513|    assert(splicePoint && "null node in spliceOut");
  117|       |    // Find the index of the splice point. We expect it to be towards the end.
  118|      0|    size_t spliceIndex = nodes_.size();
  119|   871k|    while (spliceIndex--) {
  ------------------
  |  Branch (119:12): [True: 871k, False: 0]
  ------------------
  120|   871k|      if (nodes_[spliceIndex] == splicePoint)
  ------------------
  |  Branch (120:11): [True: 513, False: 871k]
  ------------------
  121|    513|        break;
  122|   871k|    }
  123|    513|    assert(spliceIndex < nodes_.size() && "Node not in node list");
  124|       |    // Move all nodes after the splice index into a new vector.
  125|       |    // Note this may be empty.
  126|      0|    auto firstToMove = nodes_.begin() + spliceIndex + 1;
  127|    513|    NodeList result;
  128|    513|    std::move(firstToMove, nodes_.end(), std::back_inserter(result));
  129|    513|    nodes_.erase(firstToMove, nodes_.end());
  130|    513|    return result;
  131|    513|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE11markedCountEv:
  100|   882k|  uint16_t markedCount() const {
  101|   882k|    return markedCount_;
  102|   882k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE15pushAlternationENSt3__16vectorINS5_IPNS0_4NodeENS4_9allocatorIS7_EEEENS8_ISA_EEEE:
  456|    234|void Regex<Traits>::pushAlternation(std::vector<NodeList> alternatives) {
  457|    234|  appendNode<AlternationNode>(std::move(alternatives));
  458|    234|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_15AlternationNodeEJNSt3__16vectorINS7_IPNS0_4NodeENS6_9allocatorIS9_EEEENSA_ISC_EEEEEEEPT_DpOT0_:
   85|    234|  NodeType *appendNode(Args &&...args) {
   86|    234|    std::unique_ptr<NodeType> node =
   87|    234|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|    234|    NodeType *nodePtr = node.get();
   89|    234|    nodeHolder_.push_back(std::move(node));
   90|    234|    nodes_.push_back(nodePtr);
   91|    234|    return nodePtr;
   92|    234|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE8pushLoopEjjNSt3__16vectorIPNS0_4NodeENS4_9allocatorIS7_EEEEjb:
  384|      3|    bool greedy) {
  385|      3|  appendNode<LoopNode>(
  386|      3|      loopCount_++,
  387|      3|      min,
  388|      3|      max,
  389|      3|      greedy,
  390|      3|      mexp_begin,
  391|      3|      markedCount_,
  392|      3|      std::move(loopedExpr));
  393|      3|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_8LoopNodeEJjRjS6_RbS6_RtNSt3__16vectorIPNS0_4NodeENS9_9allocatorISC_EEEEEEEPT_DpOT0_:
   85|      3|  NodeType *appendNode(Args &&...args) {
   86|      3|    std::unique_ptr<NodeType> node =
   87|      3|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|      3|    NodeType *nodePtr = node.get();
   89|      3|    nodeHolder_.push_back(std::move(node));
   90|      3|    nodes_.push_back(nodePtr);
   91|      3|    return nodePtr;
   92|      3|  }
_ZNK6hermes5regex5RegexINS0_16UTF16RegexTraitsEE5flagsEv:
  184|  1.76M|  SyntaxFlags flags() const {
  185|  1.76M|    return flags_;
  186|  1.76M|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE16startBracketListEb:
  461|      1|BracketNode<Traits> *Regex<Traits>::startBracketList(bool negate) {
  462|      1|  return appendNode<BracketNode>(traits_, negate, flags_);
  463|      1|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_11BracketNodeIS2_EEJRS2_RbRNS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|      1|  NodeType *appendNode(Args &&...args) {
   86|      1|    std::unique_ptr<NodeType> node =
   87|      1|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|      1|    NodeType *nodePtr = node.get();
   89|      1|    nodeHolder_.push_back(std::move(node));
   90|      1|    nodes_.push_back(nodePtr);
   91|      1|    return nodePtr;
   92|      1|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE12pushMatchAnyEv:
  425|      8|void Regex<Traits>::pushMatchAny() {
  426|      8|  appendNode<MatchAnyNode>(flags());
  427|      8|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_12MatchAnyNodeEJNS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|      8|  NodeType *appendNode(Args &&...args) {
   86|      8|    std::unique_ptr<NodeType> node =
   87|      8|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|      8|    NodeType *nodePtr = node.get();
   89|      8|    nodeHolder_.push_back(std::move(node));
   90|      8|    nodes_.push_back(nodePtr);
   91|      8|    return nodePtr;
   92|      8|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE8pushCharEj:
  396|   882k|void Regex<Traits>::pushChar(CodePoint c) {
  397|   882k|  bool icase = flags().ignoreCase;
  398|   882k|  if (icase)
  ------------------
  |  Branch (398:7): [True: 0, False: 882k]
  ------------------
  399|      0|    c = traits_.canonicalize(c, flags().unicode);
  400|   882k|  appendNode<MatchCharNode>(Node::CodePointList{c}, flags());
  401|   882k|}
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE10appendNodeINS0_13MatchCharNodeEJN4llvh11SmallVectorIjLj5EEENS0_11SyntaxFlagsEEEEPT_DpOT0_:
   85|   882k|  NodeType *appendNode(Args &&...args) {
   86|   882k|    std::unique_ptr<NodeType> node =
   87|   882k|        std::make_unique<NodeType>(std::forward<Args>(args)...);
   88|   882k|    NodeType *nodePtr = node.get();
   89|   882k|    nodeHolder_.push_back(std::move(node));
   90|   882k|    nodes_.push_back(nodePtr);
   91|   882k|    return nodePtr;
   92|   882k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE24acquireOrderedGroupNamesEv:
  192|  11.4k|  std::deque<llvh::SmallVector<char16_t, 5>> acquireOrderedGroupNames() {
  193|  11.4k|    return std::move(orderedGroupNames_);
  194|  11.4k|  }
_ZN6hermes5regex5RegexINS0_16UTF16RegexTraitsEE24acquireGroupNamesMappingEv:
  200|  11.4k|  ParsedGroupNamesMapping acquireGroupNamesMapping() {
  201|  11.4k|    return std::move(nameMapping_);
  202|  11.4k|  }

_ZN6hermes5regex19RegexBytecodeStream16emitBracketRangeENS0_14BracketRange32E:
  331|      3|  void emitBracketRange(BracketRange32 range) {
  332|      3|    const uint8_t *rangeBytes = reinterpret_cast<const uint8_t *>(&range);
  333|      3|    bytes_.insert(bytes_.end(), rangeBytes, rangeBytes + sizeof(range));
  334|      3|  }
_ZN6hermes5regex19RegexBytecodeStream9emitChar8Ec:
  337|   871k|  void emitChar8(char c) {
  338|   871k|    bytes_.push_back((uint8_t)c);
  339|   871k|  }
_ZNK6hermes5regex19RegexBytecodeStream13currentOffsetEv:
  343|    558|  uint32_t currentOffset() const {
  344|    558|    return bytes_.size() - sizeof(RegexBytecodeHeader);
  345|    558|  }
_ZN6hermes5regex19RegexBytecodeStream15acquireBytecodeEv:
  348|  11.4k|  std::vector<uint8_t> acquireBytecode() {
  349|  11.4k|    assert(!acquired_ && "Bytecode already acquired");
  350|      0|    acquired_ = true;
  351|  11.4k|    return std::move(bytes_);
  352|  11.4k|  }
_ZN6hermes5regex19RegexBytecodeStreamC2ERKNS0_19RegexBytecodeHeaderE:
  355|  11.4k|  RegexBytecodeStream(const RegexBytecodeHeader &header) {
  356|  11.4k|    const uint8_t *headerBytes = reinterpret_cast<const uint8_t *>(&header);
  357|  11.4k|    bytes_.insert(bytes_.end(), headerBytes, headerBytes + sizeof header);
  358|  11.4k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_8GoalInsnEEENS1_18InstructionWrapperIT_EEv:
  322|  11.4k|  InstructionWrapper<Instruction> emit() {
  323|  11.4k|    size_t startSize = bytes_.size();
  324|  11.4k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  11.4k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  11.4k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  11.4k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  11.4k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_14Width1LoopInsnEEENS1_18InstructionWrapperIT_EEv:
  322|      3|  InstructionWrapper<Instruction> emit() {
  323|      3|    size_t startSize = bytes_.size();
  324|      3|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|      3|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|      3|    insn->opcode = OpcodeFor<Instruction>::value;
  327|      3|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|      3|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14Width1LoopInsnEEptEv:
  309|     15|    Instruction *operator->() {
  310|     15|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|     15|      return llvh::cast<Instruction>(base);
  312|     15|    }
_ZN4llvh8isa_implIN6hermes5regex14Width1LoopInsnENS2_4InsnEvE4doitERKS4_:
  377|     15|  static inline bool doit(const From &val) {
  378|     15|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|     15|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15AlternationInsnEEENS1_18InstructionWrapperIT_EEv:
  322|    276|  InstructionWrapper<Instruction> emit() {
  323|    276|    size_t startSize = bytes_.size();
  324|    276|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    276|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    276|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    276|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    276|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15AlternationInsnEEptEv:
  309|    828|    Instruction *operator->() {
  310|    828|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    828|      return llvh::cast<Instruction>(base);
  312|    828|    }
_ZN4llvh8isa_implIN6hermes5regex15AlternationInsnENS2_4InsnEvE4doitERKS4_:
  377|    828|  static inline bool doit(const From &val) {
  378|    828|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    828|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_10Jump32InsnEEENS1_18InstructionWrapperIT_EEv:
  322|    276|  InstructionWrapper<Instruction> emit() {
  323|    276|    size_t startSize = bytes_.size();
  324|    276|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|    276|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|    276|    insn->opcode = OpcodeFor<Instruction>::value;
  327|    276|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|    276|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_10Jump32InsnEEptEv:
  309|    276|    Instruction *operator->() {
  310|    276|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|    276|      return llvh::cast<Instruction>(base);
  312|    276|    }
_ZN4llvh8isa_implIN6hermes5regex10Jump32InsnENS2_4InsnEvE4doitERKS4_:
  377|    276|  static inline bool doit(const From &val) {
  378|    276|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|    276|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_22MatchAnyButNewlineInsnEEENS1_18InstructionWrapperIT_EEv:
  322|      8|  InstructionWrapper<Instruction> emit() {
  323|      8|    size_t startSize = bytes_.size();
  324|      8|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|      8|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|      8|    insn->opcode = OpcodeFor<Instruction>::value;
  327|      8|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|      8|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15MatchNChar8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  3.42k|  InstructionWrapper<Instruction> emit() {
  323|  3.42k|    size_t startSize = bytes_.size();
  324|  3.42k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  3.42k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  3.42k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  3.42k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  3.42k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchNChar8InsnEEptEv:
  309|  3.42k|    Instruction *operator->() {
  310|  3.42k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  3.42k|      return llvh::cast<Instruction>(base);
  312|  3.42k|    }
_ZN4llvh8isa_implIN6hermes5regex15MatchNChar8InsnENS2_4InsnEvE4doitERKS4_:
  377|  3.42k|  static inline bool doit(const From &val) {
  378|  3.42k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  3.42k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_14MatchChar8InsnEEENS1_18InstructionWrapperIT_EEv:
  322|  11.2k|  InstructionWrapper<Instruction> emit() {
  323|  11.2k|    size_t startSize = bytes_.size();
  324|  11.2k|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|  11.2k|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|  11.2k|    insn->opcode = OpcodeFor<Instruction>::value;
  327|  11.2k|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|  11.2k|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14MatchChar8InsnEEptEv:
  309|  11.2k|    Instruction *operator->() {
  310|  11.2k|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|  11.2k|      return llvh::cast<Instruction>(base);
  312|  11.2k|    }
_ZN4llvh8isa_implIN6hermes5regex14MatchChar8InsnENS2_4InsnEvE4doitERKS4_:
  377|  11.2k|  static inline bool doit(const From &val) {
  378|  11.2k|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|  11.2k|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_15MatchChar16InsnEEENS1_18InstructionWrapperIT_EEv:
  322|     15|  InstructionWrapper<Instruction> emit() {
  323|     15|    size_t startSize = bytes_.size();
  324|     15|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|     15|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|     15|    insn->opcode = OpcodeFor<Instruction>::value;
  327|     15|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|     15|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchChar16InsnEEptEv:
  309|     15|    Instruction *operator->() {
  310|     15|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|     15|      return llvh::cast<Instruction>(base);
  312|     15|    }
_ZN4llvh8isa_implIN6hermes5regex15MatchChar16InsnENS2_4InsnEvE4doitERKS4_:
  377|     15|  static inline bool doit(const From &val) {
  378|     15|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|     15|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_8GoalInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  11.4k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchNChar8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  3.42k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14MatchChar8InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|  11.2k|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15MatchChar16InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|     15|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_15AlternationInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    276|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_10Jump32InsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|    276|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_14Width1LoopInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|      3|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEptEv:
  309|      2|    Instruction *operator->() {
  310|      2|      Insn *base = reinterpret_cast<Insn *>(&bytes_->at(offset_));
  311|      2|      return llvh::cast<Instruction>(base);
  312|      2|    }
_ZN4llvh8isa_implIN6hermes5regex11BracketInsnENS2_4InsnEvE4doitERKS4_:
  377|      2|  static inline bool doit(const From &val) {
  378|      2|    return val.opcode == hermes::regex::OpcodeFor<To>::value;
  379|      2|  }
_ZN6hermes5regex19RegexBytecodeStream4emitINS0_11BracketInsnEEENS1_18InstructionWrapperIT_EEv:
  322|      1|  InstructionWrapper<Instruction> emit() {
  323|      1|    size_t startSize = bytes_.size();
  324|      1|    bytes_.resize(startSize + sizeof(Instruction), 0);
  325|      1|    Insn *insn = reinterpret_cast<Insn *>(&bytes_[startSize]);
  326|      1|    insn->opcode = OpcodeFor<Instruction>::value;
  327|      1|    return InstructionWrapper<Instruction>(&bytes_, startSize);
  328|      1|  }
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|      1|        : bytes_(bytes), offset_(offset) {}
_ZN6hermes5regex19RegexBytecodeStream18InstructionWrapperINS0_22MatchAnyButNewlineInsnEEC2EPNSt3__16vectorIhNS5_9allocatorIhEEEEj:
  315|      8|        : bytes_(bytes), offset_(offset) {}

_ZN6hermes5regex4Node7compileERKNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEERNS0_19RegexBytecodeStreamE:
   64|  11.4k|  static void compile(const NodeList &nodes, RegexBytecodeStream &bcs) {
   65|  11.4k|    std::vector<Node *> stack;
   66|  11.4k|    stack.insert(stack.end(), nodes.rbegin(), nodes.rend());
   67|  46.3k|    while (!stack.empty()) {
  ------------------
  |  Branch (67:12): [True: 34.9k, False: 11.4k]
  ------------------
   68|  34.9k|      if (auto n = stack.back()->emitStep(bcs)) {
  ------------------
  |  Branch (68:16): [True: 513, False: 34.3k]
  ------------------
   69|    513|        stack.insert(stack.end(), n->rbegin(), n->rend());
   70|  34.3k|      } else {
   71|  34.3k|        stack.pop_back();
   72|  34.3k|      }
   73|  34.9k|    }
   74|  11.4k|  }
_ZN6hermes5regex4Node23matchConstraintsForListERKNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEE:
   77|  11.9k|  static MatchConstraintSet matchConstraintsForList(const NodeList &nodes) {
   78|  11.9k|    MatchConstraintSet result = 0;
   79|   905k|    for (const auto &node : nodes) {
  ------------------
  |  Branch (79:27): [True: 905k, False: 11.9k]
  ------------------
   80|   905k|      result |= node->matchConstraints();
   81|   905k|    }
   82|  11.9k|    return result;
   83|  11.9k|  }
_ZNK6hermes5regex4Node21tryCoalesceCharactersEPN4llvh11SmallVectorIjLj5EEE:
  102|  23.1k|  virtual bool tryCoalesceCharacters(CodePointList *output) const {
  103|  23.1k|    return false;
  104|  23.1k|  }
_ZNK6hermes5regex4Node16matchConstraintsEv:
  110|   905k|  virtual MatchConstraintSet matchConstraints() const {
  111|   905k|    return 0;
  112|   905k|  }
_ZN6hermes5regex4Node11getChildrenEv:
  120|  22.9k|  virtual llvh::SmallVector<NodeList *, 1> getChildren() {
  121|  22.9k|    return {};
  122|  22.9k|  }
_ZN6hermes5regex4Node8emitStepERNS0_19RegexBytecodeStreamE:
  138|  11.4k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) {
  139|  11.4k|    return nullptr;
  140|  11.4k|  }
_ZN6hermes5regex8GoalNode8emitStepERNS0_19RegexBytecodeStreamE:
  146|  11.4k|  NodeList *emitStep(RegexBytecodeStream &bcs) override {
  147|  11.4k|    bcs.emit<GoalInsn>();
  148|  11.4k|    return nullptr;
  149|  11.4k|  }
_ZN6hermes5regex8LoopNodeC2EjjjbttNSt3__16vectorIPNS0_4NodeENS2_9allocatorIS5_EEEE:
  213|      3|        loopeeConstraints_(matchConstraintsForList(loopee_)) {}
_ZNK6hermes5regex8LoopNode16matchConstraintsEv:
  217|      3|  virtual MatchConstraintSet matchConstraints() const override {
  218|      3|    MatchConstraintSet result = 0;
  219|      3|    if (min_ > 0) {
  ------------------
  |  Branch (219:9): [True: 0, False: 3]
  ------------------
  220|      0|      result |= loopeeConstraints_;
  221|      0|    }
  222|      3|    return result | Super::matchConstraints();
  223|      3|  }
_ZN6hermes5regex8LoopNode8emitStepERNS0_19RegexBytecodeStreamE:
  237|      6|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  238|      6|    if (!endLoop_) {
  ------------------
  |  Branch (238:9): [True: 3, False: 3]
  ------------------
  239|       |      // This is the first call to emitStep() for this node, set up the loop
  240|       |      // node
  241|      3|      auto loopEntryPosition = bcs.currentOffset();
  242|      3|      if (isWidth1Loop()) {
  ------------------
  |  Branch (242:11): [True: 3, False: 0]
  ------------------
  243|      3|        assert(
  244|      3|            mexpBegin_ == mexpEnd_ &&
  245|      3|            "Width 1 loops should not contain capture groups");
  246|      0|        auto loopInsn = bcs.emit<Width1LoopInsn>();
  247|      3|        loopInsn->loopId = loopId_;
  248|      3|        loopInsn->min = min_;
  249|      3|        loopInsn->max = max_;
  250|      3|        loopInsn->greedy = greedy_;
  251|      3|        endLoop_ = [loopInsn, &bcs]() mutable {
  252|      3|          loopInsn->notTakenTarget = bcs.currentOffset();
  253|      3|        };
  254|      3|      } else if (isSimpleLoop()) {
  ------------------
  |  Branch (254:18): [True: 0, False: 0]
  ------------------
  255|      0|        auto loopInsn = bcs.emit<BeginSimpleLoopInsn>();
  256|      0|        loopInsn->loopeeConstraints = loopeeConstraints_;
  257|      0|        endLoop_ = [loopInsn, loopEntryPosition, &bcs]() mutable {
  258|      0|          bcs.emit<EndSimpleLoopInsn>()->target = loopEntryPosition;
  259|      0|          loopInsn->notTakenTarget = bcs.currentOffset();
  260|      0|        };
  261|      0|      } else {
  262|      0|        auto loopInsn = bcs.emit<BeginLoopInsn>();
  263|      0|        loopInsn->loopId = loopId_;
  264|      0|        loopInsn->min = min_;
  265|      0|        loopInsn->max = max_;
  266|      0|        loopInsn->mexpBegin = mexpBegin_;
  267|      0|        loopInsn->mexpEnd = mexpEnd_;
  268|      0|        loopInsn->greedy = greedy_;
  269|      0|        loopInsn->loopeeConstraints = loopeeConstraints_;
  270|      0|        endLoop_ = [loopInsn, loopEntryPosition, &bcs]() mutable {
  271|      0|          bcs.emit<EndLoopInsn>()->target = loopEntryPosition;
  272|      0|          loopInsn->notTakenTarget = bcs.currentOffset();
  273|      0|        };
  274|      0|      }
  275|      0|      return &loopee_;
  276|      3|    }
  277|       |    // This is the second call to emitStep, emit the end instructions and set
  278|       |    // notTakenTarget.
  279|      3|    endLoop_();
  280|      3|    endLoop_ = nullptr;
  281|      3|    return nullptr;
  282|      6|  }
_ZNK6hermes5regex8LoopNode12isWidth1LoopEv:
  286|      3|  bool isWidth1Loop() const {
  287|      3|    if (loopee_.size() != 1)
  ------------------
  |  Branch (287:9): [True: 0, False: 3]
  ------------------
  288|      0|      return false;
  289|      3|    return loopee_[0]->matchesExactlyOneCharacter();
  290|      3|  }
_ZN6hermes5regex15AlternationNodeC2ENSt3__16vectorINS3_IPNS0_4NodeENS2_9allocatorIS5_EEEENS6_IS8_EEEE:
  333|    234|        restConstraints_(alternatives_.size()) {
  334|    234|    assert(alternatives_.size() > 1 && "Must give at least 2 alternatives");
  335|       |
  336|      0|    jumps_.reserve(alternatives_.size());
  337|       |
  338|       |    // restConstraints_ needs to be set in reverse order, since each element
  339|       |    // depends on the element after it.
  340|    234|    elementConstraints_.back() = matchConstraintsForList(alternatives_.back());
  341|    234|    restConstraints_.back() = elementConstraints_.back();
  342|       |
  343|    510|    for (auto i = alternatives_.size() - 1; i-- > 0;) {
  ------------------
  |  Branch (343:45): [True: 276, False: 234]
  ------------------
  344|    276|      elementConstraints_[i] = matchConstraintsForList(alternatives_[i]);
  345|    276|      restConstraints_[i] = restConstraints_[i + 1] & elementConstraints_[i];
  346|    276|    }
  347|    234|  }
_ZNK6hermes5regex15AlternationNode16matchConstraintsEv:
  352|    234|  virtual MatchConstraintSet matchConstraints() const override {
  353|    234|    return restConstraints_.front() | Super::matchConstraints();
  354|    234|  }
_ZN6hermes5regex15AlternationNode11getChildrenEv:
  356|    234|  virtual llvh::SmallVector<NodeList *, 1> getChildren() override {
  357|    234|    llvh::SmallVector<NodeList *, 1> ret;
  358|    234|    ret.reserve(alternatives_.size());
  359|    510|    for (auto &alternative : alternatives_) {
  ------------------
  |  Branch (359:28): [True: 510, False: 234]
  ------------------
  360|    510|      ret.push_back(&alternative);
  361|    510|    }
  362|    234|    return ret;
  363|    234|  }
_ZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamE:
  372|    744|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  373|       |    // Instruction stream looks like:
  374|       |    //   [Alternation][PrimaryBranch][Jump][SecondaryBranch][...]
  375|       |    //     |____________________________|____^               ^
  376|       |    //                                  |____________________|
  377|       |    // Where the Alternation has a JumpOffset to its secondary branch.
  378|       |
  379|       |    // Check if the callback is set, if so, call it and check whether this is
  380|       |    // the last call for emitStep
  381|    744|    if (callNext_ && callNext_()) {
  ------------------
  |  Branch (381:9): [True: 510, False: 234]
  |  Branch (381:22): [True: 234, False: 276]
  ------------------
  382|       |      // This is the last call to emitStep, clean up and return nullptr
  383|    234|      jumps_.clear();
  384|    234|      callNext_ = nullptr;
  385|    234|      return nullptr;
  386|    234|    }
  387|       |    // Do not emit an alternation instruction for the very last alternative
  388|       |    // because it is simply the secondary option of the penultimate
  389|       |    // alternative. Note that jumps_.size() here is used to tell us how many
  390|       |    // times this function has already been called
  391|    510|    if (jumps_.size() < alternatives_.size() - 1) {
  ------------------
  |  Branch (391:9): [True: 276, False: 234]
  ------------------
  392|    276|      auto altInsn = bcs.emit<AlternationInsn>();
  393|    276|      altInsn->primaryConstraints = elementConstraints_[jumps_.size()];
  394|    276|      altInsn->secondaryConstraints = restConstraints_[jumps_.size() + 1];
  395|    276|      callNext_ = [this, altInsn, &bcs]() mutable {
  396|    276|        jumps_.push_back(bcs.emit<Jump32Insn>());
  397|    276|        altInsn->secondaryBranch = bcs.currentOffset();
  398|    276|        return false;
  399|    276|      };
  400|    276|      return &alternatives_[jumps_.size()];
  401|    276|    }
  402|       |    // If the program reaches here, it means that the current call to emitStep
  403|       |    // is for the last alternative. On the next call, it should just clean
  404|       |    // things up and return.
  405|    234|    callNext_ = [this, &bcs]() mutable {
  406|       |      // Set the jump instruction for every
  407|       |      // alternation to jump to the end of the block.
  408|    234|      for (auto &jump : jumps_) {
  409|    234|        jump->target = bcs.currentOffset();
  410|    234|      }
  411|    234|      return true;
  412|    234|    };
  413|    234|    return &alternatives_.back();
  414|    510|  }
_ZN6hermes5regex12MatchAnyNodeC2ENS0_11SyntaxFlagsE:
  553|      8|      : unicode_(flags.unicode), dotAll_(flags.dotAll) {}
_ZNK6hermes5regex12MatchAnyNode16matchConstraintsEv:
  555|      8|  virtual MatchConstraintSet matchConstraints() const override {
  556|      8|    return MatchConstraintNonEmpty | Super::matchConstraints();
  557|      8|  }
_ZN6hermes5regex12MatchAnyNode8emitStepERNS0_19RegexBytecodeStreamE:
  565|      8|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  566|      8|    if (unicode_) {
  ------------------
  |  Branch (566:9): [True: 0, False: 8]
  ------------------
  567|      0|      if (dotAll_) {
  ------------------
  |  Branch (567:11): [True: 0, False: 0]
  ------------------
  568|      0|        bcs.emit<U16MatchAnyInsn>();
  569|      0|      } else {
  570|      0|        bcs.emit<U16MatchAnyButNewlineInsn>();
  571|      0|      }
  572|      8|    } else {
  573|      8|      if (dotAll_) {
  ------------------
  |  Branch (573:11): [True: 0, False: 8]
  ------------------
  574|      0|        bcs.emit<MatchAnyInsn>();
  575|      8|      } else {
  576|      8|        bcs.emit<MatchAnyButNewlineInsn>();
  577|      8|      }
  578|      8|    }
  579|      8|    return nullptr;
  580|      8|  }
_ZN6hermes5regex13MatchCharNodeC2EN4llvh11SmallVectorIjLj5EEENS0_11SyntaxFlagsE:
  609|   882k|        unicode_(flags.unicode) {}
_ZNK6hermes5regex13MatchCharNode16matchConstraintsEv:
  611|   882k|  virtual MatchConstraintSet matchConstraints() const override {
  612|   882k|    MatchConstraintSet result = MatchConstraintNonEmpty;
  613|       |    // If our character is not ASCII, then we cannot match pure-ASCII strings.
  614|   882k|    if (!std::all_of(chars_.begin(), chars_.end(), isASCII)) {
  ------------------
  |  Branch (614:9): [True: 15, False: 882k]
  ------------------
  615|     15|      result |= MatchConstraintNonASCII;
  616|     15|    }
  617|   882k|    return result | Super::matchConstraints();
  618|   882k|  }
_ZNK6hermes5regex13MatchCharNode21tryCoalesceCharactersEPN4llvh11SmallVectorIjLj5EEE:
  624|   882k|  bool tryCoalesceCharacters(CodePointList *output) const override {
  625|   882k|    output->append(chars_.begin(), chars_.end());
  626|   882k|    return true;
  627|   882k|  }
_ZNK6hermes5regex13MatchCharNode31mayRequireDecodingSurrogatePairEj:
  631|     18|  bool mayRequireDecodingSurrogatePair(uint32_t cp) const {
  632|     18|    if (!isMemberOfBMP(cp)) {
  ------------------
  |  Branch (632:9): [True: 0, False: 18]
  ------------------
  633|      0|      return true;
  634|      0|    }
  635|     18|    if (unicode_ && (isHighSurrogate(cp) || isLowSurrogate(cp))) {
  ------------------
  |  Branch (635:9): [True: 0, False: 18]
  |  Branch (635:22): [True: 0, False: 0]
  |  Branch (635:45): [True: 0, False: 0]
  ------------------
  636|       |      // We have been asked to emit a literal surrogate into a Unicode string.
  637|       |      // This can only match against an unpaired surrogate in the input string.
  638|       |      // Thus ensure we emit a full 32 bit match, so that we decode surrogate
  639|       |      // pairs from the input.
  640|      0|      return true;
  641|      0|    }
  642|     18|    return false;
  643|     18|  }
_ZNK6hermes5regex13MatchCharNode26matchesExactlyOneCharacterEv:
  646|      3|  virtual bool matchesExactlyOneCharacter() const override {
  647|       |    // If our character is astral it will need to match a surrogate pair, which
  648|       |    // requires two characters.
  649|      3|    return chars_.size() == 1 &&
  ------------------
  |  Branch (649:12): [True: 3, False: 0]
  ------------------
  650|      3|        !mayRequireDecodingSurrogatePair(chars_.front());
  ------------------
  |  Branch (650:9): [True: 3, False: 0]
  ------------------
  651|      3|  }
_ZNK6hermes5regex13MatchCharNode13emitASCIIListEN4llvh8ArrayRefIjEERNS0_19RegexBytecodeStreamE:
  655|  11.2k|      const {
  656|  11.2k|    assert(
  657|  11.2k|        std::all_of(chars.begin(), chars.end(), isASCII) &&
  658|  11.2k|        "All characters should be ASCII");
  659|       |
  660|       |    // Output groups of at least kMinMatchCharNCount, but no more than
  661|       |    // kMaxMatchCharNCount.
  662|      0|    auto remaining = chars;
  663|  14.6k|    while (remaining.size() >= kMinMatchCharNCount) {
  ------------------
  |  Branch (663:12): [True: 3.42k, False: 11.2k]
  ------------------
  664|  3.42k|      size_t groupLen = std::min((size_t)kMaxMatchCharNCount, remaining.size());
  665|  3.42k|      auto group = remaining.take_front(groupLen);
  666|  3.42k|      remaining = remaining.drop_front(groupLen);
  667|       |
  668|  3.42k|      if (icase_) {
  ------------------
  |  Branch (668:11): [True: 0, False: 3.42k]
  ------------------
  669|      0|        bcs.emit<MatchNCharICase8Insn>()->charCount = groupLen;
  670|  3.42k|      } else {
  671|  3.42k|        bcs.emit<MatchNChar8Insn>()->charCount = groupLen;
  672|  3.42k|      }
  673|   871k|      for (char c : group) {
  ------------------
  |  Branch (673:19): [True: 871k, False: 3.42k]
  ------------------
  674|   871k|        bcs.emitChar8(c);
  675|   871k|      }
  676|  3.42k|    }
  677|       |
  678|       |    // Output any remaining as individual characters.
  679|  11.2k|    for (CodePoint c : remaining) {
  ------------------
  |  Branch (679:22): [True: 11.2k, False: 11.2k]
  ------------------
  680|  11.2k|      if (icase_) {
  ------------------
  |  Branch (680:11): [True: 0, False: 11.2k]
  ------------------
  681|      0|        bcs.emit<MatchCharICase8Insn>()->c = c;
  682|  11.2k|      } else {
  683|  11.2k|        bcs.emit<MatchChar8Insn>()->c = c;
  684|  11.2k|      }
  685|  11.2k|    }
  686|  11.2k|  }
_ZNK6hermes5regex13MatchCharNode16emitNonASCIIListEN4llvh8ArrayRefIjEERNS0_19RegexBytecodeStreamE:
  691|  11.2k|      RegexBytecodeStream &bcs) const {
  692|  11.2k|    for (uint32_t c : chars) {
  ------------------
  |  Branch (692:21): [True: 15, False: 11.2k]
  ------------------
  693|     15|      if (mayRequireDecodingSurrogatePair(c)) {
  ------------------
  |  Branch (693:11): [True: 0, False: 15]
  ------------------
  694|      0|        if (icase_) {
  ------------------
  |  Branch (694:13): [True: 0, False: 0]
  ------------------
  695|      0|          bcs.emit<U16MatchCharICase32Insn>()->c = c;
  696|      0|        } else {
  697|      0|          bcs.emit<U16MatchChar32Insn>()->c = c;
  698|      0|        }
  699|     15|      } else {
  700|     15|        if (icase_) {
  ------------------
  |  Branch (700:13): [True: 0, False: 15]
  ------------------
  701|      0|          bcs.emit<MatchCharICase16Insn>()->c = c;
  702|     15|        } else {
  703|     15|          bcs.emit<MatchChar16Insn>()->c = c;
  704|     15|        }
  705|     15|      }
  706|     15|    }
  707|  11.2k|  }
_ZN6hermes5regex13MatchCharNode8emitStepERNS0_19RegexBytecodeStreamE:
  710|  11.2k|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  711|  11.2k|    llvh::ArrayRef<CodePoint> remaining{chars_};
  712|  22.4k|    while (!remaining.empty()) {
  ------------------
  |  Branch (712:12): [True: 11.2k, False: 11.2k]
  ------------------
  713|       |      // Output any run (possibly empty) of ASCII chars.
  714|  11.2k|      auto asciis = remaining.take_while(isASCII);
  715|  11.2k|      emitASCIIList(asciis, bcs);
  716|  11.2k|      remaining = remaining.drop_front(asciis.size());
  717|       |
  718|       |      // Output any run (possibly empty) of non-ASCII chars.
  719|  11.2k|      auto nonAsciis = remaining.take_until(isASCII);
  720|  11.2k|      emitNonASCIIList(nonAsciis, bcs);
  721|  11.2k|      remaining = remaining.drop_front(nonAsciis.size());
  722|  11.2k|    }
  723|  11.2k|    return nullptr;
  724|  11.2k|  }
_ZN6hermes5regex4Node16optimizeNodeListERNSt3__16vectorIPS1_NS2_9allocatorIS4_EEEENS0_11SyntaxFlagsERNS3_INS2_10unique_ptrIS1_NS2_14default_deleteIS1_EEEENS5_ISD_EEEE:
  965|  11.4k|    NodeHolder &nodeHolder) {
  966|  11.4k|  std::vector<NodeList *> stack;
  967|  11.4k|  stack.push_back(&rootNodes);
  968|       |
  969|  23.4k|  while (!stack.empty()) {
  ------------------
  |  Branch (969:10): [True: 11.9k, False: 11.4k]
  ------------------
  970|  11.9k|    auto &nodes = *stack.back();
  971|  11.9k|    stack.pop_back();
  972|       |
  973|       |    // Merge adjacent runs of char nodes.
  974|       |    // For example, [CharNode('a') CharNode('b') CharNode('c')] becomes
  975|       |    // [CharNode('abc')].
  976|  35.1k|    for (size_t idx = 0, max = nodes.size(); idx < max; idx++) {
  ------------------
  |  Branch (976:46): [True: 23.1k, False: 11.9k]
  ------------------
  977|  23.1k|      auto childNodes = nodes[idx]->getChildren();
  978|  23.1k|      stack.insert(stack.end(), childNodes.begin(), childNodes.end());
  979|       |      // Get the range of nodes that can be successfully coalesced.
  980|  23.1k|      CodePointList chars;
  981|  23.1k|      size_t rangeStart = idx;
  982|   905k|      while (idx < max && nodes[idx]->tryCoalesceCharacters(&chars)) {
  ------------------
  |  Branch (982:14): [True: 905k, False: 21]
  |  Branch (982:27): [True: 882k, False: 23.1k]
  ------------------
  983|   882k|        idx++;
  984|   882k|      }
  985|  23.1k|      if (idx - rangeStart >= 2) {
  ------------------
  |  Branch (985:11): [True: 13, False: 23.1k]
  ------------------
  986|       |        // We successfully coalesced some nodes.
  987|       |        // Replace the range with a new node.
  988|     13|        nodeHolder.emplace_back(new MatchCharNode(std::move(chars), flags));
  989|     13|        nodes[rangeStart] = nodeHolder.back().get();
  990|       |        // Fill the remainder of the range with null (we'll clean them up after
  991|       |        // the loop) and skip to the end of the range.
  992|       |        // Note that rangeEnd may be one past the last valid element.
  993|     13|        std::fill(
  994|     13|            nodes.begin() + (rangeStart + 1), nodes.begin() + idx, nullptr);
  995|     13|      }
  996|  23.1k|    }
  997|       |
  998|       |    // Remove any nulls that we introduced.
  999|  11.9k|    nodes.erase(std::remove(nodes.begin(), nodes.end(), nullptr), nodes.end());
 1000|  11.9k|  }
 1001|  11.4k|}
_ZN6hermes5regex4NodeC2Ev:
   60|   905k|  Node() = default;
_ZN6hermes5regex4NodeD2Ev:
   61|   905k|  virtual ~Node() = default;
_ZZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE_clEv:
  395|    276|      callNext_ = [this, altInsn, &bcs]() mutable {
  396|    276|        jumps_.push_back(bcs.emit<Jump32Insn>());
  397|    276|        altInsn->secondaryBranch = bcs.currentOffset();
  398|    276|        return false;
  399|    276|      };
_ZZN6hermes5regex15AlternationNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE0_clEv:
  405|    234|    callNext_ = [this, &bcs]() mutable {
  406|       |      // Set the jump instruction for every
  407|       |      // alternation to jump to the end of the block.
  408|    276|      for (auto &jump : jumps_) {
  ------------------
  |  Branch (408:23): [True: 276, False: 234]
  ------------------
  409|    276|        jump->target = bcs.currentOffset();
  410|    276|      }
  411|    234|      return true;
  412|    234|    };
_ZZN6hermes5regex8LoopNode8emitStepERNS0_19RegexBytecodeStreamEENUlvE_clEv:
  251|      3|        endLoop_ = [loopInsn, &bcs]() mutable {
  252|      3|          loopInsn->notTakenTarget = bcs.currentOffset();
  253|      3|        };
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEEC2ERKS2_bNS0_11SyntaxFlagsE:
  814|      1|        unicode_(flags.unicode) {}
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE16matchConstraintsEv:
  830|      1|  virtual MatchConstraintSet matchConstraints() const override {
  831|      1|    MatchConstraintSet result = 0;
  832|      1|    if (!canMatchASCII())
  ------------------
  |  Branch (832:9): [True: 0, False: 1]
  ------------------
  833|      0|      result |= MatchConstraintNonASCII;
  834|       |
  835|      1|    if (!(codePointSet_.ranges().empty() && classes_.empty()))
  ------------------
  |  Branch (835:9): [True: 1, False: 0]
  |  Branch (835:11): [True: 0, False: 1]
  |  Branch (835:45): [True: 0, False: 0]
  ------------------
  836|      1|      result |= MatchConstraintNonEmpty;
  837|       |
  838|      1|    return result | Super::matchConstraints();
  839|      1|  }
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE13canMatchASCIIEv:
  741|      1|  bool canMatchASCII() const {
  742|       |    // Note we don't have to be concerned with case-insensitive ranges here,
  743|       |    // except in the Unicode path.
  744|       |    // The ES canonicalize() function disallows non-ASCII characters
  745|       |    // from being canonicalized to ASCII. That is, a non-ASCII character in a
  746|       |    // regexp may never match an ASCII input character even in a
  747|       |    // case-insensitive regex, unless the unicode flag is set.
  748|       |    // If we are case-sensitive and unicode, just pessimistically return true.
  749|      1|    if (icase_ && unicode_)
  ------------------
  |  Branch (749:9): [True: 0, False: 1]
  |  Branch (749:19): [True: 0, False: 0]
  ------------------
  750|      0|      return true;
  751|       |
  752|       |    // If we are negated, look only for the range [0, 127] in ranges. We don't
  753|       |    // bother to check for the more elaborate cases.
  754|      1|    if (negate_) {
  ------------------
  |  Branch (754:9): [True: 0, False: 1]
  ------------------
  755|      0|      for (const CodePointRange &range : codePointSet_.ranges()) {
  ------------------
  |  Branch (755:40): [True: 0, False: 0]
  ------------------
  756|      0|        if (range.first == 0 && range.length > 127) {
  ------------------
  |  Branch (756:13): [True: 0, False: 0]
  |  Branch (756:33): [True: 0, False: 0]
  ------------------
  757|       |          // We are an inverted class containing the range [0, 127] or a
  758|       |          // super-range; we cannot match ASCII.
  759|      0|          return false;
  760|      0|        }
  761|      0|      }
  762|      0|      return true;
  763|      1|    } else {
  764|       |      // Not negated.
  765|       |      // All character classes \w, etc. can match ASCII. Also check for
  766|       |      // singletons.
  767|      1|      if (!classes_.empty())
  ------------------
  |  Branch (767:11): [True: 0, False: 1]
  ------------------
  768|      0|        return true;
  769|       |
  770|       |      // Check ranges. It is sufficient to check the start of the range; the end
  771|       |      // is necessarily larger than the start, so the end cannot be ASCII unless
  772|       |      // the start is.
  773|      1|      for (const CodePointRange &range : codePointSet_.ranges()) {
  ------------------
  |  Branch (773:40): [True: 1, False: 0]
  ------------------
  774|      1|        if (isASCII(range.first))
  ------------------
  |  Branch (774:13): [True: 1, False: 0]
  ------------------
  775|      1|          return true;
  776|      1|      }
  777|       |
  778|       |      // None of our components can match ASCII.
  779|      0|      return false;
  780|      1|    }
  781|      1|  }
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE8emitStepERNS0_19RegexBytecodeStreamE:
  847|      1|  virtual NodeList *emitStep(RegexBytecodeStream &bcs) override {
  848|      1|    if (unicode_) {
  ------------------
  |  Branch (848:9): [True: 0, False: 1]
  ------------------
  849|      0|      populateInstruction(bcs, bcs.emit<U16BracketInsn>());
  850|      1|    } else {
  851|      1|      populateInstruction(bcs, bcs.emit<BracketInsn>());
  852|      1|    }
  853|      1|    return nullptr;
  854|      1|  }
_ZNK6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE19populateInstructionINS0_19RegexBytecodeStream18InstructionWrapperINS0_11BracketInsnEEEEEvRS5_T_:
  787|      1|  void populateInstruction(RegexBytecodeStream &bcs, Insn insn) const {
  788|      1|    insn->negate = negate_;
  789|      1|    for (CharacterClass cc : classes_) {
  ------------------
  |  Branch (789:28): [True: 0, False: 1]
  ------------------
  790|      0|      if (!cc.inverted_) {
  ------------------
  |  Branch (790:11): [True: 0, False: 0]
  ------------------
  791|      0|        insn->positiveCharClasses |= cc.type_;
  792|      0|      } else {
  793|      0|        insn->negativeCharClasses |= cc.type_;
  794|      0|      }
  795|      0|    }
  796|       |
  797|       |    // Canonicalize our code point set if needed.
  798|      1|    CodePointSet cps = icase_
  ------------------
  |  Branch (798:24): [True: 0, False: 1]
  ------------------
  799|      1|        ? makeCanonicallyEquivalent(codePointSet_, unicode_)
  800|      1|        : codePointSet_;
  801|      3|    for (const CodePointRange &range : cps.ranges()) {
  ------------------
  |  Branch (801:38): [True: 3, False: 1]
  ------------------
  802|      3|      assert(range.length > 0 && "Ranges should never be empty");
  803|      0|      bcs.emitBracketRange(
  804|      3|          BracketRange32{range.first, range.first + range.length - 1});
  805|      3|    }
  806|      1|    insn->rangeCount = cps.ranges().size();
  807|      1|  }
_ZN6hermes5regex11BracketNodeINS0_16UTF16RegexTraitsEE7addCharEj:
  816|    302|  void addChar(CodePoint c) {
  817|    302|    codePointSet_.add(c);
  818|    302|  }

_ZNK6hermes14CompiledRegExp10getPatternEv:
   61|  11.4k|  llvh::StringRef getPattern() const {
   62|  11.4k|    return pattern_;
   63|  11.4k|  }
_ZNK6hermes14CompiledRegExp8getFlagsEv:
   65|  11.4k|  llvh::StringRef getFlags() const {
   66|  11.4k|    return flags_;
   67|  11.4k|  }
_ZN6hermes14CompiledRegExp10getMappingEv:
   69|  11.4k|  regex::ParsedGroupNamesMapping &getMapping() {
   70|  11.4k|    return mapping_;
   71|  11.4k|  }
_ZN6hermes19UniquingRegExpTable9addRegExpEPNS_14CompiledRegExpE:
  120|  11.4k|  uint32_t addRegExp(CompiledRegExp *regexp) {
  121|  11.4k|    auto iter = keysToIndex_.find(keyFor(*regexp));
  122|  11.4k|    if (iter != keysToIndex_.end())
  ------------------
  |  Branch (122:9): [True: 11.4k, False: 28]
  ------------------
  123|  11.4k|      return iter->second;
  124|       |
  125|     28|    uint32_t index = regexps_.size();
  126|     28|    regexps_.push_back(regexp);
  127|     28|    keysToIndex_[keyFor(*regexps_.back())] = index;
  128|     28|    return index;
  129|  11.4k|  }
_ZNK6hermes19UniquingRegExpTable6keyForERKNS_14CompiledRegExpE:
  146|  11.4k|  KeyType keyFor(const CompiledRegExp &re) const {
  147|  11.4k|    return {re.getPattern(), re.getFlags()};
  148|  11.4k|  }
_ZN6hermes19UniquingRegExpTableC2Ev:
  116|     56|  UniquingRegExpTable() = default;

_ZNK6hermes5regex11SyntaxFlags6toByteEv:
  239|  11.4k|  uint8_t toByte() const {
  240|  11.4k|    uint8_t ret = 0;
  241|  11.4k|    if (global)
  ------------------
  |  Branch (241:9): [True: 8, False: 11.4k]
  ------------------
  242|      8|      ret |= GLOBAL;
  243|  11.4k|    if (ignoreCase)
  ------------------
  |  Branch (243:9): [True: 0, False: 11.4k]
  ------------------
  244|      0|      ret |= ICASE;
  245|  11.4k|    if (multiline)
  ------------------
  |  Branch (245:9): [True: 7.47k, False: 3.98k]
  ------------------
  246|  7.47k|      ret |= MULTILINE;
  247|  11.4k|    if (unicode)
  ------------------
  |  Branch (247:9): [True: 0, False: 11.4k]
  ------------------
  248|      0|      ret |= UCODE;
  249|  11.4k|    if (sticky)
  ------------------
  |  Branch (249:9): [True: 0, False: 11.4k]
  ------------------
  250|      0|      ret |= STICKY;
  251|  11.4k|    if (dotAll)
  ------------------
  |  Branch (251:9): [True: 0, False: 11.4k]
  ------------------
  252|      0|      ret |= DOTALL;
  253|  11.4k|    return ret;
  254|  11.4k|  }
_ZN6hermes5regex11SyntaxFlags8fromByteEh:
  259|   404k|  static SyntaxFlags fromByte(uint8_t byte) {
  260|   404k|    SyntaxFlags ret = {};
  261|   404k|    if (byte & GLOBAL)
  ------------------
  |  Branch (261:9): [True: 404k, False: 234]
  ------------------
  262|   404k|      ret.global = 1;
  263|   404k|    if (byte & ICASE)
  ------------------
  |  Branch (263:9): [True: 0, False: 404k]
  ------------------
  264|      0|      ret.ignoreCase = 1;
  265|   404k|    if (byte & MULTILINE)
  ------------------
  |  Branch (265:9): [True: 0, False: 404k]
  ------------------
  266|      0|      ret.multiline = 1;
  267|   404k|    if (byte & UCODE)
  ------------------
  |  Branch (267:9): [True: 0, False: 404k]
  ------------------
  268|      0|      ret.unicode = 1;
  269|   404k|    if (byte & STICKY)
  ------------------
  |  Branch (269:9): [True: 0, False: 404k]
  ------------------
  270|      0|      ret.sticky = 1;
  271|   404k|    if (byte & DOTALL)
  ------------------
  |  Branch (271:9): [True: 0, False: 404k]
  ------------------
  272|      0|      ret.dotAll = 1;
  273|   404k|    return ret;
  274|   404k|  }
_ZN6hermes5regex11SyntaxFlags10fromStringEN4llvh8ArrayRefIDsEE:
  301|  11.4k|      const llvh::ArrayRef<char16_t> flags) {
  302|       |    // A flags string may contain i,m,g, in any order, but at most once each
  303|  11.4k|    auto error = llvh::NoneType::None;
  304|  11.4k|    SyntaxFlags ret = {};
  305|  11.4k|    for (auto c : flags) {
  ------------------
  |  Branch (305:17): [True: 7.47k, False: 11.4k]
  ------------------
  306|  7.47k|      switch (c) {
  307|      0|        case u'i':
  ------------------
  |  Branch (307:9): [True: 0, False: 7.47k]
  ------------------
  308|      0|          if (ret.ignoreCase)
  ------------------
  |  Branch (308:15): [True: 0, False: 0]
  ------------------
  309|      0|            return error;
  310|      0|          ret.ignoreCase = 1;
  311|      0|          break;
  312|  7.47k|        case u'm':
  ------------------
  |  Branch (312:9): [True: 7.47k, False: 8]
  ------------------
  313|  7.47k|          if (ret.multiline)
  ------------------
  |  Branch (313:15): [True: 0, False: 7.47k]
  ------------------
  314|      0|            return error;
  315|  7.47k|          ret.multiline = 1;
  316|  7.47k|          break;
  317|      8|        case u'g':
  ------------------
  |  Branch (317:9): [True: 8, False: 7.47k]
  ------------------
  318|      8|          if (ret.global)
  ------------------
  |  Branch (318:15): [True: 0, False: 8]
  ------------------
  319|      0|            return error;
  320|      8|          ret.global = 1;
  321|      8|          break;
  322|      0|        case u'u':
  ------------------
  |  Branch (322:9): [True: 0, False: 7.47k]
  ------------------
  323|      0|          if (ret.unicode)
  ------------------
  |  Branch (323:15): [True: 0, False: 0]
  ------------------
  324|      0|            return error;
  325|      0|          ret.unicode = 1;
  326|      0|          break;
  327|      0|        case u'y':
  ------------------
  |  Branch (327:9): [True: 0, False: 7.47k]
  ------------------
  328|      0|          if (ret.sticky)
  ------------------
  |  Branch (328:15): [True: 0, False: 0]
  ------------------
  329|      0|            return error;
  330|      0|          ret.sticky = 1;
  331|      0|          break;
  332|      0|        case u's':
  ------------------
  |  Branch (332:9): [True: 0, False: 7.47k]
  ------------------
  333|      0|          if (ret.dotAll)
  ------------------
  |  Branch (333:15): [True: 0, False: 0]
  ------------------
  334|      0|            return error;
  335|      0|          ret.dotAll = 1;
  336|      0|          break;
  337|      0|        default:
  ------------------
  |  Branch (337:9): [True: 0, False: 7.47k]
  ------------------
  338|      0|          return error;
  339|  7.47k|      }
  340|  7.47k|    }
  341|  11.4k|    return ret;
  342|  11.4k|  }
_ZN6hermes5regex9constantsanENS1_13MatchFlagTypeES2_:
   51|   404k|inline constexpr MatchFlagType operator&(MatchFlagType x, MatchFlagType y) {
   52|   404k|  return MatchFlagType(int(x) & int(y));
   53|   404k|}
_ZN6hermes5regex9constantsorENS1_13MatchFlagTypeES2_:
   55|  48.9k|inline constexpr MatchFlagType operator|(MatchFlagType x, MatchFlagType y) {
   56|  48.9k|  return MatchFlagType(int(x) | int(y));
   57|  48.9k|}
_ZN6hermes5regex9constantsoRERNS1_13MatchFlagTypeES2_:
   68|  48.9k|inline MatchFlagType &operator|=(MatchFlagType &x, MatchFlagType y) {
   69|  48.9k|  x = x | y;
   70|  48.9k|  return x;
   71|  48.9k|}
_ZN6hermes5regex7isASCIIEj:
  194|  2.64M|inline bool isASCII(uint32_t c) {
  195|  2.64M|  return c <= 127;
  196|  2.64M|}

_ZN6hermes17uninitializedCopyIPKDsPDsEET0_T_S5_S4_:
   28|  12.6k|ForwardIt uninitializedCopy(InputIt start, InputIt end, ForwardIt dst) {
   29|  12.6k|  using SrcType = typename std::iterator_traits<InputIt>::value_type;
   30|  12.6k|  using DstType = typename std::iterator_traits<ForwardIt>::value_type;
   31|  12.6k|  if (std::is_trivial<SrcType>::value && std::is_trivial<DstType>::value)
  ------------------
  |  Branch (31:7): [Folded - Ignored]
  |  Branch (31:42): [Folded - Ignored]
  ------------------
   32|  12.6k|    return std::copy(start, end, dst);
   33|      0|  return std::uninitialized_copy(start, end, dst);
   34|  12.6k|}
_ZN6hermes17uninitializedCopyIPKcPcEET0_T_S5_S4_:
   28|   261k|ForwardIt uninitializedCopy(InputIt start, InputIt end, ForwardIt dst) {
   29|   261k|  using SrcType = typename std::iterator_traits<InputIt>::value_type;
   30|   261k|  using DstType = typename std::iterator_traits<ForwardIt>::value_type;
   31|   261k|  if (std::is_trivial<SrcType>::value && std::is_trivial<DstType>::value)
  ------------------
  |  Branch (31:7): [Folded - Ignored]
  |  Branch (31:42): [Folded - Ignored]
  ------------------
   32|   261k|    return std::copy(start, end, dst);
   33|      0|  return std::uninitialized_copy(start, end, dst);
   34|   261k|}

_ZN6hermes28BacktrackingBumpPtrAllocator5StateC2EPS1_:
   61|    880|        : slab(previous->slab), offset(previous->offset), previous(previous) {}
_ZN6hermes28BacktrackingBumpPtrAllocator5StateC2Ev:
   63|    198|    State() : slab(0), offset(0), previous(nullptr) {}
_ZN6hermes28BacktrackingBumpPtrAllocator12allocateHugeEi:
   70|     12|  void *allocateHuge(int size) {
   71|     12|    auto *ptr = checkedMalloc(size);
   72|     12|    state_->hugeAllocs.push_back(
   73|     12|        std::unique_ptr<void, decltype(free) *>(ptr, free));
   74|     12|    return ptr;
   75|     12|  }
_ZN6hermes28BacktrackingBumpPtrAllocator11alignOffsetEmmm:
   79|  7.80M|  alignOffset(uintptr_t base, uintptr_t offset, uintptr_t alignment) {
   80|  7.80M|    return llvh::alignTo(base + offset, alignment) - base;
   81|  7.80M|  }
_ZN6hermes28BacktrackingBumpPtrAllocatorC2Ev:
   87|    198|  explicit BacktrackingBumpPtrAllocator() {
   88|    198|    state_ = new State();
   89|    198|    slabs_.push_back(std::make_unique<Slab>());
   90|    198|  }
_ZN6hermes28BacktrackingBumpPtrAllocatorD2Ev:
   91|    198|  ~BacktrackingBumpPtrAllocator() {
   92|    396|    while (state_)
  ------------------
  |  Branch (92:12): [True: 198, False: 198]
  ------------------
   93|    198|      popScope();
   94|    198|  }
_ZN6hermes28BacktrackingBumpPtrAllocator9pushScopeEv:
   98|    880|  void pushScope() {
   99|    880|    state_ = new State(state_);
  100|    880|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8popScopeEv:
  103|  1.07k|  void popScope() {
  104|  1.07k|    assert(state_ && "No previous allocation scope pushed");
  105|      0|    auto *top = state_;
  106|  1.07k|    state_ = state_->previous;
  107|  1.07k|    delete top;
  108|       |    // We could also clean up unnecessary slabs, but we're likely to need
  109|       |    // then again so don't bother.
  110|  1.07k|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateEmm:
  122|  7.80M|      size_t alignment = kDefaultPlatformAlignment) {
  123|  7.80M|    auto currentSlab =
  124|  7.80M|        reinterpret_cast<uintptr_t>(&slabs_[state_->slab].get()->data);
  125|  7.80M|    state_->offset = alignOffset(currentSlab, state_->offset, alignment);
  126|       |
  127|  7.80M|    if (LLVM_UNLIKELY(size > SlabSize || state_->offset + size > SlabSize)) {
  ------------------
  |  |  189|  15.6M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.94k, False: 7.80M]
  |  |  |  Branch (189:53): [True: 12, False: 7.80M]
  |  |  |  Branch (189:53): [True: 1.92k, False: 7.80M]
  |  |  ------------------
  ------------------
  128|  1.94k|      return allocateNewSlab(size, alignment);
  129|  1.94k|    }
  130|       |
  131|  7.80M|    auto *ptr = (void *)(currentSlab + state_->offset);
  132|  7.80M|    state_->offset += size;
  133|  7.80M|    return ptr;
  134|  7.80M|  }
_ZN6hermes15AllocationScopeC2ERNS_28BacktrackingBumpPtrAllocatorE:
  145|    880|      : allocator_(allocator) {
  146|    880|    allocator_.pushScope();
  147|    880|  }
_ZN6hermes15AllocationScopeD2Ev:
  148|    880|  ~AllocationScope() {
  149|    880|    allocator_.popScope();
  150|    880|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateINS_12UniqueStringEEEPT_mm:
  114|   140k|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|   140k|    int size = sizeof(T) * num;
  116|   140k|    return static_cast<T *>(Allocate(size, alignment));
  117|   140k|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateIcEEPT_mm:
  114|   140k|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|   140k|    int size = sizeof(T) * num;
  116|   140k|    return static_cast<T *>(Allocate(size, alignment));
  117|   140k|  }
_ZN6hermes28BacktrackingBumpPtrAllocator8AllocateINS_6parser13RegExpLiteralEEEPT_mm:
  114|  34.1k|  inline T *Allocate(size_t num = 1, size_t alignment = sizeof(double)) {
  115|  34.1k|    int size = sizeof(T) * num;
  116|  34.1k|    return static_cast<T *>(Allocate(size, alignment));
  117|  34.1k|  }

_ZN6hermes6bigint19UniquingBigIntTableC2Ev:
  468|     56|  UniquingBigIntTable() = default;

_ZN6hermes14checkedMalloc2Emm:
   27|  2.36k|checkedMalloc2(size_t count, size_t size) {
   28|  2.36k|  size_t totalSize = count * size;
   29|  2.36k|  if (LLVM_UNLIKELY(size > 0 && totalSize / size != count)) {
  ------------------
  |  |  189|  4.73k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.36k]
  |  |  |  Branch (189:53): [True: 2.36k, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 2.36k]
  |  |  ------------------
  ------------------
   30|      0|    hermes_fatal("malloc failure");
   31|      0|  }
   32|  2.36k|  return checkedMalloc(totalSize);
   33|  2.36k|}

_ZN6hermes8toRValueIjEET_S1_:
  128|  9.89k|T toRValue(T x) {
  129|  9.89k|  return x;
  130|  9.89k|}

_ZN6hermes15truncateToInt32Ed:
   37|    451|inline int32_t truncateToInt32(double d) {
   38|       |  // Check of the value can be converted to integer without loss. We want to
   39|       |  // use the widest available integer because this conversion will be much
   40|       |  // faster than the bit-twiddling slow path.
   41|    451|  intmax_t fast = (intmax_t)d;
   42|    451|  if (LLVM_LIKELY(fast == d))
  ------------------
  |  |  188|    451|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 214, False: 237]
  |  |  ------------------
  ------------------
   43|    214|    return (int32_t)fast;
   44|    237|  return truncateToInt32SlowPath(d);
   45|    451|}
_ZN6hermes12toArrayIndexEN4llvh9StringRefE:
   97|   141k|inline OptValue<uint32_t> toArrayIndex(llvh::StringRef str) {
   98|   141k|  return toArrayIndex(str.begin(), str.end());
   99|   141k|}
_ZN6hermes18doubleToArrayIndexEd:
  104|  1.34M|inline OptValue<uint32_t> doubleToArrayIndex(double d) {
  105|  1.34M|  uint32_t index = (uint32_t)d;
  106|  1.34M|  if (index == d && index != 0xFFFFFFFFu)
  ------------------
  |  Branch (106:7): [True: 1.34M, False: 0]
  |  Branch (106:21): [True: 1.34M, False: 0]
  ------------------
  107|  1.34M|    return index;
  108|      0|  return llvh::None;
  109|  1.34M|}
_ZN6hermes12toArrayIndexIPKcEENS_8OptValueIjEET_S5_:
   62|   388k|OptValue<uint32_t> toArrayIndex(IT first, IT last) {
   63|       |  /// Empty string is invalid.
   64|   388k|  if (first == last)
  ------------------
  |  Branch (64:7): [True: 2.51k, False: 385k]
  ------------------
   65|  2.51k|    return llvh::None;
   66|       |
   67|       |  // Leading 0 is special.
   68|   385k|  if (*first == '0') {
  ------------------
  |  Branch (68:7): [True: 12, False: 385k]
  ------------------
   69|     12|    ++first;
   70|       |    // Just "0"?
   71|     12|    if (first == last)
  ------------------
  |  Branch (71:9): [True: 12, False: 0]
  ------------------
   72|     12|      return 0;
   73|       |    // Leading 0 is invalid otherwise.
   74|      0|    return llvh::None;
   75|     12|  }
   76|       |
   77|   385k|  uint32_t res = 0;
   78|   810k|  do {
   79|   810k|    auto ch = *first;
   80|   810k|    if (ch < '0' || ch > '9')
  ------------------
  |  Branch (80:9): [True: 5.88k, False: 805k]
  |  Branch (80:21): [True: 245k, False: 559k]
  ------------------
   81|   251k|      return llvh::None;
   82|   559k|    uint64_t tmp = (uint64_t)res * 10 + (ch - '0');
   83|       |    // Check for overflow.
   84|   559k|    if (tmp & ((uint64_t)0xFFFFFFFFu << 32))
  ------------------
  |  Branch (84:9): [True: 0, False: 559k]
  ------------------
   85|      0|      return llvh::None;
   86|   559k|    res = (uint32_t)tmp;
   87|   559k|  } while (++first != last);
  ------------------
  |  Branch (87:12): [True: 425k, False: 133k]
  ------------------
   88|       |
   89|       |  // 0xFFFFFFFF is not a valid array index.
   90|   133k|  if (res == 0xFFFFFFFFu)
  ------------------
  |  Branch (90:7): [True: 0, False: 133k]
  ------------------
   91|      0|    return llvh::None;
   92|       |
   93|   133k|  return res;
   94|   133k|}
_ZN6hermes12toArrayIndexIPKDsEENS_8OptValueIjEET_S5_:
   62|    222|OptValue<uint32_t> toArrayIndex(IT first, IT last) {
   63|       |  /// Empty string is invalid.
   64|    222|  if (first == last)
  ------------------
  |  Branch (64:7): [True: 0, False: 222]
  ------------------
   65|      0|    return llvh::None;
   66|       |
   67|       |  // Leading 0 is special.
   68|    222|  if (*first == '0') {
  ------------------
  |  Branch (68:7): [True: 0, False: 222]
  ------------------
   69|      0|    ++first;
   70|       |    // Just "0"?
   71|      0|    if (first == last)
  ------------------
  |  Branch (71:9): [True: 0, False: 0]
  ------------------
   72|      0|      return 0;
   73|       |    // Leading 0 is invalid otherwise.
   74|      0|    return llvh::None;
   75|      0|  }
   76|       |
   77|    222|  uint32_t res = 0;
   78|    222|  do {
   79|    222|    auto ch = *first;
   80|    222|    if (ch < '0' || ch > '9')
  ------------------
  |  Branch (80:9): [True: 12, False: 210]
  |  Branch (80:21): [True: 210, False: 0]
  ------------------
   81|    222|      return llvh::None;
   82|      0|    uint64_t tmp = (uint64_t)res * 10 + (ch - '0');
   83|       |    // Check for overflow.
   84|      0|    if (tmp & ((uint64_t)0xFFFFFFFFu << 32))
  ------------------
  |  Branch (84:9): [True: 0, False: 0]
  ------------------
   85|      0|      return llvh::None;
   86|      0|    res = (uint32_t)tmp;
   87|      0|  } while (++first != last);
  ------------------
  |  Branch (87:12): [True: 0, False: 0]
  ------------------
   88|       |
   89|       |  // 0xFFFFFFFF is not a valid array index.
   90|      0|  if (res == 0xFFFFFFFFu)
  ------------------
  |  Branch (90:7): [True: 0, False: 0]
  ------------------
   91|      0|    return llvh::None;
   92|       |
   93|      0|  return res;
   94|      0|}
_ZN6hermes17charLetterToLowerIcEET_S1_:
  123|  1.08M|inline T charLetterToLower(T ch) {
  124|  1.08M|  return ch | 32;
  125|  1.08M|}
JSLexer.cpp:_ZN6hermes23parseIntWithRadixDigitsILb1EN4llvh8ArrayRefIcEEZNS_6parser7JSLexer10scanNumberENS5_14GrammarContextEE3$_2EEbT0_iT1_:
  134|     24|bool parseIntWithRadixDigits(Iterable str, int radix, Callback digitCallback) {
  135|     24|  assert(
  136|     24|      radix >= 2 && radix <= 36 && "Invalid radix passed to parseIntWithRadix");
  137|      0|  assert(str.begin() != str.end() && "Empty string");
  138|     62|  for (auto it = str.begin(); it != str.end(); ++it) {
  ------------------
  |  Branch (138:31): [True: 38, False: 24]
  ------------------
  139|     38|    auto c = *it;
  140|     38|    auto cLow = charLetterToLower(c);
  141|     38|    if ('0' <= c && c <= '9' && c < '0' + radix) {
  ------------------
  |  Branch (141:9): [True: 38, False: 0]
  |  Branch (141:21): [True: 38, False: 0]
  |  Branch (141:33): [True: 38, False: 0]
  ------------------
  142|     38|      digitCallback(c - '0');
  143|     38|    } else if ('a' <= cLow && cLow < 'a' + radix - 10) {
  ------------------
  |  Branch (143:16): [True: 0, False: 0]
  |  Branch (143:31): [True: 0, False: 0]
  ------------------
  144|      0|      digitCallback(cLow - 'a' + 0xa);
  145|      0|    } else if (AllowNumericSeparator && LLVM_UNLIKELY(c == '_')) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (145:16): [Folded - Ignored]
  ------------------
  146|       |      // Ensure the '_' is in a valid location.
  147|       |      // It can only be between two existing digits.
  148|      0|      if (it == str.begin() || it == str.end() - 1) {
  ------------------
  |  Branch (148:11): [True: 0, False: 0]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|      0|        return false;
  150|      0|      }
  151|       |      // Note that the previous character must not be '_' if the current
  152|       |      // character is '_', because we would have returned None.
  153|       |      // So just check if the next character is '_'.
  154|      0|      char next = *(it + 1);
  155|      0|      if (next == '_') {
  ------------------
  |  Branch (155:11): [True: 0, False: 0]
  ------------------
  156|      0|        return false;
  157|      0|      }
  158|      0|    } else {
  159|      0|      return false;
  160|      0|    }
  161|     38|  }
  162|     24|  return true;
  163|     24|}
_ZN6hermes17parseIntWithRadixILb1EN4llvh8ArrayRefIcEEEENS_8OptValueIdEET0_i:
  171|  1.07M|OptValue<double> parseIntWithRadix(Iterable str, int radix) {
  172|  1.07M|  double result = 0;
  173|  1.07M|  bool success = parseIntWithRadixDigits<AllowNumericSeparator>(
  174|  1.07M|      str, radix, [&result, radix](uint8_t d) {
  175|  1.07M|        result *= radix;
  176|  1.07M|        result += d;
  177|  1.07M|      });
  178|  1.07M|  if (!success)
  ------------------
  |  Branch (178:7): [True: 0, False: 1.07M]
  ------------------
  179|      0|    return llvh::None;
  180|       |
  181|       |  // The largest value that fits in the 53-bit mantissa (2**53).
  182|  1.07M|  const double MAX_MANTISSA = 9007199254740992.0;
  183|  1.07M|  if (result >= MAX_MANTISSA && llvh::isPowerOf2_32(radix)) {
  ------------------
  |  Branch (183:7): [True: 114, False: 1.07M]
  |  Branch (183:33): [True: 0, False: 114]
  ------------------
  184|       |    // If the result is too high, manually reconstruct the double if
  185|       |    // the radix is 2, 4, 8, 16, 32.
  186|       |    // Go through the digits bit by bit, and manually round when necessary.
  187|      0|    result = 0;
  188|       |
  189|       |    // Keep track of how far along parsing is using this enum.
  190|      0|    enum Mode {
  191|      0|      LEADING_ZERO, // Haven't seen a set bit yet.
  192|      0|      MANTISSA, // Lower bits that allow exact representation.
  193|      0|      EXP_LOW_BIT, // Lowest bit of the exponent (determine rounding).
  194|      0|      EXP_LEADING_ZERO, // Zeros in the exponent.
  195|      0|      EXPONENT, // Seen a set bit in the exponent.
  196|      0|    };
  197|       |
  198|      0|    size_t remainingMantissa = 53;
  199|      0|    double expFactor = 0.0;
  200|      0|    size_t curDigit = 0;
  201|       |
  202|      0|    bool lastMantissaBit = false;
  203|      0|    bool lowestExponentBit = false;
  204|       |
  205|      0|    Mode curMode = Mode::LEADING_ZERO;
  206|      0|    auto itr = str.begin();
  207|      0|    auto e = str.end();
  208|      0|    for (size_t bitMask = 0;;) {
  209|      0|      if (bitMask == 0) {
  ------------------
  |  Branch (209:11): [True: 0, False: 0]
  ------------------
  210|       |        // Only need to do this check every log2(radix) iterations.
  211|      0|        if (itr == e) {
  ------------------
  |  Branch (211:13): [True: 0, False: 0]
  ------------------
  212|      0|          break;
  213|      0|        }
  214|       |        // We know it fits in 7 bits after the first pass.
  215|      0|        char c = (char)*itr;
  216|      0|        if (AllowNumericSeparator && LLVM_UNLIKELY(c == '_')) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (216:13): [Folded - Ignored]
  ------------------
  217|      0|          ++itr;
  218|      0|          continue;
  219|      0|        }
  220|      0|        auto cLow = charLetterToLower(c);
  221|      0|        if ('0' <= c && c <= '9') {
  ------------------
  |  Branch (221:13): [True: 0, False: 0]
  |  Branch (221:25): [True: 0, False: 0]
  ------------------
  222|      0|          curDigit = c - '0';
  223|      0|        } else {
  224|       |          // Must be valid, else we would have returned NaN on first pass.
  225|      0|          assert('a' <= cLow && cLow < 'a' + radix - 10);
  226|      0|          curDigit = cLow - 'a' + 0xa;
  227|      0|        }
  228|      0|        ++itr;
  229|       |        // Reset bitmask to look at the first bit.
  230|      0|        bitMask = radix >> 1;
  231|      0|      }
  232|      0|      bool curBit = (curDigit & bitMask) != 0;
  233|      0|      bitMask >>= 1;
  234|       |
  235|      0|      switch (curMode) {
  ------------------
  |  Branch (235:15): [True: 0, False: 0]
  ------------------
  236|      0|        case Mode::LEADING_ZERO:
  ------------------
  |  Branch (236:9): [True: 0, False: 0]
  ------------------
  237|       |          // Go through the string until we hit a nonzero bit.
  238|      0|          if (curBit) {
  ------------------
  |  Branch (238:15): [True: 0, False: 0]
  ------------------
  239|      0|            --remainingMantissa;
  240|      0|            result = 1;
  241|       |            // No more leading zeros.
  242|      0|            curMode = Mode::MANTISSA;
  243|      0|          }
  244|      0|          break;
  245|      0|        case Mode::MANTISSA:
  ------------------
  |  Branch (245:9): [True: 0, False: 0]
  ------------------
  246|       |          // Read into the lower bits of the mantissa (plain binary).
  247|      0|          result *= 2;
  248|      0|          result += curBit;
  249|      0|          --remainingMantissa;
  250|      0|          if (remainingMantissa == 0) {
  ------------------
  |  Branch (250:15): [True: 0, False: 0]
  ------------------
  251|       |            // Out of bits, set the last bit and go to the next curMode.
  252|      0|            lastMantissaBit = curBit;
  253|      0|            curMode = Mode::EXP_LOW_BIT;
  254|      0|          }
  255|      0|          break;
  256|      0|        case Mode::EXP_LOW_BIT:
  ------------------
  |  Branch (256:9): [True: 0, False: 0]
  ------------------
  257|      0|          lowestExponentBit = curBit;
  258|      0|          expFactor = 2.0;
  259|      0|          curMode = Mode::EXP_LEADING_ZERO;
  260|      0|          break;
  261|      0|        case Mode::EXP_LEADING_ZERO:
  ------------------
  |  Branch (261:9): [True: 0, False: 0]
  ------------------
  262|      0|          if (curBit) {
  ------------------
  |  Branch (262:15): [True: 0, False: 0]
  ------------------
  263|      0|            curMode = Mode::EXPONENT;
  264|      0|          }
  265|      0|          expFactor *= 2.0;
  266|      0|          break;
  267|      0|        case Mode::EXPONENT:
  ------------------
  |  Branch (267:9): [True: 0, False: 0]
  ------------------
  268|      0|          expFactor *= 2.0;
  269|      0|          break;
  270|      0|      }
  271|      0|    }
  272|      0|    switch (curMode) {
  ------------------
  |  Branch (272:13): [True: 0, False: 0]
  ------------------
  273|      0|      case Mode::LEADING_ZERO:
  ------------------
  |  Branch (273:7): [True: 0, False: 0]
  ------------------
  274|      0|      case Mode::MANTISSA:
  ------------------
  |  Branch (274:7): [True: 0, False: 0]
  ------------------
  275|      0|      case Mode::EXP_LOW_BIT:
  ------------------
  |  Branch (275:7): [True: 0, False: 0]
  ------------------
  276|       |        // Nothing to do here, already read those in.
  277|      0|        break;
  278|      0|      case Mode::EXP_LEADING_ZERO:
  ------------------
  |  Branch (278:7): [True: 0, False: 0]
  ------------------
  279|       |        // Rounding up.
  280|      0|        result += lowestExponentBit && lastMantissaBit;
  ------------------
  |  Branch (280:19): [True: 0, False: 0]
  |  Branch (280:40): [True: 0, False: 0]
  ------------------
  281|      0|        result *= expFactor;
  282|      0|        break;
  283|      0|      case Mode::EXPONENT:
  ------------------
  |  Branch (283:7): [True: 0, False: 0]
  ------------------
  284|       |        // Rounding up.
  285|      0|        result += lowestExponentBit;
  286|      0|        result *= expFactor;
  287|      0|        break;
  288|      0|    }
  289|      0|  }
  290|  1.07M|  return result;
  291|  1.07M|}
_ZN6hermes23parseIntWithRadixDigitsILb1EN4llvh8ArrayRefIcEEZNS_17parseIntWithRadixILb1ES3_EENS_8OptValueIdEET0_iEUlhE_EEbS7_iT1_:
  134|  1.07M|bool parseIntWithRadixDigits(Iterable str, int radix, Callback digitCallback) {
  135|  1.07M|  assert(
  136|  1.07M|      radix >= 2 && radix <= 36 && "Invalid radix passed to parseIntWithRadix");
  137|      0|  assert(str.begin() != str.end() && "Empty string");
  138|  2.15M|  for (auto it = str.begin(); it != str.end(); ++it) {
  ------------------
  |  Branch (138:31): [True: 1.08M, False: 1.07M]
  ------------------
  139|  1.08M|    auto c = *it;
  140|  1.08M|    auto cLow = charLetterToLower(c);
  141|  1.08M|    if ('0' <= c && c <= '9' && c < '0' + radix) {
  ------------------
  |  Branch (141:9): [True: 1.08M, False: 0]
  |  Branch (141:21): [True: 1.08M, False: 0]
  |  Branch (141:33): [True: 1.08M, False: 0]
  ------------------
  142|  1.08M|      digitCallback(c - '0');
  143|  1.08M|    } else if ('a' <= cLow && cLow < 'a' + radix - 10) {
  ------------------
  |  Branch (143:16): [True: 0, False: 0]
  |  Branch (143:31): [True: 0, False: 0]
  ------------------
  144|      0|      digitCallback(cLow - 'a' + 0xa);
  145|      0|    } else if (AllowNumericSeparator && LLVM_UNLIKELY(c == '_')) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (145:16): [Folded - Ignored]
  ------------------
  146|       |      // Ensure the '_' is in a valid location.
  147|       |      // It can only be between two existing digits.
  148|      0|      if (it == str.begin() || it == str.end() - 1) {
  ------------------
  |  Branch (148:11): [True: 0, False: 0]
  |  Branch (148:32): [True: 0, False: 0]
  ------------------
  149|      0|        return false;
  150|      0|      }
  151|       |      // Note that the previous character must not be '_' if the current
  152|       |      // character is '_', because we would have returned None.
  153|       |      // So just check if the next character is '_'.
  154|      0|      char next = *(it + 1);
  155|      0|      if (next == '_') {
  ------------------
  |  Branch (155:11): [True: 0, False: 0]
  ------------------
  156|      0|        return false;
  157|      0|      }
  158|      0|    } else {
  159|      0|      return false;
  160|      0|    }
  161|  1.08M|  }
  162|  1.07M|  return true;
  163|  1.07M|}
_ZZN6hermes17parseIntWithRadixILb1EN4llvh8ArrayRefIcEEEENS_8OptValueIdEET0_iENKUlhE_clEh:
  174|  1.08M|      str, radix, [&result, radix](uint8_t d) {
  175|  1.08M|        result *= radix;
  176|  1.08M|        result += d;
  177|  1.08M|      });

_ZN6hermes10hashStringIDsEEjN4llvh8ArrayRefIT_EE:
   30|  71.8k|uint32_t hashString(llvh::ArrayRef<T> str) {
   31|  71.8k|  static_assert(
   32|  71.8k|      sizeof(JenkinsHash) == sizeof(uint32_t), "Jenkins Hash must be 32-bit");
   33|  71.8k|  hermes::JenkinsHash hash = hermes::JenkinsHashInit;
   34|  4.41M|  for (const T c : str) {
  ------------------
  |  Branch (34:18): [True: 4.41M, False: 71.8k]
  ------------------
   35|  4.41M|    hash = hermes::updateJenkinsHash(hash, c);
   36|  4.41M|  }
   37|  71.8k|  return hash;
   38|  71.8k|}
_ZN6hermes10hashStringIcEEjN4llvh8ArrayRefIT_EE:
   30|   589k|uint32_t hashString(llvh::ArrayRef<T> str) {
   31|   589k|  static_assert(
   32|   589k|      sizeof(JenkinsHash) == sizeof(uint32_t), "Jenkins Hash must be 32-bit");
   33|   589k|  hermes::JenkinsHash hash = hermes::JenkinsHashInit;
   34|  16.5M|  for (const T c : str) {
  ------------------
  |  Branch (34:18): [True: 16.5M, False: 589k]
  ------------------
   35|  16.5M|    hash = hermes::updateJenkinsHash(hash, c);
   36|  16.5M|  }
   37|   589k|  return hash;
   38|   589k|}

_ZN6hermes23InternalIdentifierMakerC2ERNS_11StringTableE:
   23|   114k|      : stringTable_(stringTable) {}

_ZN6hermes15jenkins_details11jenkinsMix1Ej:
   24|  20.9M|constexpr JenkinsHash jenkinsMix1(JenkinsHash hash) {
   25|  20.9M|  return hash + (hash << 10);
   26|  20.9M|}
_ZN6hermes15jenkins_details11jenkinsMix2Ej:
   28|  20.9M|constexpr JenkinsHash jenkinsMix2(JenkinsHash hash) {
   29|  20.9M|  return hash ^ (hash >> 6);
   30|  20.9M|}
_ZN6hermes15jenkins_details10jenkinsAddIDsEEjjT_:
   20|  4.41M|constexpr JenkinsHash jenkinsAdd(JenkinsHash hash, CharT c) {
   21|  4.41M|  return hash + static_cast<JenkinsHash>(c);
   22|  4.41M|}
_ZN6hermes17updateJenkinsHashIDsEEjjT_:
   37|  4.41M|constexpr JenkinsHash updateJenkinsHash(JenkinsHash hash, CharT c) {
   38|  4.41M|  using namespace jenkins_details;
   39|  4.41M|  static_assert(
   40|  4.41M|      sizeof(CharT) <= sizeof(char16_t),
   41|  4.41M|      "Jenkins hash algorithm only hashes characters");
   42|  4.41M|  return jenkinsMix2(jenkinsMix1(jenkinsAdd(hash, c)));
   43|  4.41M|}
_ZN6hermes15jenkins_details10jenkinsAddIcEEjjT_:
   20|  16.5M|constexpr JenkinsHash jenkinsAdd(JenkinsHash hash, CharT c) {
   21|  16.5M|  return hash + static_cast<JenkinsHash>(c);
   22|  16.5M|}
_ZN6hermes17updateJenkinsHashIcEEjjT_:
   37|  16.5M|constexpr JenkinsHash updateJenkinsHash(JenkinsHash hash, CharT c) {
   38|  16.5M|  using namespace jenkins_details;
   39|  16.5M|  static_assert(
   40|  16.5M|      sizeof(CharT) <= sizeof(char16_t),
   41|  16.5M|      "Jenkins hash algorithm only hashes characters");
   42|  16.5M|  return jenkinsMix2(jenkinsMix1(jenkinsAdd(hash, c)));
   43|  16.5M|}

_ZN6hermes22HermesLLVMMemoryBufferC2ENSt3__110unique_ptrINS_6BufferENS1_14default_deleteIS3_EEEEN4llvh9StringRefEb:
   45|     99|      : name_(name), data_(std::move(buffer)) {
   46|     99|    auto start = reinterpret_cast<const char *>(data_->data());
   47|     99|    auto end = start + data_->size();
   48|     99|    init(start, end, requiresNullTerminator);
   49|     99|  }
_ZNK6hermes22HermesLLVMMemoryBuffer19getBufferIdentifierEv:
   53|    261|  virtual llvh::StringRef getBufferIdentifier() const override {
   54|    261|    return name_;
   55|    261|  }

_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEcvbEv:
   53|  3.53M|  explicit operator bool() const {
   54|  3.53M|    return hasValue_;
   55|  3.53M|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEE8hasValueEv:
   50|  5.11M|  bool hasValue() const {
   51|  5.11M|    return hasValue_;
   52|  5.11M|  }
_ZNK6hermes8OptValueIjEcvbEv:
   53|  2.14M|  explicit operator bool() const {
   54|  2.14M|    return hasValue_;
   55|  2.14M|  }
_ZN6hermes8OptValueIbEC2EN4llvh8NoneTypeE:
   81|  1.88k|  OptValue(llvh::NoneType) : value_(-1) {}
_ZN6hermes8OptValueIbEC2Eb:
   83|  4.19k|  OptValue(bool v) : value_(v ? 1 : 0) {}
_ZNK6hermes8OptValueIbE8hasValueEv:
   89|  10.5k|  bool hasValue() const {
   90|  10.5k|    return value_ >= 0;
   91|  10.5k|  }
_ZNK6hermes8OptValueIbEcvbEv:
   92|      4|  explicit operator bool() const {
   93|      4|    return hasValue();
   94|      4|  }
_ZNK6hermes8OptValueIbE8getValueEv:
   96|  4.21k|  bool getValue() const {
   97|  4.21k|    assert(hasValue());
   98|      0|    return value_ > 0;
   99|  4.21k|  }
_ZNK6hermes8OptValueIjE8hasValueEv:
   50|  7.19M|  bool hasValue() const {
   51|  7.19M|    return hasValue_;
   52|  7.19M|  }
_ZNK6hermes8OptValueIjEdeEv:
   61|  3.62M|  const T &operator*() const {
   62|  3.62M|    return getValue();
   63|  3.62M|  }
_ZNK6hermes8OptValueIjE8getValueEv:
   57|  3.85M|  const T &getValue() const {
   58|  3.85M|    assert(hasValue());
   59|      0|    return value_;
   60|  3.85M|  }
_ZNK6hermes8OptValueImEcvbEv:
   53|    657|  explicit operator bool() const {
   54|    657|    return hasValue_;
   55|    657|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEptEv:
   65|  32.8k|  const T *operator->() const {
   66|  32.8k|    return &getValue();
   67|  32.8k|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEE8getValueEv:
   57|  65.6k|  const T &getValue() const {
   58|  65.6k|    assert(hasValue());
   59|      0|    return value_;
   60|  65.6k|  }
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEE8hasValueEv:
   50|  65.6k|  bool hasValue() const {
   51|  65.6k|    return hasValue_;
   52|  65.6k|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEdeEv:
   61|  3.68M|  const T &operator*() const {
   62|  3.68M|    return getValue();
   63|  3.68M|  }
_ZNK6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEE8getValueEv:
   57|  3.68M|  const T &getValue() const {
   58|  3.68M|    assert(hasValue());
   59|      0|    return value_;
   60|  3.68M|  }
_ZN6hermes8OptValueIjEC2ERKj:
   44|  2.29M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEcvbEv:
   53|  32.8k|  explicit operator bool() const {
   54|  32.8k|    return hasValue_;
   55|  32.8k|  }
_ZN6hermes8OptValueIjEC2EN4llvh8NoneTypeE:
   42|   371k|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_3hbc19DebugSourceLocationEEC2ERKS2_:
   44|  32.8k|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueIjEC2Ev:
   43|   852k|  explicit OptValue() : hasValue_(false) {}
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEEcvbEv:
   53|  11.7M|  explicit operator bool() const {
   54|  11.7M|    return hasValue_;
   55|  11.7M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEEdeEv:
   61|  2.33M|  const T &operator*() const {
   62|  2.33M|    return getValue();
   63|  2.33M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEE8getValueEv:
   57|  2.33M|  const T &getValue() const {
   58|  2.33M|    assert(hasValue());
   59|      0|    return value_;
   60|  2.33M|  }
_ZNK6hermes8OptValueINS_2vm8Metadata9ArrayDataEE8hasValueEv:
   50|  2.33M|  bool hasValue() const {
   51|  2.33M|    return hasValue_;
   52|  2.33M|  }
_ZN6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEC2EN4llvh8NoneTypeE:
   42|  1.27M|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm15DictPropertyMap11PropertyPosEEC2ERKS3_:
   44|  3.68M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_2vm13PropertyFlagsEEC2EN4llvh8NoneTypeE:
   42|   354k|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm8SymbolIDEEC2Ev:
   43|     24|  explicit OptValue() : hasValue_(false) {}
_ZNK6hermes8OptValueINS_2vm13PropertyFlagsEEcvbEv:
   53|   354k|  explicit operator bool() const {
   54|   354k|    return hasValue_;
   55|   354k|  }
_ZN6hermes8OptValueINS_2vm16RegExpMatchRangeEEC2ERKS2_:
   44|   404k|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueIdEC2ERKd:
   44|  1.07M|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueIdE8getValueEv:
   57|  1.07M|  const T &getValue() const {
   58|  1.07M|    assert(hasValue());
   59|      0|    return value_;
   60|  1.07M|  }
_ZNK6hermes8OptValueIdE8hasValueEv:
   50|  1.07M|  bool hasValue() const {
   51|  1.07M|    return hasValue_;
   52|  1.07M|  }
_ZNK6hermes8OptValueIdEcvbEv:
   53|  1.07M|  explicit operator bool() const {
   54|  1.07M|    return hasValue_;
   55|  1.07M|  }
_ZN6hermes8OptValueIN8facebook6hermes8debugger8StepModeEEC2EN4llvh8NoneTypeE:
   42|     99|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZNK6hermes8OptValueIN4llvh9StringRefEE8hasValueEv:
   50|    532|  bool hasValue() const {
   51|    532|    return hasValue_;
   52|    532|  }
_ZNK6hermes8OptValueIN4llvh9StringRefEEptEv:
   65|     16|  const T *operator->() const {
   66|     16|    return &getValue();
   67|     16|  }
_ZNK6hermes8OptValueIN4llvh9StringRefEE8getValueEv:
   57|    528|  const T &getValue() const {
   58|    528|    assert(hasValue());
   59|      0|    return value_;
   60|    528|  }
_ZNK6hermes8OptValueIN4llvh9StringRefEEdeEv:
   61|    512|  const T &operator*() const {
   62|    512|    return getValue();
   63|    512|  }
_ZN6hermes8OptValueINS_2vm8Metadata9ArrayDataEEC2Ev:
   43|    316|  explicit OptValue() : hasValue_(false) {}
_ZN6hermes8OptValueINS_2vm8Metadata9ArrayDataEEC2ERKS3_:
   44|      8|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueINS_2vm16RegExpMatchRangeEEdeEv:
   61|   404k|  const T &operator*() const {
   62|   404k|    return getValue();
   63|   404k|  }
_ZNK6hermes8OptValueINS_2vm16RegExpMatchRangeEE8getValueEv:
   57|  3.63M|  const T &getValue() const {
   58|  3.63M|    assert(hasValue());
   59|      0|    return value_;
   60|  3.63M|  }
_ZNK6hermes8OptValueINS_2vm16RegExpMatchRangeEEptEv:
   65|  3.23M|  const T *operator->() const {
   66|  3.23M|    return &getValue();
   67|  3.23M|  }
_ZNK6hermes8OptValueINS_2vm16RegExpMatchRangeEEcvbEv:
   53|   404k|  explicit operator bool() const {
   54|   404k|    return hasValue_;
   55|   404k|  }
_ZNK6hermes8OptValueINS_2vm16RegExpMatchRangeEE8hasValueEv:
   50|  3.63M|  bool hasValue() const {
   51|  3.63M|    return hasValue_;
   52|  3.63M|  }
_ZNK6hermes8OptValueImEdeEv:
   61|    340|  const T &operator*() const {
   62|    340|    return getValue();
   63|    340|  }
_ZNK6hermes8OptValueImE8getValueEv:
   57|    340|  const T &getValue() const {
   58|    340|    assert(hasValue());
   59|      0|    return value_;
   60|    340|  }
_ZNK6hermes8OptValueImE8hasValueEv:
   50|    340|  bool hasValue() const {
   51|    340|    return hasValue_;
   52|    340|  }
_ZN6hermes8OptValueImEC2EN4llvh8NoneTypeE:
   42|    317|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermes8OptValueImEC2ERKm:
   44|    340|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueINS_3hbc19DebugSourceLocationEEdeEv:
   61|  32.7k|  const T &operator*() const {
   62|  32.7k|    return getValue();
   63|  32.7k|  }
_ZN6hermes8OptValueIN4llvh9StringRefEEC2ERKS2_:
   44|   572k|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZNK6hermes8OptValueIN4llvh9StringRefEEcvbEv:
   53|   286k|  explicit operator bool() const {
   54|   286k|    return hasValue_;
   55|   286k|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEE8hasValueEv:
   50|     36|  bool hasValue() const {
   51|     36|    return hasValue_;
   52|     36|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEEdeEv:
   61|     10|  const T &operator*() const {
   62|     10|    return getValue();
   63|     10|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEE8getValueEv:
   57|     10|  const T &getValue() const {
   58|     10|    assert(hasValue());
   59|      0|    return value_;
   60|     10|  }
_ZNK6hermes8OptValueINS_6parser9TokenKindEEcvbEv:
   53|      8|  explicit operator bool() const {
   54|      8|    return hasValue_;
   55|      8|  }
_ZN6hermes8OptValueINS_9SubsystemEEC2ERKS1_:
   44|     18|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_6parser9TokenKindEEC2ERKS2_:
   44|     26|  OptValue(const T &v) : value_(v), hasValue_(true) {}
_ZN6hermes8OptValueINS_6parser9TokenKindEEC2EN4llvh8NoneTypeE:
   42|     22|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZN6hermeseqINS_6parser9TokenKindES2_EEbRKNS_8OptValueIT_EERKNS3_IT0_EE:
  110|      6|bool operator==(const OptValue<T> &a, const OptValue<U> &b) {
  111|      6|  if (a && b)
  ------------------
  |  Branch (111:7): [True: 2, False: 4]
  |  Branch (111:12): [True: 2, False: 0]
  ------------------
  112|      2|    return *a == *b;
  113|      4|  return a.hasValue() == b.hasValue();
  114|      6|}
_ZN6hermes8OptValueINS_9SubsystemEEC2EN4llvh8NoneTypeE:
   42|     99|  OptValue(llvh::NoneType) : hasValue_(false) {}
_ZNK6hermes8OptValueINS_9SubsystemEEcvbEv:
   53|  1.26k|  explicit operator bool() const {
   54|  1.26k|    return hasValue_;
   55|  1.26k|  }
_ZNK6hermes8OptValueINS_9SubsystemEEdeEv:
   61|  1.02k|  const T &operator*() const {
   62|  1.02k|    return getValue();
   63|  1.02k|  }
_ZNK6hermes8OptValueINS_9SubsystemEE8getValueEv:
   57|  1.02k|  const T &getValue() const {
   58|  1.02k|    assert(hasValue());
   59|      0|    return value_;
   60|  1.02k|  }
_ZNK6hermes8OptValueINS_9SubsystemEE8hasValueEv:
   50|  1.02k|  bool hasValue() const {
   51|  1.02k|    return hasValue_;
   52|  1.02k|  }

_ZN6hermes11PerfSectionC2EPKcS2_:
  106|   115k|  PerfSection(const char *name, const char *category = nullptr) {}

_ZNK6hermes17SimpleDiagHandler10haveErrorsEv:
   23|    129|  bool haveErrors() const {
   24|    129|    return !firstMessage_.getMessage().empty();
   25|    129|  }
_ZNK6hermes17SimpleDiagHandler15getFirstMessageEv:
   28|     43|  const llvh::SMDiagnostic &getFirstMessage() const {
   29|     43|    assert(haveErrors() && "getFirstMessage() called without errors");
   30|      0|    return firstMessage_;
   31|     43|  }

_ZNK6hermes18SourceErrorManager12SourceCoords7isValidEv:
   87|      9|    bool isValid() const {
   88|      9|      return bufId != 0;
   89|      9|    }
_ZNK6hermes18SourceErrorManager12SourceCoords18isSameSourceLineAsERKS1_:
   91|      7|    bool isSameSourceLineAs(const SourceCoords &c) const {
   92|      7|      return isValid() && bufId == c.bufId && line == c.line;
  ------------------
  |  Branch (92:14): [True: 7, False: 0]
  |  Branch (92:27): [True: 7, False: 0]
  |  Branch (92:47): [True: 5, False: 2]
  ------------------
   93|      7|    }
_ZN6hermes18SourceErrorManager11MessageDataC2ENS0_8DiagKindEN4llvh5SMLocENS3_7SMRangeEONSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
  207|     18|        : dk(dk), loc(loc), sm(sm), msg(std::move(msg)) {}
_ZN6hermes18SourceErrorManager16isWarningEnabledENS_7WarningE:
  250|    162|  bool isWarningEnabled(Warning warning) {
  251|    162|    return warningStatuses_.test((unsigned)warning);
  252|    162|  }
_ZN6hermes18SourceErrorManager13setErrorLimitEj:
  271|    198|  void setErrorLimit(unsigned errorLimit) {
  272|    198|    errorLimit_ = errorLimit == 0 ? UINT_MAX : errorLimit;
  ------------------
  |  Branch (272:19): [True: 99, False: 99]
  ------------------
  273|    198|  }
_ZNK6hermes18SourceErrorManager13getErrorLimitEv:
  275|     99|  unsigned int getErrorLimit() const {
  276|     99|    return errorLimit_ == UINT_MAX ? 0 : errorLimit_;
  ------------------
  |  Branch (276:12): [True: 99, False: 0]
  ------------------
  277|     99|  }
_ZNK6hermes18SourceErrorManager19isErrorLimitReachedEv:
  280|  1.05k|  bool isErrorLimitReached() const {
  281|  1.05k|    return errorLimitReached_;
  282|  1.05k|  }
_ZN6hermes18SourceErrorManager22clearErrorLimitReachedEv:
  285|    198|  void clearErrorLimitReached() {
  286|    198|    messageCount_[DK_Error] = 0;
  287|    198|    errorLimitReached_ = false;
  288|    198|  }
_ZNK6hermes18SourceErrorManager16isWarningAnErrorENS_7WarningE:
  292|    162|  bool isWarningAnError(Warning warning) const {
  293|    162|    return warningsAreErrors_.test((unsigned)warning);
  294|    162|  }
_ZN6hermes18SourceErrorManager16setWarningStatusENS_7WarningEb:
  316|     99|  void setWarningStatus(Warning warning, bool enabled) {
  317|     99|    warningStatuses_[(unsigned)warning] = enabled;
  318|     99|  }
_ZN6hermes18SourceErrorManager14setDiagHandlerEPFvRKN4llvh12SMDiagnosticEPvES5_:
  330|    198|  void setDiagHandler(DiagHandlerTy DH, void *ctx = nullptr) {
  331|    198|    sm_.setDiagHandler(DH, ctx);
  332|    198|  }
_ZNK6hermes18SourceErrorManager14getDiagHandlerEv:
  335|     99|  DiagHandlerTy getDiagHandler() const {
  336|     99|    return sm_.getDiagHandler();
  337|     99|  }
_ZNK6hermes18SourceErrorManager14getDiagContextEv:
  340|     99|  void *getDiagContext() const {
  341|     99|    return sm_.getDiagContext();
  342|     99|  }
_ZNK6hermes18SourceErrorManager17isVirtualBufferIdEj:
  363|    517|  inline bool isVirtualBufferId(unsigned bufId) const {
  364|    517|    return (bufId & kVirtualBufIdTag) != 0;
  365|    517|  }
_ZNK6hermes18SourceErrorManager15getSourceBufferEj:
  370|    263|  const llvh::MemoryBuffer *getSourceBuffer(unsigned bufId) const {
  371|    263|    assert(!isVirtualBufferId(bufId) && "virtual buffers cannot be accessed");
  372|      0|    return sm_.getMemoryBuffer(bufId);
  373|    263|  }
_ZNK6hermes18SourceErrorManager19getSourceMappingUrlEj:
  383|     56|  llvh::StringRef getSourceMappingUrl(unsigned bufId) const {
  384|     56|    const auto it = sourceMappingUrls_.find(bufId);
  385|     56|    if (it == sourceMappingUrls_.end()) {
  ------------------
  |  Branch (385:9): [True: 56, False: 0]
  ------------------
  386|     56|      return "";
  387|     56|    }
  388|      0|    return it->second;
  389|     56|  }
_ZNK6hermes18SourceErrorManager12getSourceUrlEj:
  438|     56|  llvh::StringRef getSourceUrl(unsigned bufId) const {
  439|     56|    const auto it = sourceUrls_.find(bufId);
  440|     56|    if (it != sourceUrls_.end()) {
  ------------------
  |  Branch (440:9): [True: 0, False: 56]
  ------------------
  441|      0|      return it->second;
  442|      0|    }
  443|     56|    return getBufferFileName(bufId);
  444|     56|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh5SMLocENS1_7SMRangeERKNS1_5TwineENS_9SubsystemE:
  473|      5|      Subsystem subsystem = Subsystem::Unspecified) {
  474|      5|    message(DK_Error, loc, rng, msg, subsystem);
  475|      5|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh7SMRangeERKNS1_5TwineENS_9SubsystemE:
  502|     32|      Subsystem subsystem = Subsystem::Unspecified) {
  503|     32|    message(DK_Error, rng, msg, subsystem);
  504|     32|  }
_ZN6hermes18SourceErrorManager7warningEN4llvh7SMRangeERKNS1_5TwineENS_9SubsystemE:
  508|    162|      Subsystem subsystem = Subsystem::Unspecified) {
  509|    162|    warning(Warning::Misc, rng, msg, subsystem);
  510|    162|  }
_ZN6hermes18SourceErrorManager7warningENS_7WarningEN4llvh7SMRangeERKNS2_5TwineENS_9SubsystemE:
  515|    162|      Subsystem subsystem = Subsystem::Unspecified) {
  516|    162|    message(DK_Warning, rng.Start, rng, msg, w, subsystem);
  517|    162|  }
_ZN6hermes18SourceErrorManager5errorEN4llvh5SMLocERKNS1_5TwineENS_9SubsystemE:
  528|  1.05k|      Subsystem subsystem = Subsystem::Unspecified) {
  529|  1.05k|    message(DK_Error, loc, msg, subsystem);
  530|  1.05k|  }
_ZN6hermes18SourceErrorManager4noteEN4llvh5SMLocERKNS1_5TwineENS_9SubsystemE:
  547|     16|      Subsystem subsystem = Subsystem::Unspecified) {
  548|     16|    message(DK_Note, loc, msg, subsystem);
  549|     16|  }
_ZNK6hermes18SourceErrorManager15getMessageCountENS0_8DiagKindE:
  551|    485|  unsigned getMessageCount(DiagKind dk) const {
  552|    485|    assert(dk <= DK_Note);
  553|      0|    return messageCount_[dk];
  554|    485|  }
_ZNK6hermes18SourceErrorManager13getErrorCountEv:
  556|    485|  unsigned getErrorCount() const {
  557|    485|    return getMessageCount(DK_Error);
  558|    485|  }
_ZN6hermes18SourceErrorManager16combineIntoRangeEN4llvh5SMLocES2_:
  567|      5|  static SMRange combineIntoRange(SMLoc a, SMLoc b) {
  568|      5|    if (a.getPointer() < b.getPointer())
  ------------------
  |  Branch (568:9): [True: 5, False: 0]
  ------------------
  569|      5|      return SMRange(a, SMLoc::getFromPointer(b.getPointer() + 1));
  570|      0|    else
  571|      0|      return SMRange(b, SMLoc::getFromPointer(a.getPointer() + 1));
  572|      5|  }
_ZN6hermes18SourceErrorManager23SaveAndSuppressMessagesC2EPS0_NS_9SubsystemE:
  588|     18|        : sm_(sm), messagesSuppressed_(sm->suppressMessages_) {
  589|     18|      sm->suppressMessages_ = subsystem;
  590|     18|    }
_ZN6hermes18SourceErrorManager23SaveAndSuppressMessagesD2Ev:
  591|     18|    ~SaveAndSuppressMessages() {
  592|     18|      sm_->suppressMessages_ = messagesSuppressed_;
  593|     18|    }
_ZN6hermes18SourceErrorManager21SaveAndBufferMessagesC2EPS0_:
  602|     65|    SaveAndBufferMessages(SourceErrorManager *sm) : sm_(sm) {
  603|     65|      sm->enableBuffering();
  604|     65|    }
_ZN6hermes18SourceErrorManager21SaveAndBufferMessagesD2Ev:
  605|     65|    ~SaveAndBufferMessages() {
  606|     65|      sm_->disableBuffering();
  607|     65|    }
_ZN6hermes18SourceErrorManager12SourceCoordsC2Ev:
   83|  1.00M|    SourceCoords() = default;

_ZN6hermes20AreStatisticsEnabledEv:
   33|    336|inline bool AreStatisticsEnabled() {
   34|    336|  return llvh::AreStatisticsEnabled();
   35|    336|}

_ZN6hermes16StatsAccumulatorIddEC2Ev:
   24|    594|  StatsAccumulator() = default;
_ZN6hermes16StatsAccumulatorIjmEC2Ev:
   24|    594|  StatsAccumulator() = default;
_ZN6hermes16StatsAccumulatorIddE6recordEd:
   27|  1.74k|  inline void record(T value) {
   28|  1.74k|    if (n_ == 0) {
  ------------------
  |  Branch (28:9): [True: 41, False: 1.70k]
  ------------------
   29|     41|      min_ = value;
   30|     41|      max_ = value;
   31|  1.70k|    } else {
   32|  1.70k|      min_ = std::min(min_, value);
   33|  1.70k|      max_ = std::max(max_, value);
   34|  1.70k|    }
   35|  1.74k|    n_++;
   36|  1.74k|    sum_ += value;
   37|  1.74k|    double valD = static_cast<double>(value);
   38|  1.74k|    sumOfSquares_ += valD * valD;
   39|  1.74k|  }
_ZN6hermes16StatsAccumulatorIjmE6recordEj:
   27|  2.01k|  inline void record(T value) {
   28|  2.01k|    if (n_ == 0) {
  ------------------
  |  Branch (28:9): [True: 46, False: 1.97k]
  ------------------
   29|     46|      min_ = value;
   30|     46|      max_ = value;
   31|  1.97k|    } else {
   32|  1.97k|      min_ = std::min(min_, value);
   33|  1.97k|      max_ = std::max(max_, value);
   34|  1.97k|    }
   35|  2.01k|    n_++;
   36|  2.01k|    sum_ += value;
   37|  2.01k|    double valD = static_cast<double>(value);
   38|  2.01k|    sumOfSquares_ += valD * valD;
   39|  2.01k|  }

_ZN6hermes15StringSetVector6insertEN4llvh9StringRefE:
   74|   315k|inline StringSetVector::size_type StringSetVector::insert(llvh::StringRef str) {
   75|   315k|  assert(stringsToIndex_.size() == stringsStorage_.size());
   76|      0|  auto it = stringsToIndex_.find(str);
   77|   315k|  if (it != stringsToIndex_.end()) {
  ------------------
  |  Branch (77:7): [True: 313k, False: 2.24k]
  ------------------
   78|   313k|    return it->second;
   79|   313k|  }
   80|       |
   81|  2.24k|  size_type storageSize = stringsStorage_.size();
   82|  2.24k|  assert(
   83|  2.24k|      storageSize < std::numeric_limits<index_type>::max() &&
   84|  2.24k|      "StringSetVector cannot store that many elements");
   85|      0|  auto newIdx = static_cast<index_type>(storageSize);
   86|  2.24k|  assert(storageSize == newIdx && "casted value unexpectedly different");
   87|      0|  stringsStorage_.emplace_back(str.begin(), str.end());
   88|  2.24k|  auto inserted = stringsToIndex_.insert({stringsStorage_.back(), newIdx});
   89|  2.24k|  assert(inserted.second && "String already exists as key in mapping.");
   90|      0|  (void)inserted;
   91|       |
   92|  2.24k|  return storageSize;
   93|   315k|}
_ZN6hermes15StringSetVector4findEN4llvh9StringRefE:
   95|   281k|inline StringSetVector::iterator StringSetVector::find(llvh::StringRef str) {
   96|   281k|  auto it = stringsToIndex_.find(str);
   97|   281k|  if (it == stringsToIndex_.end()) {
  ------------------
  |  Branch (97:7): [True: 0, False: 281k]
  ------------------
   98|      0|    return end();
   99|      0|  }
  100|       |
  101|   281k|  return stringsStorage_.begin() + it->second;
  102|   281k|}
_ZNK6hermes15StringSetVector4findEN4llvh9StringRefE:
  105|   281k|    llvh::StringRef str) const {
  106|   281k|  return const_cast<StringSetVector *>(this)->find(str);
  107|   281k|}
_ZNK6hermes15StringSetVectorixEm:
  109|  2.77k|inline const std::string &StringSetVector::operator[](size_t i) const {
  110|  2.77k|  return stringsStorage_[i];
  111|  2.77k|}
_ZNK6hermes15StringSetVector4sizeEv:
  113|   561k|inline size_t StringSetVector::size() const {
  114|   561k|  return stringsStorage_.size();
  115|   561k|}
_ZN6hermes15StringSetVector5beginEv:
  121|     56|inline StringSetVector::iterator StringSetVector::begin() {
  122|     56|  return stringsStorage_.begin();
  123|     56|}
_ZNK6hermes15StringSetVector5beginEv:
  125|   281k|inline StringSetVector::const_iterator StringSetVector::begin() const {
  126|   281k|  return stringsStorage_.begin();
  127|   281k|}
_ZN6hermes15StringSetVector3endEv:
  129|     56|inline StringSetVector::iterator StringSetVector::end() {
  130|     56|  return stringsStorage_.end();
  131|     56|}
_ZNK6hermes15StringSetVector3endEv:
  133|   281k|inline StringSetVector::const_iterator StringSetVector::end() const {
  134|   281k|  return stringsStorage_.end();
  135|   281k|}
_ZN6hermes15StringSetVectorC2Ev:
   28|    491|  StringSetVector() = default;
_ZN6hermes15StringSetVectorC2EOS0_:
   31|    112|  StringSetVector(StringSetVector &&) = default;
_ZN6hermes15StringSetVectoraSEOS0_:
   32|     56|  StringSetVector &operator=(StringSetVector &&) = default;

_ZN6hermes12UniqueStringC2EN4llvh9StringRefE:
   41|   140k|  explicit UniqueString(llvh::StringRef str) : str_(str){};
_ZNK6hermes12UniqueString3strEv:
   43|  2.55M|  const llvh::StringRef &str() const {
   44|  2.55M|    return str_;
   45|  2.55M|  }
_ZN6hermes10IdentifierC2EPNS_12UniqueStringE:
   67|  2.81M|  explicit Identifier(PtrType ptr) : ptr_(ptr) {}
_ZNK6hermes10Identifier7isValidEv:
   70|   459k|  bool isValid() const {
   71|   459k|    return ptr_ != nullptr;
   72|   459k|  }
_ZNK6hermes10Identifier20getUnderlyingPointerEv:
   76|  1.44M|  PtrType getUnderlyingPointer() const {
   77|  1.44M|    return ptr_;
   78|  1.44M|  }
_ZN6hermes10Identifier14getFromPointerEPNS_12UniqueStringE:
   80|  2.81M|  static Identifier getFromPointer(UniqueString *ptr) {
   81|  2.81M|    return Identifier(ptr);
   82|  2.81M|  }
_ZNK6hermes10IdentifiereqES0_:
   84|  2.36M|  bool operator==(Identifier RHS) const {
   85|  2.36M|    return ptr_ == RHS.ptr_;
   86|  2.36M|  }
_ZNK6hermes10Identifier3strEv:
   91|  1.52M|  const llvh::StringRef &str() const {
   92|  1.52M|    return ptr_->str();
   93|  1.52M|  }
_ZN6hermes11StringTableC2ERNS_28BacktrackingBumpPtrAllocatorE:
  114|     99|  explicit StringTable(Allocator &allocator) : allocator_(allocator){};
_ZN6hermes11StringTable9getStringEN4llvh9StringRefE:
  117|  4.01M|  UniqueString *getString(llvh::StringRef name) {
  118|       |    // Already in the map?
  119|  4.01M|    auto it = strMap_.find(name);
  120|  4.01M|    if (it != strMap_.end())
  ------------------
  |  Branch (120:9): [True: 3.87M, False: 140k]
  ------------------
  121|  3.87M|      return it->second;
  122|       |
  123|       |    // Allocate a zero-terminated copy of the string
  124|   140k|    auto *str = new (allocator_.Allocate<UniqueString>())
  125|   140k|        UniqueString(zeroTerminate(allocator_, name));
  126|   140k|    strMap_.insert({str->str(), str});
  127|   140k|    return str;
  128|  4.01M|  }
_ZN6hermes11StringTable13getIdentifierEN4llvh9StringRefE:
  131|   763k|  Identifier getIdentifier(llvh::StringRef name) {
  132|   763k|    return Identifier::getFromPointer(getString(name));
  133|   763k|  }
_ZN4llvh12DenseMapInfoIN6hermes10IdentifierEE11getEmptyKeyEv:
  143|   697k|  static inline hermes::Identifier getEmptyKey() {
  144|   697k|    return hermes::Identifier::getFromPointer(
  145|   697k|        DenseMapInfo<hermes::UniqueString *>::getEmptyKey());
  146|   697k|  }
_ZN4llvh12DenseMapInfoIN6hermes10IdentifierEE15getTombstoneKeyEv:
  147|   691k|  static inline hermes::Identifier getTombstoneKey() {
  148|   691k|    return hermes::Identifier::getFromPointer(
  149|   691k|        DenseMapInfo<hermes::UniqueString *>::getTombstoneKey());
  150|   691k|  }
_ZN4llvh12DenseMapInfoIN6hermes10IdentifierEE12getHashValueES2_:
  151|   659k|  static inline unsigned getHashValue(hermes::Identifier id) {
  152|   659k|    return DenseMapInfo<hermes::UniqueString *>::getHashValue(
  153|   659k|        id.getUnderlyingPointer());
  154|   659k|  }
_ZN4llvh12DenseMapInfoIN6hermes10IdentifierEE7isEqualES2_S2_:
  155|  2.36M|  static inline bool isEqual(hermes::Identifier a, hermes::Identifier b) {
  156|  2.36M|    return a == b;
  157|  2.36M|  }
_ZN6hermes13zeroTerminateINS_28BacktrackingBumpPtrAllocatorEEEN4llvh9StringRefERT_S3_:
   24|   140k|llvh::StringRef zeroTerminate(Allocator &allocator, llvh::StringRef str) {
   25|       |  // Allocate a copy of the name, adding a trailing \0 for convenience.
   26|   140k|  auto *s = allocator.template Allocate<char>(str.size() + 1);
   27|   140k|  auto end = std::copy(str.begin(), str.end(), s);
   28|   140k|  *end = 0; // Zero terminate string.
   29|       |
   30|       |  // NOTE: returning the original size.
   31|   140k|  return llvh::StringRef(s, str.size());
   32|   140k|}
_ZN6hermes10IdentifierC2Ev:
   62|  1.23M|  explicit Identifier() = default;

_ZN6hermes16StringTableEntryC2Ejjb:
   34|  8.64k|      : offset_(offset), length_(length) {
   35|  8.64k|    if (isUTF16) {
  ------------------
  |  Branch (35:9): [True: 273, False: 8.37k]
  ------------------
   36|    273|      length_ |= UTF16_MASK;
   37|    273|    }
   38|  8.64k|  }
_ZNK6hermes16StringTableEntry9getOffsetEv:
   43|  50.3k|  uint32_t getOffset() const {
   44|  50.3k|    return offset_;
   45|  50.3k|  }
_ZNK6hermes16StringTableEntry9getLengthEv:
   48|  14.5k|  uint32_t getLength() const {
   49|  14.5k|    return length_ & (~UTF16_MASK);
   50|  14.5k|  }
_ZNK6hermes16StringTableEntry7isUTF16Ev:
   53|  10.3k|  bool isUTF16() const {
   54|  10.3k|    return length_ & UTF16_MASK;
   55|  10.3k|  }

_ZN6hermes11isUTF8StartEc:
   28|  17.6M|inline bool isUTF8Start(char ch) {
   29|  17.6M|  return (ch & 0x80) != 0;
   30|  17.6M|}
_ZN6hermes10isAllASCIIEPKcS1_:
   68|    151|inline bool isAllASCII(const char *start, const char *end) {
   69|    151|  return isAllASCII((const uint8_t *)start, (const uint8_t *)end);
   70|    151|}
_ZN6hermes10decodeUTF8ILb0EZNS_6parser7JSLexer10decodeUTF8EvEUlRKN4llvh5TwineEE_EEjRPKcT0_:
  188|    107|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|    107|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|    107|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 103]
  |  |  ------------------
  ------------------
  190|      4|    return *from++;
  191|       |
  192|    103|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|    107|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_6parser7JSLexer10decodeUTF8EvEUlRKN4llvh5TwineEE_EEjRPKcT0_:
   77|    103|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|    103|  uint32_t ch = (uint32_t)from[0];
   79|    103|  uint32_t result;
   80|       |
   81|    103|  assert(isUTF8Start(ch));
   82|       |
   83|    103|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|    103|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 33, False: 70]
  |  |  ------------------
  ------------------
   84|     33|    uint32_t ch1 = (uint32_t)from[1];
   85|     33|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|     33|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 15, False: 18]
  |  |  ------------------
  ------------------
   86|     15|      from += 1;
   87|     15|      error("Invalid UTF-8 continuation byte");
   88|     15|      return UNICODE_REPLACEMENT_CHARACTER;
   89|     15|    }
   90|       |
   91|     18|    from += 2;
   92|     18|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|     18|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|     70|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|     70|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 66, False: 4]
  |  |  ------------------
  ------------------
   99|     66|    uint32_t ch1 = (uint32_t)from[1];
  100|     66|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|    132|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 66]
  |  |  |  Branch (189:53): [True: 0, False: 66]
  |  |  |  Branch (189:53): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     66|    uint32_t ch2 = (uint32_t)from[2];
  106|     66|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|    132|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 66]
  |  |  |  Branch (189:53): [True: 0, False: 66]
  |  |  |  Branch (189:53): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     66|    from += 3;
  112|     66|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     66|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     66|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 66]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     66|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    136|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 64]
  |  |  |  Branch (189:53): [True: 2, False: 64]
  |  |  |  Branch (189:53): [True: 2, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     66|            result >= UNICODE_SURROGATE_FIRST &&
  119|     66|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      2|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      2|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      2|    }
  123|       |
  124|     66|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 0, False: 4]
  ------------------
  125|      0|    uint32_t ch1 = (uint32_t)from[1];
  126|      0|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|      0|    uint32_t ch2 = (uint32_t)from[2];
  132|      0|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|      0|    uint32_t ch3 = (uint32_t)from[3];
  138|      0|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|      0|    from += 4;
  144|      0|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|      0|        (ch3 & 0x3F);
  146|      0|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|      0|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|      4|  } else {
  156|      4|    from += 1;
  157|      4|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      4|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      4|  }
  160|       |
  161|     82|  return result;
  162|    103|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_6parser7JSLexer19_decodeUTF8SlowPathERPKcEUlRKN4llvh5TwineEE_EEjS5_T0_:
   77|  19.0k|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|  19.0k|  uint32_t ch = (uint32_t)from[0];
   79|  19.0k|  uint32_t result;
   80|       |
   81|  19.0k|  assert(isUTF8Start(ch));
   82|       |
   83|  19.0k|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|  19.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.33k, False: 17.7k]
  |  |  ------------------
  ------------------
   84|  1.33k|    uint32_t ch1 = (uint32_t)from[1];
   85|  1.33k|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|  1.33k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 1.33k]
  |  |  ------------------
  ------------------
   86|      2|      from += 1;
   87|      2|      error("Invalid UTF-8 continuation byte");
   88|      2|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      2|    }
   90|       |
   91|  1.33k|    from += 2;
   92|  1.33k|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|  1.33k|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|  1.33k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.33k]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|  17.7k|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|  17.7k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 15.6k, False: 2.05k]
  |  |  ------------------
  ------------------
   99|  15.6k|    uint32_t ch1 = (uint32_t)from[1];
  100|  15.6k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  31.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 345, False: 15.3k]
  |  |  |  Branch (189:53): [True: 337, False: 15.3k]
  |  |  |  Branch (189:53): [True: 8, False: 15.3k]
  |  |  ------------------
  ------------------
  101|    345|      from += 1;
  102|    345|      error("Invalid UTF-8 continuation byte");
  103|    345|      return UNICODE_REPLACEMENT_CHARACTER;
  104|    345|    }
  105|  15.3k|    uint32_t ch2 = (uint32_t)from[2];
  106|  15.3k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  30.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15.3k]
  |  |  |  Branch (189:53): [True: 0, False: 15.3k]
  |  |  |  Branch (189:53): [True: 0, False: 15.3k]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|  15.3k|    from += 3;
  112|  15.3k|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|  15.3k|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|  15.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15.3k]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|  15.3k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  30.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 15.3k]
  |  |  |  Branch (189:53): [True: 4, False: 15.3k]
  |  |  |  Branch (189:53): [True: 0, False: 4]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|  15.3k|            result >= UNICODE_SURROGATE_FIRST &&
  119|  15.3k|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      0|    }
  123|       |
  124|  15.3k|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 1.43k, False: 617]
  ------------------
  125|  1.43k|    uint32_t ch1 = (uint32_t)from[1];
  126|  1.43k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.85k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 16, False: 1.42k]
  |  |  |  Branch (189:53): [True: 16, False: 1.42k]
  |  |  |  Branch (189:53): [True: 0, False: 1.42k]
  |  |  ------------------
  ------------------
  127|     16|      from += 1;
  128|     16|      error("Invalid UTF-8 continuation byte");
  129|     16|      return UNICODE_REPLACEMENT_CHARACTER;
  130|     16|    }
  131|  1.42k|    uint32_t ch2 = (uint32_t)from[2];
  132|  1.42k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.84k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2, False: 1.41k]
  |  |  |  Branch (189:53): [True: 0, False: 1.42k]
  |  |  |  Branch (189:53): [True: 2, False: 1.41k]
  |  |  ------------------
  ------------------
  133|      2|      from += 2;
  134|      2|      error("Invalid UTF-8 continuation byte");
  135|      2|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      2|    }
  137|  1.41k|    uint32_t ch3 = (uint32_t)from[3];
  138|  1.41k|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|  2.83k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.41k]
  |  |  |  Branch (189:53): [True: 0, False: 1.41k]
  |  |  |  Branch (189:53): [True: 0, False: 1.41k]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|  1.41k|    from += 4;
  144|  1.41k|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|  1.41k|        (ch3 & 0x3F);
  146|  1.41k|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|  1.41k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.41k]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|  1.41k|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|  1.41k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.41k]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|  1.41k|  } else {
  156|    617|    from += 1;
  157|    617|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|    617|    return UNICODE_REPLACEMENT_CHARACTER;
  159|    617|  }
  160|       |
  161|  18.0k|  return result;
  162|  19.0k|}
_ZN6hermes19_decodeUTF8SlowPathILb0EZNKS_6parser7JSLexer9_peekUTF8EPKcEUlRKN4llvh5TwineEE_EEjRS4_T0_:
   77|  5.64k|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|  5.64k|  uint32_t ch = (uint32_t)from[0];
   79|  5.64k|  uint32_t result;
   80|       |
   81|  5.64k|  assert(isUTF8Start(ch));
   82|       |
   83|  5.64k|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|  5.64k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.46k, False: 179]
  |  |  ------------------
  ------------------
   84|  5.46k|    uint32_t ch1 = (uint32_t)from[1];
   85|  5.46k|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|  5.46k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.46k]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|  5.46k|    from += 2;
   92|  5.46k|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|  5.46k|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|  5.46k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.46k]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|  5.46k|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|    179|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 18, False: 161]
  |  |  ------------------
  ------------------
   99|     18|    uint32_t ch1 = (uint32_t)from[1];
  100|     18|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|     36|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  |  Branch (189:53): [True: 0, False: 18]
  |  |  |  Branch (189:53): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     18|    uint32_t ch2 = (uint32_t)from[2];
  106|     18|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|     36|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  |  Branch (189:53): [True: 0, False: 18]
  |  |  |  Branch (189:53): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     18|    from += 3;
  112|     18|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     18|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     18|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     54|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  |  Branch (189:53): [True: 18, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 18]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     18|            result >= UNICODE_SURROGATE_FIRST &&
  119|     18|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      0|    }
  123|       |
  124|    161|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 158, False: 3]
  ------------------
  125|    158|    uint32_t ch1 = (uint32_t)from[1];
  126|    158|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|    316|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|    158|    uint32_t ch2 = (uint32_t)from[2];
  132|    158|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|    316|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|    158|    uint32_t ch3 = (uint32_t)from[3];
  138|    158|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|    316|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  |  Branch (189:53): [True: 0, False: 158]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|    158|    from += 4;
  144|    158|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|    158|        (ch3 & 0x3F);
  146|    158|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|    158|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 158]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|    158|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|    158|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 158]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|    158|  } else {
  156|      3|    from += 1;
  157|      3|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      3|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      3|  }
  160|       |
  161|  5.63k|  return result;
  162|  5.64k|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S7_PKcS9_:
  219|  11.4k|    const char *end8) {
  220|   894k|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 883k, False: 11.4k]
  ------------------
  221|   883k|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|   883k|                  llvm_unreachable("invalid UTF-8");
  223|   883k|                }));
  224|  11.4k|  return dest;
  225|  11.4k|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEEvRT_j:
  198|   883k|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|   883k|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|   883k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 883k, False: 0]
  |  |  ------------------
  ------------------
  200|   883k|    *dest = (uint16_t)cp;
  201|   883k|    ++dest; // Use pre-increment in case this is an iterator.
  202|   883k|  } else {
  203|      0|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
  204|      0|    cp -= 0x10000;
  205|      0|    *dest = UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF);
  206|      0|    ++dest;
  207|      0|    *dest = UTF16_LOW_SURROGATE + (cp & 0x3FF);
  208|      0|    ++dest;
  209|      0|  }
  210|   883k|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
  188|   883k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|   883k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|   883k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 883k, False: 19]
  |  |  ------------------
  ------------------
  190|   883k|    return *from++;
  191|       |
  192|     19|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|   883k|}
_ZN6hermes19_decodeUTF8SlowPathILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj16EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
   77|     19|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|     19|  uint32_t ch = (uint32_t)from[0];
   79|     19|  uint32_t result;
   80|       |
   81|     19|  assert(isUTF8Start(ch));
   82|       |
   83|     19|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|     19|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 19]
  |  |  ------------------
  ------------------
   84|      0|    uint32_t ch1 = (uint32_t)from[1];
   85|      0|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|      0|    from += 2;
   92|      0|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|      0|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|     19|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|     19|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 19, False: 0]
  |  |  ------------------
  ------------------
   99|     19|    uint32_t ch1 = (uint32_t)from[1];
  100|     19|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|     38|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  |  Branch (189:53): [True: 0, False: 19]
  |  |  |  Branch (189:53): [True: 0, False: 19]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|     19|    uint32_t ch2 = (uint32_t)from[2];
  106|     19|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|     38|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  |  Branch (189:53): [True: 0, False: 19]
  |  |  |  Branch (189:53): [True: 0, False: 19]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|     19|    from += 3;
  112|     19|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|     19|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|     19|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|     19|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     62|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19]
  |  |  |  Branch (189:53): [True: 12, False: 7]
  |  |  |  Branch (189:53): [True: 12, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|     19|            result >= UNICODE_SURROGATE_FIRST &&
  119|     19|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      0|    }
  123|       |
  124|     19|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 0, False: 0]
  ------------------
  125|      0|    uint32_t ch1 = (uint32_t)from[1];
  126|      0|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|      0|    uint32_t ch2 = (uint32_t)from[2];
  132|      0|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|      0|    uint32_t ch3 = (uint32_t)from[3];
  138|      0|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|      0|    from += 4;
  144|      0|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|      0|        (ch3 & 0x3F);
  146|      0|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|      0|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|      0|  } else {
  156|      0|    from += 1;
  157|      0|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      0|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      0|  }
  160|       |
  161|     19|  return result;
  162|     19|}
_ZN6hermes10isAllASCIIIPKDsEEbT_S3_:
   56|    399|inline bool isAllASCII(Iter begin, Iter end) {
   57|   157k|  while (begin < end) {
  ------------------
  |  Branch (57:10): [True: 157k, False: 391]
  ------------------
   58|   157k|    if (!isASCII(*begin))
  ------------------
  |  Branch (58:9): [True: 8, False: 157k]
  ------------------
   59|      8|      return false;
   60|   157k|    ++begin;
   61|   157k|  }
   62|    391|  return true;
   63|    399|}
_ZN6hermes7isASCIIIDsEEbT_:
   46|   157k|bool isASCII(Char c) {
   47|       |  // We start with a mask representing all valid set bits of ASCII. Flip the
   48|       |  // mask, so it now represents all invalid bits. Test if any bit is set that
   49|       |  // would make it an invalid ASCII character.
   50|   157k|  constexpr uint32_t asciiMask = 0x7f;
   51|   157k|  return (c & static_cast<Char>(~asciiMask)) == 0;
   52|   157k|}
ISel.cpp:_ZN6hermes10decodeUTF8ILb0EZN12_GLOBAL__N_119ensureUTF8IdentiferERNS_11StringTableENS_10IdentifierERNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEE3$_1EEjRPKcT0_:
  188|   175k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|   175k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|   175k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 175k, False: 0]
  |  |  ------------------
  ------------------
  190|   175k|    return *from++;
  191|       |
  192|      0|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|   175k|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS1_6vectorIDsNS1_9allocatorIDsEEEEEEEET_S8_PKcSA_:
  219|    273|    const char *end8) {
  220|  2.04M|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 2.04M, False: 273]
  ------------------
  221|  2.04M|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|  2.04M|                  llvm_unreachable("invalid UTF-8");
  223|  2.04M|                }));
  224|    273|  return dest;
  225|    273|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorINS1_6vectorIDsNS1_9allocatorIDsEEEEEEEEvRT_j:
  198|  2.04M|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|  2.04M|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|  2.04M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.04M, False: 0]
  |  |  ------------------
  ------------------
  200|  2.04M|    *dest = (uint16_t)cp;
  201|  2.04M|    ++dest; // Use pre-increment in case this is an iterator.
  202|  2.04M|  } else {
  203|      0|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
  204|      0|    cp -= 0x10000;
  205|      0|    *dest = UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF);
  206|      0|    ++dest;
  207|      0|    *dest = UTF16_LOW_SURROGATE + (cp & 0x3FF);
  208|      0|    ++dest;
  209|      0|  }
  210|  2.04M|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS2_6vectorIDsNS2_9allocatorIDsEEEEEEEET_S9_PKcSB_EUlRKN4llvh5TwineEE_EEjRSB_T0_:
  188|  2.04M|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|  2.04M|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|  2.04M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.03M, False: 10.0k]
  |  |  ------------------
  ------------------
  190|  2.03M|    return *from++;
  191|       |
  192|  10.0k|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|  2.04M|}
_ZN6hermes19_decodeUTF8SlowPathILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorINS2_6vectorIDsNS2_9allocatorIDsEEEEEEEET_S9_PKcSB_EUlRKN4llvh5TwineEE_EEjRSB_T0_:
   77|  10.0k|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|  10.0k|  uint32_t ch = (uint32_t)from[0];
   79|  10.0k|  uint32_t result;
   80|       |
   81|  10.0k|  assert(isUTF8Start(ch));
   82|       |
   83|  10.0k|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|  10.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 44, False: 10.0k]
  |  |  ------------------
  ------------------
   84|     44|    uint32_t ch1 = (uint32_t)from[1];
   85|     44|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|     44|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 44]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|     44|    from += 2;
   92|     44|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|     44|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|     44|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 44]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|  10.0k|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|  10.0k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 10.0k, False: 0]
  |  |  ------------------
  ------------------
   99|  10.0k|    uint32_t ch1 = (uint32_t)from[1];
  100|  10.0k|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|  20.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.0k]
  |  |  |  Branch (189:53): [True: 0, False: 10.0k]
  |  |  |  Branch (189:53): [True: 0, False: 10.0k]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|  10.0k|    uint32_t ch2 = (uint32_t)from[2];
  106|  10.0k|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|  20.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.0k]
  |  |  |  Branch (189:53): [True: 0, False: 10.0k]
  |  |  |  Branch (189:53): [True: 0, False: 10.0k]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|  10.0k|    from += 3;
  112|  10.0k|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|  10.0k|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|  10.0k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.0k]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|  10.0k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  20.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.0k]
  |  |  |  Branch (189:53): [True: 166, False: 9.88k]
  |  |  |  Branch (189:53): [True: 164, False: 2]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|  10.0k|            result >= UNICODE_SURROGATE_FIRST &&
  119|  10.0k|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      0|    }
  123|       |
  124|  10.0k|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 0, False: 0]
  ------------------
  125|      0|    uint32_t ch1 = (uint32_t)from[1];
  126|      0|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|      0|    uint32_t ch2 = (uint32_t)from[2];
  132|      0|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|      0|    uint32_t ch3 = (uint32_t)from[3];
  138|      0|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|      0|    from += 4;
  144|      0|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|      0|        (ch3 & 0x3F);
  146|      0|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|      0|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|      0|  } else {
  156|      0|    from += 1;
  157|      0|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      0|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      0|  }
  160|       |
  161|  10.0k|  return result;
  162|  10.0k|}
DebugInfo.cpp:_ZN6hermes10decodeUTF8ILb0EZNS_3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS3_9allocatorIhEEEENS_10IdentifierEE3$_0EEjRPKcT0_:
  188|    816|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|    816|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|    816|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 808, False: 8]
  |  |  ------------------
  ------------------
  190|    808|    return *from++;
  191|       |
  192|      8|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|    816|}
DebugInfo.cpp:_ZN6hermes19_decodeUTF8SlowPathILb0EZNS_3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS3_9allocatorIhEEEENS_10IdentifierEE3$_0EEjRPKcT0_:
   77|      8|uint32_t _decodeUTF8SlowPath(const char *&from, F error) {
   78|      8|  uint32_t ch = (uint32_t)from[0];
   79|      8|  uint32_t result;
   80|       |
   81|      8|  assert(isUTF8Start(ch));
   82|       |
   83|      8|  if (LLVM_LIKELY((ch & 0xE0) == 0xC0)) {
  ------------------
  |  |  188|      8|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 8]
  |  |  ------------------
  ------------------
   84|      0|    uint32_t ch1 = (uint32_t)from[1];
   85|      0|    if (LLVM_UNLIKELY((ch1 & 0xC0) != 0x80)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   86|      0|      from += 1;
   87|      0|      error("Invalid UTF-8 continuation byte");
   88|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   89|      0|    }
   90|       |
   91|      0|    from += 2;
   92|      0|    result = ((ch & 0x1F) << 6) | (ch1 & 0x3F);
   93|      0|    if (LLVM_UNLIKELY(result <= 0x7F)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   94|      0|      error("Non-canonical UTF-8 encoding");
   95|      0|      return UNICODE_REPLACEMENT_CHARACTER;
   96|      0|    }
   97|       |
   98|      8|  } else if (LLVM_LIKELY((ch & 0xF0) == 0xE0)) {
  ------------------
  |  |  188|      8|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 8, False: 0]
  |  |  ------------------
  ------------------
   99|      8|    uint32_t ch1 = (uint32_t)from[1];
  100|      8|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|     16|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  101|      0|      from += 1;
  102|      0|      error("Invalid UTF-8 continuation byte");
  103|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  104|      0|    }
  105|      8|    uint32_t ch2 = (uint32_t)from[2];
  106|      8|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|     16|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  107|      0|      from += 2;
  108|      0|      error("Invalid UTF-8 continuation byte");
  109|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  110|      0|    }
  111|      8|    from += 3;
  112|      8|    result = ((ch & 0x0F) << 12) | ((ch1 & 0x3F) << 6) | (ch2 & 0x3F);
  113|      8|    if (LLVM_UNLIKELY(result <= 0x7FF)) {
  ------------------
  |  |  189|      8|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8]
  |  |  ------------------
  ------------------
  114|      0|      error("Non-canonical UTF-8 encoding");
  115|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  116|      0|    }
  117|      8|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     16|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 8]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  ------------------
  ------------------
  118|      8|            result >= UNICODE_SURROGATE_FIRST &&
  119|      8|            result <= UNICODE_SURROGATE_LAST && !allowSurrogates)) {
  120|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  121|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  122|      0|    }
  123|       |
  124|      8|  } else if ((ch & 0xF8) == 0xF0) {
  ------------------
  |  Branch (124:14): [True: 0, False: 0]
  ------------------
  125|      0|    uint32_t ch1 = (uint32_t)from[1];
  126|      0|    if (LLVM_UNLIKELY((ch1 & 0x40) != 0 || (ch1 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  127|      0|      from += 1;
  128|      0|      error("Invalid UTF-8 continuation byte");
  129|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  130|      0|    }
  131|      0|    uint32_t ch2 = (uint32_t)from[2];
  132|      0|    if (LLVM_UNLIKELY((ch2 & 0x40) != 0 || (ch2 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  133|      0|      from += 2;
  134|      0|      error("Invalid UTF-8 continuation byte");
  135|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  136|      0|    }
  137|      0|    uint32_t ch3 = (uint32_t)from[3];
  138|      0|    if (LLVM_UNLIKELY((ch3 & 0x40) != 0 || (ch3 & 0x80) == 0)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  139|      0|      from += 3;
  140|      0|      error("Invalid UTF-8 continuation byte");
  141|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  142|      0|    }
  143|      0|    from += 4;
  144|      0|    result = ((ch & 0x07) << 18) | ((ch1 & 0x3F) << 12) | ((ch2 & 0x3F) << 6) |
  145|      0|        (ch3 & 0x3F);
  146|      0|    if (LLVM_UNLIKELY(result <= 0xFFFF)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  147|      0|      error("Non-canonical UTF-8 encoding");
  148|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  149|      0|    }
  150|      0|    if (LLVM_UNLIKELY(result > UNICODE_MAX_VALUE)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  151|      0|      error("Invalid UTF-8 code point 0x" + llvh::Twine::utohexstr(result));
  152|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  153|      0|    }
  154|       |
  155|      0|  } else {
  156|      0|    from += 1;
  157|      0|    error("Invalid UTF-8 lead byte 0x" + llvh::Twine::utohexstr((uint8_t)ch));
  158|      0|    return UNICODE_REPLACEMENT_CHARACTER;
  159|      0|  }
  160|       |
  161|      8|  return result;
  162|      8|}
ESTreeIRGen-expr.cpp:_ZN6hermesL22isUTF8ContinuationByteEc:
   39|   908k|inline static bool isUTF8ContinuationByte(char ch) {
   40|   908k|  return (ch & 0xC0) == 0x80;
   41|   908k|}
_ZN6hermes32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEET_S7_PKcS9_:
  219|  11.4k|    const char *end8) {
  220|  18.9k|  while (begin8 < end8)
  ------------------
  |  Branch (220:10): [True: 7.47k, False: 11.4k]
  ------------------
  221|  7.47k|    encodeUTF16(dest, decodeUTF8<true>(begin8, [](const llvh::Twine &) {
  222|  7.47k|                  llvm_unreachable("invalid UTF-8");
  223|  7.47k|                }));
  224|  11.4k|  return dest;
  225|  11.4k|}
_ZN6hermes11encodeUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEEvRT_j:
  198|  7.47k|inline void encodeUTF16(OutIt &dest, uint32_t cp) {
  199|  7.47k|  if (LLVM_LIKELY(cp < 0x10000)) {
  ------------------
  |  |  188|  7.47k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.47k, False: 0]
  |  |  ------------------
  ------------------
  200|  7.47k|    *dest = (uint16_t)cp;
  201|  7.47k|    ++dest; // Use pre-increment in case this is an iterator.
  202|  7.47k|  } else {
  203|      0|    assert(cp <= UNICODE_MAX_VALUE && "invalid Unicode value");
  204|      0|    cp -= 0x10000;
  205|      0|    *dest = UTF16_HIGH_SURROGATE + ((cp >> 10) & 0x3FF);
  206|      0|    ++dest;
  207|      0|    *dest = UTF16_LOW_SURROGATE + (cp & 0x3FF);
  208|      0|    ++dest;
  209|      0|  }
  210|  7.47k|}
_ZN6hermes10decodeUTF8ILb1EZNS_32convertUTF8WithSurrogatesToUTF16INSt3__120back_insert_iteratorIN4llvh11SmallVectorIDsLj6EEEEEEET_S8_PKcSA_EUlRKNS4_5TwineEE_EEjRSA_T0_:
  188|  7.47k|inline uint32_t decodeUTF8(const char *&from, F error) {
  189|  7.47k|  if (LLVM_LIKELY((*from & 0x80) == 0)) // Ordinary ASCII?
  ------------------
  |  |  188|  7.47k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 7.47k, False: 0]
  |  |  ------------------
  ------------------
  190|  7.47k|    return *from++;
  191|       |
  192|      0|  return _decodeUTF8SlowPath<allowSurrogates>(from, error);
  193|  7.47k|}
SourceErrorManager.cpp:_ZN6hermesL22isUTF8ContinuationByteEc:
   39|  1.00M|inline static bool isUTF8ContinuationByte(char ch) {
   40|  1.00M|  return (ch & 0xC0) == 0x80;
   41|  1.00M|}

_ZN6hermes25BytecodeGenerationOptionsC2ENS_16OutputFormatKindE:
   63|     56|      : format(format) {}

_ZN6hermes2vm18AlignedHeapSegment5allocEj:
  306|  2.10M|AllocResult AlignedHeapSegment::alloc(uint32_t size) {
  307|  2.10M|  assert(lowLim() != nullptr && "Cannot allocate in a null segment");
  308|      0|  assert(size >= sizeof(GCCell) && "cell must be larger than GCCell");
  309|      0|  assert(isSizeHeapAligned(size) && "size must be heap aligned");
  310|       |
  311|      0|  char *cellPtr; // Initialized in the if below.
  312|       |
  313|       |  // On 64-bit systems, we know that we can't allocate a size large enough to
  314|       |  // cause a pointer value to overflow. This is not true on 32-bit systems. This
  315|       |  // test should be decided statically.
  316|       |  // TODO: Is there a portable way of expressing this in the preprocessor?
  317|  2.10M|  if (sizeof(void *) == 8) {
  ------------------
  |  Branch (317:7): [Folded - Ignored]
  ------------------
  318|       |    // Calculate the new level_ once.
  319|  2.10M|    char *newLevel = level_ + size;
  320|  2.10M|    if (LLVM_UNLIKELY(newLevel > effectiveEnd())) {
  ------------------
  |  |  189|  2.10M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 35, False: 2.10M]
  |  |  ------------------
  ------------------
  321|     35|      return {nullptr, false};
  322|     35|    }
  323|  2.10M|    cellPtr = level_;
  324|  2.10M|    level_ = newLevel;
  325|  2.10M|  } else {
  326|      0|    if (LLVM_UNLIKELY(available() < size)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  327|      0|      return {nullptr, false};
  328|      0|    }
  329|      0|    cellPtr = level_;
  330|      0|    level_ += size;
  331|      0|  }
  332|       |
  333|  2.10M|  __asan_unpoison_memory_region(cellPtr, size);
  334|  2.10M|#ifndef NDEBUG
  335|  2.10M|  checkUnwritten(cellPtr, cellPtr + size);
  336|  2.10M|#endif
  337|       |
  338|  2.10M|  auto *cell = reinterpret_cast<GCCell *>(cellPtr);
  339|  2.10M|  return {cell, true};
  340|  2.10M|}
_ZNK6hermes2vm18AlignedHeapSegment6lowLimEv:
  391|  41.6M|char *AlignedHeapSegment::lowLim() const {
  392|  41.6M|  return storage_.lowLim();
  393|  41.6M|}
_ZNK6hermes2vm18AlignedHeapSegment12effectiveEndEv:
  403|  2.10M|char *AlignedHeapSegment::effectiveEnd() const {
  404|  2.10M|  return effectiveEnd_;
  405|  2.10M|}
_ZN6hermes2vm18AlignedHeapSegment16HeapCellIteratorC2EPNS0_6GCCellE:
  131|  6.04k|    HeapCellIterator(GCCell *cell) : cell_(cell) {}
_ZNK6hermes2vm18AlignedHeapSegment16HeapCellIteratoreqERKS2_:
  133|  11.9M|    bool operator==(const HeapCellIterator &R) const {
  134|  11.9M|      return cell_ == R.cell_;
  135|  11.9M|    }
_ZNK6hermes2vm18AlignedHeapSegment16HeapCellIteratordeEv:
  137|  11.9M|    GCCell *const &operator*() const {
  138|  11.9M|      return cell_;
  139|  11.9M|    }
_ZN6hermes2vm18AlignedHeapSegment16HeapCellIteratorppEv:
  141|  11.9M|    HeapCellIterator &operator++() {
  142|  11.9M|      cell_ = cell_->nextCell();
  143|  11.9M|      return *this;
  144|  11.9M|    }
_ZN6hermes2vm18AlignedHeapSegment20markBitArrayCoveringEPKv:
  343|  7.24M|MarkBitArrayNC *AlignedHeapSegment::markBitArrayCovering(const void *ptr) {
  344|  7.24M|  return &contents(AlignedStorage::start(ptr))->markBitArray_;
  345|  7.24M|}
_ZN6hermes2vm18AlignedHeapSegment14setCellMarkBitEPKNS0_6GCCellE:
  348|  1.41M|void AlignedHeapSegment::setCellMarkBit(const GCCell *cell) {
  349|  1.41M|  MarkBitArrayNC *markBits = markBitArrayCovering(cell);
  350|  1.41M|  size_t ind = markBits->addressToIndex(cell);
  351|  1.41M|  markBits->mark(ind);
  352|  1.41M|}
_ZN6hermes2vm18AlignedHeapSegment14getCellMarkBitEPKNS0_6GCCellE:
  355|  5.82M|bool AlignedHeapSegment::getCellMarkBit(const GCCell *cell) {
  356|  5.82M|  MarkBitArrayNC *markBits = markBitArrayCovering(cell);
  357|  5.82M|  size_t ind = markBits->addressToIndex(cell);
  358|  5.82M|  return markBits->at(ind);
  359|  5.82M|}
_ZN6hermes2vm18AlignedHeapSegment8contentsEPv:
  362|  8.14M|    void *lowLim) {
  363|  8.14M|  return reinterpret_cast<Contents *>(lowLim);
  364|  8.14M|}
_ZN6hermes2vm18AlignedHeapSegment17cardTableCoveringEPKv:
  371|   893k|/* static */ CardTable *AlignedHeapSegment::cardTableCovering(const void *ptr) {
  372|   893k|  return &AlignedHeapSegment::contents(AlignedStorage::start(ptr))->cardTable_;
  373|   893k|}
_ZN6hermes2vm18AlignedHeapSegment7maxSizeEv:
  375|  1.71M|/* static */ constexpr size_t AlignedHeapSegment::maxSize() {
  376|  1.71M|  return AlignedStorage::size() - offsetof(Contents, allocRegion_);
  377|  1.71M|}
_ZNK6hermes2vm18AlignedHeapSegment4usedEv:
  383|    706|size_t AlignedHeapSegment::used() const {
  384|    706|  return level() - start();
  385|    706|}
_ZNK6hermes2vm18AlignedHeapSegment9availableEv:
  387|    379|size_t AlignedHeapSegment::available() const {
  388|    379|  return effectiveEnd() - level();
  389|    379|}
_ZNK6hermes2vm18AlignedHeapSegment5hiLimEv:
  395|    203|char *AlignedHeapSegment::hiLim() const {
  396|    203|  return storage_.hiLim();
  397|    203|}
_ZNK6hermes2vm18AlignedHeapSegment5startEv:
  399|  8.65k|char *AlignedHeapSegment::start() const {
  400|  8.65k|  return contents()->allocRegion_;
  401|  8.65k|}
_ZNK6hermes2vm18AlignedHeapSegment3endEv:
  407|  1.88k|char *AlignedHeapSegment::end() const {
  408|  1.88k|  return start() + maxSize();
  409|  1.88k|}
_ZNK6hermes2vm18AlignedHeapSegment5levelEv:
  411|  6.04k|char *AlignedHeapSegment::level() const {
  412|  6.04k|  return level_;
  413|  6.04k|}
_ZN6hermes2vm18AlignedHeapSegment5cellsEv:
  416|  3.02k|AlignedHeapSegment::cells() {
  417|  3.02k|  return {
  418|  3.02k|      HeapCellIterator(reinterpret_cast<GCCell *>(start())),
  419|  3.02k|      HeapCellIterator(reinterpret_cast<GCCell *>(level()))};
  420|  3.02k|}
_ZNK6hermes2vm18AlignedHeapSegment9cardTableEv:
  427|  1.43k|CardTable &AlignedHeapSegment::cardTable() const {
  428|  1.43k|  return contents()->cardTable_;
  429|  1.43k|}
_ZNK6hermes2vm18AlignedHeapSegment12markBitArrayEv:
  431|  1.55k|MarkBitArrayNC &AlignedHeapSegment::markBitArray() const {
  432|  1.55k|  return contents()->markBitArray_;
  433|  1.55k|}
_ZNK6hermes2vm18AlignedHeapSegment8contentsEv:
  435|  12.4k|AlignedHeapSegment::Contents *AlignedHeapSegment::contents() const {
  436|  12.4k|  return contents(lowLim());
  437|  12.4k|}
_ZNK6hermes2vm18AlignedHeapSegmentcvbEv:
  439|  1.29k|AlignedHeapSegment::operator bool() const {
  440|  1.29k|  return static_cast<bool>(storage_);
  441|  1.29k|}
_ZNK6hermes2vm18AlignedHeapSegment8containsEPKv:
  443|  11.9M|bool AlignedHeapSegment::contains(const void *ptr) const {
  444|  11.9M|  return storage_.contains(ptr);
  445|  11.9M|}
_ZN6hermes2vm18AlignedHeapSegmentC2Ev:
   59|     99|  AlignedHeapSegment() = default;
_ZN6hermes2vm18AlignedHeapSegmentC2EOS1_:
   60|    710|  AlignedHeapSegment(AlignedHeapSegment &&) = default;
_ZN6hermes2vm18AlignedHeapSegmentaSEOS1_:
   61|    198|  AlignedHeapSegment &operator=(AlignedHeapSegment &&) = default;

_ZNK6hermes2vm14AlignedStorage6lowLimEv:
  164|  53.5M|char *AlignedStorage::lowLim() const {
  165|  53.5M|  return lowLim_;
  166|  53.5M|}
_ZN6hermes2vm14AlignedStorage5startEPKv:
  137|   107M|/* static */ void *AlignedStorage::start(const void *ptr) {
  138|   107M|  return reinterpret_cast<char *>(reinterpret_cast<uintptr_t>(ptr) & kHighMask);
  139|   107M|}
_ZN6hermes2vm14AlignedStorage3endEPKv:
  141|  19.1M|/* static */ const void *AlignedStorage::end(const void *ptr) {
  142|  19.1M|  return reinterpret_cast<char *>(start(ptr)) + kSize;
  143|  19.1M|}
_ZN6hermes2vm14AlignedStorage15containedInSameEPKvS3_:
  147|   324k|    const void *b) {
  148|   324k|  return (reinterpret_cast<uintptr_t>(a) ^ reinterpret_cast<uintptr_t>(b)) <
  149|   324k|      kSize;
  150|   324k|}
_ZN6hermes2vm14AlignedStorage4sizeEv:
  156|  1.71M|/* static */ constexpr size_t AlignedStorage::size() {
  157|  1.71M|  return kSize;
  158|  1.71M|}
_ZNK6hermes2vm14AlignedStoragecvbEv:
  160|  1.29k|AlignedStorage::operator bool() const {
  161|  1.29k|  return lowLim_;
  162|  1.29k|}
_ZNK6hermes2vm14AlignedStorage5hiLimEv:
  168|    203|char *AlignedStorage::hiLim() const {
  169|    203|  return lowLim_ + kSize;
  170|    203|}
_ZNK6hermes2vm14AlignedStorage8containsEPKv:
  172|  11.9M|bool AlignedStorage::contains(const void *ptr) const {
  173|  11.9M|  return AlignedStorage::start(ptr) == lowLim();
  174|  11.9M|}
_ZN6hermes2vm14AlignedStorageC2Ev:
   79|  1.81k|  AlignedStorage() = default;

_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE7classofEPKNS0_6GCCellE:
   69|  3.35M|  static bool classof(const GCCell *cell) {
   70|  3.35M|    return cell->getKind() == getCellKind();
   71|  3.35M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE11getCellKindEv:
   73|  4.27M|  static constexpr CellKind getCellKind() {
   74|  4.27M|    static_assert(
   75|  4.27M|        std::is_same<HVType, HermesValue>::value ||
   76|  4.27M|            std::is_same<HVType, SmallHermesValue>::value,
   77|  4.27M|        "Illegal HVType.");
   78|  4.27M|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (78:12): [Folded - Ignored]
  ------------------
   79|  4.27M|        ? CellKind::ArrayStorageKind
   80|  4.27M|        : CellKind::ArrayStorageSmallKind;
   81|  4.27M|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE2atILNS3_6InlineE0EEES2_j:
  149|  76.0k|  HVType at(size_type index) const {
  150|  76.0k|    assert(index < size() && "index out of range");
  151|      0|    return data()[index];
  152|  76.0k|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4sizeEv:
  171|  3.27M|  size_type size() const {
  172|  3.27M|    return size_.load(std::memory_order_relaxed);
  173|  3.27M|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4dataEv:
  138|   481k|  const GCHVType *data() const {
  139|   481k|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  140|   481k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE14allocationSizeEj:
   53|    430|  static constexpr uint32_t allocationSize(size_type capacity) {
   54|    430|    return ArrayStorageBase::template totalSizeToAlloc<GCHVType>(capacity);
   55|    430|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE25capacityForAllocationSizeEj:
   59|    198|  static constexpr size_type capacityForAllocationSize(uint32_t allocSize) {
   60|    198|    return (allocSize - allocationSize(0)) / sizeof(HVType);
   61|    198|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE11maxElementsEv:
   65|     99|  static constexpr size_type maxElements() {
   66|     99|    return capacityForAllocationSize(GC::maxAllocationSize());
   67|     99|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE14allocationSizeEj:
   53|  1.92M|  static constexpr uint32_t allocationSize(size_type capacity) {
   54|  1.92M|    return ArrayStorageBase::template totalSizeToAlloc<GCHVType>(capacity);
   55|  1.92M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE25capacityForAllocationSizeEj:
   59|  1.39M|  static constexpr size_type capacityForAllocationSize(uint32_t allocSize) {
   60|  1.39M|    return (allocSize - allocationSize(0)) / sizeof(HVType);
   61|  1.39M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE11maxElementsEv:
   65|   476k|  static constexpr size_type maxElements() {
   66|   476k|    return capacityForAllocationSize(GC::maxAllocationSize());
   67|   476k|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE2atILNS3_6InlineE1EEES2_j:
  149|   405k|  HVType at(size_type index) const {
  150|   405k|    assert(index < size() && "index out of range");
  151|      0|    return data()[index];
  152|   405k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE3setILNS3_6InlineE1EEEvjS2_RNS0_7HadesGCE:
  156|   405k|  void set(size_type index, HVType val, GC &gc) {
  157|   405k|    assert(index < size() && "index out of range");
  158|      0|    data()[index].set(val, gc);
  159|   405k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE4dataEv:
  135|  2.87M|  GCHVType *data() {
  136|  2.87M|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  137|  2.87M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE3setILNS3_6InlineE0EEEvjS2_RNS0_7HadesGCE:
  156|  1.08M|  void set(size_type index, HVType val, GC &gc) {
  157|  1.08M|    assert(index < size() && "index out of range");
  158|      0|    data()[index].set(val, gc);
  159|  1.08M|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEjj:
  123|   404k|  create(Runtime &runtime, size_type capacity, size_type size) {
  124|   404k|    auto arrRes = create(runtime, capacity);
  125|   404k|    if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  126|      0|      return ExecutionStatus::EXCEPTION;
  127|      0|    }
  128|       |
  129|   404k|    resizeWithinCapacity(
  130|   404k|        vmcast<ArrayStorageBase<HVType>>(*arrRes), runtime, size);
  131|   404k|    return arrRes;
  132|   404k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEj:
   84|   459k|  static CallResult<HermesValue> create(Runtime &runtime, size_type capacity) {
   85|   459k|    if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|   459k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 459k]
  |  |  ------------------
  ------------------
   86|      0|      return throwExcessiveCapacityError(runtime, capacity);
   87|      0|    }
   88|   459k|    const auto allocSize = allocationSize(capacity);
   89|   459k|    auto *cell = runtime.makeAVariable<ArrayStorageBase<HVType>>(allocSize);
   90|   459k|    return HermesValue::encodeObjectValue(cell);
   91|   459k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE20resizeWithinCapacityEPS3_RNS0_7RuntimeEj:
  265|   674k|      size_type newSize) {
  266|   674k|    resizeWithinCapacity(self, runtime.getHeap(), newSize);
  267|   674k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE11getCellKindEv:
   73|    297|  static constexpr CellKind getCellKind() {
   74|    297|    static_assert(
   75|    297|        std::is_same<HVType, HermesValue>::value ||
   76|    297|            std::is_same<HVType, SmallHermesValue>::value,
   77|    297|        "Illegal HVType.");
   78|    297|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (78:12): [Folded - Ignored]
  ------------------
   79|    297|        ? CellKind::ArrayStorageKind
   80|    297|        : CellKind::ArrayStorageSmallKind;
   81|    297|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE7classofEPKNS0_6GCCellE:
   69|     99|  static bool classof(const GCCell *cell) {
   70|     99|    return cell->getKind() == getCellKind();
   71|     99|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4sizeEv:
  171|    232|  size_type size() const {
  172|    232|    return size_.load(std::memory_order_relaxed);
  173|    232|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4dataEv:
  138|      1|  const GCHVType *data() const {
  139|      1|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  140|      1|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE4dataEv:
  135|     99|  GCHVType *data() {
  136|     99|    return ArrayStorageBase<HVType>::template getTrailingObjects<GCHVType>();
  137|     99|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EEC2Ev:
  273|   459k|  ArrayStorageBase() = default;
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE6createERNS0_7RuntimeEj:
   84|     99|  static CallResult<HermesValue> create(Runtime &runtime, size_type capacity) {
   85|     99|    if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   86|      0|      return throwExcessiveCapacityError(runtime, capacity);
   87|      0|    }
   88|     99|    const auto allocSize = allocationSize(capacity);
   89|     99|    auto *cell = runtime.makeAVariable<ArrayStorageBase<HVType>>(allocSize);
   90|     99|    return HermesValue::encodeObjectValue(cell);
   91|     99|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEEC2Ev:
  273|     99|  ArrayStorageBase() = default;
_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE9push_backERNS0_13MutableHandleIS3_EERNS0_7RuntimeENS0_6HandleIS2_EE:
  186|     99|      Handle<> value) {
  187|     99|    auto *self = selfHandle.get();
  188|     99|    const auto currSz = self->size();
  189|       |    // This must be done before the capacity check, because encodeHermesValue
  190|       |    // may allocate, which could cause trimming of the ArrayStorage. If the
  191|       |    // capacity check fails, then this work is wasted, but that's okay because
  192|       |    // it's a slow path.
  193|     99|    auto hv = HVType::encodeHermesValue(value.get(), runtime);
  194|       |    // For SmallHermesValue, the above may allocate, so update self.
  195|     99|    if (std::is_same<HVType, SmallHermesValue>::value)
  ------------------
  |  Branch (195:9): [Folded - Ignored]
  ------------------
  196|      0|      self = selfHandle.get();
  197|     99|    if (LLVM_LIKELY(currSz < self->capacity())) {
  ------------------
  |  |  188|     99|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  198|       |      // Use the constructor of GCHermesValue to use the correct write barrier
  199|       |      // for uninitialized memory.
  200|     99|      new (&self->data()[currSz]) GCHVType(hv, runtime.getHeap());
  201|     99|      self->size_.store(currSz + 1, std::memory_order_release);
  202|     99|      return ExecutionStatus::RETURNED;
  203|     99|    }
  204|      0|    return pushBackSlowPath(selfHandle, runtime, value);
  205|     99|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE8capacityEv:
  168|     99|  size_type capacity() const {
  169|     99|    return capacityForAllocationSize(getAllocatedSize());
  170|     99|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE9push_backERNS0_13MutableHandleIS3_EERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  186|     24|      Handle<> value) {
  187|     24|    auto *self = selfHandle.get();
  188|     24|    const auto currSz = self->size();
  189|       |    // This must be done before the capacity check, because encodeHermesValue
  190|       |    // may allocate, which could cause trimming of the ArrayStorage. If the
  191|       |    // capacity check fails, then this work is wasted, but that's okay because
  192|       |    // it's a slow path.
  193|     24|    auto hv = HVType::encodeHermesValue(value.get(), runtime);
  194|       |    // For SmallHermesValue, the above may allocate, so update self.
  195|     24|    if (std::is_same<HVType, SmallHermesValue>::value)
  ------------------
  |  Branch (195:9): [Folded - Ignored]
  ------------------
  196|     24|      self = selfHandle.get();
  197|     24|    if (LLVM_LIKELY(currSz < self->capacity())) {
  ------------------
  |  |  188|     24|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24, False: 0]
  |  |  ------------------
  ------------------
  198|       |      // Use the constructor of GCHermesValue to use the correct write barrier
  199|       |      // for uninitialized memory.
  200|     24|      new (&self->data()[currSz]) GCHVType(hv, runtime.getHeap());
  201|     24|      self->size_.store(currSz + 1, std::memory_order_release);
  202|     24|      return ExecutionStatus::RETURNED;
  203|     24|    }
  204|      0|    return pushBackSlowPath(selfHandle, runtime, value);
  205|     24|  }
_ZNK6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE8capacityEv:
  168|   919k|  size_type capacity() const {
  169|   919k|    return capacityForAllocationSize(getAllocatedSize());
  170|   919k|  }
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE6resizeERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  237|  5.78k|      size_type newSize) {
  238|  5.78k|    return shift(selfHandle, runtime, 0, 0, newSize);
  239|  5.78k|  }

_ZN6hermes2vm11BoxedDouble11getCellKindEv:
   27|  3.59k|  static constexpr CellKind getCellKind() {
   28|  3.59k|    return CellKind::BoxedDoubleKind;
   29|  3.59k|  }
_ZN6hermes2vm11BoxedDouble6createEdRNS0_7RuntimeE:
   34|  1.79k|  static BoxedDouble *create(double d, Runtime &runtime) {
   35|  1.79k|    return runtime.makeAFixed<BoxedDouble>(d);
   36|  1.79k|  }
_ZN6hermes2vm11BoxedDoubleC2Ed:
   38|  1.79k|  BoxedDouble(double d) : value_(d) {}

_ZN6hermes2vmeqINS0_11HermesValueEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|  3.74M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  3.74M|  return lhs.getStatus() == rhs;
  417|  3.74M|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|   206k|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|    137|  ~CallResult() = default;
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EE9getStatusEv:
  219|  3.22M|  ExecutionStatus getStatus() const {
  220|  3.22M|    return (ExecutionStatus)status_;
  221|  3.22M|  }
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEdeEv:
  215|  1.60M|  bool operator*() const {
  216|  1.60M|    return getValue();
  217|  1.60M|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE9getStatusEv:
  332|  1.76M|  ExecutionStatus getStatus() const {
  333|  1.76M|    return status_;
  334|  1.76M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEptEv:
  346|  24.3k|  PseudoHandle<> *operator->() {
  347|  24.3k|    return &getValue();
  348|  24.3k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE8getValueEv:
  335|  1.76M|  PseudoHandle<> &getValue() {
  336|  1.76M|    assert(status_ == ExecutionStatus::RETURNED);
  337|      0|    return storage_;
  338|  1.76M|  }
_ZNK6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EE8getValueEv:
  222|  1.60M|  bool getValue() const {
  223|  1.60M|    assert(getStatus() == ExecutionStatus::RETURNED);
  224|      0|    return value_;
  225|  1.60M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|  1.23M|  ~CallResult() = default;
_ZN6hermes2vmneIbEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  419|  1.31M|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  1.31M|  return lhs.getStatus() != rhs;
  421|  1.31M|}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEdeEv:
  325|   933k|  PseudoHandle<> &operator*() {
  326|   933k|    return getValue();
  327|   933k|  }
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|  1.93M|  const T &operator*() const {
  172|  1.93M|    return getValue();
  173|  1.93M|  }
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|  3.74M|  const T &getValue() const {
  179|  3.74M|    assert(status_ == ExecutionStatus::RETURNED);
  180|      0|    return *reinterpret_cast<const T *>(&storage_);
  181|  3.74M|  }
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|  3.74M|  ExecutionStatus getStatus() const {
  176|  3.74M|    return status_;
  177|  3.74M|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|   413k|  ExecutionStatus getStatus() const {
  290|   413k|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 413k]
  ------------------
  291|   413k|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|   413k|        ? ExecutionStatus::EXCEPTION
  293|   413k|        : ExecutionStatus::RETURNED;
  294|   413k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|   206k|  Handle<T> &getValue() {
  296|   206k|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|   206k|  }
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|    411|  ExecutionStatus getStatus() const {
  290|    411|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 411]
  ------------------
  291|    411|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|    411|        ? ExecutionStatus::EXCEPTION
  293|    411|        : ExecutionStatus::RETURNED;
  294|    411|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|    137|  Handle<T> &getValue() {
  296|    137|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|    137|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ENS0_15ExecutionStatusE:
  167|    179|  /* implicit */ CallResult(ExecutionStatus status) : status_(status) {
  168|    179|    assert(status != ExecutionStatus::RETURNED);
  169|    179|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ES2_:
  163|  2.97M|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|  2.97M|    new (&storage_) T(value);
  165|  2.97M|  }
_ZN6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEC2ENS0_15ExecutionStatusE:
  211|    155|  /* implicit */ CallResult(ExecutionStatus status) : status_((int)status) {
  212|    155|    assert(status != ExecutionStatus::RETURNED);
  213|    155|  }
_ZN6hermes2vm10CallResultIbLNS0_6detail20CallResultSpecializeE1EEC2Eb:
  209|  1.83M|      : status_((int)ExecutionStatus::RETURNED), value_(value) {}
_ZN6hermes2vmeqINS0_6HandleINS0_7JSArrayEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|   832k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   832k|  return lhs.getStatus() == rhs;
  417|   832k|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|   415k|  Handle<T> &operator*() {
  282|   415k|    return getValue();
  283|   415k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|  1.64M|  Handle<T> &getValue() {
  296|  1.64M|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|  1.64M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|  1.23M|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|  3.29M|  ExecutionStatus getStatus() const {
  290|  3.29M|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 3.29M]
  ------------------
  291|  3.29M|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|  3.29M|        ? ExecutionStatus::EXCEPTION
  293|  3.29M|        : ExecutionStatus::RETURNED;
  294|  3.29M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSArrayEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|   416k|  Handle<T> *operator->() {
  285|   416k|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|      0|    return &getValue();
  287|   416k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|    877|  PseudoHandle<T> &getValue() {
  406|    877|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|      0|    return valueOrStatus_;
  408|    877|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  2.94k|  ExecutionStatus getStatus() const {
  401|  2.94k|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 2.94k]
  ------------------
  402|  2.94k|        ? ExecutionStatus::EXCEPTION
  403|  2.94k|        : ExecutionStatus::RETURNED;
  404|  2.94k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEC2EOS4_:
  319|  1.76M|      : status_(ExecutionStatus::RETURNED), storage_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEC2ENS0_15ExecutionStatusE:
  321|    179|  /* implicit */ CallResult(ExecutionStatus status) : status_(status) {
  322|    179|    assert(status != ExecutionStatus::RETURNED);
  323|    179|  }
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EE23toCallResultHermesValueEv:
  350|   405k|  CallResult<HermesValue> toCallResultHermesValue() const {
  351|       |    // Use a private constructor in CallResult<HermesValue> to convert
  352|       |    // without having to branch.
  353|   405k|    return CallResult<HermesValue>{status_, storage_.getHermesValue()};
  354|   405k|  }
_ZN6hermes2vmeqINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|   190k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   190k|  return lhs.getStatus() == rhs;
  417|   190k|}
_ZNK6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|   724k|  ExecutionStatus getStatus() const {
  125|   724k|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 724k, False: 0]
  ------------------
  126|   724k|  }
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|   495k|  T *operator->() {
  136|   495k|    return &getValue();
  137|   495k|  }
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|   495k|  T &getValue() {
  128|   495k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|      0|    return *value_;
  130|   495k|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_15StringPrimitiveEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.30M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.30M|  return lhs.getStatus() == rhs;
  417|  1.30M|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  2.61M|  ExecutionStatus getStatus() const {
  401|  2.61M|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 2.61M]
  ------------------
  402|  2.61M|        ? ExecutionStatus::EXCEPTION
  403|  2.61M|        : ExecutionStatus::RETURNED;
  404|  2.61M|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEdeEv:
  392|   798k|  PseudoHandle<T> &operator*() {
  393|   798k|    return getValue();
  394|   798k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|   832k|  PseudoHandle<T> &getValue() {
  406|   832k|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|      0|    return valueOrStatus_;
  408|   832k|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.75M|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.75M|  return lhs.getStatus() == rhs;
  417|  1.75M|}
_ZN6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EEC2Ed:
  163|     99|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|     99|    new (&storage_) T(value);
  165|     99|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     99|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEC2EOS7_:
  314|      4|  CallResult(CallResult &&cr) = default;
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE5EEaSEOS7_:
  315|   135k|  CallResult &operator=(CallResult &&cr) = default;
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|  1.47k|      : valueOrStatus_(std::move(value)) {}
_ZNK6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEptEv:
  182|  1.27M|  const T *operator->() const {
  183|  1.27M|    return &getValue();
  184|  1.27M|  }
_ZN6hermes2vmeqImEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|   404k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   404k|  return lhs.getStatus() == rhs;
  417|   404k|}
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|   404k|  ExecutionStatus getStatus() const {
  176|   404k|    return status_;
  177|   404k|  }
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|   404k|  const T &operator*() const {
  172|   404k|    return getValue();
  173|   404k|  }
_ZNK6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|   404k|  const T &getValue() const {
  179|   404k|    assert(status_ == ExecutionStatus::RETURNED);
  180|      0|    return *reinterpret_cast<const T *>(&storage_);
  181|   404k|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_8JSObjectEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  1.47k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  1.47k|  return lhs.getStatus() == rhs;
  417|  1.47k|}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|    594|  PseudoHandle<T> *operator->() {
  396|    594|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|      0|    return &valueOrStatus_;
  398|    594|  }
_ZN6hermes2vmeqIbEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|   296k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   296k|  return lhs.getStatus() == rhs;
  417|   296k|}
_ZN6hermes2vmeqIdEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEENS0_15ExecutionStatusE:
  415|     99|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     99|  return lhs.getStatus() == rhs;
  417|     99|}
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EE9getStatusEv:
  175|     99|  ExecutionStatus getStatus() const {
  176|     99|    return status_;
  177|     99|  }
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EEdeEv:
  171|    198|  const T &operator*() const {
  172|    198|    return getValue();
  173|    198|  }
_ZNK6hermes2vm10CallResultIdLNS0_6detail20CallResultSpecializeE2EE8getValueEv:
  178|    198|  const T &getValue() const {
  179|    198|    assert(status_ == ExecutionStatus::RETURNED);
  180|      0|    return *reinterpret_cast<const T *>(&storage_);
  181|    198|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8SymbolIDEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|   206k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   206k|  return lhs.getStatus() == rhs;
  417|   206k|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|   202k|  Handle<T> &operator*() {
  282|   202k|    return getValue();
  283|   202k|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8JSStringEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|     99|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     99|  return lhs.getStatus() == rhs;
  417|     99|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|    198|  ExecutionStatus getStatus() const {
  290|    198|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 198]
  ------------------
  291|    198|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|    198|        ? ExecutionStatus::EXCEPTION
  293|    198|        : ExecutionStatus::RETURNED;
  294|    198|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     99|  Handle<T> &getValue() {
  296|     99|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|     99|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEaSERKS5_:
  155|  3.30k|  CallResult &operator=(const CallResult &cr) {
  156|  3.30k|    status_ = cr.status_;
  157|       |    // GCC8 requires this no-op cast to avoid its -Wclass-memaccess warning.
  158|  3.30k|    std::memcpy(reinterpret_cast<void *>(&storage_), &cr.storage_, sizeof(T));
  159|  3.30k|    return *this;
  160|  3.30k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EEC2IS7_vEEOT_:
  109|   302k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vmneINS0_12PseudoHandleINS0_15DictPropertyMapEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  419|  9.45k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  9.45k|  return lhs.getStatus() != rhs;
  421|  9.45k|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|  38.5k|  ExecutionStatus getStatus() const {
  401|  38.5k|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 38.5k]
  ------------------
  402|  38.5k|        ? ExecutionStatus::EXCEPTION
  403|  38.5k|        : ExecutionStatus::RETURNED;
  404|  38.5k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|  19.2k|  PseudoHandle<T> *operator->() {
  396|  19.2k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|      0|    return &valueOrStatus_;
  398|  19.2k|  }
_ZN6hermes2vmneINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  419|  37.9k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  37.9k|  return lhs.getStatus() != rhs;
  421|  37.9k|}
_ZN6hermes2vmeqINS0_8SymbolIDEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|   205k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   205k|  return lhs.getStatus() == rhs;
  417|   205k|}
_ZNK6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|   205k|  ExecutionStatus getStatus() const {
  125|   205k|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 205k, False: 0]
  ------------------
  126|   205k|  }
_ZN6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEdeEv:
  117|   205k|  T &operator*() {
  118|   205k|    return *value_;
  119|   205k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8SymbolIDEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|   206k|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|  1.30M|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|   475k|  PseudoHandle<T> *operator->() {
  396|   475k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|      0|    return &valueOrStatus_;
  398|   475k|  }
_ZN6hermes2vm10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEC2IS2_vEEOT_:
  109|   205k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_9ArgumentsEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|    155|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     14|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|   603k|  T *operator->() {
  136|   603k|    return &getValue();
  137|   603k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|   603k|  T &getValue() {
  128|   603k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|      0|    return *value_;
  130|   603k|  }
_ZNK6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|   905k|  ExecutionStatus getStatus() const {
  125|   905k|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 905k, False: 0]
  ------------------
  126|   905k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEELNS0_6detail20CallResultSpecializeE0EED2Ev:
  115|   302k|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_9ArgumentsEEELNS0_6detail20CallResultSpecializeE4EEC2ENS0_15ExecutionStatusE:
  277|    155|            reinterpret_cast<const PinnedHermesValue *>(-1))) {
  278|    155|    assert(status != ExecutionStatus::RETURNED);
  279|    155|  }
_ZN6hermes2vmeqINS0_6HandleINS0_8JSObjectEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|     14|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     14|  return lhs.getStatus() == rhs;
  417|     14|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|     28|  ExecutionStatus getStatus() const {
  290|     28|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 28]
  ------------------
  291|     28|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|     28|        ? ExecutionStatus::EXCEPTION
  293|     28|        : ExecutionStatus::RETURNED;
  294|     28|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|     14|  Handle<T> &operator*() {
  282|     14|    return getValue();
  283|     14|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     14|  Handle<T> &getValue() {
  296|     14|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|     14|  }
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS8_EE5valueEEENS0_15ExecutionStatusE:
  415|   415k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   415k|  return lhs.getStatus() == rhs;
  417|   415k|}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|   831k|  ExecutionStatus getStatus() const {
  401|   831k|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 831k]
  ------------------
  402|   831k|        ? ExecutionStatus::EXCEPTION
  403|   831k|        : ExecutionStatus::RETURNED;
  404|   831k|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEdeEv:
  392|    121|  PseudoHandle<T> &operator*() {
  393|    121|    return getValue();
  394|    121|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EE8getValueEv:
  405|    121|  PseudoHandle<T> &getValue() {
  406|    121|    assert(getStatus() == ExecutionStatus::RETURNED);
  407|      0|    return valueOrStatus_;
  408|    121|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|   415k|  PseudoHandle<T> *operator->() {
  396|   415k|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|      0|    return &valueOrStatus_;
  398|   415k|  }
_ZN6hermes2vmneINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  419|  1.18k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  1.18k|  return lhs.getStatus() != rhs;
  421|  1.18k|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|     24|  ~CallResult() = default;
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|     24|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqINS0_6HandleINS0_7JSErrorEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|     24|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|     24|  return lhs.getStatus() == rhs;
  417|     24|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|     48|  ExecutionStatus getStatus() const {
  290|     48|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 48]
  ------------------
  291|     48|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|     48|        ? ExecutionStatus::EXCEPTION
  293|     48|        : ExecutionStatus::RETURNED;
  294|     48|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|     24|  Handle<T> &operator*() {
  282|     24|    return getValue();
  283|     24|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_7JSErrorEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|     24|  Handle<T> &getValue() {
  296|     24|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|     24|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|  67.8k|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EED2Ev:
  271|  67.8k|  ~CallResult() = default;
_ZN6hermes2vmeqINS0_6HandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  67.8k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  67.8k|  return lhs.getStatus() == rhs;
  417|  67.8k|}
_ZNK6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EE9getStatusEv:
  289|   135k|  ExecutionStatus getStatus() const {
  290|   135k|    return reinterpret_cast<intptr_t>(
  ------------------
  |  Branch (290:12): [True: 0, False: 135k]
  ------------------
  291|   135k|               valueOrStatus_.unsafeGetPinnedHermesValue()) == -1
  292|   135k|        ? ExecutionStatus::EXCEPTION
  293|   135k|        : ExecutionStatus::RETURNED;
  294|   135k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EEdeEv:
  281|  67.8k|  Handle<T> &operator*() {
  282|  67.8k|    return getValue();
  283|  67.8k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_11HermesValueEEELNS0_6detail20CallResultSpecializeE4EE8getValueEv:
  295|  67.8k|  Handle<T> &getValue() {
  296|  67.8k|    assert(getStatus() == ExecutionStatus::RETURNED);
  297|      0|    return valueOrStatus_;
  298|  67.8k|  }
_ZN6hermes2vmeqINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  415|    756|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    756|  return lhs.getStatus() == rhs;
  417|    756|}
_ZNK6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  3.70k|  ExecutionStatus getStatus() const {
  125|  3.70k|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 3.70k, False: 0]
  ------------------
  126|  3.70k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  2.94k|  T *operator->() {
  136|  2.94k|    return &getValue();
  137|  2.94k|  }
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  2.94k|  T &getValue() {
  128|  2.94k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|      0|    return *value_;
  130|  2.94k|  }
_ZN6hermes2vmeqINSt3__14pairINS0_6HandleINS0_11HiddenClassEEEjEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  415|   300k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   300k|  return lhs.getStatus() == rhs;
  417|   300k|}
_ZN6hermes2vm10CallResultINSt3__14pairINS0_8JSObject20PropertyUpdateStatusENS0_13PropertyFlagsEEELNS0_6detail20CallResultSpecializeE0EEC2IS7_vEEOT_:
  109|    756|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZNK6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EE9getStatusEv:
  400|     99|  ExecutionStatus getStatus() const {
  401|     99|    return reinterpret_cast<intptr_t>(valueOrStatus_.unsafeGetValue()) == -1
  ------------------
  |  Branch (401:12): [True: 0, False: 99]
  ------------------
  402|     99|        ? ExecutionStatus::EXCEPTION
  403|     99|        : ExecutionStatus::RETURNED;
  404|     99|  }
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEaSEOSA_:
  103|   808k|  CallResult &operator=(CallResult &&cr) = default;
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EED2Ev:
  115|  1.61M|  ~CallResult() = default;
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEC2EOSA_:
  102|   404k|  CallResult(CallResult &&cr) = default;
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEC2IS7_vEEOT_:
  109|  1.21M|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vmeqIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS9_EE5valueEEENS0_15ExecutionStatusE:
  415|   808k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   808k|  return lhs.getStatus() == rhs;
  417|   808k|}
_ZNK6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  1.21M|  ExecutionStatus getStatus() const {
  125|  1.21M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 1.21M, False: 0]
  ------------------
  126|  1.21M|  }
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|   404k|  T *operator->() {
  136|   404k|    return &getValue();
  137|   404k|  }
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|   404k|  T &getValue() {
  128|   404k|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|      0|    return *value_;
  130|   404k|  }
_ZN6hermes2vm10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEdeEv:
  117|   808k|  T &operator*() {
  118|   808k|    return *value_;
  119|   808k|  }
_ZN6hermes2vm10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEC2ENS0_15ExecutionStatusES2_:
  190|   405k|      : status_(status), storage_(value) {
  191|   405k|    static_assert(
  192|   405k|        std::is_same<T, HermesValue>::value,
  193|   405k|        "private constructor is for constructing CallResult<HermesValue>");
  194|   405k|  }
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEC2IS2_vEEOT_:
  109|   459k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EED2Ev:
  115|   459k|  ~CallResult() = default;
_ZN6hermes2vm10CallResultImLNS0_6detail20CallResultSpecializeE2EEC2Em:
  163|   404k|  /* implicit */ CallResult(T value) : status_(ExecutionStatus::RETURNED) {
  164|   404k|    new (&storage_) T(value);
  165|   404k|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSObjectEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|     14|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmneINS0_12PseudoHandleINS0_11HermesValueEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  419|     99|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|     99|  return lhs.getStatus() != rhs;
  421|     99|}
_ZN6hermes2vmeqINS0_13StringBuilderEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  415|   459k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|   459k|  return lhs.getStatus() == rhs;
  417|   459k|}
_ZNK6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EE9getStatusEv:
  124|  1.81M|  ExecutionStatus getStatus() const {
  125|  1.81M|    return value_ ? ExecutionStatus::RETURNED : ExecutionStatus::EXCEPTION;
  ------------------
  |  Branch (125:12): [True: 1.81M, False: 0]
  ------------------
  126|  1.81M|  }
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEptEv:
  135|  1.35M|  T *operator->() {
  136|  1.35M|    return &getValue();
  137|  1.35M|  }
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EE8getValueEv:
  127|  1.35M|  T &getValue() {
  128|  1.35M|    assert(getStatus() == ExecutionStatus::RETURNED);
  129|      0|    return *value_;
  130|  1.35M|  }
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|    137|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_8JSStringEEELNS0_6detail20CallResultSpecializeE4EEC2ES4_:
  273|     99|  /* implicit */ CallResult(Handle<T> value) : valueOrStatus_(value) {}
_ZN6hermes2vmeqIPNS0_13RuntimeModuleEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS5_EE5valueEEENS0_15ExecutionStatusE:
  415|    155|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    155|  return lhs.getStatus() == rhs;
  417|    155|}
_ZNK6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EE9getStatusEv:
  252|    310|  ExecutionStatus getStatus() const {
  253|    310|    return reinterpret_cast<intptr_t>(valueOrStatus_) == -1
  ------------------
  |  Branch (253:12): [True: 0, False: 310]
  ------------------
  254|    310|        ? ExecutionStatus::EXCEPTION
  255|    310|        : ExecutionStatus::RETURNED;
  256|    310|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EEdeEv:
  245|    155|  T *&operator*() {
  246|    155|    return getValue();
  247|    155|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EE8getValueEv:
  257|    155|  T *&getValue() {
  258|    155|    assert(getStatus() == ExecutionStatus::RETURNED);
  259|      0|    return valueOrStatus_;
  260|    155|  }
_ZN6hermes2vmneINS0_11HermesValueEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEENS0_15ExecutionStatusE:
  419|  4.45k|bool operator!=(const CallResult<T> &lhs, ExecutionStatus rhs) {
  420|  4.45k|  return lhs.getStatus() != rhs;
  421|  4.45k|}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EEptEv:
  395|     99|  PseudoHandle<T> *operator->() {
  396|     99|    assert(getStatus() == ExecutionStatus::RETURNED);
  397|      0|    return &valueOrStatus_;
  398|     99|  }
_ZN6hermes2vm10CallResultIPNS0_13RuntimeModuleELNS0_6detail20CallResultSpecializeE3EEC2ES3_:
  238|    155|  /* implicit */ CallResult(T *value) : valueOrStatus_(value) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEELNS0_6detail20CallResultSpecializeE6EEC2EOS6_:
  378|   415k|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vm10CallResultINS0_13StringBuilderELNS0_6detail20CallResultSpecializeE0EEdeEv:
  117|     24|  T &operator*() {
  118|     24|    return *value_;
  119|     24|  }
_ZN6hermes2vmeqINS0_6HandleINS0_15StringPrimitiveEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|    137|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|    137|  return lhs.getStatus() == rhs;
  417|    137|}
_ZN6hermes2vm10CallResultINS0_6HandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE4EEptEv:
  284|    137|  Handle<T> *operator->() {
  285|    137|    assert(getStatus() == ExecutionStatus::RETURNED);
  286|      0|    return &getValue();
  287|    137|  }
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_15DictPropertyMapEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|  19.2k|      : valueOrStatus_(std::move(value)) {}
_ZN6hermes2vmeqINS0_12PseudoHandleINS0_15DictPropertyMapEEEEEbRKNS0_10CallResultIT_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEENS0_15ExecutionStatusE:
  415|  9.82k|bool operator==(const CallResult<T> &lhs, ExecutionStatus rhs) {
  416|  9.82k|  return lhs.getStatus() == rhs;
  417|  9.82k|}
_ZN6hermes2vm10CallResultINSt3__14pairIPNS0_23NamedPropertyDescriptorEbEELNS0_6detail20CallResultSpecializeE0EEC2IS6_vEEOT_:
  109|   228k|  /* implicit */ CallResult(U &&value) : value_(std::forward<U>(value)) {}
_ZN6hermes2vm10CallResultINS0_12PseudoHandleINS0_14OrderedHashMapEEELNS0_6detail20CallResultSpecializeE6EEC2EOS4_:
  378|     99|      : valueOrStatus_(std::move(value)) {}

_ZN6hermes2vm8Callable4callENS0_6HandleIS1_EERNS0_7RuntimeE:
  248|   407k|      Runtime &runtime) {
  249|       |    // Any call to a native or JS function could potentially allocate.
  250|       |    // Move the heap to force raw pointer errors to come out whenever a call is
  251|       |    // made.
  252|   407k|    runtime.potentiallyMoveHeap();
  253|   407k|    return selfHandle->getVT()->call(selfHandle, runtime);
  254|   407k|  }
_ZNK6hermes2vm8Callable5getVTEv:
  141|   407k|  const CallableVTable *getVT() const {
  142|   407k|    return static_cast<const CallableVTable *>(GCCell::getVT());
  143|   407k|  }
_ZN6hermes2vm11Environment7classofEPKNS0_6GCCellE:
   45|  13.1k|  static bool classof(const GCCell *cell) {
   46|  13.1k|    return cell->getKind() == CellKind::EnvironmentKind;
   47|  13.1k|  }
_ZN6hermes2vm8Callable7classofEPKNS0_6GCCellE:
  134|   414k|  static bool classof(const GCCell *cell) {
  135|   414k|    return kindInRange(
  136|   414k|        cell->getKind(),
  137|   414k|        CellKind::CallableKind_first,
  138|   414k|        CellKind::CallableKind_last);
  139|   414k|  }
_ZN6hermes2vm11Environment11getCellKindEv:
   42|    904|  static constexpr CellKind getCellKind() {
   43|    904|    return CellKind::EnvironmentKind;
   44|    904|  }
_ZN6hermes2vm11Environment6createERNS0_7RuntimeENS0_6HandleIS1_EEj:
   53|    452|      uint32_t size) {
   54|    452|    auto *cell = runtime.makeAVariable<Environment>(
   55|    452|        allocationSize(size), runtime, parentEnvironment, size);
   56|    452|    return HermesValue::encodeObjectValue(cell);
   57|    452|  }
_ZNK6hermes2vm11Environment7getSizeEv:
   66|  5.05k|  uint32_t getSize() const {
   67|  5.05k|    return size_.load(std::memory_order_relaxed);
   68|  5.05k|  }
_ZN6hermes2vm11Environment4slotEj:
   70|  5.05k|  GCHermesValue &slot(uint32_t index) {
   71|  5.05k|    assert(index < getSize() && "invalid Environment slot index");
   72|      0|    return getSlots()[index];
   73|  5.05k|  }
_ZN6hermes2vm11Environment14allocationSizeEj:
   76|    452|  static uint32_t allocationSize(uint32_t size) {
   77|    452|    return totalSizeToAlloc<GCHermesValue>(size);
   78|    452|  }
_ZN6hermes2vm11EnvironmentC2ERNS0_7RuntimeENS0_6HandleIS1_EEj:
   89|    452|        size_(size) {
   90|       |    // Initialize all slots to 'undefined'.
   91|    452|    GCHermesValue::uninitialized_fill(
   92|    452|        getSlots(),
   93|    452|        getSlots() + size,
   94|    452|        HermesValue::encodeUndefinedValue(),
   95|    452|        runtime.getHeap());
   96|    452|  }
_ZN6hermes2vm11Environment8getSlotsEv:
  100|  5.96k|  GCHermesValue *getSlots() {
  101|  5.96k|    return getTrailingObjects<GCHermesValue>();
  102|  5.96k|  }
_ZNK6hermes2vm11Environment8getSlotsEv:
  103|      1|  const GCHermesValue *getSlots() const {
  104|      1|    return getTrailingObjects<GCHermesValue>();
  105|      1|  }
_ZNK6hermes2vm8Callable14getEnvironmentERNS0_7RuntimeE:
  146|  1.73k|  Environment *getEnvironment(Runtime &runtime) const {
  147|  1.73k|    return environment_.get(runtime);
  148|  1.73k|  }
_ZN6hermes2vm8Callable9newObjectENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_8JSObjectEEE:
  241|    594|      Handle<JSObject> parentHandle) {
  242|    594|    return selfHandle->getVT()->newObject(selfHandle, runtime, parentHandle);
  243|    594|  }
_ZN6hermes2vm8CallableC2ERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassENS0_6HandleINS0_11EnvironmentEEE:
  315|  4.50k|        environment_(runtime, *env, runtime.getHeap()) {}
_ZN6hermes2vm8CallableC2ERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassE:
  317|  46.5k|      : JSObject(runtime, parent, clazz), environment_() {}
_ZN6hermes2vm13BoundFunction11getCellKindEv:
  346|    198|  static constexpr CellKind getCellKind() {
  347|    198|    return CellKind::BoundFunctionKind;
  348|    198|  }
_ZN6hermes2vm13BoundFunction7classofEPKNS0_6GCCellE:
  349|    103|  static bool classof(const GCCell *cell) {
  350|    103|    return cell->getKind() == CellKind::BoundFunctionKind;
  351|    103|  }
_ZN6hermes2vm13BoundFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENS4_INS0_8CallableEEENS4_INS0_16ArrayStorageBaseINS0_11HermesValueEEEEE:
  399|     99|        argStorage_(runtime, *argStorage, runtime.getHeap()) {}
_ZN6hermes2vm14NativeFunction11getCellKindEv:
  444|  84.8k|  static constexpr CellKind getCellKind() {
  445|  84.8k|    return CellKind::NativeFunctionKind;
  446|  84.8k|  }
_ZN6hermes2vm14NativeFunction7classofEPKNS0_6GCCellE:
  447|   459k|  static bool classof(const GCCell *cell) {
  448|   459k|    return kindInRange(
  449|   459k|        cell->getKind(),
  450|   459k|        CellKind::NativeFunctionKind_first,
  451|   459k|        CellKind::NativeFunctionKind_last);
  452|   459k|  }
_ZN6hermes2vm14NativeFunction11_nativeCallEPS1_RNS0_7RuntimeE:
  483|   408k|      Runtime &runtime) {
  484|   408k|    ScopedNativeDepthTracker depthTracker{runtime};
  485|   408k|    if (LLVM_UNLIKELY(depthTracker.overflowed())) {
  ------------------
  |  |  189|   408k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 408k]
  |  |  ------------------
  ------------------
  486|      0|      return runtime.raiseStackOverflow(
  487|      0|          Runtime::StackOverflowKind::NativeStack);
  488|      0|    }
  489|       |
  490|   408k|    auto newFrame = runtime.setCurrentFrameToTopOfStack();
  491|   408k|    runtime.saveCallerIPInStackFrame();
  492|       |    // Allocate the "reserved" registers in the new frame.
  493|   408k|    if (LLVM_UNLIKELY(!runtime.checkAndAllocStack(
  ------------------
  |  |  189|   408k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 408k]
  |  |  ------------------
  ------------------
  494|   408k|            StackFrameLayout::CalleeExtraRegistersAtStart,
  495|   408k|            HermesValue::encodeUndefinedValue()))) {
  496|       |      // Restore the stack before raising the overflow.
  497|      0|      runtime.restoreStackAndPreviousFrame(newFrame);
  498|      0|      return runtime.raiseStackOverflow(
  499|      0|          Runtime::StackOverflowKind::JSRegisterStack);
  500|      0|    }
  501|       |
  502|       |#ifdef HERMESVM_PROFILER_NATIVECALL
  503|       |    auto t1 = HERMESVM_RDTSC();
  504|       |#endif
  505|       |
  506|   408k|    auto res =
  507|   408k|        self->functionPtr_(self->context_, runtime, newFrame.getNativeArgs());
  508|       |
  509|       |#ifdef HERMESVM_PROFILER_NATIVECALL
  510|       |    self->callDuration_ = HERMESVM_RDTSC() - t1;
  511|       |    ++self->callCount_;
  512|       |#endif
  513|   408k|    runtime.restoreStackAndPreviousFrame(newFrame);
  514|   408k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   408k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 408k]
  |  |  ------------------
  ------------------
  515|      0|      return ExecutionStatus::EXCEPTION;
  516|      0|    }
  517|   408k|    return createPseudoHandle(*res);
  518|   408k|  }
_ZN6hermes2vm14NativeFunction22createWithoutPrototypeERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEENS0_8SymbolIDEjj:
  576|  1.28k|      unsigned additionalSlotCount = 0) {
  577|  1.28k|    return create(
  578|  1.28k|        runtime,
  579|  1.28k|        parentHandle,
  580|  1.28k|        context,
  581|  1.28k|        functionPtr,
  582|  1.28k|        name,
  583|  1.28k|        paramCount,
  584|  1.28k|        runtime.makeNullHandle<JSObject>(),
  585|  1.28k|        additionalSlotCount);
  586|  1.28k|  }
_ZN6hermes2vm14NativeFunction22createWithoutPrototypeERNS0_7RuntimeEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES4_S3_NS0_10NativeArgsEENS0_8SymbolIDEjj:
  603|  1.28k|      unsigned additionalSlotCount = 0) {
  604|  1.28k|    return createWithoutPrototype(
  605|  1.28k|        runtime,
  606|  1.28k|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  607|  1.28k|        context,
  608|  1.28k|        functionPtr,
  609|  1.28k|        name,
  610|  1.28k|        paramCount,
  611|  1.28k|        additionalSlotCount);
  612|  1.28k|  }
_ZN6hermes2vm14NativeFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES9_S3_NS0_10NativeArgsEE:
  646|  46.4k|        functionPtr_(functionPtr) {}
_ZN6hermes2vm17NativeConstructor11getCellKindEv:
  700|  8.11k|  static constexpr CellKind getCellKind() {
  701|  8.11k|    return CellKind::NativeConstructorKind;
  702|  8.11k|  }
_ZN6hermes2vm17NativeConstructor7classofEPKNS0_6GCCellE:
  703|  4.05k|  static bool classof(const GCCell *cell) {
  704|  4.05k|    return cell->getKind() == CellKind::NativeConstructorKind;
  705|  4.05k|  }
_ZN6hermes2vm17NativeConstructor6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEEjPFNS8_INS0_12PseudoHandleIS5_EELSB_6EEES3_S6_S7_ENS0_8CellKindE:
  724|  4.05k|      CellKind targetKind) {
  725|  4.05k|    auto *cell = runtime.makeAFixed<NativeConstructor>(
  726|  4.05k|        runtime,
  727|  4.05k|        parentHandle,
  728|  4.05k|        runtime.getHiddenClassForPrototype(
  729|  4.05k|            *parentHandle, numOverlapSlots<NativeConstructor>()),
  730|  4.05k|        context,
  731|  4.05k|        functionPtr,
  732|  4.05k|        creator,
  733|  4.05k|        targetKind);
  734|  4.05k|    return JSObjectInit::initToPseudoHandle(runtime, cell);
  735|  4.05k|  }
_ZN6hermes2vm17NativeConstructorC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES9_S3_NS0_10NativeArgsEEPFNSA_INS0_12PseudoHandleIS5_EELSD_6EEES3_S6_S9_ENS0_8CellKindE:
  786|  4.05k|        creator_(creator) {
  787|  4.05k|  }
_ZN6hermes2vm10JSFunctionC2ERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS4_INS0_8JSObjectEEENS4_INS0_11HiddenClassEEENS4_INS0_11EnvironmentEEEPNS0_9CodeBlockE:
  855|  4.50k|        domain_(runtime, *domain, runtime.getHeap()) {
  856|  4.50k|    assert(
  857|  4.50k|        !vt.finalize_ == (kHasFinalizer != HasFinalizer::Yes) &&
  858|  4.50k|        "kHasFinalizer invalid value");
  859|  4.50k|  }
_ZN6hermes2vm10JSFunction11getCellKindEv:
  864|  9.00k|  static constexpr CellKind getCellKind() {
  865|  9.00k|    return CellKind::JSFunctionKind;
  866|  9.00k|  }
_ZN6hermes2vm10JSFunction7classofEPKNS0_6GCCellE:
  867|  8.63k|  static bool classof(const GCCell *cell) {
  868|  8.63k|    return kindInRange(
  869|  8.63k|        cell->getKind(),
  870|  8.63k|        CellKind::CodeBlockFunctionKind_first,
  871|  8.63k|        CellKind::CodeBlockFunctionKind_last);
  872|  8.63k|  }
_ZNK6hermes2vm10JSFunction12getCodeBlockERNS0_7RuntimeE:
  906|  1.73k|  CodeBlock *getCodeBlock(Runtime &runtime) const {
  907|  1.73k|    return codeBlock_.get(runtime);
  908|  1.73k|  }
_ZN6hermes2vm19JSGeneratorFunction7classofEPKNS0_6GCCellE:
 1026|  4.40k|  static bool classof(const GCCell *cell) {
 1027|  4.40k|    return cell->getKind() == CellKind::JSGeneratorFunctionKind;
 1028|  4.40k|  }

_ZN6hermes2vm9CardTable8Boundary4bumpEv:
  278|   989k|inline void CardTable::Boundary::bump() {
  279|   989k|  index_++;
  280|   989k|  address_ += kCardSize;
  281|   989k|}
_ZNK6hermes2vm9CardTable8Boundary5indexEv:
  283|  1.06M|inline size_t CardTable::Boundary::index() const {
  284|  1.06M|  return index_;
  285|  1.06M|}
_ZNK6hermes2vm9CardTable8Boundary7addressEv:
  287|  1.91M|inline const char *CardTable::Boundary::address() const {
  288|  1.91M|  return address_;
  289|  1.91M|}
_ZNK6hermes2vm9CardTable14addressToIndexEPKv:
  294|   970k|inline size_t CardTable::addressToIndex(const void *addr) const {
  295|   970k|  auto addrPtr = reinterpret_cast<const char *>(addr);
  296|   970k|  assert(
  297|   970k|      base() <= addrPtr &&
  298|   970k|      addrPtr < (static_cast<const char *>(AlignedStorage::end(base())) +
  299|   970k|                 kCardSize) &&
  300|   970k|      "address is required to be within range.");
  301|      0|  return (addrPtr - base()) >> kLogCardSize;
  302|   970k|}
_ZNK6hermes2vm9CardTable14indexToAddressEm:
  304|  10.8M|inline const char *CardTable::indexToAddress(size_t index) const {
  305|  10.8M|  assert(index <= kValidIndices && "index must be within the index range");
  306|      0|  const char *res = base() + (index << kLogCardSize);
  307|  10.8M|  assert(
  308|  10.8M|      base() <= res && res <= AlignedStorage::end(base()) &&
  309|  10.8M|      "result must be within the covered range");
  310|      0|  return res;
  311|  10.8M|}
_ZN6hermes2vm9CardTable19dirtyCardForAddressEPKv:
  313|   267k|inline void CardTable::dirtyCardForAddress(const void *addr) {
  314|   267k|  cards_[addressToIndex(addr)].store(
  315|   267k|      CardStatus::Dirty, std::memory_order_relaxed);
  316|   267k|}
_ZNK6hermes2vm9CardTable21isCardForAddressDirtyEPKv:
  318|  8.82k|inline bool CardTable::isCardForAddressDirty(const void *addr) const {
  319|  8.82k|  return isCardForIndexDirty(addressToIndex(addr));
  320|  8.82k|}
_ZNK6hermes2vm9CardTable19isCardForIndexDirtyEm:
  322|  9.16k|inline bool CardTable::isCardForIndexDirty(size_t index) const {
  323|  9.16k|  assert(index < kValidIndices && "index is required to be in range.");
  324|      0|  return cards_[index].load(std::memory_order_relaxed) == CardStatus::Dirty;
  325|  9.16k|}
_ZNK6hermes2vm9CardTable17findNextDirtyCardEmm:
  329|    487|    size_t endIndex) const {
  330|    487|  return findNextCardWithStatus(CardStatus::Dirty, fromIndex, endIndex);
  331|    487|}
_ZNK6hermes2vm9CardTable17findNextCleanCardEmm:
  335|    170|    size_t endIndex) const {
  336|    170|  return findNextCardWithStatus(CardStatus::Clean, fromIndex, endIndex);
  337|    170|}
_ZNK6hermes2vm9CardTable12nextBoundaryEPKc:
  339|   616k|inline CardTable::Boundary CardTable::nextBoundary(const char *level) const {
  340|   616k|  assert(level != nullptr);
  341|      0|  size_t ix = addressToIndex(level - 1) + 1;
  342|   616k|  const char *addr = indexToAddress(ix);
  343|       |
  344|   616k|  return {ix, addr};
  345|   616k|}
_ZNK6hermes2vm9CardTable4baseEv:
  347|  35.5M|inline const char *CardTable::base() const {
  348|       |  // As we know the card table is laid out inline before the allocation region
  349|       |  // of its aligned heap segment, we can use its own this pointer as the base
  350|       |  // address.
  351|  35.5M|  return reinterpret_cast<const char *>(this);
  352|  35.5M|}
_ZN6hermes2vm9CardTable9encodeExpEa:
  354|   913k|/* static */ inline int8_t CardTable::encodeExp(int8_t exp) {
  355|   913k|  return -(exp + 1);
  356|   913k|}
_ZN6hermes2vm9CardTable9decodeExpEa:
  358|  28.0M|/* static */ inline int8_t CardTable::decodeExp(int8_t encodedVal) {
  359|  28.0M|  return -encodedVal - 1;
  360|  28.0M|}
_ZN6hermes2vm9CardTable13isCardAlignedEPKv:
  362|    637|/* static */ inline bool CardTable::isCardAligned(const void *ptr) {
  363|    637|  return (reinterpret_cast<intptr_t>(ptr) & (kCardSize - 1)) == 0;
  364|    637|}
_ZN6hermes2vm9CardTableC2Ev:
   98|    203|  CardTable() = default;
_ZN6hermes2vm9CardTable8BoundaryC2EmPKc:
  292|   616k|    : index_(index), address_(address) {}

_ZN6hermes2vm6vmcastINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   42|  2.07M|ToType *vmcast(HermesValue val) {
   43|  2.07M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  2.07M|}
_ZN6hermes2vm6vmcastINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   29|  2.72M|ToType *vmcast(GCCell *cell) {
   30|  2.72M|  return llvh::cast<ToType>(cell);
   31|  2.72M|}
_ZN6hermes2vm6vmcastINS0_11HiddenClassEEEPT_PNS0_6GCCellE:
   29|  3.83M|ToType *vmcast(GCCell *cell) {
   30|  3.83M|  return llvh::cast<ToType>(cell);
   31|  3.83M|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   29|  3.34M|ToType *vmcast(GCCell *cell) {
   30|  3.34M|  return llvh::cast<ToType>(cell);
   31|  3.34M|}
_ZN6hermes2vm6vmcastINS0_7JSArrayEEEPT_NS0_11HermesValueE:
   42|   145k|ToType *vmcast(HermesValue val) {
   43|   145k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   145k|}
_ZN6hermes2vm6vmcastINS0_7JSArrayEEEPT_PNS0_6GCCellE:
   29|   145k|ToType *vmcast(GCCell *cell) {
   30|   145k|  return llvh::cast<ToType>(cell);
   31|   145k|}
_ZN6hermes2vm6vmcastINS0_8JSObjectEEEPT_NS0_11HermesValueE:
   42|  1.14M|ToType *vmcast(HermesValue val) {
   43|  1.14M|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  1.14M|}
_ZN6hermes2vm6vmcastINS0_8JSObjectEEEPT_PNS0_6GCCellE:
   29|  1.55M|ToType *vmcast(GCCell *cell) {
   30|  1.55M|  return llvh::cast<ToType>(cell);
   31|  1.55M|}
_ZN6hermes2vm14vmcast_or_nullINS0_11EnvironmentEEEPT_NS0_11HermesValueE:
   60|    607|ToType *vmcast_or_null(HermesValue val) {
   61|    607|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|    607|}
_ZN6hermes2vm14vmcast_or_nullINS0_11EnvironmentEEEPT_PNS0_6GCCellE:
   49|  2.34k|ToType *vmcast_or_null(GCCell *cell) {
   50|  2.34k|#ifndef NDEBUG
   51|  2.34k|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  2.34k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb1EEEEEbPKNS0_6GCCellE:
  116|  1.34M|bool vmisa(const GCCell *cell) {
  117|  1.34M|  return llvh::isa<ToType>(cell);
  118|  1.34M|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb1EEEEEPKT_PKNS0_6GCCellE:
   35|   919k|const ToType *vmcast(const GCCell *cell) {
   36|   919k|  return llvh::cast<ToType>(cell);
   37|   919k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb0EEEEEbPKNS0_6GCCellE:
  116|   422k|bool vmisa(const GCCell *cell) {
  117|   422k|  return llvh::isa<ToType>(cell);
  118|   422k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb0EEEEEPKT_PKNS0_6GCCellE:
   35|   422k|const ToType *vmcast(const GCCell *cell) {
   36|   422k|  return llvh::cast<ToType>(cell);
   37|   422k|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIcEEEEPKT_PKNS0_6GCCellE:
   35|      5|const ToType *vmcast(const GCCell *cell) {
   36|      5|  return llvh::cast<ToType>(cell);
   37|      5|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIcEEEEPT_NS0_11HermesValueE:
   42|  1.36k|ToType *vmcast(HermesValue val) {
   43|  1.36k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  1.36k|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIcEEEEPT_PNS0_6GCCellE:
   29|  1.43k|ToType *vmcast(GCCell *cell) {
   30|  1.43k|  return llvh::cast<ToType>(cell);
   31|  1.43k|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPKT_PKNS0_6GCCellE:
   35|   985k|const ToType *vmcast(const GCCell *cell) {
   36|   985k|  return llvh::cast<ToType>(cell);
   37|   985k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb1EEEEEbPKNS0_6GCCellE:
  116|   186k|bool vmisa(const GCCell *cell) {
  117|   186k|  return llvh::isa<ToType>(cell);
  118|   186k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb1EEEEEPKT_PKNS0_6GCCellE:
   35|  20.9k|const ToType *vmcast(const GCCell *cell) {
   36|  20.9k|  return llvh::cast<ToType>(cell);
   37|  20.9k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb0EEEEEbPKNS0_6GCCellE:
  116|   165k|bool vmisa(const GCCell *cell) {
  117|   165k|  return llvh::isa<ToType>(cell);
  118|   165k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb0EEEEEPKT_PKNS0_6GCCellE:
   35|   165k|const ToType *vmcast(const GCCell *cell) {
   36|   165k|  return llvh::cast<ToType>(cell);
   37|   165k|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPT_NS0_11HermesValueE:
   42|    314|ToType *vmcast(HermesValue val) {
   43|    314|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    314|}
_ZN6hermes2vm6vmcastINS0_23ExternalStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   29|   302k|ToType *vmcast(GCCell *cell) {
   30|   302k|  return llvh::cast<ToType>(cell);
   31|   302k|}
_ZN6hermes2vm5vmisaINS0_7JSArrayEEEbNS0_11HermesValueE:
  103|   354k|bool vmisa(HermesValue val) {
  104|   354k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 354k, False: 0]
  ------------------
  105|   354k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 354k, False: 0]
  ------------------
  106|   354k|}
_ZN6hermes2vm5vmisaINS0_8CallableEEEbNS0_11HermesValueE:
  103|   407k|bool vmisa(HermesValue val) {
  104|   407k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 407k, False: 435]
  ------------------
  105|   407k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 406k, False: 594]
  ------------------
  106|   407k|}
_ZN6hermes2vm6vmcastINS0_8CallableEEEPT_NS0_11HermesValueE:
   42|  2.85k|ToType *vmcast(HermesValue val) {
   43|  2.85k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  2.85k|}
_ZN6hermes2vm6vmcastINS0_8CallableEEEPT_PNS0_6GCCellE:
   29|  2.88k|ToType *vmcast(GCCell *cell) {
   30|  2.88k|  return llvh::cast<ToType>(cell);
   31|  2.88k|}
_ZN6hermes2vm5vmisaINS0_21SymbolStringPrimitiveEEEbPKNS0_6GCCellE:
  116|   105k|bool vmisa(const GCCell *cell) {
  117|   105k|  return llvh::isa<ToType>(cell);
  118|   105k|}
_ZN6hermes2vm6vmcastINS0_21SymbolStringPrimitiveEEEPT_PNS0_6GCCellE:
   29|   105k|ToType *vmcast(GCCell *cell) {
   30|   105k|  return llvh::cast<ToType>(cell);
   31|   105k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIcLb1EEEEEbPNS0_6GCCellE:
  110|  49.5k|bool vmisa(GCCell *cell) {
  111|  49.5k|  return llvh::isa<ToType>(cell);
  112|  49.5k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIcLb0EEEEEPT_PNS0_6GCCellE:
   29|  49.5k|ToType *vmcast(GCCell *cell) {
   30|  49.5k|  return llvh::cast<ToType>(cell);
   31|  49.5k|}
_ZN6hermes2vm5vmisaINS0_22DynamicStringPrimitiveIDsLb1EEEEEbPNS0_6GCCellE:
  110|   544k|bool vmisa(GCCell *cell) {
  111|   544k|  return llvh::isa<ToType>(cell);
  112|   544k|}
_ZN6hermes2vm6vmcastINS0_22DynamicStringPrimitiveIDsLb0EEEEEPT_PNS0_6GCCellE:
   29|   544k|ToType *vmcast(GCCell *cell) {
   30|   544k|  return llvh::cast<ToType>(cell);
   31|   544k|}
_ZN6hermes2vm6vmcastINS0_21SymbolStringPrimitiveEEEPKT_PKNS0_6GCCellE:
   35|    288|const ToType *vmcast(const GCCell *cell) {
   36|    288|  return llvh::cast<ToType>(cell);
   37|    288|}
_ZN6hermes2vm5vmisaINS0_15StringPrimitiveEEEbPNS0_6GCCellE:
  110|  88.5k|bool vmisa(GCCell *cell) {
  111|  88.5k|  return llvh::isa<ToType>(cell);
  112|  88.5k|}
_ZN6hermes2vm6vmcastINS0_15DictPropertyMapEEEPT_PNS0_6GCCellE:
   29|  2.45M|ToType *vmcast(GCCell *cell) {
   30|  2.45M|  return llvh::cast<ToType>(cell);
   31|  2.45M|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSObjectEEEPT_PNS0_6GCCellE:
   49|  1.26M|ToType *vmcast_or_null(GCCell *cell) {
   50|  1.26M|#ifndef NDEBUG
   51|  1.26M|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  1.26M|}
_ZN6hermes2vm14vmcast_or_nullINS0_11HiddenClassEEEPT_PNS0_6GCCellE:
   49|  1.05M|ToType *vmcast_or_null(GCCell *cell) {
   50|  1.05M|#ifndef NDEBUG
   51|  1.05M|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  1.05M|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_NS0_11HermesValueE:
   42|   863k|ToType *vmcast(HermesValue val) {
   43|   863k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   863k|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm14vmcast_or_nullINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   49|  34.5k|ToType *vmcast_or_null(GCCell *cell) {
   50|  34.5k|#ifndef NDEBUG
   51|  34.5k|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  34.5k|}
_ZN6hermes2vm6vmcastINS0_11HiddenClassEEEPT_NS0_11HermesValueE:
   42|   548k|ToType *vmcast(HermesValue val) {
   43|   548k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   548k|}
_ZN6hermes2vm14vmcast_or_nullINS0_8CallableEEEPT_PNS0_6GCCellE:
   49|  1.92k|ToType *vmcast_or_null(GCCell *cell) {
   50|  1.92k|#ifndef NDEBUG
   51|  1.92k|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  1.92k|}
_ZN6hermes2vm14vmcast_or_nullINS0_8JSObjectEEEPT_NS0_11HermesValueE:
   60|   447k|ToType *vmcast_or_null(HermesValue val) {
   61|   447k|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|   447k|}
_ZN6hermes2vm6vmcastINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEPT_PNS0_6GCCellE:
   29|  6.77M|ToType *vmcast(GCCell *cell) {
   30|  6.77M|  return llvh::cast<ToType>(cell);
   31|  6.77M|}
_ZN6hermes2vm14vmcast_or_nullINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   49|  3.47M|ToType *vmcast_or_null(GCCell *cell) {
   50|  3.47M|#ifndef NDEBUG
   51|  3.47M|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  3.47M|}
_ZN6hermes2vm5vmisaINS0_10JSFunctionEEEbNS0_11HermesValueE:
  103|    222|bool vmisa(HermesValue val) {
  104|    222|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 222, False: 0]
  ------------------
  105|    222|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 222, False: 0]
  ------------------
  106|    222|}
_ZN6hermes2vm5vmisaINS0_19JSGeneratorFunctionEEEbPNS0_6GCCellE:
  110|  4.40k|bool vmisa(GCCell *cell) {
  111|  4.40k|  return llvh::isa<ToType>(cell);
  112|  4.40k|}
_ZN6hermes2vm6vmcastINS0_16PropertyAccessorEEEPT_NS0_11HermesValueE:
   42|  4.50k|ToType *vmcast(HermesValue val) {
   43|  4.50k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  4.50k|}
_ZN6hermes2vm6vmcastINS0_16PropertyAccessorEEEPT_PNS0_6GCCellE:
   29|  6.38k|ToType *vmcast(GCCell *cell) {
   30|  6.38k|  return llvh::cast<ToType>(cell);
   31|  6.38k|}
_ZN6hermes2vm5vmisaINS0_8JSObjectEEEbNS0_11HermesValueE:
  103|  1.34k|bool vmisa(HermesValue val) {
  104|  1.34k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 1.34k, False: 0]
  ------------------
  105|  1.34k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 1.34k, False: 0]
  ------------------
  106|  1.34k|}
_ZN6hermes2vm6vmcastINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEPT_S3_:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm10dyn_vmcastINS0_13BoundFunctionEEEPT_PNS0_6GCCellE:
   68|      4|ToType *dyn_vmcast(GCCell *cell) {
   69|      4|  return llvh::dyn_cast<ToType>(cell);
   70|      4|}
_ZN6hermes2vm6vmcastINS0_14NativeFunctionEEEPT_PNS0_6GCCellE:
   29|   411k|ToType *vmcast(GCCell *cell) {
   30|   411k|  return llvh::cast<ToType>(cell);
   31|   411k|}
_ZN6hermes2vm6vmcastINS0_10JSFunctionEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm6vmcastINS0_6DomainEEEPT_PNS0_6GCCellE:
   29|    353|ToType *vmcast(GCCell *cell) {
   30|    353|  return llvh::cast<ToType>(cell);
   31|    353|}
_ZN6hermes2vm10dyn_vmcastINS0_15StringPrimitiveEEEPT_PNS0_6GCCellE:
   68|     24|ToType *dyn_vmcast(GCCell *cell) {
   69|     24|  return llvh::dyn_cast<ToType>(cell);
   70|     24|}
_ZN6hermes2vm14vmcast_or_nullINS0_11HiddenClassEEEPT_NS0_11HermesValueE:
   60|    119|ToType *vmcast_or_null(HermesValue val) {
   61|    119|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|    119|}
_ZN6hermes2vm14vmcast_or_nullINS0_15DictPropertyMapEEEPT_PNS0_6GCCellE:
   49|   378k|ToType *vmcast_or_null(GCCell *cell) {
   50|   378k|#ifndef NDEBUG
   51|   378k|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|   378k|}
_ZN6hermes2vm14vmcast_or_nullINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   60|  34.3k|ToType *vmcast_or_null(HermesValue val) {
   61|  34.3k|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|  34.3k|}
_ZN6hermes2vm10dyn_vmcastINS0_14NativeFunctionEEEPT_NS0_11HermesValueE:
   81|    786|ToType *dyn_vmcast(HermesValue val) {
   82|    786|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 786, False: 0]
  ------------------
   83|    786|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|    786|      : nullptr;
   85|    786|}
_ZN6hermes2vm10dyn_vmcastINS0_14NativeFunctionEEEPT_PNS0_6GCCellE:
   68|    786|ToType *dyn_vmcast(GCCell *cell) {
   69|    786|  return llvh::dyn_cast<ToType>(cell);
   70|    786|}
_ZN6hermes2vm10dyn_vmcastINS0_13BoundFunctionEEEPT_NS0_11HermesValueE:
   81|      4|ToType *dyn_vmcast(HermesValue val) {
   82|      4|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 4, False: 0]
  ------------------
   83|      4|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|      4|      : nullptr;
   85|      4|}
_ZN6hermes2vm10dyn_vmcastINS0_10JSFunctionEEEPT_NS0_11HermesValueE:
   81|  2.29k|ToType *dyn_vmcast(HermesValue val) {
   82|  2.29k|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 2.29k, False: 0]
  ------------------
   83|  2.29k|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|  2.29k|      : nullptr;
   85|  2.29k|}
_ZN6hermes2vm10dyn_vmcastINS0_10JSFunctionEEEPT_PNS0_6GCCellE:
   68|  2.29k|ToType *dyn_vmcast(GCCell *cell) {
   69|  2.29k|  return llvh::dyn_cast<ToType>(cell);
   70|  2.29k|}
_ZN6hermes2vm6vmcastINS0_11EnvironmentEEEPT_NS0_11HermesValueE:
   42|  9.40k|ToType *vmcast(HermesValue val) {
   43|  9.40k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  9.40k|}
_ZN6hermes2vm6vmcastINS0_11EnvironmentEEEPT_PNS0_6GCCellE:
   29|  9.40k|ToType *vmcast(GCCell *cell) {
   30|  9.40k|  return llvh::cast<ToType>(cell);
   31|  9.40k|}
_ZN6hermes2vm6vmcastINS0_8JSRegExpEEEPT_NS0_11HermesValueE:
   42|   406k|ToType *vmcast(HermesValue val) {
   43|   406k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   406k|}
_ZN6hermes2vm6vmcastINS0_8JSRegExpEEEPT_PNS0_6GCCellE:
   29|   406k|ToType *vmcast(GCCell *cell) {
   30|   406k|  return llvh::cast<ToType>(cell);
   31|   406k|}
_ZN6hermes2vm10dyn_vmcastINS0_7JSErrorEEEPT_NS0_11HermesValueE:
   81|     24|ToType *dyn_vmcast(HermesValue val) {
   82|     24|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 24, False: 0]
  ------------------
   83|     24|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|     24|      : nullptr;
   85|     24|}
_ZN6hermes2vm10dyn_vmcastINS0_7JSErrorEEEPT_PNS0_6GCCellE:
   68|     24|ToType *dyn_vmcast(GCCell *cell) {
   69|     24|  return llvh::dyn_cast<ToType>(cell);
   70|     24|}
_ZN6hermes2vm6vmcastINS0_7JSErrorEEEPT_NS0_11HermesValueE:
   42|     48|ToType *vmcast(HermesValue val) {
   43|     48|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     48|}
_ZN6hermes2vm6vmcastINS0_7JSErrorEEEPT_PNS0_6GCCellE:
   29|     72|ToType *vmcast(GCCell *cell) {
   30|     72|  return llvh::cast<ToType>(cell);
   31|     72|}
_ZN6hermes2vm6vmcastINS0_9ArrayImplEEEPT_PNS0_6GCCellE:
   29|  3.22M|ToType *vmcast(GCCell *cell) {
   30|  3.22M|  return llvh::cast<ToType>(cell);
   31|  3.22M|}
_ZN6hermes2vm6vmcastINS0_9ArrayImplEEEPT_NS0_11HermesValueE:
   42|   195k|ToType *vmcast(HermesValue val) {
   43|   195k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|   195k|}
_ZN6hermes2vm14vmcast_or_nullINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEPT_PNS0_6GCCellE:
   49|  5.76k|ToType *vmcast_or_null(GCCell *cell) {
   50|  5.76k|#ifndef NDEBUG
   51|  5.76k|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|  5.76k|}
_ZN6hermes2vm5vmisaINS0_7JSErrorEEEbPNS0_6GCCellE:
  110|     24|bool vmisa(GCCell *cell) {
  111|     24|  return llvh::isa<ToType>(cell);
  112|     24|}
_ZN6hermes2vm14vmcast_or_nullINS0_8CallableEEEPT_NS0_11HermesValueE:
   60|     24|ToType *vmcast_or_null(HermesValue val) {
   61|     24|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|     24|}
_ZN6hermes2vm5vmisaINS0_15StringPrimitiveEEEbNS0_11HermesValueE:
  103|     24|bool vmisa(HermesValue val) {
  104|     24|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 24, False: 0]
  ------------------
  105|     24|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 24, False: 0]
  ------------------
  106|     24|}
_ZN6hermes2vm10dyn_vmcastINS0_15StringPrimitiveEEEPT_NS0_11HermesValueE:
   81|     24|ToType *dyn_vmcast(HermesValue val) {
   82|     24|  return val.isPointer()
  ------------------
  |  Branch (82:10): [True: 24, False: 0]
  ------------------
   83|     24|      ? dyn_vmcast<ToType>(static_cast<GCCell *>(val.getPointer()))
   84|     24|      : nullptr;
   85|     24|}
_ZN6hermes2vm5vmisaINS0_8CallableEEEbPNS0_6GCCellE:
  110|    222|bool vmisa(GCCell *cell) {
  111|    222|  return llvh::isa<ToType>(cell);
  112|    222|}
_ZN6hermes2vm14vmcast_or_nullINS0_7JSArrayEEEPT_NS0_11HermesValueE:
   60|      4|ToType *vmcast_or_null(HermesValue val) {
   61|      4|  assert(val.isPointer() && "vmcast with non-pointer");
   62|      0|  return vmcast_or_null<ToType>(static_cast<GCCell *>(val.getPointer()));
   63|      4|}
_ZN6hermes2vm14vmcast_or_nullINS0_7JSArrayEEEPT_PNS0_6GCCellE:
   49|      4|ToType *vmcast_or_null(GCCell *cell) {
   50|      4|#ifndef NDEBUG
   51|      4|  return llvh::cast_or_null<ToType>(cell);
   52|       |#else
   53|       |  // In opt builds, avoid doing a branch for the null case.
   54|       |  return static_cast<ToType *>(cell);
   55|       |#endif
   56|      4|}
_ZN6hermes2vm5vmisaINS0_7JSArrayEEEbPNS0_6GCCellE:
  110|      7|bool vmisa(GCCell *cell) {
  111|      7|  return llvh::isa<ToType>(cell);
  112|      7|}
_ZN6hermes2vm6vmcastINS0_15DecoratedObjectEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm5vmisaINS0_8JSRegExpEEEbNS0_11HermesValueE:
  103|   406k|bool vmisa(HermesValue val) {
  104|   406k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 406k, False: 0]
  ------------------
  105|   406k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 406k, False: 0]
  ------------------
  106|   406k|}
_ZN6hermes2vm6vmcastINS0_8JSStringEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm6vmcastINS0_6DomainEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm5vmisaINS0_14NativeFunctionEEEbNS0_11HermesValueE:
  103|  3.66k|bool vmisa(HermesValue val) {
  104|  3.66k|  return val.isPointer() &&
  ------------------
  |  Branch (104:10): [True: 3.66k, False: 0]
  ------------------
  105|  3.66k|      llvh::isa<ToType>(static_cast<GCCell *>(val.getPointer()));
  ------------------
  |  Branch (105:7): [True: 3.66k, False: 0]
  ------------------
  106|  3.66k|}
_ZN6hermes2vm6vmcastINS0_14NativeFunctionEEEPT_NS0_11HermesValueE:
   42|  4.05k|ToType *vmcast(HermesValue val) {
   43|  4.05k|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|  4.05k|}
_ZN6hermes2vm6vmcastINS0_10JSFunctionEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm10dyn_vmcastINS0_23BufferedStringPrimitiveIcEEEEPT_PNS0_6GCCellE:
   68|    711|ToType *dyn_vmcast(GCCell *cell) {
   69|    711|  return llvh::dyn_cast<ToType>(cell);
   70|    711|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIcEEEEPT_NS0_11HermesValueE:
   42|    651|ToType *vmcast(HermesValue val) {
   43|    651|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    651|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIcEEEEPT_PNS0_6GCCellE:
   29|    651|ToType *vmcast(GCCell *cell) {
   30|    651|  return llvh::cast<ToType>(cell);
   31|    651|}
_ZN6hermes2vm10dyn_vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   68|    162|ToType *dyn_vmcast(GCCell *cell) {
   69|    162|  return llvh::dyn_cast<ToType>(cell);
   70|    162|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_NS0_11HermesValueE:
   42|    152|ToType *vmcast(HermesValue val) {
   43|    152|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|    152|}
_ZN6hermes2vm6vmcastINS0_23BufferedStringPrimitiveIDsEEEEPT_PNS0_6GCCellE:
   29|    152|ToType *vmcast(GCCell *cell) {
   30|    152|  return llvh::cast<ToType>(cell);
   31|    152|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm6vmcastINS0_8JSStringEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_8JSNumberEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_8JSNumberEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm6vmcastINS0_9JSBooleanEEEPT_NS0_11HermesValueE:
   42|     99|ToType *vmcast(HermesValue val) {
   43|     99|  assert(val.isPointer() && "vmcast with non-pointer");
   44|      0|  return vmcast<ToType>(static_cast<GCCell *>(val.getPointer()));
   45|     99|}
_ZN6hermes2vm6vmcastINS0_9JSBooleanEEEPT_PNS0_6GCCellE:
   29|     99|ToType *vmcast(GCCell *cell) {
   30|     99|  return llvh::cast<ToType>(cell);
   31|     99|}
_ZN6hermes2vm5vmisaINS0_13JSWeakMapImplILNS0_8CellKindE51EEEEEbPNS0_6GCCellE:
  110|   802k|bool vmisa(GCCell *cell) {
  111|   802k|  return llvh::isa<ToType>(cell);
  112|   802k|}
_ZN6hermes2vm6vmcastINS0_7HadesGC6OldGen12FreelistCellEEEPT_PNS0_6GCCellE:
   29|   616k|ToType *vmcast(GCCell *cell) {
   30|   616k|  return llvh::cast<ToType>(cell);
   31|   616k|}
_ZN6hermes2vm5vmisaINS0_7HadesGC6OldGen12FreelistCellEEEbPNS0_6GCCellE:
  110|  11.1M|bool vmisa(GCCell *cell) {
  111|  11.1M|  return llvh::isa<ToType>(cell);
  112|  11.1M|}

_ZN6hermes2vm11kindInRangeENS0_8CellKindES1_S1_:
   27|  47.8M|inline bool kindInRange(CellKind value, CellKind from, CellKind to) {
   28|  47.8M|  return value >= from && value <= to;
  ------------------
  |  Branch (28:10): [True: 47.8M, False: 4.24k]
  |  Branch (28:27): [True: 47.7M, False: 85.5k]
  ------------------
   29|  47.8M|}

_ZN6hermes2vm9CodeBlock13propertyCacheEv:
   72|  60.0k|  PropertyCacheEntry *propertyCache() {
   73|  60.0k|    return getTrailingObjects<PropertyCacheEntry>();
   74|  60.0k|  }
_ZN6hermes2vm9CodeBlockC2EPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhjjj:
   92|  4.69k|        writePropCacheOffset_(writePropCacheOffset) {
   93|  4.69k|    std::uninitialized_fill_n(propertyCache(), cacheSize, PropertyCacheEntry{});
   94|  4.69k|  }
_ZN6hermes2vm9CodeBlock6createEPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhjjj:
  113|  4.69k|      uint32_t writePropCacheOffset) {
  114|  4.69k|    auto allocSize = totalSizeToAlloc<PropertyCacheEntry>(cacheSize);
  115|  4.69k|    void *mem = checkedMalloc(allocSize);
  116|  4.69k|    return new (mem) CodeBlock(
  117|  4.69k|        runtimeModule,
  118|  4.69k|        header,
  119|  4.69k|        bytecode,
  120|  4.69k|        functionID,
  121|  4.69k|        cacheSize,
  122|  4.69k|        writePropCacheOffset);
  123|  4.69k|  }
_ZN6hermes2vm9CodeBlockdlEPv:
  127|  4.69k|  static void operator delete(void *cb) {
  128|  4.69k|    free(cb);
  129|  4.69k|  }
_ZNK6hermes2vm9CodeBlock13getParamCountEv:
  133|    222|  uint32_t getParamCount() const {
  134|    222|    return functionHeader_.paramCount();
  135|    222|  }
_ZNK6hermes2vm9CodeBlock12getFrameSizeEv:
  136|  1.64k|  uint32_t getFrameSize() const {
  137|  1.64k|    return functionHeader_.frameSize();
  138|  1.64k|  }
_ZNK6hermes2vm9CodeBlock18getEnvironmentSizeEv:
  139|    452|  uint32_t getEnvironmentSize() const {
  140|    452|    return functionHeader_.environmentSize();
  141|    452|  }
_ZNK6hermes2vm9CodeBlock16getRuntimeModuleEv:
  168|  81.5k|  RuntimeModule *getRuntimeModule() const {
  169|  81.5k|    return runtimeModule_;
  170|  81.5k|  }
_ZNK6hermes2vm9CodeBlock14getHeaderFlagsEv:
  172|  1.86k|  hbc::FunctionHeaderFlag getHeaderFlags() const {
  173|  1.86k|    return functionHeader_.flags();
  174|  1.86k|  }
_ZNK6hermes2vm9CodeBlock12isStrictModeEv:
  176|  3.34k|  bool isStrictMode() const {
  177|  3.34k|    return functionHeader_.flags().strictMode;
  178|  3.34k|  }
_ZNK6hermes2vm9CodeBlock5beginEv:
  186|   436k|  const_iterator begin() const {
  187|   436k|    return bytecode_;
  188|   436k|  }
_ZNK6hermes2vm9CodeBlock3endEv:
  189|   436k|  const_iterator end() const {
  190|   436k|    return bytecode_ + functionHeader_.bytecodeSizeInBytes();
  191|   436k|  }
_ZNK6hermes2vm9CodeBlock8containsEPKNS_4inst4InstE:
  197|   435k|  bool contains(const inst::Inst *inst) const {
  198|   435k|    return begin() <= reinterpret_cast<const uint8_t *>(inst) &&
  ------------------
  |  Branch (198:12): [True: 435k, False: 0]
  ------------------
  199|   435k|        reinterpret_cast<const uint8_t *>(inst) < end();
  ------------------
  |  Branch (199:9): [True: 435k, False: 0]
  ------------------
  200|   435k|  }
_ZNK6hermes2vm9CodeBlock11getOffsetOfEPKNS_4inst4InstE:
  222|     28|  uint32_t getOffsetOf(const inst::Inst *inst) const {
  223|     28|    assert(
  224|     28|        reinterpret_cast<const uint8_t *>(inst) >= begin() &&
  225|     28|        "inst not in this codeBlock");
  226|      0|    uint32_t offset = reinterpret_cast<const uint8_t *>(inst) - begin();
  227|     28|    assert(begin() + offset < end() && "inst not in this codeBlock");
  228|      0|    return offset;
  229|     28|  }
_ZNK6hermes2vm9CodeBlock6isLazyEv:
  233|  1.86k|  bool isLazy() const {
  234|       |    // null bytecode_ indicates that this is a lazy code block.
  235|  1.86k|    return !bytecode_;
  236|  1.86k|  }
_ZN6hermes2vm9CodeBlock11lazyCompileERNS0_7RuntimeE:
  239|  1.64k|  ExecutionStatus lazyCompile(Runtime &runtime) {
  240|  1.64k|    if (LLVM_UNLIKELY(isLazy())) {
  ------------------
  |  |  189|  1.64k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.64k]
  |  |  ------------------
  ------------------
  241|      0|      return lazyCompileImpl(runtime);
  242|      0|    }
  243|  1.64k|    return ExecutionStatus::RETURNED;
  244|  1.64k|  }
_ZN6hermes2vm9CodeBlock17getReadCacheEntryEh:
  265|  3.46k|  inline PropertyCacheEntry *getReadCacheEntry(uint8_t idx) {
  266|  3.46k|    assert(idx < writePropCacheOffset_ && "idx out of ReadCache bound");
  267|      0|    return &propertyCache()[idx];
  268|  3.46k|  }
_ZN6hermes2vm9CodeBlock18getWriteCacheEntryEh:
  270|  5.71k|  inline PropertyCacheEntry *getWriteCacheEntry(uint8_t idx) {
  271|  5.71k|    assert(
  272|  5.71k|        writePropCacheOffset_ + idx < propertyCacheSize_ &&
  273|  5.71k|        "idx out of WriteCache bound");
  274|      0|    return &propertyCache()[writePropCacheOffset_ + idx];
  275|  5.71k|  }

_ZNK6hermes2vm17CompressedPointer10getNonNullERNS0_11PointerBaseE:
   48|  23.1M|  GCCell *getNonNull(PointerBase &base) const {
   49|  23.1M|#ifdef HERMESVM_COMPRESSED_POINTERS
   50|  23.1M|    return reinterpret_cast<GCCell *>(base.basedToPointerNonNull(ptr_));
   51|       |#else
   52|       |    (void)base;
   53|       |    return ptr_;
   54|       |#endif
   55|  23.1M|  }
_ZN6hermes2vm17CompressedPointer7fromRawEj:
   33|  20.8M|  static CompressedPointer fromRaw(RawType r) {
   34|  20.8M|    return CompressedPointer(r);
   35|  20.8M|  }
_ZN6hermes2vm17CompressedPointerC2Ej:
  101|  20.8M|  explicit CompressedPointer(RawType r) : ptr_(rawToStorageType(r)) {}
_ZN6hermes2vm17CompressedPointer16rawToStorageTypeEj:
  108|  20.8M|  static StorageType rawToStorageType(BasedPointer::StorageType raw) {
  109|  20.8M|    return BasedPointer{raw};
  110|  20.8M|  }
_ZNK6hermes2vm17CompressedPointer3getERNS0_11PointerBaseE:
   44|  21.8M|  GCCell *get(PointerBase &base) const {
   45|  21.8M|    return storageTypeToPointer(ptr_, base);
   46|  21.8M|  }
_ZN6hermes2vm17CompressedPointer20storageTypeToPointerENS0_12BasedPointerERNS0_11PointerBaseE:
  119|  21.8M|  static GCCell *storageTypeToPointer(StorageType st, PointerBase &base) {
  120|  21.8M|    return reinterpret_cast<GCCell *>(base.basedToPointer(st));
  121|  21.8M|  }
_ZN6hermes2vm17CompressedPointer6encodeEPNS0_6GCCellERNS0_11PointerBaseE:
   37|  6.52M|  static CompressedPointer encode(GCCell *ptr, PointerBase &base) {
   38|  6.52M|    return CompressedPointer(pointerToStorageType(ptr, base));
   39|  6.52M|  }
_ZN6hermes2vm17CompressedPointer20pointerToStorageTypeEPNS0_6GCCellERNS0_11PointerBaseE:
  111|  6.52M|  static StorageType pointerToStorageType(GCCell *ptr, PointerBase &base) {
  112|  6.52M|    return base.pointerToBased(ptr);
  113|  6.52M|  }
_ZN6hermes2vm17CompressedPointerC2ENS0_12BasedPointerE:
  102|  10.4M|  explicit CompressedPointer(StorageType s) : ptr_(s) {}
_ZNK6hermes2vm17CompressedPointercvbEv:
   61|  11.3M|  explicit operator bool() const {
   62|  11.3M|    return static_cast<bool>(ptr_);
   63|  11.3M|  }
_ZN6hermes2vm17CompressedPointerC2EDn:
   31|  2.44M|  constexpr explicit CompressedPointer(std::nullptr_t) : ptr_() {}
_ZN6hermes2vm17CompressedPointer13encodeNonNullEPNS0_6GCCellERNS0_11PointerBaseE:
   40|  3.91M|  static CompressedPointer encodeNonNull(GCCell *ptr, PointerBase &base) {
   41|  3.91M|    return CompressedPointer(pointerToStorageTypeNonNull(ptr, base));
   42|  3.91M|  }
_ZN6hermes2vm17CompressedPointer7setInGCES1_:
   57|  4.57M|  void setInGC(CompressedPointer cp) {
   58|  4.57M|    setNoBarrier(cp);
   59|  4.57M|  }
_ZNK6hermes2vm17CompressedPointereqERKS1_:
   65|  3.10M|  bool operator==(const CompressedPointer &other) const {
   66|  3.10M|    return ptr_ == other.ptr_;
   67|  3.10M|  }
_ZNK6hermes2vm17CompressedPointerneERKS1_:
   69|  1.14M|  bool operator!=(const CompressedPointer &other) const {
   70|  1.14M|    return !(*this == other);
   71|  1.14M|  }
_ZNK6hermes2vm17CompressedPointer6getRawEv:
   73|  4.85M|  RawType getRaw() const {
   74|  4.85M|    return storageTypeToRaw(ptr_);
   75|  4.85M|  }
_ZNK6hermes2vm17CompressedPointer15getSegmentStartEv:
   77|   525k|  CompressedPointer getSegmentStart() const {
   78|   525k|    return fromRaw(
   79|   525k|        getRaw() & llvh::maskTrailingZeros<RawType>(AlignedStorage::kLogSize));
   80|   525k|  }
_ZN6hermes2vm17CompressedPointer12setNoBarrierES1_:
   96|  8.41M|  void setNoBarrier(CompressedPointer cp) {
   97|  8.41M|    ptr_ = cp.ptr_;
   98|  8.41M|  }
_ZN6hermes2vm17CompressedPointer16storageTypeToRawENS0_12BasedPointerE:
  105|  4.85M|  static BasedPointer::StorageType storageTypeToRaw(StorageType st) {
  106|  4.85M|    return st.getRawValue();
  107|  4.85M|  }
_ZN6hermes2vm17CompressedPointer27pointerToStorageTypeNonNullEPNS0_6GCCellERNS0_11PointerBaseE:
  116|  3.91M|      PointerBase &base) {
  117|  3.91M|    return base.pointerToBasedNonNull(ptr);
  118|  3.91M|  }
_ZN6hermes2vm27AssignableCompressedPointerC2EDn:
  155|  55.9k|      : CompressedPointer(nullptr) {}
_ZN6hermes2vm27AssignableCompressedPointerC2ENS0_17CompressedPointerE:
  157|    198|      : CompressedPointer(cp) {}
_ZN6hermes2vm27AssignableCompressedPointeraSENS0_17CompressedPointerE:
  159|   860k|  AssignableCompressedPointer &operator=(CompressedPointer ptr) {
  160|   860k|    setNoBarrier(ptr);
  161|   860k|    return *this;
  162|   860k|  }
_ZN6hermes2vm27AssignableCompressedPointeraSES1_:
  163|   859k|  AssignableCompressedPointer &operator=(AssignableCompressedPointer ptr) {
  164|   859k|    setNoBarrier(ptr);
  165|   859k|    return *this;
  166|   859k|  }
_ZN6hermes2vm27AssignableCompressedPointeraSEDn:
  167|    407|  AssignableCompressedPointer &operator=(std::nullptr_t) {
  168|    407|    setNoBarrier(CompressedPointer(nullptr));
  169|    407|    return *this;
  170|    407|  }

_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEE9push_backERKS3_RNS0_7HadesGCE:
  165|    928|  void push_back(const T &elem, GC &gc) {
  166|    928|    if (LLVM_UNLIKELY(size_ == capacity_)) {
  ------------------
  |  |  189|    928|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 282, False: 646]
  |  |  ------------------
  ------------------
  167|    282|      grow(gc);
  168|    282|    }
  169|    928|    new (start_ + size_) T(elem);
  170|    928|    ++size_;
  171|    928|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEE4growERNS0_7HadesGCE:
  207|    282|  void grow(GC &gc) {
  208|       |    // Grow by a factor of 1.5, rounding up.
  209|    282|    size_t desired = capacity_ + (capacity_ - capacity_ / 2u);
  210|    282|    if (desired < capacity_ || desired > kMaxCapacity) {
  ------------------
  |  Branch (210:9): [True: 0, False: 282]
  |  Branch (210:32): [True: 0, False: 282]
  ------------------
  211|       |      // Overflow.
  212|      0|      gc.oom(make_error_code(OOMError::CopyableVectorCapacityIntegerOverflow));
  213|      0|    }
  214|    282|    setCapacity(std::max<size_type>(1u, desired));
  215|    282|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEE11setCapacityEm:
  219|    282|  void setCapacity(size_type newCapacity) {
  220|    282|    assert(newCapacity > capacity_ && "setCapacity() must grow the vector");
  221|      0|    T *newStart = static_cast<T *>(checkedMalloc2(sizeof(T), newCapacity));
  222|  2.15k|    for (T *src = start_, *end = start_ + size_, *target = newStart; src < end;
  ------------------
  |  Branch (222:70): [True: 1.87k, False: 282]
  ------------------
  223|  1.87k|         ++src, ++target) {
  224|  1.87k|      new (target) T(std::move(*src));
  225|  1.87k|      src->~T();
  226|  1.87k|    }
  227|    282|    free(start_);
  228|    282|    start_ = newStart;
  229|    282|    capacity_ = newCapacity;
  230|    282|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEEC2Em:
   68|    508|      : size_(0), capacity_(capacity) {
   69|    508|    assert(capacity_ <= kMaxCapacity && "capacity overflow for CopyableVector");
   70|    508|    if (capacity_ == 0) {
  ------------------
  |  Branch (70:9): [True: 508, False: 0]
  ------------------
   71|    508|      start_ = nullptr;
   72|    508|    } else {
   73|      0|      start_ = static_cast<T *>(checkedMalloc2(sizeof(T), capacity_));
   74|      0|    }
   75|    508|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEE5beginEv:
  148|  1.01k|  T *begin() {
  149|  1.01k|    return start_;
  150|  1.01k|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEE3endEv:
  158|  1.01k|  T *end() {
  159|  1.01k|    return start_ + size_;
  160|  1.01k|  }
_ZN6hermes2vm14CopyableVectorIPNS0_13RuntimeModuleEED2Ev:
   78|    508|  ~CopyableVector() {
   79|    928|    for (auto &v : *this) {
  ------------------
  |  Branch (79:18): [True: 928, False: 508]
  ------------------
   80|    928|      v.~T();
   81|    928|    }
   82|    508|    free(start_);
   83|    508|  }

_ZN6hermes2vm8DebuggerC2ERNS0_7RuntimeE:
  190|     99|  explicit Debugger(Runtime &runtime) : runtime_(runtime) {}
_ZN6hermes2vm8Debugger19setDidPauseCallbackENSt3__18functionIFNS0_12DebugCommandENS0_16InterpreterStateEN8facebook6hermes8debugger11PauseReasonENS0_11HermesValueERKNS1_18EvalResultMetadataEmEEE:
  250|     99|  void setDidPauseCallback(DidPauseCallback callback) {
  251|     99|    didPauseCallback_ = std::move(callback);
  252|     99|  }
_ZN6hermes2vm8Debugger29setBreakpointResolvedCallbackENSt3__18functionIFvmEEE:
  254|     99|  void setBreakpointResolvedCallback(BreakpointResolvedCallback callback) {
  255|     99|    breakpointResolvedCallback_ = std::move(callback);
  256|     99|  }
_ZNK6hermes2vm8Debugger26getShouldPauseOnScriptLoadEv:
  262|    155|  bool getShouldPauseOnScriptLoad() const {
  263|    155|    return pauseOnScriptLoad_;
  264|    155|  }
_ZNK6hermes2vm8Debugger19getPauseOnThrowModeEv:
  270|     24|  PauseOnThrowMode getPauseOnThrowMode() const {
  271|     24|    return pauseOnThrowMode_;
  272|     24|  }
_ZN6hermes2vm8Debugger18willEnterCodeBlockEPNS0_9CodeBlockE:
  378|  1.64k|  void willEnterCodeBlock(CodeBlock *codeBlock) {
  379|  1.64k|    if (LLVM_UNLIKELY(pauseOnAllCodeBlocks_)) {
  ------------------
  |  |  189|  1.64k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.64k]
  |  |  ------------------
  ------------------
  380|      0|      setEntryBreakpointForCodeBlock(codeBlock);
  381|      0|    }
  382|  1.64k|  }

_ZN6hermes2vm15DecoratedObject7classofEPKNS0_6GCCellE:
   92|     99|  static bool classof(const GCCell *cell) {
   93|     99|    return kindInRange(
   94|     99|        cell->getKind(),
   95|     99|        CellKind::DecoratedObjectKind_first,
   96|     99|        CellKind::DecoratedObjectKind_last);
   97|     99|  }
_ZN6hermes2vm15DecoratedObjectC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENSt3__110unique_ptrINS1_10DecorationENS9_14default_deleteISB_EEEE:
  108|     99|        decoration_(std::move(decoration)) {}
_ZN6hermes2vm15DecoratedObjectD2Ev:
  100|     99|  ~DecoratedObject() = default;
_ZN6hermes2vm15DecoratedObject10DecorationD2Ev:
   28|     99|    virtual ~Decoration() = default;

_ZN6hermes2vm6detail11DPMHashPairC2Ev:
   78|  19.2k|  DPMHashPair() : idpart_(0), desc_(0) {}
_ZNK6hermes2vm6detail11DPMHashPair7isEmptyEv:
   79|  1.14M|  bool isEmpty() const {
   80|  1.14M|    return desc_ == EMPTY;
   81|  1.14M|  }
_ZNK6hermes2vm6detail11DPMHashPair9isDeletedEv:
   82|   697k|  bool isDeleted() const {
   83|   697k|    return desc_ == DELETED;
   84|   697k|  }
_ZNK6hermes2vm6detail11DPMHashPair7isValidEv:
   85|  16.6M|  bool isValid() const {
   86|  16.6M|    return desc_ >= FIRST_VALID;
   87|  16.6M|  }
_ZNK6hermes2vm6detail11DPMHashPair12getDescIndexEv:
   88|  3.69M|  uint32_t getDescIndex() const {
   89|  3.69M|    assert(isValid() && "asked for descriptor of invalid pair");
   90|      0|    return desc_ - FIRST_VALID;
   91|  3.69M|  }
_ZNK6hermes2vm6detail11DPMHashPair5mayBeENS0_8SymbolIDE:
   93|  6.33M|  bool mayBe(SymbolID id) const {
   94|  6.33M|    assert(isValid() && "tried to match invalid pair");
   95|      0|    return idpart_ == (id.unsafeGetRaw() & ID_MASK);
   96|  6.33M|  }
_ZN6hermes2vm6detail11DPMHashPair12setDescIndexEjNS0_8SymbolIDE:
   99|   469k|  bool setDescIndex(uint32_t idx, SymbolID id) {
  100|   469k|    assert(!isValid() && "overwriting a valid entry");
  101|      0|    assert(canStore(idx) && "impossibly large descriptor index");
  102|      0|    bool ret = isDeleted();
  103|   469k|    desc_ = idx + FIRST_VALID;
  104|   469k|    idpart_ = (id.unsafeGetRaw() & ID_MASK);
  105|   469k|    assert(isValid() && "failed to make a valid entry");
  106|      0|    return ret;
  107|   469k|  }
_ZN6hermes2vm6detail11DPMHashPair8canStoreEj:
  118|   469k|  static constexpr bool canStore(uint32_t idx) {
  119|   469k|    return idx < ((1 << DESC_BITS) - FIRST_VALID);
  120|   469k|  }
_ZN6hermes2vm15DictPropertyMap11PropertyPosC2Ej:
  175|  1.84M|    PropertyPos(size_type hashPairIndex) : hashPairIndex(hashPairIndex) {}
_ZN6hermes2vm15DictPropertyMap11getCellKindEv:
  183|  38.5k|  static constexpr CellKind getCellKind() {
  184|  38.5k|    return CellKind::DictPropertyMapKind;
  185|  38.5k|  }
_ZN6hermes2vm15DictPropertyMap7classofEPKNS0_6GCCellE:
  186|  3.21M|  static bool classof(const GCCell *cell) {
  187|  3.21M|    return cell->getKind() == CellKind::DictPropertyMapKind;
  188|  3.21M|  }
_ZN6hermes2vm15DictPropertyMap16calcHashCapacityEj:
  320|  19.2k|  static size_type calcHashCapacity(size_type cap) {
  321|  19.2k|    assert(
  322|  19.2k|        (cap <= std::numeric_limits<size_type>::max() / 4) &&
  323|  19.2k|        "size will cause integer overflow in calcHashCapacity");
  324|       |
  325|      0|    return llvh::PowerOf2Ceil(cap * 4 / 3 + 1);
  326|  19.2k|  }
_ZN6hermes2vm15DictPropertyMap4hashENS0_8SymbolIDE:
  341|  2.98M|  static unsigned hash(SymbolID symbolID) {
  342|  2.98M|    return symbolID.unsafeGetRaw();
  343|  2.98M|  }
_ZN6hermes2vm15DictPropertyMapC2Ejj:
  347|  19.2k|      : descriptorCapacity_(descriptorCapacity), hashCapacity_(hashCapacity) {
  348|       |    // Clear the hash table.
  349|  19.2k|    std::fill_n(getHashPairs(), hashCapacity_, HashPair{});
  350|  19.2k|  }
_ZN6hermes2vm15DictPropertyMap18getDescriptorPairsEv:
  353|  2.09M|  DescriptorPair *getDescriptorPairs() {
  354|  2.09M|    return getTrailingObjects<DescriptorPair>();
  355|  2.09M|  }
_ZNK6hermes2vm15DictPropertyMap18getDescriptorPairsEv:
  356|  1.85M|  const DescriptorPair *getDescriptorPairs() const {
  357|  1.85M|    return getTrailingObjects<DescriptorPair>();
  358|  1.85M|  }
_ZN6hermes2vm15DictPropertyMap12getHashPairsEv:
  359|  6.69M|  HashPair *getHashPairs() {
  360|  6.69M|    return getTrailingObjects<HashPair>();
  361|  6.69M|  }
_ZNK6hermes2vm15DictPropertyMap7isMatchEPKNS0_6detail11DPMHashPairENS0_8SymbolIDE:
  398|  4.49M|  bool isMatch(const HashPair *entry, SymbolID symbolID) const {
  399|  4.49M|    return entry->mayBe(symbolID) &&
  ------------------
  |  Branch (399:12): [True: 1.85M, False: 2.64M]
  ------------------
  400|  4.49M|        getDescriptorPairs()[entry->getDescIndex()].first == symbolID;
  ------------------
  |  Branch (400:9): [True: 1.84M, False: 7.01k]
  ------------------
  401|  4.49M|  }
_ZN6hermes2vm15DictPropertyMap14allocationSizeEjj:
  417|  19.2k|      size_type hashCapacity) {
  418|  19.2k|    return totalSizeToAlloc<DescriptorPair, HashPair>(
  419|  19.2k|        descriptorCapacity, hashCapacity);
  420|  19.2k|  }
_ZNK6hermes2vm15DictPropertyMap18numTrailingObjectsEN4llvh25trailing_objects_internal19TrailingObjectsBase13OverloadTokenINSt3__14pairINS0_10GCSymbolIDENS0_23NamedPropertyDescriptorEEEEE:
  484|  6.69M|  size_t numTrailingObjects(OverloadToken<DescriptorPair>) const {
  485|  6.69M|    return descriptorCapacity_;
  486|  6.69M|  }
_ZN6hermes2vm15DictPropertyMap17getDescriptorPairEPS1_NS1_11PropertyPosE:
  566|  1.84M|    PropertyPos pos) {
  567|  1.84M|  assert(
  568|  1.84M|      pos.hashPairIndex < self->hashCapacity_ && "property pos out of range");
  569|       |
  570|      0|  auto *hashPair = self->getHashPairs() + pos.hashPairIndex;
  571|  1.84M|  auto descIndex = hashPair->getDescIndex();
  572|  1.84M|  assert(
  573|  1.84M|      descIndex < self->numDescriptors_.load(std::memory_order_relaxed) &&
  574|  1.84M|      "descriptor index out of range");
  575|       |
  576|      0|  auto *res = self->getDescriptorPairs() + descIndex;
  577|  1.84M|  assert(hashPair->mayBe(res->first) && "accessing incorrect descriptor pair");
  578|      0|  return res;
  579|  1.84M|}
_ZN6hermes2vm15DictPropertyMap4findEPKS1_NS0_8SymbolIDE:
  583|  2.50M|    SymbolID id) {
  584|       |  // We want to keep the public interface of find() clean, so it accepts a
  585|       |  // const self pointer, but internally we don't want to duplicate the code
  586|       |  // only to propagate the "constness". So we cast the const away and promise
  587|       |  // not to mutate it.
  588|  2.50M|  auto *mutableSelf = const_cast<DictPropertyMap *>(self);
  589|  2.50M|  auto found = lookupEntryFor(mutableSelf, id);
  590|  2.50M|  if (!found.first)
  ------------------
  |  Branch (590:7): [True: 666k, False: 1.84M]
  ------------------
  591|   666k|    return llvh::None;
  592|  1.84M|  return PropertyPos{(size_type)(found.second - mutableSelf->getHashPairs())};
  593|  2.50M|}
_ZN6hermes2vm15DictPropertyMap3addERNS0_13MutableHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorE:
  599|   190k|    NamedPropertyDescriptor desc) {
  600|   190k|  auto found = findOrAdd(selfHandleRef, runtime, id);
  601|   190k|  if (LLVM_UNLIKELY(found == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   190k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 190k]
  |  |  ------------------
  ------------------
  602|      0|    return ExecutionStatus::EXCEPTION;
  603|      0|  }
  604|   190k|  assert(found->second && "trying to add an existing property");
  605|      0|  *found->first = desc;
  606|   190k|  return ExecutionStatus::RETURNED;
  607|   190k|}

_ZN6hermes2vm6Domain11getCellKindEv:
  108|    508|  static constexpr CellKind getCellKind() {
  109|    508|    return CellKind::DomainKind;
  110|    508|  }
_ZN6hermes2vm6Domain7classofEPKNS0_6GCCellE:
  111|    353|  static bool classof(const GCCell *cell) {
  112|    353|    return cell->getKind() == CellKind::DomainKind;
  113|    353|  }
_ZN6hermes2vm6Domain16addRuntimeModuleENS0_6HandleIS1_EERNS0_7RuntimeEPNS0_13RuntimeModuleE:
  122|    928|      RuntimeModule *runtimeModule) {
  123|    928|    self->runtimeModules_.push_back(runtimeModule, runtime.getHeap());
  124|    928|  }

_ZN6hermes2vm6GCBase17minAllocationSizeEv:
  107|  7.80M|constexpr uint32_t GCBase::minAllocationSize() {
  108|  7.80M|  return GC::minAllocationSizeImpl();
  109|  7.80M|}
_ZN6hermes2vm6GCBase17maxAllocationSizeEv:
  103|  1.09M|constexpr uint32_t GCBase::maxAllocationSize() {
  104|  1.09M|  return std::min(GC::maxAllocationSizeImpl(), GCCell::maxSize());
  105|  1.09M|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_11BoxedDoubleELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_DpOT2_:
   24|  1.79k|T *GCBase::makeAFixed(Args &&...args) {
   25|  1.79k|  static_assert(
   26|  1.79k|      cellSize<T>() >= minAllocationSize() &&
   27|  1.79k|          cellSize<T>() <= maxAllocationSize(),
   28|  1.79k|      "Cell size outside legal range.");
   29|  1.79k|  assert(
   30|  1.79k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  1.79k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  1.79k|}
_ZN6hermes2vm6GCBase5makeAINS0_11BoxedDoubleELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_jDpOT3_:
   57|  1.79k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  1.79k|  assert(
   59|  1.79k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  1.79k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  1.79k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  1.79k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  1.79k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  1.79k|          size, std::forward<Args>(args)...);
   73|  1.79k|#endif
   74|  1.79k|#ifndef NDEBUG
   75|  1.79k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  1.79k|#endif
   77|  1.79k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  1.79k|  newAlloc(ptr, size);
   79|  1.79k|#endif
   80|  1.79k|  return ptr;
   81|  1.79k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_16ArrayStorageBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|   459k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   459k|  assert(
   43|   459k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|   459k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   459k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   459k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   459k|}
_ZN6hermes2vm6GCBase5makeAINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|   459k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   459k|  assert(
   59|   459k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   459k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   459k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   459k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   459k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   459k|          size, std::forward<Args>(args)...);
   73|   459k|#endif
   74|   459k|#ifndef NDEBUG
   75|   459k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   459k|#endif
   77|   459k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   459k|  newAlloc(ptr, size);
   79|   459k|#endif
   80|   459k|  return ptr;
   81|   459k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_11EnvironmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT2_:
   40|    452|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    452|  assert(
   43|    452|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|    452|      !VTable::getVTable(T::getCellKind())->size &&
   46|    452|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    452|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    452|}
_ZN6hermes2vm6GCBase5makeAINS0_11EnvironmentELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT3_:
   57|    452|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    452|  assert(
   59|    452|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    452|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    452|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    452|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    452|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    452|          size, std::forward<Args>(args)...);
   73|    452|#endif
   74|    452|#ifndef NDEBUG
   75|    452|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    452|#endif
   77|    452|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    452|  newAlloc(ptr, size);
   79|    452|#endif
   80|    452|  return ptr;
   81|    452|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_17NativeConstructorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEERPFNSG_INS0_12PseudoHandleIS9_EELSJ_6EEES7_SA_SE_ERNS0_8CellKindEEEEPT_DpOT2_:
   24|  4.05k|T *GCBase::makeAFixed(Args &&...args) {
   25|  4.05k|  static_assert(
   26|  4.05k|      cellSize<T>() >= minAllocationSize() &&
   27|  4.05k|          cellSize<T>() <= maxAllocationSize(),
   28|  4.05k|      "Cell size outside legal range.");
   29|  4.05k|  assert(
   30|  4.05k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  4.05k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  4.05k|}
_ZN6hermes2vm6GCBase5makeAINS0_17NativeConstructorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEERPFNSG_INS0_12PseudoHandleIS9_EELSJ_6EEES7_SA_SE_ERNS0_8CellKindEEEEPT_jDpOT3_:
   57|  4.05k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  4.05k|  assert(
   59|  4.05k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  4.05k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  4.05k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  4.05k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  4.05k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  4.05k|          size, std::forward<Args>(args)...);
   73|  4.05k|#endif
   74|  4.05k|#ifndef NDEBUG
   75|  4.05k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  4.05k|#endif
   77|  4.05k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  4.05k|  newAlloc(ptr, size);
   79|  4.05k|#endif
   80|  4.05k|  return ptr;
   81|  4.05k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_16ArrayStorageBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|     99|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     99|  assert(
   43|     99|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|     99|      !VTable::getVTable(T::getCellKind())->size &&
   46|     99|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     99|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_16ArrayStorageBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_13BoundFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_13BoundFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_14NativeFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_DpOT2_:
   24|  42.4k|T *GCBase::makeAFixed(Args &&...args) {
   25|  42.4k|  static_assert(
   26|  42.4k|      cellSize<T>() >= minAllocationSize() &&
   27|  42.4k|          cellSize<T>() <= maxAllocationSize(),
   28|  42.4k|      "Cell size outside legal range.");
   29|  42.4k|  assert(
   30|  42.4k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  42.4k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  42.4k|}
_ZN6hermes2vm6GCBase5makeAINS0_14NativeFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_jDpOT3_:
   57|  42.4k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  42.4k|  assert(
   59|  42.4k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  42.4k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  42.4k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  42.4k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  42.4k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  42.4k|          size, std::forward<Args>(args)...);
   73|  42.4k|#endif
   74|  42.4k|#ifndef NDEBUG
   75|  42.4k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  42.4k|#endif
   77|  42.4k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  42.4k|  newAlloc(ptr, size);
   79|  42.4k|#endif
   80|  42.4k|  return ptr;
   81|  42.4k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_10JSFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_DpOT2_:
   24|  4.50k|T *GCBase::makeAFixed(Args &&...args) {
   25|  4.50k|  static_assert(
   26|  4.50k|      cellSize<T>() >= minAllocationSize() &&
   27|  4.50k|          cellSize<T>() <= maxAllocationSize(),
   28|  4.50k|      "Cell size outside legal range.");
   29|  4.50k|  assert(
   30|  4.50k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  4.50k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  4.50k|}
_ZN6hermes2vm6GCBase5makeAINS0_10JSFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_jDpOT3_:
   57|  4.50k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  4.50k|  assert(
   59|  4.50k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  4.50k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  4.50k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  4.50k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  4.50k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  4.50k|          size, std::forward<Args>(args)...);
   73|  4.50k|#endif
   74|  4.50k|#ifndef NDEBUG
   75|  4.50k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  4.50k|#endif
   77|  4.50k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  4.50k|  newAlloc(ptr, size);
   79|  4.50k|#endif
   80|  4.50k|  return ptr;
   81|  4.50k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_6DomainELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
   24|    254|T *GCBase::makeAFixed(Args &&...args) {
   25|    254|  static_assert(
   26|    254|      cellSize<T>() >= minAllocationSize() &&
   27|    254|          cellSize<T>() <= maxAllocationSize(),
   28|    254|      "Cell size outside legal range.");
   29|    254|  assert(
   30|    254|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    254|      cellSize<T>(), std::forward<Args>(args)...);
   33|    254|}
_ZN6hermes2vm6GCBase5makeAINS0_6DomainELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|    254|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    254|  assert(
   59|    254|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    254|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    254|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    254|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    254|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    254|          size, std::forward<Args>(args)...);
   73|    254|#endif
   74|    254|#ifndef NDEBUG
   75|    254|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    254|#endif
   77|    254|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    254|  newAlloc(ptr, size);
   79|    254|#endif
   80|    254|  return ptr;
   81|    254|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_11HiddenClassELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_DpOT2_:
   24|  56.9k|T *GCBase::makeAFixed(Args &&...args) {
   25|  56.9k|  static_assert(
   26|  56.9k|      cellSize<T>() >= minAllocationSize() &&
   27|  56.9k|          cellSize<T>() <= maxAllocationSize(),
   28|  56.9k|      "Cell size outside legal range.");
   29|  56.9k|  assert(
   30|  56.9k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  56.9k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  56.9k|}
_ZN6hermes2vm6GCBase5makeAINS0_11HiddenClassELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_jDpOT3_:
   57|  56.9k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  56.9k|  assert(
   59|  56.9k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  56.9k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  56.9k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  56.9k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  56.9k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  56.9k|          size, std::forward<Args>(args)...);
   73|  56.9k|#endif
   74|  56.9k|#ifndef NDEBUG
   75|  56.9k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  56.9k|#endif
   77|  56.9k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  56.9k|  newAlloc(ptr, size);
   79|  56.9k|#endif
   80|  56.9k|  return ptr;
   81|  56.9k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
   40|   105k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   105k|  assert(
   43|   105k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|   105k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   105k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   105k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   105k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
   57|   105k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   105k|  assert(
   59|   105k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   105k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   105k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   105k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   105k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   105k|          size, std::forward<Args>(args)...);
   73|   105k|#endif
   74|   105k|#ifndef NDEBUG
   75|   105k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   105k|#endif
   77|   105k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   105k|  newAlloc(ptr, size);
   79|   105k|#endif
   80|   105k|  return ptr;
   81|   105k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
   40|    132|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    132|  assert(
   43|    132|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|    132|      !VTable::getVTable(T::getCellKind())->size &&
   46|    132|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    132|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    132|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
   57|    132|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    132|  assert(
   59|    132|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    132|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    132|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    132|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    132|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    132|          size, std::forward<Args>(args)...);
   73|    132|#endif
   74|    132|#ifndef NDEBUG
   75|    132|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    132|#endif
   77|    132|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    132|  newAlloc(ptr, size);
   79|    132|#endif
   80|    132|  return ptr;
   81|    132|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_7JSArrayELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
   24|   428k|T *GCBase::makeAFixed(Args &&...args) {
   25|   428k|  static_assert(
   26|   428k|      cellSize<T>() >= minAllocationSize() &&
   27|   428k|          cellSize<T>() <= maxAllocationSize(),
   28|   428k|      "Cell size outside legal range.");
   29|   428k|  assert(
   30|   428k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|   428k|      cellSize<T>(), std::forward<Args>(args)...);
   33|   428k|}
_ZN6hermes2vm6GCBase5makeAINS0_7JSArrayELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
   57|   428k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   428k|  assert(
   59|   428k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   428k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   428k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   428k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   428k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   428k|          size, std::forward<Args>(args)...);
   73|   428k|#endif
   74|   428k|#ifndef NDEBUG
   75|   428k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   428k|#endif
   77|   428k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   428k|  newAlloc(ptr, size);
   79|   428k|#endif
   80|   428k|  return ptr;
   81|   428k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_7JSErrorELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_DpOT2_:
   24|     24|T *GCBase::makeAFixed(Args &&...args) {
   25|     24|  static_assert(
   26|     24|      cellSize<T>() >= minAllocationSize() &&
   27|     24|          cellSize<T>() <= maxAllocationSize(),
   28|     24|      "Cell size outside legal range.");
   29|     24|  assert(
   30|     24|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     24|      cellSize<T>(), std::forward<Args>(args)...);
   33|     24|}
_ZN6hermes2vm6GCBase5makeAINS0_7JSErrorELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_jDpOT3_:
   57|     24|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     24|  assert(
   59|     24|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     24|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     24|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     24|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     24|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     24|          size, std::forward<Args>(args)...);
   73|     24|#endif
   74|     24|#ifndef NDEBUG
   75|     24|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     24|#endif
   77|     24|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     24|  newAlloc(ptr, size);
   79|     24|#endif
   80|     24|  return ptr;
   81|     24|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSObjectELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
   24|  10.9k|T *GCBase::makeAFixed(Args &&...args) {
   25|  10.9k|  static_assert(
   26|  10.9k|      cellSize<T>() >= minAllocationSize() &&
   27|  10.9k|          cellSize<T>() <= maxAllocationSize(),
   28|  10.9k|      "Cell size outside legal range.");
   29|  10.9k|  assert(
   30|  10.9k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  10.9k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  10.9k|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSObjectELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
   57|  10.9k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  10.9k|  assert(
   59|  10.9k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  10.9k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  10.9k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  10.9k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  10.9k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  10.9k|          size, std::forward<Args>(args)...);
   73|  10.9k|#endif
   74|  10.9k|#ifndef NDEBUG
   75|  10.9k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  10.9k|#endif
   77|  10.9k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  10.9k|  newAlloc(ptr, size);
   79|  10.9k|#endif
   80|  10.9k|  return ptr;
   81|  10.9k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSRegExpELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|    242|T *GCBase::makeAFixed(Args &&...args) {
   25|    242|  static_assert(
   26|    242|      cellSize<T>() >= minAllocationSize() &&
   27|    242|          cellSize<T>() <= maxAllocationSize(),
   28|    242|      "Cell size outside legal range.");
   29|    242|  assert(
   30|    242|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|    242|      cellSize<T>(), std::forward<Args>(args)...);
   33|    242|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSRegExpELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|    242|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    242|  assert(
   59|    242|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    242|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    242|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    242|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    242|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    242|          size, std::forward<Args>(args)...);
   73|    242|#endif
   74|    242|#ifndef NDEBUG
   75|    242|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    242|#endif
   77|    242|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    242|  newAlloc(ptr, size);
   79|    242|#endif
   80|    242|  return ptr;
   81|    242|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_10HostObjectELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_10HostObjectELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSStringELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSStringELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_8JSNumberELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_8JSNumberELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_9JSBooleanELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_9JSBooleanELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_16PropertyAccessorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_DpOT2_:
   24|  4.28k|T *GCBase::makeAFixed(Args &&...args) {
   25|  4.28k|  static_assert(
   26|  4.28k|      cellSize<T>() >= minAllocationSize() &&
   27|  4.28k|          cellSize<T>() <= maxAllocationSize(),
   28|  4.28k|      "Cell size outside legal range.");
   29|  4.28k|  assert(
   30|  4.28k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  4.28k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  4.28k|}
_ZN6hermes2vm6GCBase5makeAINS0_16PropertyAccessorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_jDpOT3_:
   57|  4.28k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  4.28k|  assert(
   59|  4.28k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  4.28k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  4.28k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  4.28k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  4.28k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  4.28k|          size, std::forward<Args>(args)...);
   73|  4.28k|#endif
   74|  4.28k|#ifndef NDEBUG
   75|  4.28k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  4.28k|#endif
   77|  4.28k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  4.28k|  newAlloc(ptr, size);
   79|  4.28k|#endif
   80|  4.28k|  return ptr;
   81|  4.28k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
   24|  1.09k|T *GCBase::makeAFixed(Args &&...args) {
   25|  1.09k|  static_assert(
   26|  1.09k|      cellSize<T>() >= minAllocationSize() &&
   27|  1.09k|          cellSize<T>() <= maxAllocationSize(),
   28|  1.09k|      "Cell size outside legal range.");
   29|  1.09k|  assert(
   30|  1.09k|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|  1.09k|      cellSize<T>(), std::forward<Args>(args)...);
   33|  1.09k|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|  1.09k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  1.09k|  assert(
   59|  1.09k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  1.09k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  1.09k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  1.09k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  1.09k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  1.09k|          size, std::forward<Args>(args)...);
   73|  1.09k|#endif
   74|  1.09k|#ifndef NDEBUG
   75|  1.09k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  1.09k|#endif
   77|  1.09k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  1.09k|  newAlloc(ptr, size);
   79|  1.09k|#endif
   80|  1.09k|  return ptr;
   81|  1.09k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
   40|   415k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   415k|  assert(
   43|   415k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|   415k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   415k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   415k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   415k|}
_ZN6hermes2vm6GCBase5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
   57|   415k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   415k|  assert(
   59|   415k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   415k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   415k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   415k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   415k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   415k|          size, std::forward<Args>(args)...);
   73|   415k|#endif
   74|   415k|#ifndef NDEBUG
   75|   415k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   415k|#endif
   77|   415k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   415k|  newAlloc(ptr, size);
   79|   415k|#endif
   80|   415k|  return ptr;
   81|   415k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
   40|      8|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|      8|  assert(
   43|      8|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|      8|      !VTable::getVTable(T::getCellKind())->size &&
   46|      8|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|      8|      heapAlignSize(size), std::forward<Args>(args)...);
   49|      8|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
   57|      8|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|      8|  assert(
   59|      8|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|      8|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|      8|          (hasFinalizer == HasFinalizer::Yes) &&
   63|      8|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|      8|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|      8|          size, std::forward<Args>(args)...);
   73|      8|#endif
   74|      8|#ifndef NDEBUG
   75|      8|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|      8|#endif
   77|      8|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|      8|  newAlloc(ptr, size);
   79|      8|#endif
   80|      8|  return ptr;
   81|      8|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
   40|  12.6k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  12.6k|  assert(
   43|  12.6k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|  12.6k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  12.6k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  12.6k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  12.6k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
   57|  12.6k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  12.6k|  assert(
   59|  12.6k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  12.6k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  12.6k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  12.6k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  12.6k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  12.6k|          size, std::forward<Args>(args)...);
   73|  12.6k|#endif
   74|  12.6k|#ifndef NDEBUG
   75|  12.6k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  12.6k|#endif
   77|  12.6k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  12.6k|  newAlloc(ptr, size);
   79|  12.6k|#endif
   80|  12.6k|  return ptr;
   81|  12.6k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
   40|   410k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   410k|  assert(
   43|   410k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|   410k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   410k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   410k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   410k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
   57|   410k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   410k|  assert(
   59|   410k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   410k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   410k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   410k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   410k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   410k|          size, std::forward<Args>(args)...);
   73|   410k|#endif
   74|   410k|#ifndef NDEBUG
   75|   410k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   410k|#endif
   77|   410k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   410k|  newAlloc(ptr, size);
   79|   410k|#endif
   80|   410k|  return ptr;
   81|   410k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
   40|   249k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|   249k|  assert(
   43|   249k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|   249k|      !VTable::getVTable(T::getCellKind())->size &&
   46|   249k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|   249k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|   249k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
   57|   249k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|   249k|  assert(
   59|   249k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|   249k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|   249k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|   249k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|   249k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|   249k|          size, std::forward<Args>(args)...);
   73|   249k|#endif
   74|   249k|#ifndef NDEBUG
   75|   249k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|   249k|#endif
   77|   249k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|   249k|  newAlloc(ptr, size);
   79|   249k|#endif
   80|   249k|  return ptr;
   81|   249k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
   40|  12.6k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  12.6k|  assert(
   43|  12.6k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|  12.6k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  12.6k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  12.6k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  12.6k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
   57|  12.6k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  12.6k|  assert(
   59|  12.6k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  12.6k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  12.6k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  12.6k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  12.6k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  12.6k|          size, std::forward<Args>(args)...);
   73|  12.6k|#endif
   74|  12.6k|#ifndef NDEBUG
   75|  12.6k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  12.6k|#endif
   77|  12.6k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  12.6k|  newAlloc(ptr, size);
   79|  12.6k|#endif
   80|  12.6k|  return ptr;
   81|  12.6k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
   40|  49.4k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  49.4k|  assert(
   43|  49.4k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|  49.4k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  49.4k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  49.4k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  49.4k|}
_ZN6hermes2vm6GCBase5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
   57|  49.4k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  49.4k|  assert(
   59|  49.4k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  49.4k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  49.4k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  49.4k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  49.4k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  49.4k|          size, std::forward<Args>(args)...);
   73|  49.4k|#endif
   74|  49.4k|#ifndef NDEBUG
   75|  49.4k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  49.4k|#endif
   77|  49.4k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  49.4k|  newAlloc(ptr, size);
   79|  49.4k|#endif
   80|  49.4k|  return ptr;
   81|  49.4k|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
   40|     13|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     13|  assert(
   43|     13|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|     13|      !VTable::getVTable(T::getCellKind())->size &&
   46|     13|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     13|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     13|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
   57|     13|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     13|  assert(
   59|     13|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     13|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     13|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     13|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     13|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     13|          size, std::forward<Args>(args)...);
   73|     13|#endif
   74|     13|#ifndef NDEBUG
   75|     13|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     13|#endif
   77|     13|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     13|  newAlloc(ptr, size);
   79|     13|#endif
   80|     13|  return ptr;
   81|     13|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
   40|      5|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|      5|  assert(
   43|      5|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|      5|      !VTable::getVTable(T::getCellKind())->size &&
   46|      5|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|      5|      heapAlignSize(size), std::forward<Args>(args)...);
   49|      5|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
   57|      5|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|      5|  assert(
   59|      5|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|      5|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|      5|          (hasFinalizer == HasFinalizer::Yes) &&
   63|      5|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|      5|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|      5|          size, std::forward<Args>(args)...);
   73|      5|#endif
   74|      5|#ifndef NDEBUG
   75|      5|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|      5|#endif
   77|      5|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|      5|  newAlloc(ptr, size);
   79|      5|#endif
   80|      5|  return ptr;
   81|      5|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
   40|     60|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     60|  assert(
   43|     60|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|     60|      !VTable::getVTable(T::getCellKind())->size &&
   46|     60|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     60|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     60|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
   57|     60|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     60|  assert(
   59|     60|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     60|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     60|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     60|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     60|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     60|          size, std::forward<Args>(args)...);
   73|     60|#endif
   74|     60|#ifndef NDEBUG
   75|     60|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     60|#endif
   77|     60|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     60|  newAlloc(ptr, size);
   79|     60|#endif
   80|     60|  return ptr;
   81|     60|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
   40|     48|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|     48|  assert(
   43|     48|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|     48|      !VTable::getVTable(T::getCellKind())->size &&
   46|     48|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|     48|      heapAlignSize(size), std::forward<Args>(args)...);
   49|     48|}
_ZN6hermes2vm6GCBase5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
   57|     48|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     48|  assert(
   59|     48|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     48|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     48|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     48|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     48|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     48|          size, std::forward<Args>(args)...);
   73|     48|#endif
   74|     48|#ifndef NDEBUG
   75|     48|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     48|#endif
   77|     48|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     48|  newAlloc(ptr, size);
   79|     48|#endif
   80|     48|  return ptr;
   81|     48|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23BufferedStringPrimitiveIDsEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT2_:
   40|    162|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    162|  assert(
   43|    162|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|    162|      !VTable::getVTable(T::getCellKind())->size &&
   46|    162|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    162|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    162|}
_ZN6hermes2vm6GCBase5makeAINS0_23BufferedStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT3_:
   57|    162|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    162|  assert(
   59|    162|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    162|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    162|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    162|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    162|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    162|          size, std::forward<Args>(args)...);
   73|    162|#endif
   74|    162|#ifndef NDEBUG
   75|    162|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    162|#endif
   77|    162|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    162|  newAlloc(ptr, size);
   79|    162|#endif
   80|    162|  return ptr;
   81|    162|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_23BufferedStringPrimitiveIcEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEEEEEPT_jDpOT2_:
   40|    711|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|    711|  assert(
   43|    711|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|    711|      !VTable::getVTable(T::getCellKind())->size &&
   46|    711|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|    711|      heapAlignSize(size), std::forward<Args>(args)...);
   49|    711|}
_ZN6hermes2vm6GCBase5makeAINS0_23BufferedStringPrimitiveIcEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEEEEEPT_jDpOT3_:
   57|    711|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|    711|  assert(
   59|    711|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|    711|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|    711|          (hasFinalizer == HasFinalizer::Yes) &&
   63|    711|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|    711|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|    711|          size, std::forward<Args>(args)...);
   73|    711|#endif
   74|    711|#ifndef NDEBUG
   75|    711|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|    711|#endif
   77|    711|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|    711|  newAlloc(ptr, size);
   79|    711|#endif
   80|    711|  return ptr;
   81|    711|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_12SingleObjectILNS0_8CellKindE60EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_12SingleObjectILNS0_8CellKindE60EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_12SingleObjectILNS0_8CellKindE59EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_12SingleObjectILNS0_8CellKindE59EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12MarkAcceptorEEEvPNS0_6GCCellERT_:
  124|   801k|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  125|   801k|  markCell(cell, cell->getKind(), acceptor);
  126|   801k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12MarkAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_:
  129|   801k|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  130|   801k|  SlotVisitor<Acceptor> visitor(acceptor);
  131|   801k|  markCell(visitor, cell, kind);
  132|   801k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12MarkAcceptorEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  136|   801k|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  137|   801k|  visitor.visit(
  138|   801k|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  139|   801k|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  140|   801k|}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12MarkAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_:
  115|   801k|    Acceptor &acceptor) {
  116|   801k|  markWeakRefsIfNecessary(
  117|   801k|      cell,
  118|   801k|      kind,
  119|   801k|      acceptor,
  120|   801k|      std::is_convertible<Acceptor &, WeakRefAcceptor &>{});
  121|   801k|}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12EvacAcceptorILb1EEEEEvPNS0_6GCCellENS0_8CellKindERT_:
  115|      1|    Acceptor &acceptor) {
  116|      1|  markWeakRefsIfNecessary(
  117|      1|      cell,
  118|      1|      kind,
  119|      1|      acceptor,
  120|      1|      std::is_convertible<Acceptor &, WeakRefAcceptor &>{});
  121|      1|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb1EEEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  136|      1|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  137|      1|  visitor.visit(
  138|      1|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  139|      1|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  140|      1|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb1EEEEEvPNS0_6GCCellERT_:
  124|      1|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  125|      1|  markCell(cell, cell->getKind(), acceptor);
  126|      1|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb1EEEEEvPNS0_6GCCellENS0_8CellKindERT_:
  129|      1|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  130|      1|  SlotVisitor<Acceptor> visitor(acceptor);
  131|      1|  markCell(visitor, cell, kind);
  132|      1|}
_ZN6hermes2vm6GCBase19markCellWithinRangeINS0_7HadesGC12EvacAcceptorILb0EEEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindEPKcSE_:
  148|    339|    const char *end) {
  149|    339|  visitor.visitWithinRange(
  150|    339|      cell,
  151|    339|      Metadata::metadataTable[static_cast<size_t>(kind)].offsets,
  152|    339|      begin,
  153|    339|      end);
  154|    339|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  155|    339|}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellENS0_8CellKindERT_:
  115|   439k|    Acceptor &acceptor) {
  116|   439k|  markWeakRefsIfNecessary(
  117|   439k|      cell,
  118|   439k|      kind,
  119|   439k|      acceptor,
  120|   439k|      std::is_convertible<Acceptor &, WeakRefAcceptor &>{});
  121|   439k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  136|   438k|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  137|   438k|  visitor.visit(
  138|   438k|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  139|   438k|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  140|   438k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellERT_:
  124|   428k|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  125|   428k|  markCell(cell, cell->getKind(), acceptor);
  126|   428k|}
_ZN6hermes2vm6GCBase8markCellINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellENS0_8CellKindERT_:
  129|   428k|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  130|   428k|  SlotVisitor<Acceptor> visitor(acceptor);
  131|   428k|  markCell(visitor, cell, kind);
  132|   428k|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellERT_:
  124|  5.65M|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  125|  5.65M|  markCell(cell, cell->getKind(), acceptor);
  126|  5.65M|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_:
  129|  5.65M|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  130|  5.65M|  SlotVisitor<Acceptor> visitor(acceptor);
  131|  5.65M|  markCell(visitor, cell, kind);
  132|  5.65M|}
_ZN6hermes2vm6GCBase8markCellINS0_27CheckHeapWellFormedAcceptorEEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  136|  5.65M|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  137|  5.65M|  visitor.visit(
  138|  5.65M|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  139|  5.65M|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  140|  5.65M|}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_:
  115|  5.65M|    Acceptor &acceptor) {
  116|  5.65M|  markWeakRefsIfNecessary(
  117|  5.65M|      cell,
  118|  5.65M|      kind,
  119|  5.65M|      acceptor,
  120|  5.65M|      std::is_convertible<Acceptor &, WeakRefAcceptor &>{});
  121|  5.65M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellERT_:
  124|  4.82M|inline void GCBase::markCell(GCCell *cell, Acceptor &acceptor) {
  125|  4.82M|  markCell(cell, cell->getKind(), acceptor);
  126|  4.82M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellENS0_8CellKindERT_:
  129|  4.82M|inline void GCBase::markCell(GCCell *cell, CellKind kind, Acceptor &acceptor) {
  130|  4.82M|  SlotVisitor<Acceptor> visitor(acceptor);
  131|  4.82M|  markCell(visitor, cell, kind);
  132|  4.82M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase8markCellIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvRNS0_11SlotVisitorIT_EEPNS0_6GCCellENS0_8CellKindE:
  136|  4.82M|GCBase::markCell(SlotVisitor<Acceptor> &visitor, GCCell *cell, CellKind kind) {
  137|  4.82M|  visitor.visit(
  138|  4.82M|      cell, Metadata::metadataTable[static_cast<size_t>(kind)].offsets);
  139|  4.82M|  markWeakRefsIfNecessary(cell, kind, visitor.acceptor_);
  140|  4.82M|}
HadesGC.cpp:_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellENS0_8CellKindERT_:
  115|  4.82M|    Acceptor &acceptor) {
  116|  4.82M|  markWeakRefsIfNecessary(
  117|  4.82M|      cell,
  118|  4.82M|      kind,
  119|  4.82M|      acceptor,
  120|  4.82M|      std::is_convertible<Acceptor &, WeakRefAcceptor &>{});
  121|  4.82M|}
_ZN6hermes2vm6GCBase13makeAVariableINS0_15DictPropertyMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT2_:
   40|  19.2k|T *GCBase::makeAVariable(uint32_t size, Args &&...args) {
   41|       |  // If size is greater than the max, we should OOM.
   42|  19.2k|  assert(
   43|  19.2k|      size >= GC::minAllocationSize() && "Cell size is smaller than minimum");
   44|      0|  assert(
   45|  19.2k|      !VTable::getVTable(T::getCellKind())->size &&
   46|  19.2k|      "Cell is not variable size.");
   47|      0|  return makeA<T, false /* fixedSize */, hasFinalizer, longLived>(
   48|  19.2k|      heapAlignSize(size), std::forward<Args>(args)...);
   49|  19.2k|}
_ZN6hermes2vm6GCBase5makeAINS0_15DictPropertyMapELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT3_:
   57|  19.2k|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|  19.2k|  assert(
   59|  19.2k|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|  19.2k|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|  19.2k|          (hasFinalizer == HasFinalizer::Yes) &&
   63|  19.2k|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|  19.2k|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|  19.2k|          size, std::forward<Args>(args)...);
   73|  19.2k|#endif
   74|  19.2k|#ifndef NDEBUG
   75|  19.2k|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|  19.2k|#endif
   77|  19.2k|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|  19.2k|  newAlloc(ptr, size);
   79|  19.2k|#endif
   80|  19.2k|  return ptr;
   81|  19.2k|}
_ZN6hermes2vm6GCBase10makeAFixedINS0_14OrderedHashMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_DpOT2_:
   24|     99|T *GCBase::makeAFixed(Args &&...args) {
   25|     99|  static_assert(
   26|     99|      cellSize<T>() >= minAllocationSize() &&
   27|     99|          cellSize<T>() <= maxAllocationSize(),
   28|     99|      "Cell size outside legal range.");
   29|     99|  assert(
   30|     99|      VTable::getVTable(T::getCellKind())->size && "Cell is not fixed size.");
   31|      0|  return makeA<T, true /* fixedSize */, hasFinalizer, longLived>(
   32|     99|      cellSize<T>(), std::forward<Args>(args)...);
   33|     99|}
_ZN6hermes2vm6GCBase5makeAINS0_14OrderedHashMapELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_jDpOT3_:
   57|     99|T *GCBase::makeA(uint32_t size, Args &&...args) {
   58|     99|  assert(
   59|     99|      isSizeHeapAligned(size) && "Size must be aligned before reaching here");
   60|      0|  assert(
   61|     99|      !!VTable::getVTable(T::getCellKind())->finalize_ ==
   62|     99|          (hasFinalizer == HasFinalizer::Yes) &&
   63|     99|      "hasFinalizer should be set iff the cell has a finalizer.");
   64|       |#ifdef HERMESVM_GC_RUNTIME
   65|       |  T *ptr = runtimeGCDispatch([&](auto *gc) {
   66|       |    return gc->template makeA<T, fixedSize, hasFinalizer, longLived>(
   67|       |        size, std::forward<Args>(args)...);
   68|       |  });
   69|       |#else
   70|      0|  T *ptr =
   71|     99|      static_cast<GC *>(this)->makeA<T, fixedSize, hasFinalizer, longLived>(
   72|     99|          size, std::forward<Args>(args)...);
   73|     99|#endif
   74|     99|#ifndef NDEBUG
   75|     99|  ptr->setDebugAllocationIdInGC(nextObjectID());
   76|     99|#endif
   77|     99|#ifdef HERMES_MEMORY_INSTRUMENTATION
   78|     99|  newAlloc(ptr, size);
   79|     99|#endif
   80|     99|  return ptr;
   81|     99|}

_ZNK6hermes2vm6GCBase7getNameEv:
  804|    571|  const std::string &getName() const {
  805|    571|    return name_;
  806|    571|  }
_ZN6hermes2vm6GCBase12weakRefMutexEv:
 1127|  2.94M|  WeakRefMutex &weakRefMutex() {
 1128|  2.94M|    return weakRefMutex_;
 1129|  2.94M|  }
_ZN6hermes2vm6GCBase9IDTracker8reservedENS2_16ReservedObjectIDE:
  600|     99|    static constexpr HeapSnapshot::NodeID reserved(ReservedObjectID id) {
  601|       |      // All reserved IDs should be odd numbers to signify that they're JS
  602|       |      // objects and not native objects. This follows v8's output.
  603|     99|      return static_cast<std::underlying_type<ReservedObjectID>::type>(id) * 2 +
  604|     99|          1;
  605|     99|    }
_ZN6hermes2vm6GCBase33SamplingAllocationLocationTrackerC2EPS1_:
  514|     99|    explicit inline SamplingAllocationLocationTracker(GCBase *gc) : gc_(gc) {}
_ZNK6hermes2vm6GCBase33SamplingAllocationLocationTracker9isEnabledEv:
  517|  2.29M|    bool isEnabled() const {
  518|  2.29M|      return !!dist_;
  519|  2.29M|    }
_ZN6hermes2vm6GCBaseD2Ev:
  775|     99|  virtual ~GCBase() {}
_ZNK6hermes2vm6GCBase14getPointerBaseEv:
  812|  11.2M|  PointerBase &getPointerBase() const {
  813|  11.2M|    return pointerBase_;
  814|  11.2M|  }
_ZNK6hermes2vm6GCBase12getCallbacksEv:
  816|  2.11M|  GCCallbacks &getCallbacks() const {
  817|  2.11M|    return gcCallbacks_;
  818|  2.11M|  }
_ZNK6hermes2vm6GCBase4inGCEv:
 1189|   523k|  bool inGC() const {
 1190|   523k|    return inGC_;
 1191|   523k|  }
_ZN6hermes2vm6GCBase13isTrackingIDsEv:
 1200|    747|  bool isTrackingIDs() {
 1201|    747|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1202|    747|    return getIDTracker().isTrackingIDs() ||
  ------------------
  |  Branch (1202:12): [True: 0, False: 747]
  ------------------
 1203|    747|        getAllocationLocationTracker().isEnabled() ||
  ------------------
  |  Branch (1203:9): [True: 0, False: 747]
  ------------------
 1204|    747|        getSamplingAllocationTracker().isEnabled();
  ------------------
  |  Branch (1204:9): [True: 0, False: 747]
  ------------------
 1205|       |#else
 1206|       |    return getIDTracker().isTrackingIDs();
 1207|       |#endif
 1208|    747|  }
_ZN6hermes2vm6GCBase12getIDTrackerEv:
 1210|  9.23k|  IDTracker &getIDTracker() {
 1211|  9.23k|    return idTracker_;
 1212|  9.23k|  }
_ZN6hermes2vm6GCBase28getAllocationLocationTrackerEv:
 1215|    747|  AllocationLocationTracker &getAllocationLocationTracker() {
 1216|    747|    return allocationLocationTracker_;
 1217|    747|  }
_ZN6hermes2vm6GCBase28getSamplingAllocationTrackerEv:
 1219|    747|  SamplingAllocationLocationTracker &getSamplingAllocationTracker() {
 1220|    747|    return samplingAllocationTracker_;
 1221|    747|  }
_ZN6hermes2vm6GCBase9markRootsERNS0_28RootAndSlotAcceptorWithNamesEb:
 1310|  1.18k|  void markRoots(RootAndSlotAcceptorWithNames &acceptor, bool markLongLived) {
 1311|  1.18k|    gcCallbacks_.markRoots(acceptor, markLongLived);
 1312|  1.18k|  }
_ZN6hermes2vm6GCBase13markWeakRootsERNS0_16WeakRootAcceptorEb:
 1316|  1.18k|  void markWeakRoots(WeakRootAcceptor &acceptor, bool markLongLived) {
 1317|  1.18k|    gcCallbacks_.markWeakRoots(acceptor, markLongLived);
 1318|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::WeakRefSlots);
 1319|   692k|    for (auto &slot : weakSlots_) {
  ------------------
  |  Branch (1319:21): [True: 692k, False: 1.18k]
  ------------------
 1320|   692k|      slot.markWeakRoots(acceptor);
 1321|   692k|    }
 1322|  1.18k|    acceptor.endRootSection();
 1323|  1.18k|  }
_ZN6hermes2vm6GCBase12freeWeakSlotEPNS0_11WeakRefSlotE:
 1326|     60|  void freeWeakSlot(WeakRefSlot *slot) {
 1327|     60|    slot->free(firstFreeWeak_);
 1328|     60|    firstFreeWeak_ = slot;
 1329|     60|  }
_ZN6hermes2vm6GCBase13constructCellINS0_11BoxedDoubleEJRdEEEPT_PvjDpOT0_:
 1389|  1.79k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  1.79k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  1.79k|    constexpr auto kind = T::getCellKind();
 1392|  1.79k|    cell->setKindAndSize({kind, size});
 1393|  1.79k|    return cell;
 1394|  1.79k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16ArrayStorageBaseINS0_13HermesValue32EEEJEEEPT_PvjDpOT0_:
 1389|   459k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   459k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   459k|    constexpr auto kind = T::getCellKind();
 1392|   459k|    cell->setKindAndSize({kind, size});
 1393|   459k|    return cell;
 1394|   459k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_11EnvironmentEJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_PvjDpOT0_:
 1389|    452|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    452|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    452|    constexpr auto kind = T::getCellKind();
 1392|    452|    cell->setKindAndSize({kind, size});
 1393|    452|    return cell;
 1394|    452|  }
_ZN6hermes2vm6GCBase13constructCellINS0_17NativeConstructorEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESC_S5_NS0_10NativeArgsEERPFNSE_INS0_12PseudoHandleIS7_EELSH_6EEES5_S8_SC_ERNS0_8CellKindEEEEPT_SC_jDpOT0_:
 1389|  4.05k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  4.05k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  4.05k|    constexpr auto kind = T::getCellKind();
 1392|  4.05k|    cell->setKindAndSize({kind, size});
 1393|  4.05k|    return cell;
 1394|  4.05k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16ArrayStorageBaseINS0_11HermesValueEEEJEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_13BoundFunctionEJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERNS6_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_14NativeFunctionEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESC_S5_NS0_10NativeArgsEEEEEPT_SC_jDpOT0_:
 1389|  42.4k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  42.4k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  42.4k|    constexpr auto kind = T::getCellKind();
 1392|  42.4k|    cell->setKindAndSize({kind, size});
 1393|  42.4k|    return cell;
 1394|  42.4k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_10JSFunctionEJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS6_INS0_8JSObjectEEENS6_INS0_11HiddenClassEEERNS6_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_PvjDpOT0_:
 1389|  4.50k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  4.50k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  4.50k|    constexpr auto kind = T::getCellKind();
 1392|  4.50k|    cell->setKindAndSize({kind, size});
 1393|  4.50k|    return cell;
 1394|  4.50k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_6DomainEJEEEPT_PvjDpOT0_:
 1389|    254|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    254|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    254|    constexpr auto kind = T::getCellKind();
 1392|    254|    cell->setKindAndSize({kind, size});
 1393|    254|    return cell;
 1394|    254|  }
_ZN6hermes2vm6GCBase13constructCellINS0_11HiddenClassEJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_PvjDpOT0_:
 1389|  56.9k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  56.9k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  56.9k|    constexpr auto kind = T::getCellKind();
 1392|  56.9k|    cell->setKindAndSize({kind, size});
 1393|  56.9k|    return cell;
 1394|  56.9k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb1EEEJRmEEEPT_PvjDpOT0_:
 1389|   105k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   105k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   105k|    constexpr auto kind = T::getCellKind();
 1392|   105k|    cell->setKindAndSize({kind, size});
 1393|   105k|    return cell;
 1394|   105k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb1EEEJRmEEEPT_PvjDpOT0_:
 1389|    132|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    132|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    132|    constexpr auto kind = T::getCellKind();
 1392|    132|    cell->setKindAndSize({kind, size});
 1393|    132|    return cell;
 1394|    132|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7JSArrayEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS6_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_PvjDpOT0_:
 1389|   428k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   428k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   428k|    constexpr auto kind = T::getCellKind();
 1392|   428k|    cell->setKindAndSize({kind, size});
 1393|   428k|    return cell;
 1394|   428k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7JSErrorEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEERbEEEPT_PvjDpOT0_:
 1389|     24|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     24|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     24|    constexpr auto kind = T::getCellKind();
 1392|     24|    cell->setKindAndSize({kind, size});
 1393|     24|    return cell;
 1394|     24|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSObjectEJRNS0_7RuntimeERNS0_6HandleIS3_EENS6_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_PvjDpOT0_:
 1389|  10.9k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  10.9k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  10.9k|    constexpr auto kind = T::getCellKind();
 1392|  10.9k|    cell->setKindAndSize({kind, size});
 1393|  10.9k|    return cell;
 1394|  10.9k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSRegExpEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|    242|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    242|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    242|    constexpr auto kind = T::getCellKind();
 1392|    242|    cell->setKindAndSize({kind, size});
 1393|    242|    return cell;
 1394|    242|  }
_ZN6hermes2vm6GCBase13constructCellINS0_10HostObjectEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSC_14default_deleteISE_EEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSStringEJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS6_INS0_8JSObjectEEERNS6_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_8JSNumberEJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_9JSBooleanEJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_16PropertyAccessorEJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEES9_EEEPT_PvjDpOT0_:
 1389|  4.28k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  4.28k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  4.28k|    constexpr auto kind = T::getCellKind();
 1392|  4.28k|    cell->setKindAndSize({kind, size});
 1393|  4.28k|    return cell;
 1394|  4.28k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_10FillerCellEJEEEPT_PvjDpOT0_:
 1389|     44|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     44|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     44|    constexpr auto kind = T::getCellKind();
 1392|     44|    cell->setKindAndSize({kind, size});
 1393|     44|    return cell;
 1394|     44|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEJEEEPT_PvjDpOT0_:
 1389|  1.09k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  1.09k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  1.09k|    constexpr auto kind = T::getCellKind();
 1392|  1.09k|    cell->setKindAndSize({kind, size});
 1393|  1.09k|    return cell;
 1394|  1.09k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEJEEEPT_PvjDpOT0_:
 1389|   415k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   415k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   415k|    constexpr auto kind = T::getCellKind();
 1392|   415k|    cell->setKindAndSize({kind, size});
 1393|   415k|    return cell;
 1394|   415k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb0EEEJRN4llvh8ArrayRefIDsEEEEEPT_PvjDpOT0_:
 1389|  12.6k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  12.6k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  12.6k|    constexpr auto kind = T::getCellKind();
 1392|  12.6k|    cell->setKindAndSize({kind, size});
 1393|  12.6k|    return cell;
 1394|  12.6k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIDsLb0EEEJRjEEEPT_PvjDpOT0_:
 1389|   410k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   410k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   410k|    constexpr auto kind = T::getCellKind();
 1392|   410k|    cell->setKindAndSize({kind, size});
 1393|   410k|    return cell;
 1394|   410k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb0EEEJRN4llvh8ArrayRefIcEEEEEPT_PvjDpOT0_:
 1389|   261k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|   261k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|   261k|    constexpr auto kind = T::getCellKind();
 1392|   261k|    cell->setKindAndSize({kind, size});
 1393|   261k|    return cell;
 1394|   261k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_22DynamicStringPrimitiveIcLb0EEEJRjEEEPT_PvjDpOT0_:
 1389|  49.4k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  49.4k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  49.4k|    constexpr auto kind = T::getCellKind();
 1392|  49.4k|    cell->setKindAndSize({kind, size});
 1393|  49.4k|    return cell;
 1394|  49.4k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23ExternalStringPrimitiveIDsEEJNSt3__112basic_stringIDsNS5_11char_traitsIDsEENS5_9allocatorIDsEEEEEEEPT_PvjDpOT0_:
 1389|     61|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     61|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     61|    constexpr auto kind = T::getCellKind();
 1392|     61|    cell->setKindAndSize({kind, size});
 1393|     61|    return cell;
 1394|     61|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23ExternalStringPrimitiveIcEEJNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEEEEEPT_PvjDpOT0_:
 1389|     65|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     65|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     65|    constexpr auto kind = T::getCellKind();
 1392|     65|    cell->setKindAndSize({kind, size});
 1393|     65|    return cell;
 1394|     65|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23BufferedStringPrimitiveIDsEEJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_PvjDpOT0_:
 1389|    162|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    162|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    162|    constexpr auto kind = T::getCellKind();
 1392|    162|    cell->setKindAndSize({kind, size});
 1393|    162|    return cell;
 1394|    162|  }
_ZN6hermes2vm6GCBase13constructCellINS0_23BufferedStringPrimitiveIcEEJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEEEEEPT_PvjDpOT0_:
 1389|    711|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|    711|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|    711|    constexpr auto kind = T::getCellKind();
 1392|    711|    cell->setKindAndSize({kind, size});
 1393|    711|    return cell;
 1394|    711|  }
_ZN6hermes2vm6GCBase13constructCellINS0_12SingleObjectILNS0_8CellKindE60EEEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase13constructCellINS0_12SingleObjectILNS0_8CellKindE59EEEJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12MarkAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_NSt3__117integral_constantIbLb1EEE:
 1368|   801k|      std::true_type) {
 1369|       |    // In C++17, we could implement this via "constexpr if" rather than
 1370|       |    // overloads with std::true_type.
 1371|       |    // Once C++17 is available, switch to using that.
 1372|   801k|    if (auto *cb = VTable::getVTable(kind)->getMarkWeakCallback()) {
  ------------------
  |  Branch (1372:15): [True: 80.6k, False: 720k]
  ------------------
 1373|  80.6k|      std::lock_guard<Mutex> wrLk{weakRefMutex()};
 1374|  80.6k|      cb(cell, acceptor);
 1375|  80.6k|    }
 1376|   801k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_7HadesGC6OldGen12FreelistCellEJEEEPT_PvjDpOT0_:
 1389|  1.40k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  1.40k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  1.40k|    constexpr auto kind = T::getCellKind();
 1392|  1.40k|    cell->setKindAndSize({kind, size});
 1393|  1.40k|    return cell;
 1394|  1.40k|  }
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12EvacAcceptorILb1EEEEEvPNS0_6GCCellENS0_8CellKindERT_NSt3__117integral_constantIbLb0EEE:
 1386|      1|      std::false_type) {}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_7HadesGC12EvacAcceptorILb0EEEEEvPNS0_6GCCellENS0_8CellKindERT_NSt3__117integral_constantIbLb0EEE:
 1386|   439k|      std::false_type) {}
_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryINS0_27CheckHeapWellFormedAcceptorEEEvPNS0_6GCCellENS0_8CellKindERT_NSt3__117integral_constantIbLb1EEE:
 1368|  5.65M|      std::true_type) {
 1369|       |    // In C++17, we could implement this via "constexpr if" rather than
 1370|       |    // overloads with std::true_type.
 1371|       |    // Once C++17 is available, switch to using that.
 1372|  5.65M|    if (auto *cb = VTable::getVTable(kind)->getMarkWeakCallback()) {
  ------------------
  |  Branch (1372:15): [True: 423k, False: 5.22M]
  ------------------
 1373|   423k|      std::lock_guard<Mutex> wrLk{weakRefMutex()};
 1374|   423k|      cb(cell, acceptor);
 1375|   423k|    }
 1376|  5.65M|  }
HadesGC.cpp:_ZN6hermes2vm6GCBase23markWeakRefsIfNecessaryIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEEvPNS0_6GCCellENS0_8CellKindERT_NSt3__117integral_constantIbLb0EEE:
 1386|  4.82M|      std::false_type) {}
_ZN6hermes2vm6GCBase13constructCellINS0_15DictPropertyMapEJRjS4_EEEPT_PvjDpOT0_:
 1389|  19.2k|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|  19.2k|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|  19.2k|    constexpr auto kind = T::getCellKind();
 1392|  19.2k|    cell->setKindAndSize({kind, size});
 1393|  19.2k|    return cell;
 1394|  19.2k|  }
_ZN6hermes2vm6GCBase13constructCellINS0_14OrderedHashMapEJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_PvjDpOT0_:
 1389|     99|  static T *constructCell(void *ptr, uint32_t size, Args &&...args) {
 1390|     99|    auto *cell = new (ptr) T(std::forward<Args>(args)...);
 1391|     99|    constexpr auto kind = T::getCellKind();
 1392|     99|    cell->setKindAndSize({kind, size});
 1393|     99|    return cell;
 1394|     99|  }

_ZNK6hermes2vm6GCCell7getKindEv:
  144|  74.2M|  CellKind getKind() const {
  145|  74.2M|    return kindAndSize_.getKind();
  146|  74.2M|  }
_ZNK6hermes2vm11KindAndSize7getKindEv:
   48|  74.2M|  CellKind getKind() const {
   49|  74.2M|    return static_cast<CellKind>(kind_);
   50|  74.2M|  }
_ZNK6hermes2vm6GCCell5getVTEv:
  150|  3.00M|  const VTable *getVT() const {
  151|  3.00M|    assert(isValid() && "Called getVT() on an invalid cell");
  152|      0|    return kindAndSize_.getVT();
  153|  3.00M|  }
_ZNK6hermes2vm6GCCell7isValidEv:
  234|  31.9M|  bool isValid() const {
  235|  31.9M|#ifndef NDEBUG
  236|       |    // We only do the cell magic number check in debug builds.
  237|  31.9M|    return magic_ == kMagic && kindAndSize_.getVT()->isValid();
  ------------------
  |  Branch (237:12): [True: 31.9M, False: 18.4E]
  |  Branch (237:32): [True: 31.9M, False: 4.87k]
  ------------------
  238|       |#else
  239|       |    return kindAndSize_.getVT()->isValid();
  240|       |#endif
  241|  31.9M|  }
_ZNK6hermes2vm11KindAndSize5getVTEv:
   51|  34.9M|  const VTable *getVT() const {
   52|  34.9M|    return VTable::vtableArray[kind_];
   53|  34.9M|  }
_ZN6hermes2vm6GCCellnwEmPv:
  250|  2.29M|  static void *operator new(size_t, void *p) {
  251|  2.29M|    return p;
  252|  2.29M|  }
_ZN6hermes2vm6GCCell14setKindAndSizeENS0_11KindAndSizeE:
  163|  2.90M|  void setKindAndSize(KindAndSize kindAndSize) {
  164|  2.90M|    kindAndSize_ = kindAndSize;
  165|  2.90M|  }
_ZN6hermes2vm11KindAndSizeC2ENS0_8CellKindEm:
   56|  2.90M|      : size_(sz), kind_(static_cast<uint8_t>(kind)) {
   57|  2.90M|    assert((sz & 1) == 0 && "LSB of size must always be zero.");
   58|  2.90M|  }
_ZN6hermes2vm6GCCell24setDebugAllocationIdInGCEj:
  269|  2.29M|  void setDebugAllocationIdInGC(uint32_t id) {
  270|  2.29M|    _debugAllocationId_ = id;
  271|  2.29M|  }
_ZNK6hermes2vm6GCCell16getAllocatedSizeEv:
  116|  29.5M|  uint32_t getAllocatedSize() const {
  117|  29.5M|    return kindAndSize_.getSize();
  118|  29.5M|  }
_ZNK6hermes2vm11KindAndSize7getSizeEv:
   45|  29.5M|  size_t getSize() const {
   46|  29.5M|    return size_;
   47|  29.5M|  }
_ZN6hermes2vm11KindAndSize7maxSizeEv:
   60|  1.09M|  static constexpr uint32_t maxSize() {
   61|  1.09M|    return (1ULL << kNumSizeBits) - 1;
   62|  1.09M|  }
_ZNK6hermes2vm6GCCell14isVariableSizeEv:
  133|   616k|  bool isVariableSize() const {
  134|   616k|    return isVariableSize(getVT());
  135|   616k|  }
_ZN6hermes2vm6GCCell14isVariableSizeEPKNS0_6VTableE:
  139|   616k|  static bool isVariableSize(const VTable *vtp) {
  140|   616k|    return vtp->size == 0;
  141|   616k|  }
_ZN6hermes2vm6GCCell26setMarkedForwardingPointerENS0_17CompressedPointerE:
  201|   428k|  void setMarkedForwardingPointer(CompressedPointer cell) {
  202|   428k|    forwardingPointer_ = CompressedPointer::fromRaw(cell.getRaw() | 0x1);
  203|   428k|  }
_ZNK6hermes2vm6GCCell26getMarkedForwardingPointerEv:
  209|   437k|  CompressedPointer getMarkedForwardingPointer() const {
  210|   437k|    assert(isMarked());
  211|      0|    return CompressedPointer::fromRaw(forwardingPointer_.getRaw() - 0x1);
  212|   437k|  }
_ZNK6hermes2vm6GCCell26hasMarkedForwardingPointerEv:
  216|   870k|  bool hasMarkedForwardingPointer() const {
  217|   870k|    return isMarked();
  218|   870k|  }
_ZN6hermes2vm6GCCell8nextCellEv:
  224|  11.9M|  GCCell *nextCell() {
  225|  11.9M|    return reinterpret_cast<GCCell *>(
  226|  11.9M|        reinterpret_cast<char *>(this) + getAllocatedSize());
  227|  11.9M|  }
_ZNK6hermes2vm6GCCell8isMarkedEv:
  275|  1.30M|  bool isMarked() const {
  276|  1.30M|    return forwardingPointer_.getRaw() & 0x1;
  277|  1.30M|  }
_ZN6hermes2vm6GCCell7maxSizeEv:
  279|  1.09M|  static constexpr uint32_t maxSize() {
  280|  1.09M|    return KindAndSize::maxSize();
  281|  1.09M|  }
_ZN6hermes2vm23VariableSizeRuntimeCell13setSizeFromGCEj:
  296|   616k|  void setSizeFromGC(uint32_t sz) {
  297|   616k|    assert(
  298|   616k|        isVariableSize() &&
  299|   616k|        "Cannot call setSizeFromGC on a non-variable size cell");
  300|      0|    assert(
  301|   616k|        sz >= sizeof(VariableSizeRuntimeCell) &&
  302|   616k|        "Should not allocate a VariableSizeRuntimeCell of size less than "
  303|   616k|        "the size of a cell");
  304|      0|    setKindAndSize(KindAndSize{getKind(), sz});
  305|   616k|  }
_ZN6hermes2vm6GCCell12cellSizeImplINS0_11BoxedDoubleEEEjv:
  122|  1.79k|  static constexpr uint32_t cellSizeImpl() {
  123|  1.79k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|  1.79k|    static_assert(
  127|  1.79k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|  1.79k|        "must be fixed-size");
  129|  1.79k|    return sizeof(C);
  130|  1.79k|  }
_ZN6hermes2vm6GCCellC2Ev:
  109|  2.29M|  GCCell() = default;
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_11BoxedDoubleEEEjv:
   37|  1.79k|static constexpr uint32_t cellSize() {
   38|  1.79k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  1.79k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  1.79k|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_13BoundFunctionEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_14NativeFunctionEEEjv:
   37|  42.4k|static constexpr uint32_t cellSize() {
   38|  42.4k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  42.4k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  42.4k|}
Callable.cpp:_ZN6hermes2vmL8cellSizeINS0_10JSFunctionEEEjv:
   37|  4.50k|static constexpr uint32_t cellSize() {
   38|  4.50k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  4.50k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  4.50k|}
Domain.cpp:_ZN6hermes2vmL8cellSizeINS0_6DomainEEEjv:
   37|    254|static constexpr uint32_t cellSize() {
   38|    254|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    254|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    254|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_6DomainEEEjv:
  122|    254|  static constexpr uint32_t cellSizeImpl() {
  123|    254|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|    254|    static_assert(
  127|    254|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|    254|        "must be fixed-size");
  129|    254|    return sizeof(C);
  130|    254|  }
HiddenClass.cpp:_ZN6hermes2vmL8cellSizeINS0_11HiddenClassEEEjv:
   37|  56.9k|static constexpr uint32_t cellSize() {
   38|  56.9k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  56.9k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  56.9k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_11HiddenClassEEEjv:
  122|  56.9k|  static constexpr uint32_t cellSizeImpl() {
  123|  56.9k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|  56.9k|    static_assert(
  127|  56.9k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|  56.9k|        "must be fixed-size");
  129|  56.9k|    return sizeof(C);
  130|  56.9k|  }
JSArray.cpp:_ZN6hermes2vmL8cellSizeINS0_7JSArrayEEEjv:
   37|   428k|static constexpr uint32_t cellSize() {
   38|   428k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|   428k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|   428k|}
JSError.cpp:_ZN6hermes2vmL8cellSizeINS0_7JSErrorEEEjv:
   37|     24|static constexpr uint32_t cellSize() {
   38|     24|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     24|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     24|}
JSObject.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSObjectEEEjv:
   37|  10.9k|static constexpr uint32_t cellSize() {
   38|  10.9k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  10.9k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  10.9k|}
JSRegExp.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSRegExpEEEjv:
   37|    242|static constexpr uint32_t cellSize() {
   38|    242|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|    242|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|    242|}
HostModel.cpp:_ZN6hermes2vmL8cellSizeINS0_10HostObjectEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSStringEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_8JSNumberEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
PrimitiveBox.cpp:_ZN6hermes2vmL8cellSizeINS0_9JSBooleanEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
PropertyAccessor.cpp:_ZN6hermes2vmL8cellSizeINS0_16PropertyAccessorEEEjv:
   37|  4.28k|static constexpr uint32_t cellSize() {
   38|  4.28k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  4.28k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  4.28k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_16PropertyAccessorEEEjv:
  122|  4.28k|  static constexpr uint32_t cellSizeImpl() {
  123|  4.28k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|  4.28k|    static_assert(
  127|  4.28k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|  4.28k|        "must be fixed-size");
  129|  4.28k|    return sizeof(C);
  130|  4.28k|  }
SegmentedArray.cpp:_ZN6hermes2vmL8cellSizeINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEjv:
   37|  1.09k|static constexpr uint32_t cellSize() {
   38|  1.09k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  1.09k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  1.09k|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEEjv:
  122|  1.09k|  static constexpr uint32_t cellSizeImpl() {
  123|  1.09k|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|  1.09k|    static_assert(
  127|  1.09k|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|  1.09k|        "must be fixed-size");
  129|  1.09k|    return sizeof(C);
  130|  1.09k|  }
AsyncFunction.cpp:_ZN6hermes2vmL8cellSizeINS0_17NativeConstructorEEEjv:
   37|  4.05k|static constexpr uint32_t cellSize() {
   38|  4.05k|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|  4.05k|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|  4.05k|}
Math.cpp:_ZN6hermes2vmL8cellSizeINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
JSON.cpp:_ZN6hermes2vmL8cellSizeINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
OrderedHashMap.cpp:_ZN6hermes2vmL8cellSizeINS0_14OrderedHashMapEEEjv:
   37|     99|static constexpr uint32_t cellSize() {
   38|     99|  static_assert(HeapAlign % alignof(C) == 0, "insufficient heap alignment");
   39|     99|  return heapAlignSize(C::template cellSizeImpl<C>());
   40|     99|}
_ZN6hermes2vm6GCCell12cellSizeImplINS0_14OrderedHashMapEEEjv:
  122|     99|  static constexpr uint32_t cellSizeImpl() {
  123|     99|    static_assert(std::is_convertible<C *, GCCell *>::value, "must be a cell");
  124|       |    // ExternalStringPrimitive<T> is special: it extends VariableSizeRuntimeCell
  125|       |    // but it's actually fixed-size.
  126|     99|    static_assert(
  127|     99|        !std::is_convertible<C *, VariableSizeRuntimeCell *>::value,
  128|     99|        "must be fixed-size");
  129|     99|    return sizeof(C);
  130|     99|  }

_ZNK6hermes2vm4impl10DebugMutexcvbEv:
   98|  3.20M|  operator bool() const {
   99|       |    // Check that this thread owns the mutex.
  100|       |    // The mutex must be held in order to check this condition safely.
  101|  3.20M|    return tid_.load(std::memory_order_relaxed) == std::this_thread::get_id();
  102|  3.20M|  }
_ZN6hermes2vm4impl10DebugMutexC2Ev:
   95|    638|  DebugMutex() : tid_() {}
_ZN6hermes2vm4impl10DebugMutex4lockEv:
  104|   769k|  void lock() {
  105|   769k|    inner_.lock();
  106|   769k|    depth_++;
  107|   769k|    tid_.store(std::this_thread::get_id(), std::memory_order_relaxed);
  108|   769k|  }
_ZN6hermes2vm4impl10DebugMutex6unlockEv:
  110|   769k|  void unlock() {
  111|   769k|    assert(depth_ && "Should not unlock an unlocked mutex");
  112|      0|    assert(
  113|   769k|        tid_.load(std::memory_order_relaxed) == std::this_thread::get_id() &&
  114|   769k|        "Mutex should be acquired and unlocked on the same thread");
  115|      0|    depth_--;
  116|   769k|    if (!depth_) {
  ------------------
  |  Branch (116:9): [True: 344k, False: 424k]
  ------------------
  117|   344k|      tid_.store(std::thread::id{}, std::memory_order_relaxed);
  118|   344k|    }
  119|   769k|    inner_.unlock();
  120|   769k|  }
_ZNK6hermes2vm4impl10DebugMutex5depthEv:
  122|    143|  uint32_t depth() const {
  123|    143|    assert(*this && "Must hold the inner mutex to call depth");
  124|      0|    return depth_;
  125|    143|  }
_ZN6hermes2vm4impl10DebugMutexD2Ev:
   96|    638|  ~DebugMutex() = default;

_ZN6hermes2vm13GCPointerBase3setERNS0_11PointerBaseEPNS0_6GCCellERNS0_7HadesGCE:
   36|   416k|inline void GCPointerBase::set(PointerBase &base, GCCell *ptr, GC &gc) {
   37|   416k|  assert(
   38|   416k|      (!ptr || gc.validPointer(ptr)) &&
   39|   416k|      "Cannot set a GCPointer to an invalid pointer");
   40|       |  // Write barrier must happen before the write.
   41|      0|  gc.writeBarrier(this, ptr);
   42|   416k|  setNoBarrier(CompressedPointer::encode(ptr, base));
   43|   416k|}
_ZN6hermes2vm13GCPointerBase10setNonNullERNS0_11PointerBaseEPNS0_6GCCellERNS0_7HadesGCE:
   45|   961k|inline void GCPointerBase::setNonNull(PointerBase &base, GCCell *ptr, GC &gc) {
   46|   961k|  assert(
   47|   961k|      gc.validPointer(ptr) && "Cannot set a GCPointer to an invalid pointer");
   48|       |  // Write barrier must happen before the write.
   49|      0|  gc.writeBarrier(this, ptr);
   50|   961k|  setNoBarrier(CompressedPointer::encodeNonNull(ptr, base));
   51|   961k|}
_ZN6hermes2vm13GCPointerBase3setERNS0_11PointerBaseENS0_17CompressedPointerERNS0_7HadesGCE:
   54|  57.5k|GCPointerBase::set(PointerBase &base, CompressedPointer ptr, GC &gc) {
   55|  57.5k|  assert(
   56|  57.5k|      (!ptr || gc.validPointer(ptr.get(base))) &&
   57|  57.5k|      "Cannot set a GCPointer to an invalid pointer");
   58|       |  // Write barrier must happen before the write.
   59|      0|  gc.writeBarrier(this, ptr.get(base));
   60|  57.5k|  setNoBarrier(ptr);
   61|  57.5k|}
_ZN6hermes2vm13GCPointerBase7setNullERNS0_7HadesGCE:
   63|   166k|inline void GCPointerBase::setNull(GC &gc) {
   64|   166k|  gc.snapshotWriteBarrier(this);
   65|   166k|  setNoBarrier(CompressedPointer(nullptr));
   66|   166k|}
_ZN6hermes2vm13GCPointerBaseC2INS1_10NoBarriersEEERNS0_11PointerBaseEPNS0_6GCCellERNS0_7HadesGCET_:
   25|   981k|    : CompressedPointer(CompressedPointer::encode(ptr, base)) {
   26|   981k|  assert(
   27|   981k|      (!ptr || gc.validPointer(ptr)) &&
   28|   981k|      "Cannot construct a GCPointer from an invalid pointer");
   29|   981k|  if (NeedsBarriers::value) {
  ------------------
  |  Branch (29:7): [Folded - Ignored]
  ------------------
   30|      0|    gc.constructorWriteBarrier(this, ptr);
   31|   981k|  } else {
   32|   981k|    assert(!gc.needsWriteBarrier(this, ptr));
   33|   981k|  }
   34|   981k|}
_ZN6hermes2vm13GCPointerBaseC2INS1_11YesBarriersEEERNS0_11PointerBaseEPNS0_6GCCellERNS0_7HadesGCET_:
   25|  75.6k|    : CompressedPointer(CompressedPointer::encode(ptr, base)) {
   26|  75.6k|  assert(
   27|  75.6k|      (!ptr || gc.validPointer(ptr)) &&
   28|  75.6k|      "Cannot construct a GCPointer from an invalid pointer");
   29|  75.6k|  if (NeedsBarriers::value) {
  ------------------
  |  Branch (29:7): [Folded - Ignored]
  ------------------
   30|  75.6k|    gc.constructorWriteBarrier(this, ptr);
   31|  75.6k|  } else {
   32|      0|    assert(!gc.needsWriteBarrier(this, ptr));
   33|      0|  }
   34|  75.6k|}

_ZNK6hermes2vm9GCPointerINS0_11HiddenClassEE10getNonNullERNS0_11PointerBaseE:
   85|  3.22M|  T *getNonNull(PointerBase &base) const {
   86|  3.22M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  3.22M|  }
_ZNK6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE10getNonNullERNS0_11PointerBaseE:
   85|  2.48M|  T *getNonNull(PointerBase &base) const {
   86|  2.48M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  2.48M|  }
_ZN6hermes2vm13GCPointerBaseC2EDn:
   25|  1.08M|  explicit GCPointerBase(std::nullptr_t) : CompressedPointer(nullptr) {}
_ZNK6hermes2vm9GCPointerINS0_15DictPropertyMapEE10getNonNullERNS0_11PointerBaseE:
   85|  2.45M|  T *getNonNull(PointerBase &base) const {
   86|  2.45M|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|  2.45M|  }
_ZNK6hermes2vm9GCPointerINS0_8JSObjectEE3getERNS0_11PointerBaseE:
   82|   413k|  T *get(PointerBase &base) const {
   83|   413k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|   413k|  }
_ZNK6hermes2vm9GCPointerINS0_11HiddenClassEE3getERNS0_11PointerBaseE:
   82|  1.05M|  T *get(PointerBase &base) const {
   83|  1.05M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  1.05M|  }
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE10setNonNullERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   96|   459k|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|   459k|    GCPointerBase::setNonNull(base, ptr, gc);
   98|   459k|  }
_ZNK6hermes2vm9GCPointerINS0_15StringPrimitiveEE3getERNS0_11PointerBaseE:
   82|    234|  T *get(PointerBase &base) const {
   83|    234|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|    234|  }
_ZNK6hermes2vm9GCPointerINS0_11EnvironmentEE3getERNS0_11PointerBaseE:
   82|  1.73k|  T *get(PointerBase &base) const {
   83|  1.73k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  1.73k|  }
_ZNK6hermes2vm9GCPointerINS0_8CallableEE3getERNS0_11PointerBaseE:
   82|  1.90k|  T *get(PointerBase &base) const {
   83|  1.90k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  1.90k|  }
_ZNK6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getERNS0_11PointerBaseE:
   82|  3.47M|  T *get(PointerBase &base) const {
   83|  3.47M|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  3.47M|  }
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3setERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   93|   416k|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|   416k|    GCPointerBase::set(base, ptr, gc);
   95|   416k|  }
_ZN6hermes2vm9GCPointerINS0_8JSObjectEEC2INS0_13GCPointerBase10NoBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|   490k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2INS0_13GCPointerBase10NoBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|   490k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2EDn:
   58|   490k|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2Ev:
   56|  46.5k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_8CallableEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  8.66k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_8CallableEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  8.66k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   72|     99|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS4_RNS0_7HadesGCET_:
   66|     99|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  4.95k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_11EnvironmentEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  4.95k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_6DomainEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  4.50k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_6DomainEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  4.50k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2Ev:
   56|    254|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_14NativeFunctionEEC2Ev:
   56|    254|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEE3setERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   93|    242|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|    242|    GCPointerBase::set(base, ptr, gc);
   95|    242|  }
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEEC2Ev:
   56|  56.9k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|  56.9k|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|  56.9k|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_11HermesValueEEEEC2Ev:
   56|  56.9k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEE3setERNS0_11PointerBaseERKS3_RNS0_7HadesGCE:
  101|  57.5k|  void set(PointerBase &base, const GCPointer<T> &ptr, GC &gc) {
  102|  57.5k|    GCPointerBase::set(base, ptr, gc);
  103|  57.5k|  }
_ZNK6hermes2vm9GCPointerINS0_15DictPropertyMapEE3getERNS0_11PointerBaseE:
   82|   378k|  T *get(PointerBase &base) const {
   83|   378k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|   378k|  }
_ZN6hermes2vm9GCPointerINS0_15DictPropertyMapEE10setNonNullERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   96|   200k|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|   200k|    GCPointerBase::setNonNull(base, ptr, gc);
   98|   200k|  }
_ZNK6hermes2vm9GCPointerINS0_8CallableEE10getNonNullERNS0_11PointerBaseE:
   85|     24|  T *getNonNull(PointerBase &base) const {
   86|     24|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|     24|  }
_ZN6hermes2vm9GCPointerINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2Ev:
   56|   428k|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2Ev:
   56|     48|  GCPointer() : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3setERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   93|     48|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|     48|    GCPointerBase::set(base, ptr, gc);
   95|     48|  }
_ZN6hermes2vm9GCPointerINS0_11HiddenClassEE10setNonNullERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   96|   302k|  void setNonNull(PointerBase &base, T *ptr, GC &gc) {
   97|   302k|    GCPointerBase::setNonNull(base, ptr, gc);
   98|   302k|  }
_ZN6hermes2vm9GCPointerINS0_8JSObjectEE3setERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   93|     99|  void set(PointerBase &base, T *ptr, GC &gc) {
   94|     99|    GCPointerBase::set(base, ptr, gc);
   95|     99|  }
_ZNK6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3getERNS0_11PointerBaseE:
   82|  5.76k|  T *get(PointerBase &base) const {
   83|  5.76k|    return vmcast_or_null<T>(GCPointerBase::get(base));
   84|  5.76k|  }
_ZNK6hermes2vm9GCPointerINS0_8JSObjectEE10getNonNullERNS0_11PointerBaseE:
   85|   411k|  T *getNonNull(PointerBase &base) const {
   86|   411k|    return vmcast<T>(GCPointerBase::getNonNull(base));
   87|   411k|  }
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEEC2ERNS0_11PointerBaseEPS2_RNS0_7HadesGCE:
   72|    341|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_15StringPrimitiveEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS2_RNS0_7HadesGCET_:
   66|    341|      : GCPointerBase(base, ptr, gc, needsBarriers) {}
_ZN6hermes2vm9GCPointerINS0_8JSObjectEEC2EDn:
   58|    242|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_12HashMapEntryEEC2EDn:
   58|    198|  GCPointer(std::nullptr_t) : GCPointerBase(nullptr) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_11PointerBaseEPS4_RNS0_7HadesGCE:
   72|     99|      : GCPointer<T>(base, ptr, gc, YesBarriers()) {}
_ZN6hermes2vm9GCPointerINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2INS0_13GCPointerBase11YesBarriersEEERNS0_11PointerBaseEPS4_RNS0_7HadesGCET_:
   66|     99|      : GCPointerBase(base, ptr, gc, needsBarriers) {}

_ZN6hermes2vm9GCStorage3getEv:
   65|  16.2M|  GC *get() {
   66|       |#ifdef HERMESVM_GC_RUNTIME
   67|       |    return reinterpret_cast<GC *>(&storage_);
   68|       |#else
   69|  16.2M|    return &heap_;
   70|  16.2M|#endif
   71|  16.2M|  }
_ZN6hermes2vm9GCStorageC2ERNS0_6GCBase11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENSB_INS0_15StorageProviderEEEj:
   34|     99|            vmExperimentFlags) {
   35|     99|  }

_ZN6hermes2vm7HadesGC21minAllocationSizeImplEv:
   82|  7.80M|  static constexpr uint32_t minAllocationSizeImpl() {
   83|  7.80M|    return heapAlignSize(
   84|  7.80M|        std::max(sizeof(OldGen::FreelistCell), sizeof(CopyListCell)));
   85|  7.80M|  }
_ZN6hermes2vm7HadesGC9allocWorkILb0ELNS0_12HasFinalizerE0EEEPvj:
 1112|  1.60M|void *HadesGC::allocWork(uint32_t sz) {
 1113|  1.60M|  assert(
 1114|  1.60M|      isSizeHeapAligned(sz) &&
 1115|  1.60M|      "Should be aligned before entering this function");
 1116|      0|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1117|  1.60M|  if (kConcurrentGC) {
  ------------------
  |  Branch (1117:7): [Folded - Ignored]
  ------------------
 1118|  1.60M|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  1.60M|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1119|  1.60M|        !weakRefMutex() &&
 1120|  1.60M|        "WeakRef mutex should not be held when alloc is called");
 1121|  1.60M|  }
 1122|  1.60M|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1122:7): [Folded - Ignored]
  ------------------
 1123|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1124|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1125|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1126|       |    // more interesting aspect of Hades which is concurrent background
 1127|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1128|       |    // oldGenCollection if one is not already running.
 1129|      0|    youngGenCollection(
 1130|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1131|      0|  }
 1132|  1.60M|  AllocResult res = youngGen().alloc(sz);
 1133|  1.60M|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|  1.60M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 22, False: 1.60M]
  |  |  ------------------
  ------------------
 1134|  1.60M|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1134:7): [Folded - Ignored]
  ------------------
 1135|      0|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1136|  1.60M|  return resPtr;
 1137|  1.60M|}
_ZN6hermes2vm7HadesGC8youngGenEv:
 1030|  2.10M|  HeapSegment &youngGen() {
 1031|  2.10M|    return youngGen_;
 1032|  2.10M|  }
_ZN6hermes2vm7HadesGC21maxAllocationSizeImplEv:
   76|  1.09M|  static constexpr uint32_t maxAllocationSizeImpl() {
   77|       |    // The largest allocation allowable in Hades is the max size a single
   78|       |    // segment supports.
   79|  1.09M|    return HeapSegment::maxSize();
   80|  1.09M|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEES3_:
  155|  4.34k|  void writeBarrier(const GCHermesValue *loc, HermesValue value) {
  156|  4.34k|    assert(
  157|  4.34k|        !calledByBackgroundThread() &&
  158|  4.34k|        "Write barrier invoked by background thread.");
  159|       |    // A pointer that lives in YG never needs any write barriers.
  160|  4.34k|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  4.34k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.34k]
  |  |  ------------------
  ------------------
  161|      0|      writeBarrierSlow(loc, value);
  162|  4.34k|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
  165|  4.16M|  void writeBarrier(const GCSmallHermesValue *loc, SmallHermesValue value) {
  166|  4.16M|    assert(
  167|  4.16M|        !calledByBackgroundThread() &&
  168|  4.16M|        "Write barrier invoked by background thread.");
  169|       |    // A pointer that lives in YG never needs any write barriers.
  170|  4.16M|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  4.16M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 293k, False: 3.86M]
  |  |  ------------------
  ------------------
  171|   293k|      writeBarrierSlow(loc, value);
  172|  4.16M|  }
_ZN6hermes2vm7HadesGC12writeBarrierEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
  179|  1.43M|  void writeBarrier(const GCPointerBase *loc, const GCCell *value) {
  180|  1.43M|    assert(
  181|  1.43M|        !calledByBackgroundThread() &&
  182|  1.43M|        "Write barrier invoked by background thread.");
  183|       |    // A pointer that lives in YG never needs any write barriers.
  184|  1.43M|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  1.43M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 258k, False: 1.17M]
  |  |  ------------------
  ------------------
  185|   258k|      writeBarrierSlow(loc, value);
  186|  1.43M|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEES3_:
  191|     99|  void constructorWriteBarrier(const GCHermesValue *loc, HermesValue value) {
  192|       |    // A pointer that lives in YG never needs any write barriers.
  193|     99|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  194|      0|      constructorWriteBarrierSlow(loc, value);
  195|     99|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
  200|     24|      SmallHermesValue value) {
  201|       |    // A pointer that lives in YG never needs any write barriers.
  202|     24|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  203|      0|      constructorWriteBarrierSlow(loc, value);
  204|     24|  }
_ZN6hermes2vm7HadesGC23constructorWriteBarrierEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
  209|  75.6k|  void constructorWriteBarrier(const GCPointerBase *loc, const GCCell *value) {
  210|       |    // A pointer that lives in YG never needs any write barriers.
  211|  75.6k|    if (LLVM_UNLIKELY(!inYoungGen(loc)))
  ------------------
  |  |  189|  75.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56.9k, False: 18.6k]
  |  |  ------------------
  ------------------
  212|  56.9k|      relocationWriteBarrier(loc, value);
  213|  75.6k|  }
_ZN6hermes2vm7HadesGC28constructorWriteBarrierRangeEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEEj:
  228|  5.87k|      uint32_t numHVs) {
  229|       |    // A pointer that lives in YG never needs any write barriers.
  230|  5.87k|    if (LLVM_UNLIKELY(!inYoungGen(start)))
  ------------------
  |  |  189|  5.87k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.87k]
  |  |  ------------------
  ------------------
  231|      0|      constructorWriteBarrierRangeSlow(start, numHVs);
  232|  5.87k|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
  237|    198|  void snapshotWriteBarrier(const GCHermesValue *loc) {
  238|    198|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  239|      0|      snapshotWriteBarrierInternal(*loc);
  240|    198|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_13GCPointerBaseE:
  245|   166k|  void snapshotWriteBarrier(const GCPointerBase *loc) {
  246|   166k|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|   333k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 22, False: 166k]
  |  |  |  Branch (189:53): [True: 166k, False: 0]
  |  |  |  Branch (189:53): [True: 22, False: 166k]
  |  |  ------------------
  ------------------
  247|     22|      if (CompressedPointer cp = *loc)
  ------------------
  |  Branch (247:29): [True: 15, False: 7]
  ------------------
  248|     15|        snapshotWriteBarrierInternal(cp);
  249|   166k|  }
_ZN6hermes2vm7HadesGC20snapshotWriteBarrierEPKNS0_10GCSymbolIDE:
  250|   228k|  void snapshotWriteBarrier(const GCSymbolID *loc) {
  251|   228k|    if (LLVM_UNLIKELY(!inYoungGen(loc) && ogMarkingBarriers_))
  ------------------
  |  |  189|   228k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 228k]
  |  |  |  Branch (189:53): [True: 0, False: 228k]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  252|      0|      snapshotWriteBarrierInternal(*loc);
  253|   228k|  }
_ZNK6hermes2vm7HadesGC10inYoungGenEPKv:
  295|  39.6M|  bool inYoungGen(const void *p) const override {
  296|  39.6M|    return youngGen_.lowLim() == AlignedStorage::start(p);
  297|  39.6M|  }
_ZNK6hermes2vm7HadesGC10inYoungGenENS0_17CompressedPointerE:
  298|   525k|  bool inYoungGen(CompressedPointer p) const {
  299|   525k|    return p.getSegmentStart() == youngGenCP_;
  300|   525k|  }
_ZNK6hermes2vm7HadesGC10calledByGCEv:
  315|   521k|  bool calledByGC() const override {
  316|       |    // Check if this is called by the background thread or the inGC flag is
  317|       |    // set.
  318|   521k|    return calledByBackgroundThread() || inGC();
  ------------------
  |  Branch (318:12): [True: 0, False: 521k]
  |  Branch (318:42): [True: 521k, False: 0]
  ------------------
  319|   521k|  }
_ZN6hermes2vm7HadesGC11HeapSegmentC2ENS0_14AlignedStorageE:
  356|    203|        : AlignedHeapSegment(std::move(storage)) {}
_ZN6hermes2vm7HadesGC6OldGen20creditExternalMemoryEj:
  429|  1.05k|    void creditExternalMemory(uint32_t size) {
  430|  1.05k|      assert(
  431|  1.05k|          gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
  432|      0|      externalBytes_ += size;
  433|  1.05k|    }
_ZN6hermes2vm7HadesGC6OldGen19debitExternalMemoryEj:
  436|     97|    void debitExternalMemory(uint32_t size) {
  437|     97|      assert(
  438|     97|          externalBytes_ >= size && "Debiting more memory than was credited");
  439|      0|      assert(
  440|     97|          gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
  441|      0|      externalBytes_ -= size;
  442|     97|    }
_ZN6hermes2vm7HadesGC6OldGen12FreelistCell7classofEPKNS0_6GCCellE:
  464|  11.7M|      static bool classof(const GCCell *cell) {
  465|  11.7M|        return cell->getKind() == CellKind::FreelistKind;
  466|  11.7M|      }
_ZNK6hermes2vm7HadesGC14CompacteeState8containsEPKv:
  779|  12.5M|    bool contains(const void *p) const {
  780|  12.5M|      return start == AlignedStorage::start(p);
  781|  12.5M|    }
_ZNK6hermes2vm7HadesGC14CompacteeState12evacContainsEPKv:
  788|  16.1M|    bool evacContains(const void *p) const {
  789|  16.1M|      return evacStart == AlignedStorage::start(p);
  790|  16.1M|    }
_ZNK6hermes2vm7HadesGC14CompacteeState10evacActiveEv:
  796|    599|    bool evacActive() const {
  797|    599|      return evacStart != reinterpret_cast<void *>(kInvalidCompacteeStart);
  798|    599|    }
_ZNK6hermes2vm7HadesGC14CompacteeState5emptyEv:
  802|    143|    bool empty() const {
  803|    143|      void *const invalid = reinterpret_cast<void *>(kInvalidCompacteeStart);
  804|    143|      return evacStart == invalid && start == invalid && !segment;
  ------------------
  |  Branch (804:14): [True: 143, False: 0]
  |  Branch (804:38): [True: 143, False: 0]
  |  Branch (804:58): [True: 143, False: 0]
  ------------------
  805|    143|    }
_ZN6hermes2vm7HadesGC26ensureBackgroundTaskPausedEv:
  931|   187k|  LLVM_NODISCARD std::lock_guard<Mutex> ensureBackgroundTaskPaused() {
  932|   187k|    if constexpr (kConcurrentGC) {
  ------------------
  |  Branch (932:19): [Folded - Ignored]
  ------------------
  933|   187k|      return pauseBackgroundTask();
  934|   187k|    }
  935|      0|    return std::lock_guard(gcMutex_);
  936|   187k|  }
_ZN6hermes2vm7HadesGC5makeAINS0_11BoxedDoubleELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_jDpOT3_:
 1094|  1.79k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  1.79k|  assert(
 1096|  1.79k|      isSizeHeapAligned(size) &&
 1097|  1.79k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  1.79k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  1.79k|  return constructCell<T>(
 1106|  1.79k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  1.79k|      size,
 1108|  1.79k|      std::forward<Args>(args)...);
 1109|  1.79k|}
_ZN6hermes2vm7HadesGC9allocWorkILb1ELNS0_12HasFinalizerE0EEEPvj:
 1112|   497k|void *HadesGC::allocWork(uint32_t sz) {
 1113|   497k|  assert(
 1114|   497k|      isSizeHeapAligned(sz) &&
 1115|   497k|      "Should be aligned before entering this function");
 1116|      0|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1117|   497k|  if (kConcurrentGC) {
  ------------------
  |  Branch (1117:7): [Folded - Ignored]
  ------------------
 1118|   497k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|   497k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1119|   497k|        !weakRefMutex() &&
 1120|   497k|        "WeakRef mutex should not be held when alloc is called");
 1121|   497k|  }
 1122|   497k|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1122:7): [Folded - Ignored]
  ------------------
 1123|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1124|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1125|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1126|       |    // more interesting aspect of Hades which is concurrent background
 1127|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1128|       |    // oldGenCollection if one is not already running.
 1129|      0|    youngGenCollection(
 1130|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1131|      0|  }
 1132|   497k|  AllocResult res = youngGen().alloc(sz);
 1133|   497k|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|   497k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 8, False: 497k]
  |  |  ------------------
  ------------------
 1134|   497k|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1134:7): [Folded - Ignored]
  ------------------
 1135|      0|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1136|   497k|  return resPtr;
 1137|   497k|}
_ZN6hermes2vm7HadesGC5makeAINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1094|   459k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   459k|  assert(
 1096|   459k|      isSizeHeapAligned(size) &&
 1097|   459k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   459k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|   459k|  return constructCell<T>(
 1106|   459k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|   459k|      size,
 1108|   459k|      std::forward<Args>(args)...);
 1109|   459k|}
_ZN6hermes2vm7HadesGC5makeAINS0_11EnvironmentELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EERjEEEPT_jDpOT3_:
 1094|    452|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    452|  assert(
 1096|    452|      isSizeHeapAligned(size) &&
 1097|    452|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    452|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|    452|  return constructCell<T>(
 1106|    452|      allocWork<fixedSize, hasFinalizer>(size),
 1107|    452|      size,
 1108|    452|      std::forward<Args>(args)...);
 1109|    452|}
_ZN6hermes2vm7HadesGC5makeAINS0_17NativeConstructorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEERPFNSG_INS0_12PseudoHandleIS9_EELSJ_6EEES7_SA_SE_ERNS0_8CellKindEEEEPT_jDpOT3_:
 1094|  4.05k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  4.05k|  assert(
 1096|  4.05k|      isSizeHeapAligned(size) &&
 1097|  4.05k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  4.05k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  4.05k|  return constructCell<T>(
 1106|  4.05k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  4.05k|      size,
 1108|  4.05k|      std::forward<Args>(args)...);
 1109|  4.05k|}
_ZN6hermes2vm7HadesGC5makeAINS0_16ArrayStorageBaseINS0_11HermesValueEEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_13BoundFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_14NativeFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESE_S7_NS0_10NativeArgsEEEEEPT_jDpOT3_:
 1094|  42.4k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  42.4k|  assert(
 1096|  42.4k|      isSizeHeapAligned(size) &&
 1097|  42.4k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  42.4k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  42.4k|  return constructCell<T>(
 1106|  42.4k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  42.4k|      size,
 1108|  42.4k|      std::forward<Args>(args)...);
 1109|  42.4k|}
_ZN6hermes2vm7HadesGC5makeAINS0_10JSFunctionELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_6DomainEEERNS8_INS0_8JSObjectEEENS8_INS0_11HiddenClassEEERNS8_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_jDpOT3_:
 1094|  4.50k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  4.50k|  assert(
 1096|  4.50k|      isSizeHeapAligned(size) &&
 1097|  4.50k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  4.50k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  4.50k|  return constructCell<T>(
 1106|  4.50k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  4.50k|      size,
 1108|  4.50k|      std::forward<Args>(args)...);
 1109|  4.50k|}
_ZN6hermes2vm7HadesGC5makeAINS0_6DomainELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1094|    254|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    254|  assert(
 1096|    254|      isSizeHeapAligned(size) &&
 1097|    254|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    254|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|    254|  return constructCell<T>(
 1106|    254|      allocWork<fixedSize, hasFinalizer>(size),
 1107|    254|      size,
 1108|    254|      std::forward<Args>(args)...);
 1109|    254|}
_ZN6hermes2vm7HadesGC9allocWorkILb1ELNS0_12HasFinalizerE1EEEPvj:
 1112|    619|void *HadesGC::allocWork(uint32_t sz) {
 1113|    619|  assert(
 1114|    619|      isSizeHeapAligned(sz) &&
 1115|    619|      "Should be aligned before entering this function");
 1116|      0|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1117|    619|  if (kConcurrentGC) {
  ------------------
  |  Branch (1117:7): [Folded - Ignored]
  ------------------
 1118|    619|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|    619|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1119|    619|        !weakRefMutex() &&
 1120|    619|        "WeakRef mutex should not be held when alloc is called");
 1121|    619|  }
 1122|    619|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1122:7): [Folded - Ignored]
  ------------------
 1123|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1124|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1125|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1126|       |    // more interesting aspect of Hades which is concurrent background
 1127|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1128|       |    // oldGenCollection if one is not already running.
 1129|      0|    youngGenCollection(
 1130|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1131|      0|  }
 1132|    619|  AllocResult res = youngGen().alloc(sz);
 1133|    619|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|    619|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 619]
  |  |  ------------------
  ------------------
 1134|    619|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1134:7): [Folded - Ignored]
  ------------------
 1135|    619|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1136|    619|  return resPtr;
 1137|    619|}
_ZN6hermes2vm7HadesGC5makeAINS0_11HiddenClassELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRNS0_7RuntimeERNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_jDpOT3_:
 1094|  56.9k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  56.9k|  assert(
 1096|  56.9k|      isSizeHeapAligned(size) &&
 1097|  56.9k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  56.9k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|  56.9k|    auto lk = ensureBackgroundTaskPaused();
 1101|  56.9k|    return constructCell<T>(
 1102|  56.9k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|  56.9k|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|  56.9k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
 1094|   105k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   105k|  assert(
 1096|   105k|      isSizeHeapAligned(size) &&
 1097|   105k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   105k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|   105k|    auto lk = ensureBackgroundTaskPaused();
 1101|   105k|    return constructCell<T>(
 1102|   105k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|   105k|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|   105k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb1EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT3_:
 1094|    132|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    132|  assert(
 1096|    132|      isSizeHeapAligned(size) &&
 1097|    132|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    132|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|    132|    auto lk = ensureBackgroundTaskPaused();
 1101|    132|    return constructCell<T>(
 1102|    132|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|    132|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|    132|}
_ZN6hermes2vm7HadesGC5makeAINS0_7JSArrayELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
 1094|   428k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   428k|  assert(
 1096|   428k|      isSizeHeapAligned(size) &&
 1097|   428k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   428k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|   428k|  return constructCell<T>(
 1106|   428k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|   428k|      size,
 1108|   428k|      std::forward<Args>(args)...);
 1109|   428k|}
_ZN6hermes2vm7HadesGC5makeAINS0_7JSErrorELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEERbEEEPT_jDpOT3_:
 1094|     24|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     24|  assert(
 1096|     24|      isSizeHeapAligned(size) &&
 1097|     24|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     24|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     24|  return constructCell<T>(
 1106|     24|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     24|      size,
 1108|     24|      std::forward<Args>(args)...);
 1109|     24|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSObjectELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleIS3_EENS8_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_jDpOT3_:
 1094|  10.9k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  10.9k|  assert(
 1096|  10.9k|      isSizeHeapAligned(size) &&
 1097|  10.9k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  10.9k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  10.9k|  return constructCell<T>(
 1106|  10.9k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  10.9k|      size,
 1108|  10.9k|      std::forward<Args>(args)...);
 1109|  10.9k|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSRegExpELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|    242|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    242|  assert(
 1096|    242|      isSizeHeapAligned(size) &&
 1097|    242|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    242|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|    242|  return constructCell<T>(
 1106|    242|      allocWork<fixedSize, hasFinalizer>(size),
 1107|    242|      size,
 1108|    242|      std::forward<Args>(args)...);
 1109|    242|}
_ZN6hermes2vm7HadesGC5makeAINS0_10HostObjectELb1ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENS8_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSE_14default_deleteISG_EEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSStringELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_15StringPrimitiveEEERNS8_INS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_8JSNumberELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERdRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_9JSBooleanELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERbRNS0_6HandleINS0_8JSObjectEEERNS9_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_16PropertyAccessorELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8CallableEEESB_EEEPT_jDpOT3_:
 1094|  4.28k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  4.28k|  assert(
 1096|  4.28k|      isSizeHeapAligned(size) &&
 1097|  4.28k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  4.28k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  4.28k|  return constructCell<T>(
 1106|  4.28k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  4.28k|      size,
 1108|  4.28k|      std::forward<Args>(args)...);
 1109|  4.28k|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1094|  1.09k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  1.09k|  assert(
 1096|  1.09k|      isSizeHeapAligned(size) &&
 1097|  1.09k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  1.09k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  1.09k|  return constructCell<T>(
 1106|  1.09k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  1.09k|      size,
 1108|  1.09k|      std::forward<Args>(args)...);
 1109|  1.09k|}
_ZN6hermes2vm7HadesGC5makeAINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT3_:
 1094|   415k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   415k|  assert(
 1096|   415k|      isSizeHeapAligned(size) &&
 1097|   415k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   415k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|   415k|  return constructCell<T>(
 1106|   415k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|   415k|      size,
 1108|   415k|      std::forward<Args>(args)...);
 1109|   415k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
 1094|      8|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|      8|  assert(
 1096|      8|      isSizeHeapAligned(size) &&
 1097|      8|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|      8|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|      8|  return constructCell<T>(
 1106|      8|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      8|      size,
 1108|      8|      std::forward<Args>(args)...);
 1109|      8|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT3_:
 1094|  12.6k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  12.6k|  assert(
 1096|  12.6k|      isSizeHeapAligned(size) &&
 1097|  12.6k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  12.6k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|  12.6k|    auto lk = ensureBackgroundTaskPaused();
 1101|  12.6k|    return constructCell<T>(
 1102|  12.6k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|  12.6k|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|  12.6k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIDsLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
 1094|   410k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   410k|  assert(
 1096|   410k|      isSizeHeapAligned(size) &&
 1097|   410k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   410k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|   410k|  return constructCell<T>(
 1106|   410k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|   410k|      size,
 1108|   410k|      std::forward<Args>(args)...);
 1109|   410k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
 1094|   249k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|   249k|  assert(
 1096|   249k|      isSizeHeapAligned(size) &&
 1097|   249k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|   249k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|   249k|  return constructCell<T>(
 1106|   249k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|   249k|      size,
 1108|   249k|      std::forward<Args>(args)...);
 1109|   249k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT3_:
 1094|  12.6k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  12.6k|  assert(
 1096|  12.6k|      isSizeHeapAligned(size) &&
 1097|  12.6k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  12.6k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|  12.6k|    auto lk = ensureBackgroundTaskPaused();
 1101|  12.6k|    return constructCell<T>(
 1102|  12.6k|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|  12.6k|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|  12.6k|}
_ZN6hermes2vm7HadesGC5makeAINS0_22DynamicStringPrimitiveIcLb0EEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT3_:
 1094|  49.4k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  49.4k|  assert(
 1096|  49.4k|      isSizeHeapAligned(size) &&
 1097|  49.4k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  49.4k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  49.4k|  return constructCell<T>(
 1106|  49.4k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  49.4k|      size,
 1108|  49.4k|      std::forward<Args>(args)...);
 1109|  49.4k|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
 1094|     13|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     13|  assert(
 1096|     13|      isSizeHeapAligned(size) &&
 1097|     13|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     13|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|     13|    auto lk = ensureBackgroundTaskPaused();
 1101|     13|    return constructCell<T>(
 1102|     13|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|     13|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|     13|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
 1094|      5|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|      5|  assert(
 1096|      5|      isSizeHeapAligned(size) &&
 1097|      5|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|      5|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      5|    auto lk = ensureBackgroundTaskPaused();
 1101|      5|    return constructCell<T>(
 1102|      5|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      5|  }
 1104|       |
 1105|      0|  return constructCell<T>(
 1106|      0|      allocWork<fixedSize, hasFinalizer>(size),
 1107|      0|      size,
 1108|      0|      std::forward<Args>(args)...);
 1109|      5|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIcEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT3_:
 1094|     60|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     60|  assert(
 1096|     60|      isSizeHeapAligned(size) &&
 1097|     60|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     60|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     60|  return constructCell<T>(
 1106|     60|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     60|      size,
 1108|     60|      std::forward<Args>(args)...);
 1109|     60|}
_ZN6hermes2vm7HadesGC9allocWorkILb0ELNS0_12HasFinalizerE1EEEPvj:
 1112|    108|void *HadesGC::allocWork(uint32_t sz) {
 1113|    108|  assert(
 1114|    108|      isSizeHeapAligned(sz) &&
 1115|    108|      "Should be aligned before entering this function");
 1116|      0|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 1117|    108|  if (kConcurrentGC) {
  ------------------
  |  Branch (1117:7): [Folded - Ignored]
  ------------------
 1118|    108|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|    108|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1119|    108|        !weakRefMutex() &&
 1120|    108|        "WeakRef mutex should not be held when alloc is called");
 1121|    108|  }
 1122|    108|  if (shouldSanitizeHandles()) {
  ------------------
  |  Branch (1122:7): [Folded - Ignored]
  ------------------
 1123|       |    // The best way to sanitize uses of raw pointers outside handles is to force
 1124|       |    // the entire heap to move, and ASAN poison the old heap. That is too
 1125|       |    // expensive to do, even with sampling, for Hades. It also doesn't test the
 1126|       |    // more interesting aspect of Hades which is concurrent background
 1127|       |    // collections. So instead, do a youngGenCollection which force-starts an
 1128|       |    // oldGenCollection if one is not already running.
 1129|      0|    youngGenCollection(
 1130|      0|        kHandleSanCauseForAnalytics, /*forceOldGenCollection*/ true);
 1131|      0|  }
 1132|    108|  AllocResult res = youngGen().alloc(sz);
 1133|    108|  void *resPtr = LLVM_UNLIKELY(!res.success) ? allocSlow(sz) : res.ptr;
  ------------------
  |  |  189|    108|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 5, False: 103]
  |  |  ------------------
  ------------------
 1134|    108|  if (hasFinalizer == HasFinalizer::Yes)
  ------------------
  |  Branch (1134:7): [Folded - Ignored]
  ------------------
 1135|    108|    youngGenFinalizables_.emplace_back(static_cast<GCCell *>(resPtr));
 1136|    108|  return resPtr;
 1137|    108|}
_ZN6hermes2vm7HadesGC5makeAINS0_23ExternalStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT3_:
 1094|     48|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     48|  assert(
 1096|     48|      isSizeHeapAligned(size) &&
 1097|     48|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     48|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     48|  return constructCell<T>(
 1106|     48|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     48|      size,
 1108|     48|      std::forward<Args>(args)...);
 1109|     48|}
_ZN6hermes2vm7HadesGC5makeAINS0_23BufferedStringPrimitiveIDsEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT3_:
 1094|    162|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    162|  assert(
 1096|    162|      isSizeHeapAligned(size) &&
 1097|    162|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    162|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|    162|  return constructCell<T>(
 1106|    162|      allocWork<fixedSize, hasFinalizer>(size),
 1107|    162|      size,
 1108|    162|      std::forward<Args>(args)...);
 1109|    162|}
_ZN6hermes2vm7HadesGC5makeAINS0_23BufferedStringPrimitiveIcEELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERjRNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEEEEEPT_jDpOT3_:
 1094|    711|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|    711|  assert(
 1096|    711|      isSizeHeapAligned(size) &&
 1097|    711|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|    711|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|    711|  return constructCell<T>(
 1106|    711|      allocWork<fixedSize, hasFinalizer>(size),
 1107|    711|      size,
 1108|    711|      std::forward<Args>(args)...);
 1109|    711|}
_ZN6hermes2vm7HadesGC5makeAINS0_12SingleObjectILNS0_8CellKindE60EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC5makeAINS0_12SingleObjectILNS0_8CellKindE59EEELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_8JSObjectEEENSA_INS0_11HiddenClassEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}
_ZN6hermes2vm7HadesGC11HeapSegmentC2Ev:
  357|     99|    HeapSegment() = default;
_ZN6hermes2vm7HadesGC5makeAINS0_15DictPropertyMapELb0ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT3_:
 1094|  19.2k|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|  19.2k|  assert(
 1096|  19.2k|      isSizeHeapAligned(size) &&
 1097|  19.2k|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|  19.2k|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|  19.2k|  return constructCell<T>(
 1106|  19.2k|      allocWork<fixedSize, hasFinalizer>(size),
 1107|  19.2k|      size,
 1108|  19.2k|      std::forward<Args>(args)...);
 1109|  19.2k|}
_ZN6hermes2vm7HadesGC5makeAINS0_14OrderedHashMapELb1ELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRNS0_7RuntimeERNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_jDpOT3_:
 1094|     99|inline T *HadesGC::makeA(uint32_t size, Args &&...args) {
 1095|     99|  assert(
 1096|     99|      isSizeHeapAligned(size) &&
 1097|     99|      "Call to makeA must use a size aligned to HeapAlign");
 1098|      0|  assert(noAllocLevel_ == 0 && "No allocs allowed right now.");
 1099|     99|  if (longLived == LongLived::Yes) {
  ------------------
  |  Branch (1099:7): [Folded - Ignored]
  ------------------
 1100|      0|    auto lk = ensureBackgroundTaskPaused();
 1101|      0|    return constructCell<T>(
 1102|      0|        allocLongLived(size), size, std::forward<Args>(args)...);
 1103|      0|  }
 1104|       |
 1105|     99|  return constructCell<T>(
 1106|     99|      allocWork<fixedSize, hasFinalizer>(size),
 1107|     99|      size,
 1108|     99|      std::forward<Args>(args)...);
 1109|     99|}

_ZN6hermes2vm10HandleBaseD2Ev:
   54|  50.7M|inline HandleBase::~HandleBase() {
   55|  50.7M|  if (gcScope_) {
  ------------------
  |  Branch (55:7): [True: 34.4M, False: 16.3M]
  ------------------
   56|  34.4M|    --gcScope_->numActiveHandles_;
   57|  34.4M|  }
   58|  50.7M|}
_ZN6hermes2vm10HandleBaseC2ERKS1_:
   45|  38.5M|inline HandleBase::HandleBase(const HandleBase &sc) : handle_(sc.handle_) {
   46|  38.5M|  gcScope_ = sc.gcScope_;
   47|  38.5M|  if (gcScope_) {
  ------------------
  |  Branch (47:7): [True: 28.7M, False: 9.74M]
  ------------------
   48|  28.7M|    ++gcScope_->numActiveHandles_;
   49|  28.7M|  }
   50|  38.5M|}
_ZN6hermes2vm10HandleBaseC2ERNS0_15HandleRootOwnerENS0_11HermesValueE:
   37|  5.66M|    : handle_(runtime.newPinnedHermesValue(value)) {
   38|  5.66M|#ifndef NDEBUG
   39|  5.66M|  gcScope_ = runtime.getTopGCScope();
   40|  5.66M|  ++gcScope_->numActiveHandles_;
   41|  5.66M|#endif
   42|  5.66M|}
_ZN6hermes2vm10HandleBaseaSERKS1_:
   62|   206k|inline HandleBase &HandleBase::operator=(const HandleBase &other) {
   63|   206k|  if (gcScope_)
  ------------------
  |  Branch (63:7): [True: 205k, False: 198]
  ------------------
   64|   205k|    --gcScope_->numActiveHandles_;
   65|   206k|  if ((gcScope_ = other.gcScope_) != nullptr)
  ------------------
  |  Branch (65:7): [True: 206k, False: 0]
  ------------------
   66|   206k|    ++gcScope_->numActiveHandles_;
   67|   206k|  handle_ = other.handle_;
   68|   206k|  return *this;
   69|   206k|}
_ZN6hermes2vm6HandleINS0_10JSFunctionEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|    222|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|    222|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 222, False: 0]
  ------------------
   75|    222|      ? Handle<T>(other, true)
   76|    222|      : HandleRootOwner::makeNullHandle<T>();
   77|    222|}
_ZN6hermes2vm6HandleINS0_8CallableEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|   405k|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|   405k|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 405k, False: 24]
  ------------------
   75|   405k|      ? Handle<T>(other, true)
   76|   405k|      : HandleRootOwner::makeNullHandle<T>();
   77|   405k|}
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|     24|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|     24|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 24, False: 0]
  ------------------
   75|     24|      ? Handle<T>(other, true)
   76|     24|      : HandleRootOwner::makeNullHandle<T>();
   77|     24|}
_ZN6hermes2vm6HandleINS0_7JSArrayEE10dyn_vmcastERKNS0_10HandleBaseE:
   73|   354k|inline Handle<T> Handle<T>::dyn_vmcast(const HandleBase &other) {
   74|   354k|  return vmisa<T>(other.getHermesValue())
  ------------------
  |  Branch (74:10): [True: 354k, False: 0]
  ------------------
   75|   354k|      ? Handle<T>(other, true)
   76|   354k|      : HandleRootOwner::makeNullHandle<T>();
   77|   354k|}
_ZN6hermes2vm12PseudoHandleINS0_8CallableEE6vmcastINS0_11HermesValueEEES3_ONS1_IT_EE:
   21|      4|inline PseudoHandle<T> PseudoHandle<T>::vmcast(PseudoHandle<U> &&other) {
   22|      4|  auto result = PseudoHandle<T>::create(hermes::vm::vmcast<T>(other.get()));
   23|      4|  other.invalidate();
   24|      4|  return result;
   25|      4|}

_ZN6hermes2vm6HandleINS0_11HermesValueEEC2EPKNS0_17PinnedHermesValueE:
  324|  1.11M|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {
  325|  1.11M|    static_assert(
  326|  1.11M|        std::is_same<value_type, HermesValue>::value,
  327|  1.11M|        "This constructor can only be used for Handle<HermesValue>");
  328|  1.11M|  }
_ZN6hermes2vm10HandleBaseC2EPKNS0_17PinnedHermesValueE:
  214|  3.22M|      : handle_(const_cast<PinnedHermesValue *>(valueAddr)) {
  215|  3.22M|#ifndef NDEBUG
  216|  3.22M|    gcScope_ = nullptr;
  217|  3.22M|#endif
  218|  3.22M|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2ERKS3_:
  337|  9.76k|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm10HandleBase14getHermesValueEv:
  248|  21.5M|  HermesValue getHermesValue() const {
  249|  21.5M|    return *handleRef();
  250|  21.5M|  }
_ZNK6hermes2vm10HandleBase9handleRefEv:
  198|  61.3M|  const PinnedHermesValue *handleRef() const {
  199|  61.3M|#ifdef HERMES_SLOW_DEBUG
  200|  61.3M|    assert(!handle_->isInvalid() && "Reading from flushed handle");
  201|      0|#endif
  202|      0|    return handle_;
  203|  61.3M|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERKS3_:
  337|  6.93M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    195|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    195|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    195|    return Handle<T>(valueAddr, true);
  392|    195|  }
_ZN6hermes2vm15HermesValueCastINS0_11HermesValueELb0EE11assertValidES2_:
  286|    195|  static void assertValid(HermesValue x) {
  287|    195|#ifndef NDEBUG
  288|    195|    (void)HermesValueTraits<T>::decode(x);
  289|    195|#endif
  290|    195|  }
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2EPKNS0_17PinnedHermesValueEb:
  305|    195|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm18createPseudoHandleINS0_11HiddenClassEEENS0_12PseudoHandleIT_EEPS4_:
  503|  2.44M|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  2.44M|  return PseudoHandle<T>::create(ptr);
  505|  2.44M|}
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEE6createEPS2_:
  155|  2.44M|  static PseudoHandle<T> create(value_type value) {
  156|  2.44M|    return PseudoHandle<T>(value);
  157|  2.44M|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEEC2EPS2_:
   67|  2.44M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERKS3_:
  337|  11.2M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2ERKS3_:
  337|  5.69M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8JSObjectEvEERKNS1_IT_EE:
  335|  1.35M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_7JSArrayEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    198|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    198|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    198|    return Handle<T>(valueAddr, true);
  392|    198|  }
_ZN6hermes2vm15HermesValueCastINS0_7JSArrayELb1EE11assertValidENS0_11HermesValueE:
  275|   145k|  static void assertValid(HermesValue x) {
  276|   145k|#ifndef NDEBUG
  277|   145k|    (void)vmcast<T>(x);
  278|   145k|#endif
  279|   145k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2EPKNS0_17PinnedHermesValueEb:
  305|    202|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2ERNS0_15HandleRootOwnerES2_:
  317|   987k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_8CallableEEptEv:
  368|   408k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|   408k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|   408k|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERKS3_:
  337|  1.22M|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm6HandleINS0_11HermesValueEEptEv:
  368|  2.35M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  2.35M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  2.35M|  }
_ZNK6hermes2vm6HandleINS0_8JSObjectEEptEv:
  368|  14.7M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  14.7M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  14.7M|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE3getEv:
  126|   528k|  value_type get() const {
  127|   528k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|   528k|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|   485k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEE10invalidateEv:
  120|  1.59k|  void invalidate() {
  121|  1.59k|#ifndef NDEBUG
  122|  1.59k|    valid_ = false;
  123|  1.59k|#endif
  124|  1.59k|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEE3getEv:
  126|  1.36M|  value_type get() const {
  127|  1.36M|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  1.36M|  }
_ZNK6hermes2vm6HandleINS0_8JSObjectEEdeEv:
  372|  2.30M|  value_type operator*() const {
  373|  2.30M|    return get();
  374|  2.30M|  }
_ZNK6hermes2vm6HandleINS0_8JSObjectEE3getEv:
  358|  5.01M|  value_type get() const {
  359|  5.01M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  5.01M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEEptEv:
  131|   864k|  arrow_type operator->() const {
  132|   864k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|   864k|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|   731k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|   731k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|   731k|    return Handle<T>(valueAddr, true);
  392|   731k|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSObjectELb1EE11assertValidENS0_11HermesValueE:
  275|  1.13M|  static void assertValid(HermesValue x) {
  276|  1.13M|#ifndef NDEBUG
  277|  1.13M|    (void)vmcast<T>(x);
  278|  1.13M|#endif
  279|  1.13M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2EPKNS0_17PinnedHermesValueEb:
  305|  1.17M|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11EnvironmentEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|    155|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|    155|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|    155|    return Handle<T>(valueAddr, true);
  399|    155|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2EPKNS0_17PinnedHermesValueEb:
  305|  4.50k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_9ArrayImplEvEERKNS1_IT_EE:
  335|   986k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_7JSArrayEvEERKNS1_IT_EE:
  335|  1.76M|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEEC2INS0_7JSArrayEvEERKNS1_IT_EE:
  335|   996k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEdeEv:
  372|  2.37M|  value_type operator*() const {
  373|  2.37M|    return get();
  374|  2.37M|  }
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEE3getEv:
  358|  2.37M|  value_type get() const {
  359|  2.37M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  2.37M|  }
_ZNK6hermes2vm10HandleBase26unsafeGetPinnedHermesValueEv:
  256|  3.84M|  const PinnedHermesValue *unsafeGetPinnedHermesValue() const {
  257|       |    // Don't call handleRef() because it creates HermesValues in debug mode.
  258|  3.84M|    return handle_;
  259|  3.84M|  }
_ZN6hermes2vm18createPseudoHandleINS0_15StringPrimitiveEEENS0_12PseudoHandleIT_EEPS4_:
  503|  1.31M|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  1.31M|  return PseudoHandle<T>::create(ptr);
  505|  1.31M|}
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE6createEPS2_:
  155|  1.31M|  static PseudoHandle<T> create(value_type value) {
  156|  1.31M|    return PseudoHandle<T>(value);
  157|  1.31M|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2EPS2_:
   67|  1.31M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm15HermesValueCastINS0_8SymbolIDELb0EE11assertValidENS0_11HermesValueE:
  286|    418|  static void assertValid(HermesValue x) {
  287|    418|#ifndef NDEBUG
  288|    418|    (void)HermesValueTraits<T>::decode(x);
  289|    418|#endif
  290|    418|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  2.31M|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE14getHermesValueEv:
  142|  9.30k|  HermesValue getHermesValue() const {
  143|  9.30k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|  9.30k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERKS3_:
  337|  1.65M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm13MutableHandleINS0_8SymbolIDEEC2ERNS0_15HandleRootOwnerES2_:
  450|  71.5k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERNS0_15HandleRootOwnerES2_:
  317|   279k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm10HandleBase9handleRefEv:
  192|  2.67M|  PinnedHermesValue *&handleRef() {
  193|  2.67M|#ifdef HERMES_SLOW_DEBUG
  194|  2.67M|    assert(!handle_->isInvalid() && "Reading from flushed handle");
  195|      0|#endif
  196|      0|    return handle_;
  197|  2.67M|  }
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8SymbolIDEvEERKNS1_IT_EE:
  335|  1.40k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2EOS3_:
  338|  1.64M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm10HandleBaseC2EOS1_:
  229|  3.32M|  HandleBase(HandleBase &&sc) : handle_(sc.handle_) {
  230|  3.32M|    gcScope_ = sc.gcScope_;
  231|  3.32M|    sc.gcScope_ = nullptr;
  232|  3.32M|  }
_ZNK6hermes2vm6HandleINS0_7JSArrayEEptEv:
  368|   538k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|   538k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|   538k|  }
_ZN6hermes2vm6HandleINS0_8CallableEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    693|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    693|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    693|    return Handle<T>(valueAddr, true);
  392|    693|  }
_ZN6hermes2vm15HermesValueCastINS0_8CallableELb1EE11assertValidENS0_11HermesValueE:
  275|    915|  static void assertValid(HermesValue x) {
  276|    915|#ifndef NDEBUG
  277|    915|    (void)vmcast<T>(x);
  278|    915|#endif
  279|    915|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2EPKNS0_17PinnedHermesValueEb:
  305|    717|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEE14unsafeGetValueEv:
  150|  2.94k|  value_type unsafeGetValue() const {
  151|  2.94k|    return value_;
  152|  2.94k|  }
_ZN6hermes2vm18createPseudoHandleENS0_11HermesValueE:
  508|  1.76M|inline PseudoHandle<> createPseudoHandle(HermesValue value) {
  509|  1.76M|  return PseudoHandle<>::create(value);
  510|  1.76M|}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEE6createES2_:
  155|  1.76M|  static PseudoHandle<T> create(value_type value) {
  156|  1.76M|    return PseudoHandle<T>(value);
  157|  1.76M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HermesValueEE14getHermesValueEv:
  142|   405k|  HermesValue getHermesValue() const {
  143|   405k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|   405k|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEEdeEv:
  372|   987k|  value_type operator*() const {
  373|   987k|    return get();
  374|   987k|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEE3getEv:
  358|   987k|  value_type get() const {
  359|   987k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   987k|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE14unsafeGetValueEv:
  150|  2.61M|  value_type unsafeGetValue() const {
  151|  2.61M|    return value_;
  152|  2.61M|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE3getEv:
  126|  1.34M|  value_type get() const {
  127|  1.34M|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  1.34M|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE10invalidateEv:
  120|   802k|  void invalidate() {
  121|   802k|#ifndef NDEBUG
  122|   802k|    valid_ = false;
  123|   802k|#endif
  124|   802k|  }
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEptEv:
  368|  10.5M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  10.5M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  10.5M|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSObjectEEptEv:
  131|   461k|  arrow_type operator->() const {
  132|   461k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|   461k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEE6createEPS2_:
  155|  78.2k|  static PseudoHandle<T> create(value_type value) {
  156|  78.2k|    return PseudoHandle<T>(value);
  157|  78.2k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEE10invalidateEv:
  120|  1.33M|  void invalidate() {
  121|  1.33M|#ifndef NDEBUG
  122|  1.33M|    valid_ = false;
  123|  1.33M|#endif
  124|  1.33M|  }
_ZNK6hermes2vm6HandleINS0_11HermesValueEE3getEv:
  358|  4.41M|  value_type get() const {
  359|  4.41M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  4.41M|  }
_ZNK6hermes2vm6HandleINS0_6DomainEEptEv:
  368|    928|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    928|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    928|  }
_ZN6hermes2vm18createPseudoHandleINS0_8JSObjectEEENS0_12PseudoHandleIT_EEPS4_:
  503|  78.2k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  78.2k|  return PseudoHandle<T>::create(ptr);
  505|  78.2k|}
_ZN6hermes2vm6HandleINS0_11HiddenClassEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|   491k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|   491k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|   491k|    return Handle<T>(valueAddr, true);
  392|   491k|  }
_ZN6hermes2vm15HermesValueCastINS0_11HiddenClassELb1EE11assertValidENS0_11HermesValueE:
  275|   491k|  static void assertValid(HermesValue x) {
  276|   491k|#ifndef NDEBUG
  277|   491k|    (void)vmcast<T>(x);
  278|   491k|#endif
  279|   491k|  }
_ZNK6hermes2vm6HandleINS0_11EnvironmentEE3getEv:
  358|  4.95k|  value_type get() const {
  359|  4.95k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  4.95k|  }
_ZNK6hermes2vm6HandleINS0_11HermesValueEEdeEv:
  372|  2.80M|  value_type operator*() const {
  373|  2.80M|    return get();
  374|  2.80M|  }
_ZNK6hermes2vm6HandleINS0_11EnvironmentEEdeEv:
  372|  4.50k|  value_type operator*() const {
  373|  4.50k|    return get();
  374|  4.50k|  }
_ZNK6hermes2vm6HandleINS0_8CallableEEdeEv:
  372|  12.8k|  value_type operator*() const {
  373|  12.8k|    return get();
  374|  12.8k|  }
_ZNK6hermes2vm6HandleINS0_8CallableEE3getEv:
  358|   419k|  value_type get() const {
  359|   419k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   419k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEdeEv:
  372|     99|  value_type operator*() const {
  373|     99|    return get();
  374|     99|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEE3getEv:
  358|    198|  value_type get() const {
  359|    198|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    198|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|   447k|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|   447k|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|   447k|    return Handle<T>(valueAddr, true);
  399|   447k|  }
_ZN6hermes2vm18createPseudoHandleINS0_17NativeConstructorEEENS0_12PseudoHandleIT_EEPS4_:
  503|  4.05k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  4.05k|  return PseudoHandle<T>::create(ptr);
  505|  4.05k|}
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEE6createEPS2_:
  155|  4.05k|  static PseudoHandle<T> create(value_type value) {
  156|  4.05k|    return PseudoHandle<T>(value);
  157|  4.05k|  }
_ZNK6hermes2vm6HandleINS0_6DomainEEdeEv:
  372|  5.42k|  value_type operator*() const {
  373|  5.42k|    return get();
  374|  5.42k|  }
_ZNK6hermes2vm6HandleINS0_6DomainEE3getEv:
  358|  5.42k|  value_type get() const {
  359|  5.42k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  5.42k|  }
_ZNK6hermes2vm12PseudoHandleINS0_6DomainEE3getEv:
  126|    155|  value_type get() const {
  127|    155|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|    155|  }
_ZN6hermes2vm12PseudoHandleINS0_6DomainEE10invalidateEv:
  120|    155|  void invalidate() {
  121|    155|#ifndef NDEBUG
  122|    155|    valid_ = false;
  123|    155|#endif
  124|    155|  }
_ZN6hermes2vm6HandleINS0_6DomainEEC2ERKS3_:
  337|  7.34k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_6DomainEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  5.35k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2EPKNS0_17PinnedHermesValueEb:
  305|   491k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2Ev:
   90|    179|  constexpr PseudoHandle() : value_(traits_type::defaultValue()) {}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2EOS3_:
   74|  1.76M|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|  1.76M|    hnd.valid_ = false;
   76|  1.76M|  }
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEC2ES2_:
   67|  1.76M|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm12PseudoHandleINS0_11HermesValueEEaSEOS3_:
   77|   135k|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|   135k|    value_ = std::move(hnd.value_);
   79|   135k|    valid_ = hnd.valid_;
   80|   135k|    hnd.valid_ = false;
   81|   135k|    return *this;
   82|   135k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2EOS3_:
   74|   462k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   462k|    hnd.valid_ = false;
   76|   462k|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2EPS2_:
   67|  78.2k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_10JSFunctionEEC2ERKNS0_10HandleBaseEb:
  307|    222|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEcvbEv:
  364|    222|  explicit operator bool() const {
  365|    222|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 222, False: 0]
  |  Branch (365:40): [True: 222, False: 0]
  ------------------
  366|    222|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEptEv:
  368|    222|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    222|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    222|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEEdeEv:
  372|    222|  value_type operator*() const {
  373|    222|    return get();
  374|    222|  }
_ZNK6hermes2vm6HandleINS0_10JSFunctionEE3getEv:
  358|    222|  value_type get() const {
  359|    222|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    222|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  2.10k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_13BoundFunctionEvEERKNS1_IT_EE:
  335|     99|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8CallableEvEERKNS1_IT_EE:
  335|  99.4k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_15StringPrimitiveEvEERKNS1_IT_EE:
  335|   980k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|    321|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|    321|    HermesValueCast<T>::assertValid(*valueAddr);
  391|    321|    return Handle<T>(valueAddr, true);
  392|    321|  }
_ZN6hermes2vm15HermesValueCastINS0_16PropertyAccessorELb1EE11assertValidENS0_11HermesValueE:
  275|    321|  static void assertValid(HermesValue x) {
  276|    321|#ifndef NDEBUG
  277|    321|    (void)vmcast<T>(x);
  278|    321|#endif
  279|    321|  }
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEEC2EPKNS0_17PinnedHermesValueEb:
  305|    321|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_16PropertyAccessorEvEERKNS1_IT_EE:
  335|  4.77k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8JSObjectEEcvbEv:
  364|   528k|  explicit operator bool() const {
  365|   528k|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 528k, False: 0]
  |  Branch (365:40): [True: 76.7k, False: 451k]
  ------------------
  366|   528k|  }
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_8CallableEvEERKNS1_IT_EE:
  335|  4.38k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEEC2ERKNS0_10HandleBaseEb:
  307|   195k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEEC2ERNS0_15HandleRootOwnerES2_:
  450|  2.19k|      : Handle<T>(runtime, value) {}
_ZNK6hermes2vm6HandleINS0_9ArrayImplEEptEv:
  368|   206k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|   206k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|   206k|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEEaSES2_:
  466|  1.00M|  MutableHandle &operator=(value_type value) {
  467|  1.00M|    set(value);
  468|  1.00M|    return *this;
  469|  1.00M|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEE3setES2_:
  475|  1.64M|  void set(value_type value) {
  476|  1.64M|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  1.64M|  }
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|     99|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|     99|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2EOS3_:
  338|     99|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2EOS3_:
  338|   365k|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEC2ERKS5_:
  337|     99|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_13BoundFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|     99|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_8SymbolIDEEdeEv:
  372|   202k|  value_type operator*() const {
  373|   202k|    return get();
  374|   202k|  }
_ZNK6hermes2vm6HandleINS0_8SymbolIDEE3getEv:
  358|   206k|  value_type get() const {
  359|   206k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   206k|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEE6vmcastERKNS0_10HandleBaseE:
  403|   404k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   404k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   404k|    return Handle<T>(other, true);
  406|   404k|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2ERKNS0_10HandleBaseEb:
  307|   404k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_14NativeFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  51.0k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  42.5k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  50.9k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm12PseudoHandleINS0_8JSObjectEEC2ENS0_6HandleIS2_EE:
   91|   459k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm12PseudoHandleINS0_7JSErrorEE3getEv:
  126|     24|  value_type get() const {
  127|     24|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|     24|  }
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEE10invalidateEv:
  120|     24|  void invalidate() {
  121|     24|#ifndef NDEBUG
  122|     24|    valid_ = false;
  123|     24|#endif
  124|     24|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSStringEvEERKNS1_IT_EE:
  335|  3.76k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm18createPseudoHandleINS0_10JSFunctionEEENS0_12PseudoHandleIT_EEPS4_:
  503|  4.50k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  4.50k|  return PseudoHandle<T>::create(ptr);
  505|  4.50k|}
_ZN6hermes2vm12PseudoHandleINS0_10JSFunctionEE6createEPS2_:
  155|  4.50k|  static PseudoHandle<T> create(value_type value) {
  156|  4.50k|    return PseudoHandle<T>(value);
  157|  4.50k|  }
_ZN6hermes2vm12PseudoHandleINS0_10JSFunctionEEC2EPS2_:
   67|  4.50k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_10JSFunctionEEptEv:
  131|  4.50k|  arrow_type operator->() const {
  132|  4.50k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|  4.50k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2ERKS3_:
  337|  1.59M|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_6DomainEEENS0_12PseudoHandleIT_EEPS4_:
  503|    254|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    254|  return PseudoHandle<T>::create(ptr);
  505|    254|}
_ZN6hermes2vm12PseudoHandleINS0_6DomainEE6createEPS2_:
  155|    254|  static PseudoHandle<T> create(value_type value) {
  156|    254|    return PseudoHandle<T>(value);
  157|    254|  }
_ZN6hermes2vm12PseudoHandleINS0_6DomainEEC2EPS2_:
   67|    254|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm6HandleINS0_14NativeFunctionEEdeEv:
  372|  1.48k|  value_type operator*() const {
  373|  1.48k|    return get();
  374|  1.48k|  }
_ZNK6hermes2vm6HandleINS0_14NativeFunctionEE3getEv:
  358|  5.84k|  value_type get() const {
  359|  5.84k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  5.84k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|   482k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_11HiddenClassEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|    119|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|    119|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|    119|    return Handle<T>(valueAddr, true);
  399|    119|  }
_ZNK6hermes2vm6HandleINS0_11HiddenClassEEptEv:
  368|  3.52M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  3.52M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  3.52M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HiddenClassEEptEv:
  131|  4.90M|  arrow_type operator->() const {
  132|  4.90M|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|  4.90M|  }
_ZNK6hermes2vm12PseudoHandleINS0_11HiddenClassEE3getEv:
  126|  9.93k|  value_type get() const {
  127|  9.93k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  9.93k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEE10invalidateEv:
  120|  9.93k|  void invalidate() {
  121|  9.93k|#ifndef NDEBUG
  122|  9.93k|    valid_ = false;
  123|  9.93k|#endif
  124|  9.93k|  }
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEEaSENS0_6HandleIS2_EE:
  101|  9.45k|  PseudoHandle &operator=(Handle<T> handle) {
  102|  9.45k|    value_ = *handle;
  103|  9.45k|#ifndef NDEBUG
  104|  9.45k|    valid_ = true;
  105|  9.45k|#endif
  106|  9.45k|    return *this;
  107|  9.45k|  }
_ZN6hermes2vm6HandleINS0_11HiddenClassEEaSERKS3_:
  350|    208|  Handle<T> &operator=(const Handle<T> &other) {
  351|    208|    HandleBase::operator=(other);
  352|    208|    return *this;
  353|    208|  }
_ZN6hermes2vm6HandleINS0_15DictPropertyMapEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|   200k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|    331|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEEaSEPS2_:
  466|    693|  MutableHandle &operator=(value_type value) {
  467|    693|    set(value);
  468|    693|    return *this;
  469|    693|  }
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEE3setEPS2_:
  475|  1.17k|  void set(value_type value) {
  476|  1.17k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  1.17k|  }
_ZNK6hermes2vm6HandleINS0_15DictPropertyMapEEdeEv:
  372|   448k|  value_type operator*() const {
  373|   448k|    return get();
  374|   448k|  }
_ZNK6hermes2vm6HandleINS0_15DictPropertyMapEE3getEv:
  358|   448k|  value_type get() const {
  359|   448k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   448k|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|   200k|      : Handle<T>(runtime, value) {}
_ZNK6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE14unsafeGetValueEv:
  150|  38.5k|  value_type unsafeGetValue() const {
  151|  38.5k|    return value_;
  152|  38.5k|  }
_ZNK6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE3getEv:
  126|  19.2k|  value_type get() const {
  127|  19.2k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  19.2k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2EOS3_:
  338|  1.24M|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|  34.3k|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|  34.3k|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|  34.3k|    return Handle<T>(valueAddr, true);
  399|  34.3k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2EPKNS0_17PinnedHermesValueEb:
  305|  34.4k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm6HandleINS0_15StringPrimitiveEEcvbEv:
  364|   622k|  explicit operator bool() const {
  365|   622k|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 622k, False: 0]
  |  Branch (365:40): [True: 554k, False: 68.8k]
  ------------------
  366|   622k|  }
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERKS3_:
  337|   206k|  Handle(const Handle<T> &) = default;
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEcvbEv:
  136|   206k|  explicit operator bool() const {
  137|   206k|    assert(valid_ && "Pseudo handle has been invalidated");
  138|      0|    return value_ != nullptr;
  139|   206k|  }
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEptEv:
  131|   240k|  arrow_type operator->() const {
  132|   240k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|   240k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEaSERKS3_:
  350|   205k|  Handle<T> &operator=(const Handle<T> &other) {
  351|   205k|    HandleBase::operator=(other);
  352|   205k|    return *this;
  353|   205k|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2Ev:
   90|   105k|  constexpr PseudoHandle() : value_(traits_type::defaultValue()) {}
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEaSEOS3_:
   77|   105k|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|   105k|    value_ = std::move(hnd.value_);
   79|   105k|    valid_ = hnd.valid_;
   80|   105k|    hnd.valid_ = false;
   81|   105k|    return *this;
   82|   105k|  }
_ZN6hermes2vm12PseudoHandleINS0_15StringPrimitiveEEC2EOS3_:
   74|  1.74M|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|  1.74M|    hnd.valid_ = false;
   76|  1.74M|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEaSEPS2_:
  466|   526k|  MutableHandle &operator=(value_type value) {
  467|   526k|    set(value);
  468|   526k|    return *this;
  469|   526k|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEE3setEPS2_:
  475|   526k|  void set(value_type value) {
  476|   526k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|   526k|  }
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE6vmcastERKNS0_10HandleBaseE:
  403|   459k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   459k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   459k|    return Handle<T>(other, true);
  406|   459k|  }
_ZN6hermes2vm15HermesValueCastINS0_15StringPrimitiveELb1EE11assertValidENS0_11HermesValueE:
  275|   460k|  static void assertValid(HermesValue x) {
  276|   460k|#ifndef NDEBUG
  277|   460k|    (void)vmcast<T>(x);
  278|   460k|#endif
  279|   460k|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|   814k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_8SymbolIDEE6vmcastERKNS0_10HandleBaseE:
  403|    418|  static Handle<T> vmcast(const HandleBase &other) {
  404|    418|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    418|    return Handle<T>(other, true);
  406|    418|  }
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2ERKNS0_10HandleBaseEb:
  307|    418|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_11HiddenClassEEaSEONS0_12PseudoHandleIS2_EE:
  460|    480|  MutableHandle &operator=(PseudoHandle<T> &&other) {
  461|    480|    set(other.get());
  462|    480|    other.invalidate();
  463|    480|    return *this;
  464|    480|  }
_ZN6hermes2vm6HandleINS0_9ArgumentsEE12unsafeCreateEPKNS0_17PinnedHermesValueE:
  419|    155|  static Handle<T> unsafeCreate(const PinnedHermesValue *valueAddr) {
  420|    155|    return Handle<T>(valueAddr, true);
  421|    155|  }
_ZN6hermes2vm6HandleINS0_9ArgumentsEEC2EPKNS0_17PinnedHermesValueEb:
  305|    155|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|   482k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm12PseudoHandleINS0_11HiddenClassEEC2ENS0_6HandleIS2_EE:
   91|  2.29k|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm6HandleINS0_7JSArrayEEdeEv:
  372|  1.92M|  value_type operator*() const {
  373|  1.92M|    return get();
  374|  1.92M|  }
_ZNK6hermes2vm6HandleINS0_7JSArrayEE3getEv:
  358|  3.15M|  value_type get() const {
  359|  3.15M|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  3.15M|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEE5clearEv:
  471|   230k|  void clear() {
  472|   230k|    set(HermesValueTraits<T>::defaultValue());
  473|   230k|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|  4.34k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|  4.34k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|  4.34k|    return Handle<T>(valueAddr, true);
  392|  4.34k|  }
_ZN6hermes2vm15HermesValueCastINS0_11EnvironmentELb1EE11assertValidENS0_11HermesValueE:
  275|  4.34k|  static void assertValid(HermesValue x) {
  276|  4.34k|#ifndef NDEBUG
  277|  4.34k|    (void)vmcast<T>(x);
  278|  4.34k|#endif
  279|  4.34k|  }
_ZNK6hermes2vm12PseudoHandleINS0_10JSFunctionEE14getHermesValueEv:
  142|  4.50k|  HermesValue getHermesValue() const {
  143|  4.50k|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|  4.50k|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEE14vmcast_or_nullERKNS0_10HandleBaseE:
  410|    452|  static Handle<T> vmcast_or_null(const HandleBase &other) {
  411|    452|    (void)hermes::vm::vmcast_or_null<T>(other.getHermesValue());
  412|    452|    return Handle<T>(other, true);
  413|    452|  }
_ZN6hermes2vm6HandleINS0_11EnvironmentEEC2ERKNS0_10HandleBaseEb:
  307|    452|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm12PseudoHandleINS0_15StringPrimitiveEE14getHermesValueEv:
  142|    873|  HermesValue getHermesValue() const {
  143|    873|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|    873|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSRegExpEE14getHermesValueEv:
  142|    242|  HermesValue getHermesValue() const {
  143|    242|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|    242|  }
_ZN6hermes2vm6HandleINS0_8JSRegExpEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|   406k|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|   406k|    HermesValueCast<T>::assertValid(*valueAddr);
  391|   406k|    return Handle<T>(valueAddr, true);
  392|   406k|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSRegExpELb1EE11assertValidENS0_11HermesValueE:
  275|   406k|  static void assertValid(HermesValue x) {
  276|   406k|#ifndef NDEBUG
  277|   406k|    (void)vmcast<T>(x);
  278|   406k|#endif
  279|   406k|  }
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2EPKNS0_17PinnedHermesValueEb:
  305|   406k|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSRegExpEEC2ERKS3_:
  337|   809k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|     48|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERKS3_:
  337|    216|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2EOS3_:
  338|  68.0k|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     99|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     99|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     99|    return Handle<T>(valueAddr, true);
  392|     99|  }
_ZN6hermes2vm6HandleINS0_16PropertyAccessorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  4.15k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_9ArrayImplEE3getEv:
  358|  10.9k|  value_type get() const {
  359|  10.9k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  10.9k|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE14unsafeGetValueEv:
  150|   831k|  value_type unsafeGetValue() const {
  151|   831k|    return value_;
  152|   831k|  }
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|  1.16k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE10invalidateEv:
  120|    552|  void invalidate() {
  121|    552|#ifndef NDEBUG
  122|    552|    valid_ = false;
  123|    552|#endif
  124|    552|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getEv:
  358|  1.67k|  value_type get() const {
  359|  1.67k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  1.67k|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|    615|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_9ArrayImplEE6vmcastERKNS0_10HandleBaseE:
  403|   195k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   195k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   195k|    return Handle<T>(other, true);
  406|   195k|  }
_ZN6hermes2vm15HermesValueCastINS0_9ArrayImplELb1EE11assertValidENS0_11HermesValueE:
  275|   195k|  static void assertValid(HermesValue x) {
  276|   195k|#ifndef NDEBUG
  277|   195k|    (void)vmcast<T>(x);
  278|   195k|#endif
  279|   195k|  }
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEptEv:
  368|  7.94k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  7.94k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  7.94k|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3getEv:
  126|   416k|  value_type get() const {
  127|   416k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|   416k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|   832k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_6DomainEvEERKNS1_IT_EE:
  335|     24|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  450|  5.81k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|  11.6k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2EOS5_:
  338|     24|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_7JSErrorEE6vmcastERKNS0_10HandleBaseE:
  403|     24|  static Handle<T> vmcast(const HandleBase &other) {
  404|     24|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|     24|    return Handle<T>(other, true);
  406|     24|  }
_ZN6hermes2vm15HermesValueCastINS0_7JSErrorELb1EE11assertValidENS0_11HermesValueE:
  275|     24|  static void assertValid(HermesValue x) {
  276|     24|#ifndef NDEBUG
  277|     24|    (void)vmcast<T>(x);
  278|     24|#endif
  279|     24|  }
_ZN6hermes2vm6HandleINS0_7JSErrorEEC2ERKNS0_10HandleBaseEb:
  307|     24|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_7JSErrorEEptEv:
  368|    312|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    312|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    312|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2ERKNS0_10HandleBaseEb:
  307|   405k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_8CallableEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|     24|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|     24|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|     24|    return Handle<T>(valueAddr, true);
  399|     24|  }
_ZNK6hermes2vm6HandleINS0_8CallableEEcvbEv:
  364|   405k|  explicit operator bool() const {
  365|   405k|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 405k, False: 0]
  |  Branch (365:40): [True: 405k, False: 24]
  ------------------
  366|   405k|  }
_ZN6hermes2vm13MutableHandleINS0_11HermesValueEEaSEONS0_12PseudoHandleIS2_EE:
  460|   404k|  MutableHandle &operator=(PseudoHandle<T> &&other) {
  461|   404k|    set(other.get());
  462|   404k|    other.invalidate();
  463|   404k|    return *this;
  464|   404k|  }
_ZN6hermes2vm18createPseudoHandleINS0_7JSErrorEEENS0_12PseudoHandleIT_EEPS4_:
  503|     24|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|     24|  return PseudoHandle<T>::create(ptr);
  505|     24|}
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEE6createEPS2_:
  155|     24|  static PseudoHandle<T> create(value_type value) {
  156|     24|    return PseudoHandle<T>(value);
  157|     24|  }
_ZN6hermes2vm12PseudoHandleINS0_7JSErrorEEC2EPS2_:
   67|     24|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm6HandleINS0_15StringPrimitiveEEC2ERKNS0_10HandleBaseEb:
  307|   459k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_7JSErrorEvEERKNS1_IT_EE:
  335|     48|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEptEv:
  368|  23.1k|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  23.1k|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  23.1k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3getEv:
  358|  23.2k|  value_type get() const {
  359|  23.2k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|  23.2k|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEcvbEv:
  364|     24|  explicit operator bool() const {
  365|     24|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 24, False: 0]
  |  Branch (365:40): [True: 24, False: 0]
  ------------------
  366|     24|  }
_ZNK6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEdeEv:
  372|  5.78k|  value_type operator*() const {
  373|  5.78k|    return get();
  374|  5.78k|  }
_ZN6hermes2vm6HandleINS0_8CallableEE6vmcastERKNS0_10HandleBaseE:
  403|    222|  static Handle<T> vmcast(const HandleBase &other) {
  404|    222|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    222|    return Handle<T>(other, true);
  406|    222|  }
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEEaSEPS2_:
  466|  77.3k|  MutableHandle &operator=(value_type value) {
  467|  77.3k|    set(value);
  468|  77.3k|    return *this;
  469|  77.3k|  }
_ZN6hermes2vm13MutableHandleINS0_8JSObjectEE3setEPS2_:
  475|  77.3k|  void set(value_type value) {
  476|  77.3k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  77.3k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEEC2ERKNS0_10HandleBaseEb:
  307|   499k|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_7JSArrayEE14vmcast_or_nullEPKNS0_17PinnedHermesValueE:
  396|      4|  static Handle<T> vmcast_or_null(const PinnedHermesValue *valueAddr) {
  397|      4|    (void)hermes::vm::vmcast_or_null<T>(*valueAddr);
  398|      4|    return Handle<T>(valueAddr, true);
  399|      4|  }
_ZNK6hermes2vm6HandleINS0_7JSArrayEEcvbEv:
  364|   758k|  explicit operator bool() const {
  365|   758k|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 758k, False: 0]
  |  Branch (365:40): [True: 758k, False: 4]
  ------------------
  366|   758k|  }
_ZN6hermes2vm6HandleINS0_7JSArrayEE6vmcastERKNS0_10HandleBaseE:
  403|   145k|  static Handle<T> vmcast(const HandleBase &other) {
  404|   145k|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|   145k|    return Handle<T>(other, true);
  406|   145k|  }
_ZNK6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE14unsafeGetValueEv:
  150|     99|  value_type unsafeGetValue() const {
  151|     99|    return value_;
  152|     99|  }
_ZN6hermes2vm18createPseudoHandleINS0_8JSRegExpEEENS0_12PseudoHandleIT_EEPS4_:
  503|    242|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|    242|  return PseudoHandle<T>::create(ptr);
  505|    242|}
_ZN6hermes2vm12PseudoHandleINS0_8JSRegExpEE6createEPS2_:
  155|    242|  static PseudoHandle<T> create(value_type value) {
  156|    242|    return PseudoHandle<T>(value);
  157|    242|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSRegExpEEC2EPS2_:
   67|    242|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm6HandleINS0_8JSRegExpEEptEv:
  368|  2.02M|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|  2.02M|    return HermesValueTraits<T>::arrow(*handleRef());
  370|  2.02M|  }
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSRegExpEvEERKNS1_IT_EE:
  335|   809k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8JSRegExpEE3getEv:
  358|   406k|  value_type get() const {
  359|   406k|    return HermesValueTraits<T>::decode(getHermesValue());
  360|   406k|  }
_ZN6hermes2vm13MutableHandleINS0_15StringPrimitiveEEC2EOS3_:
  453|   459k|  MutableHandle(MutableHandle &&sc) : Handle<T>(std::move(sc)) {}
_ZNK6hermes2vm12PseudoHandleINS0_9JSBooleanEE14getHermesValueEv:
  142|     99|  HermesValue getHermesValue() const {
  143|     99|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|     99|  }
_ZNK6hermes2vm12PseudoHandleINS0_8JSNumberEE14getHermesValueEv:
  142|     99|  HermesValue getHermesValue() const {
  143|     99|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|     99|  }
_ZN6hermes2vm12PseudoHandleINS0_8CallableEE6createEPS2_:
  155|      4|  static PseudoHandle<T> create(value_type value) {
  156|      4|    return PseudoHandle<T>(value);
  157|      4|  }
_ZN6hermes2vm12PseudoHandleINS0_8CallableEEC2EPS2_:
   67|      4|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_8CallableEE3getEv:
  126|      4|  value_type get() const {
  127|      4|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|      4|  }
_ZN6hermes2vm6HandleINS0_8JSStringEEC2EOS3_:
  338|    198|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_8JSStringEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|     99|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSStringEEC2EPKNS0_17PinnedHermesValueEb:
  305|     99|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSStringEEC2ERKS3_:
  337|     99|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_8JSNumberEEENS0_12PseudoHandleIT_EEPS4_:
  503|     99|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|     99|  return PseudoHandle<T>::create(ptr);
  505|     99|}
_ZN6hermes2vm12PseudoHandleINS0_8JSNumberEE6createEPS2_:
  155|     99|  static PseudoHandle<T> create(value_type value) {
  156|     99|    return PseudoHandle<T>(value);
  157|     99|  }
_ZN6hermes2vm12PseudoHandleINS0_8JSNumberEEC2EPS2_:
   67|     99|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_9JSBooleanEEENS0_12PseudoHandleIT_EEPS4_:
  503|     99|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|     99|  return PseudoHandle<T>::create(ptr);
  505|     99|}
_ZN6hermes2vm12PseudoHandleINS0_9JSBooleanEE6createEPS2_:
  155|     99|  static PseudoHandle<T> create(value_type value) {
  156|     99|    return PseudoHandle<T>(value);
  157|     99|  }
_ZN6hermes2vm12PseudoHandleINS0_9JSBooleanEEC2EPS2_:
   67|     99|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_6DomainEE14getHermesValueEv:
  142|     99|  HermesValue getHermesValue() const {
  143|     99|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|     99|  }
_ZN6hermes2vm6HandleINS0_6DomainEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     99|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     99|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     99|    return Handle<T>(valueAddr, true);
  392|     99|  }
_ZN6hermes2vm15HermesValueCastINS0_6DomainELb1EE11assertValidENS0_11HermesValueE:
  275|     99|  static void assertValid(HermesValue x) {
  276|     99|#ifndef NDEBUG
  277|     99|    (void)vmcast<T>(x);
  278|     99|#endif
  279|     99|  }
_ZN6hermes2vm6HandleINS0_6DomainEEC2EPKNS0_17PinnedHermesValueEb:
  305|     99|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZNK6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE14getHermesValueEv:
  142|     99|  HermesValue getHermesValue() const {
  143|     99|    assert(valid_ && "Pseudo handle has been invalidated");
  144|      0|    return traits_type::encode(value_);
  145|     99|  }
_ZN6hermes2vm6HandleINS0_8SymbolIDEEC2EOS3_:
  338|  4.35k|  Handle(Handle<T> &&) = default;
_ZN6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ERKS5_:
  337|  2.14k|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEENS0_12PseudoHandleIT_EEPS7_:
  503|  1.09k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  1.09k|  return PseudoHandle<T>::create(ptr);
  505|  1.09k|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEE6createEPS5_:
  155|  1.09k|  static PseudoHandle<T> create(value_type value) {
  156|  1.09k|    return PseudoHandle<T>(value);
  157|  1.09k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEEC2EPS5_:
   67|  1.09k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE6createEPS4_:
  155|   415k|  static PseudoHandle<T> create(value_type value) {
  156|   415k|    return PseudoHandle<T>(value);
  157|   415k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2EPS4_:
   67|   415k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_12PseudoHandleIT_EEPS6_:
  503|   415k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|   415k|  return PseudoHandle<T>::create(ptr);
  505|   415k|}
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2EOS5_:
   74|   416k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|   416k|    hnd.valid_ = false;
   76|   416k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSEOS5_:
   77|    114|  PseudoHandle &operator=(PseudoHandle &&hnd) {
   78|    114|    value_ = std::move(hnd.value_);
   79|    114|    valid_ = hnd.valid_;
   80|    114|    hnd.valid_ = false;
   81|    114|    return *this;
   82|    114|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentEE3getEv:
  126|  1.09k|  value_type get() const {
  127|  1.09k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  1.09k|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEC2ENS0_6HandleIS4_EE:
   91|    508|  PseudoHandle(Handle<T> handle) : value_(*handle) {}
_ZNK6hermes2vm6HandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEdeEv:
  372|  1.05k|  value_type operator*() const {
  373|  1.05k|    return get();
  374|  1.05k|  }
_ZNK6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEptEv:
  131|  3.79k|  arrow_type operator->() const {
  132|  3.79k|    assert(valid_ && "Pseudo handle has been invalidated");
  133|      0|    return traits_type::arrow(value_);
  134|  3.79k|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSEPS4_:
  466|    107|  MutableHandle &operator=(value_type value) {
  467|    107|    set(value);
  468|    107|    return *this;
  469|    107|  }
_ZN6hermes2vm13MutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEE3setEPS4_:
  475|    107|  void set(value_type value) {
  476|    107|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|    107|  }
_ZN6hermes2vm12PseudoHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEaSENS0_6HandleIS4_EE:
  101|    545|  PseudoHandle &operator=(Handle<T> handle) {
  102|    545|    value_ = *handle;
  103|    545|#ifndef NDEBUG
  104|    545|    valid_ = true;
  105|    545|#endif
  106|    545|    return *this;
  107|    545|  }
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEC2ERKS4_:
  337|    172|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIcEEEC2ERKS4_:
  337|    771|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIcEEE6vmcastERKNS0_10HandleBaseE:
  403|    651|  static Handle<T> vmcast(const HandleBase &other) {
  404|    651|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    651|    return Handle<T>(other, true);
  406|    651|  }
_ZN6hermes2vm15HermesValueCastINS0_23BufferedStringPrimitiveIcEELb1EE11assertValidENS0_11HermesValueE:
  275|    651|  static void assertValid(HermesValue x) {
  276|    651|#ifndef NDEBUG
  277|    651|    (void)vmcast<T>(x);
  278|    651|#endif
  279|    651|  }
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIcEEEC2ERKNS0_10HandleBaseEb:
  307|    651|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEE6vmcastERKNS0_10HandleBaseE:
  403|    152|  static Handle<T> vmcast(const HandleBase &other) {
  404|    152|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    152|    return Handle<T>(other, true);
  406|    152|  }
_ZN6hermes2vm15HermesValueCastINS0_23BufferedStringPrimitiveIDsEELb1EE11assertValidENS0_11HermesValueE:
  275|    152|  static void assertValid(HermesValue x) {
  276|    152|#ifndef NDEBUG
  277|    152|    (void)vmcast<T>(x);
  278|    152|#endif
  279|    152|  }
_ZN6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEEC2ERKNS0_10HandleBaseEb:
  307|    152|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEdeEv:
  372|    162|  value_type operator*() const {
  373|    162|    return get();
  374|    162|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEE3getEv:
  358|    162|  value_type get() const {
  359|    162|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    162|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEptEv:
  368|    162|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    162|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    162|  }
_ZNK6hermes2vm6HandleINS0_23BufferedStringPrimitiveIDsEEE3getEv:
  358|    152|  value_type get() const {
  359|    152|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    152|  }
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIDsEEEC2ERNS0_15HandleRootOwnerEPS3_:
  317|    162|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIcEEEdeEv:
  372|    711|  value_type operator*() const {
  373|    711|    return get();
  374|    711|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIcEEE3getEv:
  358|    711|  value_type get() const {
  359|    711|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    711|  }
_ZNK6hermes2vm6HandleINS0_23ExternalStringPrimitiveIcEEEptEv:
  368|    711|  typename HermesValueTraits<T>::arrow_type operator->() const {
  369|    711|    return HermesValueTraits<T>::arrow(*handleRef());
  370|    711|  }
_ZNK6hermes2vm6HandleINS0_23BufferedStringPrimitiveIcEEE3getEv:
  358|    651|  value_type get() const {
  359|    651|    return HermesValueTraits<T>::decode(getHermesValue());
  360|    651|  }
_ZN6hermes2vm6HandleINS0_23ExternalStringPrimitiveIcEEEC2ERNS0_15HandleRootOwnerEPS3_:
  317|    711|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  13.3k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_7JSArrayEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|   404k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_7JSArrayEEaSEPS2_:
  466|   404k|  MutableHandle &operator=(value_type value) {
  467|   404k|    set(value);
  468|   404k|    return *this;
  469|   404k|  }
_ZN6hermes2vm13MutableHandleINS0_7JSArrayEE3setEPS2_:
  475|   404k|  void set(value_type value) {
  476|   404k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|   404k|  }
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEEC2EPS2_:
   67|  4.05k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZNK6hermes2vm12PseudoHandleINS0_17NativeConstructorEE3getEv:
  126|  4.05k|  value_type get() const {
  127|  4.05k|    assert(valid_ && "Pseudo handle has been invalidated");
  128|      0|    return value_;
  129|  4.05k|  }
_ZN6hermes2vm6HandleINS0_17NativeConstructorEEC2ERNS0_15HandleRootOwnerEPS2_:
  317|  4.05k|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm12PseudoHandleINS0_17NativeConstructorEE10invalidateEv:
  120|  4.05k|  void invalidate() {
  121|  4.05k|#ifndef NDEBUG
  122|  4.05k|    valid_ = false;
  123|  4.05k|#endif
  124|  4.05k|  }
_ZN6hermes2vm6HandleINS0_8CallableEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  4.05k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_17NativeConstructorEvEERKNS1_IT_EE:
  335|  4.15k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_11HermesValueEEC2INS0_14NativeFunctionEvEERKNS1_IT_EE:
  335|  36.9k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_14NativeFunctionEE6vmcastERKNS0_10HandleBaseE:
  403|    198|  static Handle<T> vmcast(const HandleBase &other) {
  404|    198|    HermesValueCast<T>::assertValid(other.getHermesValue());
  405|    198|    return Handle<T>(other, true);
  406|    198|  }
_ZN6hermes2vm15HermesValueCastINS0_14NativeFunctionELb1EE11assertValidENS0_11HermesValueE:
  275|    198|  static void assertValid(HermesValue x) {
  276|    198|#ifndef NDEBUG
  277|    198|    (void)vmcast<T>(x);
  278|    198|#endif
  279|    198|  }
_ZN6hermes2vm6HandleINS0_14NativeFunctionEEC2ERKNS0_10HandleBaseEb:
  307|    198|  explicit Handle(const HandleBase &hb, bool) : HandleBase(hb) {}
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEEC2ERNS0_15HandleRootOwnerEPS2_:
  450|  8.31k|      : Handle<T>(runtime, value) {}
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEEaSEPS2_:
  466|  4.25k|  MutableHandle &operator=(value_type value) {
  467|  4.25k|    set(value);
  468|  4.25k|    return *this;
  469|  4.25k|  }
_ZN6hermes2vm13MutableHandleINS0_14NativeFunctionEE3setEPS2_:
  475|  4.25k|  void set(value_type value) {
  476|  4.25k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  4.25k|  }
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE60EEEEC2ERKS5_:
  337|    198|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE60EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|     99|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_12SingleObjectILNS0_8CellKindE60EEEvEERKNS1_IT_EE:
  335|  4.45k|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_12SingleObjectILNS0_8CellKindE59EEEEC2ERNS0_15HandleRootOwnerEPS4_:
  317|     99|      : HandleBase(runtime, HermesValueTraits<T>::encode(value)){};
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_12SingleObjectILNS0_8CellKindE59EEEvEERKNS1_IT_EE:
  335|    396|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEaSEPS4_:
  466|  5.76k|  MutableHandle &operator=(value_type value) {
  467|  5.76k|    set(value);
  468|  5.76k|    return *this;
  469|  5.76k|  }
_ZN6hermes2vm13MutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEE3setEPS4_:
  475|  5.76k|  void set(value_type value) {
  476|  5.76k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  5.76k|  }
_ZN6hermes2vm6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEC2ERKS5_:
  337|     99|  Handle(const Handle<T> &) = default;
_ZN6hermes2vm6HandleINS0_8JSStringEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     99|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     99|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     99|    return Handle<T>(valueAddr, true);
  392|     99|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSStringELb1EE11assertValidENS0_11HermesValueE:
  275|     99|  static void assertValid(HermesValue x) {
  276|     99|#ifndef NDEBUG
  277|     99|    (void)vmcast<T>(x);
  278|     99|#endif
  279|     99|  }
_ZN6hermes2vm6HandleINS0_8JSNumberEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     99|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     99|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     99|    return Handle<T>(valueAddr, true);
  392|     99|  }
_ZN6hermes2vm15HermesValueCastINS0_8JSNumberELb1EE11assertValidENS0_11HermesValueE:
  275|     99|  static void assertValid(HermesValue x) {
  276|     99|#ifndef NDEBUG
  277|     99|    (void)vmcast<T>(x);
  278|     99|#endif
  279|     99|  }
_ZN6hermes2vm6HandleINS0_8JSNumberEEC2EPKNS0_17PinnedHermesValueEb:
  305|     99|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_8JSNumberEvEERKNS1_IT_EE:
  335|    693|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZN6hermes2vm6HandleINS0_9JSBooleanEE6vmcastEPKNS0_17PinnedHermesValueE:
  389|     99|  static Handle<T> vmcast(const PinnedHermesValue *valueAddr) {
  390|     99|    HermesValueCast<T>::assertValid(*valueAddr);
  391|     99|    return Handle<T>(valueAddr, true);
  392|     99|  }
_ZN6hermes2vm15HermesValueCastINS0_9JSBooleanELb1EE11assertValidENS0_11HermesValueE:
  275|     99|  static void assertValid(HermesValue x) {
  276|     99|#ifndef NDEBUG
  277|     99|    (void)vmcast<T>(x);
  278|     99|#endif
  279|     99|  }
_ZN6hermes2vm6HandleINS0_9JSBooleanEEC2EPKNS0_17PinnedHermesValueEb:
  305|     99|      : HandleBase(const_cast<PinnedHermesValue *>(valueAddr)) {}
_ZN6hermes2vm6HandleINS0_8JSObjectEEC2INS0_9JSBooleanEvEERKNS1_IT_EE:
  335|    297|  Handle(const Handle<U> &other) : HandleBase(other) {}
_ZNK6hermes2vm6HandleINS0_8JSRegExpEEcvbEv:
  364|   406k|  explicit operator bool() const {
  365|   406k|    return handleRef()->isPointer() && handleRef()->getPointer();
  ------------------
  |  Branch (365:12): [True: 406k, False: 0]
  |  Branch (365:40): [True: 406k, False: 0]
  ------------------
  366|   406k|  }
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEE6createEPS2_:
  155|  19.2k|  static PseudoHandle<T> create(value_type value) {
  156|  19.2k|    return PseudoHandle<T>(value);
  157|  19.2k|  }
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEEC2EPS2_:
   67|  19.2k|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_15DictPropertyMapEEENS0_12PseudoHandleIT_EEPS4_:
  503|  19.2k|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|  19.2k|  return PseudoHandle<T>::create(ptr);
  505|  19.2k|}
_ZN6hermes2vm12PseudoHandleINS0_15DictPropertyMapEEC2EOS3_:
   74|  19.2k|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|  19.2k|    hnd.valid_ = false;
   76|  19.2k|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEEaSEPS2_:
  466|  9.82k|  MutableHandle &operator=(value_type value) {
  467|  9.82k|    set(value);
  468|  9.82k|    return *this;
  469|  9.82k|  }
_ZN6hermes2vm13MutableHandleINS0_15DictPropertyMapEE3setEPS2_:
  475|  9.82k|  void set(value_type value) {
  476|  9.82k|    *HandleBase::handleRef() = HermesValueTraits<T>::encode(value);
  477|  9.82k|  }
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEE6createEPS2_:
  155|     99|  static PseudoHandle<T> create(value_type value) {
  156|     99|    return PseudoHandle<T>(value);
  157|     99|  }
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEEC2EPS2_:
   67|     99|  explicit PseudoHandle(value_type value) : value_(value) {}
_ZN6hermes2vm18createPseudoHandleINS0_14OrderedHashMapEEENS0_12PseudoHandleIT_EEPS4_:
  503|     99|inline PseudoHandle<T> createPseudoHandle(T *ptr) {
  504|     99|  return PseudoHandle<T>::create(ptr);
  505|     99|}
_ZN6hermes2vm12PseudoHandleINS0_14OrderedHashMapEEC2EOS3_:
   74|     99|  PseudoHandle(PseudoHandle &&hnd) : value_(hnd.value_), valid_(hnd.valid_) {
   75|     99|    hnd.valid_ = false;
   76|     99|  }

_ZN6hermes2vm15HandleRootOwner17getUndefinedValueEv:
   61|    242|inline Handle<HermesValue> HandleRootOwner::getUndefinedValue() {
   62|    242|  return Handle<HermesValue>(&undefinedValue_);
   63|    242|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|   430k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|   430k|  return Handle<T>(*this, vmcast<T>(value));
   30|   430k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleENS0_11HermesValueE:
   17|  52.1k|inline Handle<HermesValue> HandleRootOwner::makeHandle(HermesValue value) {
   18|       |  // This is the same as Handle<HermesValue>(getTopGCScope(), value), but it's
   19|       |  // this way for historical reasons.  The source could be updated for clarity
   20|       |  // if the generated code doesn't change.
   21|  52.1k|  return Handle<HermesValue>(*this, value);
   22|  52.1k|}
_ZN6hermes2vm15HandleRootOwner20newPinnedHermesValueENS0_11HermesValueE:
  101|  5.66M|    HermesValue value) {
  102|  5.66M|  assert(topGCScope_ && "no active GCScope");
  103|      0|  return newPinnedHermesValue(topGCScope_, value);
  104|  5.66M|}
_ZN6hermes2vm15HandleRootOwner20newPinnedHermesValueEPNS0_7GCScopeENS0_11HermesValueE:
   95|  5.66M|    HermesValue value) {
   96|  5.66M|  assert(inScope && "Target GCScope can't be null");
   97|      0|  return inScope->newPinnedHermesValue(value);
   98|  5.66M|}
_ZN6hermes2vm15HandleRootOwner13getTopGCScopeEv:
   89|  5.73M|inline GCScope *HandleRootOwner::getTopGCScope() {
   90|  5.73M|  return topGCScope_;
   91|  5.73M|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSObjectEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  1.59k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  1.59k|  Handle<T> res{*this, pseudo.get()};
   37|  1.59k|  pseudo.invalidate();
   38|  1.59k|  return res;
   39|  1.59k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_11EnvironmentEEENS0_6HandleIT_EEv:
   57|    155|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|    155|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|    155|}
_ZN6hermes2vm15HandleRootOwner10makeHandleENS0_8SymbolIDE:
   31|   207k|inline Handle<SymbolID> HandleRootOwner::makeHandle(SymbolID value) {
   32|   207k|  return Handle<SymbolID>(*this, value);
   33|   207k|}
_ZN6hermes2vm15HandleRootOwner12getZeroValueEv:
   77|   404k|inline Handle<HermesValue> HandleRootOwner::getZeroValue() {
   78|   404k|  return Handle<HermesValue>(&zeroValue_);
   79|   404k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEPS5_:
   24|  50.3k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  50.3k|  return Handle<T>(*this, p);
   26|  50.3k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|   802k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|   802k|  Handle<T> res{*this, pseudo.get()};
   37|   802k|  pseudo.invalidate();
   38|   802k|  return res;
   39|   802k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HermesValueEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|   932k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|   932k|  Handle<T> res{*this, pseudo.get()};
   37|   932k|  pseudo.invalidate();
   38|   932k|  return res;
   39|   932k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_8JSObjectEEENS0_6HandleIT_EEv:
   57|   447k|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|   447k|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|   447k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_6DomainEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|    155|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|    155|  Handle<T> res{*this, pseudo.get()};
   37|    155|  pseudo.invalidate();
   38|    155|  return res;
   39|    155|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_6DomainEEENS0_6HandleIT_EEPS5_:
   24|  5.19k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  5.19k|  return Handle<T>(*this, p);
   26|  5.19k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSObjectEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    922|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    922|  return Handle<T>(*this, vmcast<T>(value));
   30|    922|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEENS0_13MutableHandleIT_EEPS7_:
   52|     99|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|     99|  return MutableHandle<T>(*this, p);
   54|     99|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_13BoundFunctionEEENS0_6HandleIT_EEPS5_:
   24|     99|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     99|  return Handle<T>(*this, p);
   26|     99|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_14NativeFunctionEEENS0_6HandleIT_EEPS5_:
   24|  42.5k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|  42.5k|  return Handle<T>(*this, p);
   26|  42.5k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EEPS5_:
   24|   114k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|   114k|  return Handle<T>(*this, p);
   26|   114k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_11HiddenClassEEENS0_6HandleIT_EEv:
   57|    119|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|    119|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|    119|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  56.8k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  56.8k|  return Handle<T>(*this, vmcast<T>(value));
   30|  56.8k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  9.45k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  9.45k|  Handle<T> res{*this, pseudo.get()};
   37|  9.45k|  pseudo.invalidate();
   38|  9.45k|  return res;
   39|  9.45k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_15StringPrimitiveEEENS0_6HandleIT_EEv:
   57|  34.3k|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|  34.3k|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|  34.3k|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_11HiddenClassEEENS0_13MutableHandleIT_EEPS5_:
   52|    232|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|    232|  return MutableHandle<T>(*this, p);
   54|    232|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSErrorEEENS0_6HandleIT_EEPS5_:
   24|     24|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     24|  return Handle<T>(*this, p);
   26|     24|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_16PropertyAccessorEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  4.15k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  4.15k|  return Handle<T>(*this, vmcast<T>(value));
   30|  4.15k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_6HandleIT_EEONS0_12PseudoHandleIS7_EE:
   35|    552|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|    552|  Handle<T> res{*this, pseudo.get()};
   37|    552|  pseudo.invalidate();
   38|    552|  return res;
   39|    552|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_18SegmentedArrayBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EEPS7_:
   52|    615|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|    615|  return MutableHandle<T>(*this, p);
   54|    615|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSArrayEEENS0_6HandleIT_EEPS5_:
   24|   428k|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|   428k|  return Handle<T>(*this, p);
   26|   428k|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_8CallableEEENS0_6HandleIT_EEv:
   57|     24|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|     24|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|     24|}
_ZN6hermes2vm15HandleRootOwner17makeMutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EEPS7_:
   52|     24|inline MutableHandle<T> HandleRootOwner::makeMutableHandle(T *p) {
   53|     24|  return MutableHandle<T>(*this, p);
   54|     24|}
_ZN6hermes2vm15HandleRootOwner14makeNullHandleINS0_7JSArrayEEENS0_6HandleIT_EEv:
   57|      4|inline Handle<T> HandleRootOwner::makeNullHandle() {
   58|      4|  return Handle<T>::vmcast_or_null(&nullPointer_);
   59|      4|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8CallableEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    198|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    198|  return Handle<T>(*this, vmcast<T>(value));
   30|    198|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8JSStringEEENS0_6HandleIT_EEPS5_:
   24|     99|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|     99|  return Handle<T>(*this, p);
   26|     99|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_7JSErrorEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|     24|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|     24|  Handle<T> res{*this, pseudo.get()};
   37|     24|  pseudo.invalidate();
   38|     24|  return res;
   39|     24|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIDsEEEENS0_6HandleIT_EEPS6_:
   24|    152|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|    152|  return Handle<T>(*this, p);
   26|    152|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIDsEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|     10|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|     10|  return Handle<T>(*this, vmcast<T>(value));
   30|     10|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIcEEEENS0_6HandleIT_EEPS6_:
   24|    651|inline Handle<T> HandleRootOwner::makeHandle(T *p) {
   25|    651|  return Handle<T>(*this, p);
   26|    651|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_23ExternalStringPrimitiveIcEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|     60|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|     60|  return Handle<T>(*this, vmcast<T>(value));
   30|     60|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_17NativeConstructorEEENS0_6HandleIT_EEONS0_12PseudoHandleIS5_EE:
   35|  4.05k|inline Handle<T> HandleRootOwner::makeHandle(PseudoHandle<T> &&pseudo) {
   36|  4.05k|  Handle<T> res{*this, pseudo.get()};
   37|  4.05k|  pseudo.invalidate();
   38|  4.05k|  return res;
   39|  4.05k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_14NativeFunctionEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|    198|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|    198|  return Handle<T>(*this, vmcast<T>(value));
   30|    198|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_12SingleObjectILNS0_8CellKindE60EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|     99|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|     99|  return Handle<T>(*this, vmcast<T>(value));
   30|     99|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_12SingleObjectILNS0_8CellKindE59EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|     99|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|     99|  return Handle<T>(*this, vmcast<T>(value));
   30|     99|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_6HandleIT_EENS0_11HermesValueE:
   28|  5.86k|inline Handle<T> HandleRootOwner::makeHandle(HermesValue value) {
   29|  5.86k|  return Handle<T>(*this, vmcast<T>(value));
   30|  5.86k|}
_ZN6hermes2vm15HandleRootOwner10makeHandleINS0_8CallableEEENS0_6HandleIT_EEONS0_12PseudoHandleINS0_11HermesValueEEE:
   42|      4|    PseudoHandle<HermesValue> &&pseudo) {
   43|      4|  Handle<T> res{*this, PseudoHandle<T>::vmcast(std::move(pseudo)).get()};
   44|      4|  return res;
   45|      4|}

_ZN6hermes2vm7GCScopeC2ERNS0_15HandleRootOwnerEPKcj:
  306|   720k|        chunks_({(PinnedHermesValue *)inlineStorage_}) {
  307|   720k|    runtime.topGCScope_ = this;
  308|   720k|  }
_ZN6hermes2vm16GCScopeDebugBaseD2Ev:
  182|   720k|  ~GCScopeDebugBase() {
  183|   720k|    assert(numActiveHandles_ == 0 && "Destroying GCScope with active handles");
  184|   720k|  }
_ZN6hermes2vm7GCScope20newPinnedHermesValueENS0_11HermesValueE:
  442|  5.66M|  PinnedHermesValue *newPinnedHermesValue(HermesValue value) {
  443|  5.66M|    assert(
  444|  5.66M|        getHandleCountDbg() < handlesLimit_ &&
  445|  5.66M|        "Too many handles allocated in GCScope");
  446|      0|    assert(runtime_.noHandleLevel_ == 0 && "No handles allowed right now.");
  447|       |
  448|      0|    setHandleCountDbg(getHandleCountDbg() + 1);
  449|       |#ifdef HERMESVM_DEBUG_TRACK_GCSCOPE_HANDLES
  450|       |    if (numAllocatedHandles_ > maxAllocatedHandles_)
  451|       |      maxAllocatedHandles_ = numAllocatedHandles_;
  452|       |#endif
  453|       |
  454|       |    /// Check the fast path: is there space in the current chunk?
  455|  5.66M|    if (LLVM_LIKELY(next_ < curChunkEnd_)) {
  ------------------
  |  |  188|  5.66M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.58M, False: 70.7k]
  |  |  ------------------
  ------------------
  456|       |      /// Initialize the new handle with the specified value and return.
  457|  5.58M|      return new (next_++) PinnedHermesValue(value);
  458|  5.58M|    }
  459|       |
  460|       |    /// Slow path: allocate a new chunk.
  461|  70.7k|    return _newChunkAndPHV(value);
  462|  5.66M|  }
_ZNK6hermes2vm7GCScope17getHandleCountDbgEv:
  331|  12.0M|  LLVM_ATTRIBUTE_ALWAYS_INLINE size_t getHandleCountDbg() const {
  332|  12.0M|    return numAllocatedHandles_;
  333|  12.0M|  }
_ZN6hermes2vm7GCScope17setHandleCountDbgEj:
  335|  7.02M|  LLVM_ATTRIBUTE_ALWAYS_INLINE void setHandleCountDbg(unsigned count) {
  336|  7.02M|    numAllocatedHandles_ = count;
  337|  7.02M|  }
_ZN6hermes2vm7GCScope6MarkerC2EPNS0_17PinnedHermesValueEj:
  358|   478k|        : next(next), curChunkIndex(curChunkIndex) {}
_ZNK6hermes2vm7GCScope12createMarkerEv:
  369|   478k|  Marker createMarker() const {
  370|   478k|    return Marker(next_, curChunkIndex_);
  371|   478k|  }
_ZN6hermes2vm7GCScope13flushToMarkerENS1_6MarkerE:
  375|  1.09M|  void flushToMarker(Marker marker) {
  376|  1.09M|    assert(
  377|  1.09M|        marker.curChunkIndex <= curChunkIndex_ &&
  378|  1.09M|        "trying to reset to a higher chunk");
  379|      0|    assert(
  380|  1.09M|        (marker.curChunkIndex < curChunkIndex_ || marker.next <= next_) &&
  381|  1.09M|        "trying to reset to a higher next pointer");
  382|      0|    PinnedHermesValue *const chunkStart = chunks_[marker.curChunkIndex];
  383|  1.09M|    PinnedHermesValue *const chunkEnd = chunkStart + CHUNK_SIZE;
  384|       |    // Write empty values into the soon-to-be invalid chunk slots to catch bugs.
  385|  1.09M|    invalidateFreedHandleValues(marker.curChunkIndex, marker.next);
  386|  1.09M|    curChunkIndex_ = marker.curChunkIndex;
  387|  1.09M|    curChunkEnd_ = chunkEnd;
  388|       |    // Ensure that the marker is associated with this GCScope by validating the
  389|       |    // saved 'next' pointer - it must point within the chunk. Note that it can
  390|       |    // be equal to curChunkEnd_ if the chunk had just been exhausted before the
  391|       |    // marker was saved.
  392|  1.09M|    assert(
  393|  1.09M|        marker.next >= chunkStart && marker.next <= curChunkEnd_ &&
  394|  1.09M|        "savedNext is not within the current chunk");
  395|      0|    next_ = marker.next;
  396|       |
  397|  1.09M|    setHandleCountDbg(
  398|  1.09M|        curChunkIndex_ * CHUNK_SIZE + (next_ - chunks_[curChunkIndex_]));
  399|  1.09M|  }
_ZN6hermes2vm7GCScope17flushToSmallCountEj:
  403|   263k|  void flushToSmallCount(unsigned numHandlesToPreserve) {
  404|   263k|    assert(
  405|   263k|        numHandlesToPreserve <= CHUNK_SIZE && "numHandles exceeds CHUNK_SIZE");
  406|      0|    assert(
  407|   263k|        numHandlesToPreserve <= getHandleCountDbg() &&
  408|   263k|        "numHandles exceeds the actual number of handles");
  409|       |
  410|      0|    auto *chunk = (PinnedHermesValue *)inlineStorage_;
  411|       |    // Write empty values into the soon-to-be invalid chunk slots to catch bugs.
  412|   263k|    invalidateFreedHandleValues(0, chunk + numHandlesToPreserve);
  413|   263k|    next_ = chunk + numHandlesToPreserve;
  414|   263k|    curChunkEnd_ = chunk + CHUNK_SIZE;
  415|   263k|    curChunkIndex_ = 0;
  416|       |
  417|   263k|    setHandleCountDbg(numHandlesToPreserve);
  418|   263k|  }
_ZN6hermes2vm7GCScope15clearAllHandlesEv:
  422|  3.26k|  void clearAllHandles() {
  423|  3.26k|    flushToSmallCount(0);
  424|  3.26k|  }
_ZN6hermes2vm17GCScopeMarkerRAIIC2ERNS0_15HandleRootOwnerE:
  489|  74.1k|      : gcScope_(runtime.getTopGCScope()), marker_(gcScope_->createMarker()) {}
_ZN6hermes2vm17GCScopeMarkerRAII5flushEv:
  498|  76.1k|  void flush() {
  499|  76.1k|    gcScope_->flushToMarker(marker_);
  500|  76.1k|  }
_ZN6hermes2vm17GCScopeMarkerRAIID2Ev:
  502|  74.1k|  ~GCScopeMarkerRAII() {
  503|  74.1k|    flush();
  504|  74.1k|  }
_ZN6hermes2vm15HandleRootOwnerD2Ev:
   60|     99|  virtual ~HandleRootOwner() = default;

_ZN6hermes2vm17isSizeHeapAlignedEj:
   32|  49.1M|constexpr inline bool isSizeHeapAligned(gcheapsize_t size) {
   33|  49.1M|  return (size & (HeapAlign - 1)) == 0;
   34|  49.1M|}
_ZN6hermes2vm13heapAlignSizeEj:
   26|  10.1M|constexpr inline uint32_t heapAlignSize(gcheapsize_t size) {
   27|  10.1M|  return llvh::alignTo<HeapAlign>(size);
   28|  10.1M|}

_ZN6hermes2vm11HeapRuntimeINS0_7RuntimeEE6createENSt3__110shared_ptrINS0_15StorageProviderEEE:
   31|     99|  static std::shared_ptr<RT> create(std::shared_ptr<StorageProvider> sp) {
   32|     99|    auto hrt = std::shared_ptr<HeapRuntime>(new HeapRuntime(std::move(sp)));
   33|     99|    return std::shared_ptr<RT>(hrt, hrt->runtime_);
   34|     99|  }
_ZN6hermes2vm11HeapRuntimeINS0_7RuntimeEEC2ENSt3__110shared_ptrINS0_15StorageProviderEEE:
   37|     99|  HeapRuntime(std::shared_ptr<StorageProvider> sp) : sp_{std::move(sp)} {
   38|     99|    auto ptrOrError = sp_->newStorage("hermes-rt");
   39|     99|    if (!ptrOrError)
  ------------------
  |  Branch (39:9): [True: 0, False: 99]
  ------------------
   40|      0|      hermes_fatal("Cannot initialize Runtime storage.", ptrOrError.getError());
   41|     99|    static_assert(sizeof(RT) < AlignedStorage::size(), "Segments too small.");
   42|     99|    runtime_ = static_cast<RT *>(*ptrOrError);
   43|     99|  }
_ZN6hermes2vm11HeapRuntimeINS0_7RuntimeEED2Ev:
   22|     99|  ~HeapRuntime() {
   23|     99|    runtime_->~RT();
   24|     99|    sp_->deleteStorage(runtime_);
   25|     99|  }

_ZN6hermes2vm11HermesValue7setInGCES1_RNS0_7HadesGCE:
   20|  36.1k|void HermesValue::setInGC(HermesValue hv, GC &gc) {
   21|  36.1k|  setNoBarrier(hv);
   22|  36.1k|  assert(gc.calledByGC());
   23|  36.1k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE3setINSt3__117integral_constantIbLb1EEEEEvS2_RNS0_7HadesGCE:
   52|  4.16M|inline void GCHermesValueBase<HVType>::set(HVType hv, GC &gc) {
   53|  4.16M|  if (hv.isPointer()) {
  ------------------
  |  Branch (53:7): [True: 1.66M, False: 2.49M]
  ------------------
   54|  1.66M|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  1.66M|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   55|      0|        gc.validPointer(hv.getPointer(gc.getPointerBase())) &&
   56|      0|        "Setting an invalid pointer into a GCHermesValue");
   57|      0|    assert(
   58|  1.66M|        NeedsBarriers::value ||
   59|  1.66M|        !gc.needsWriteBarrier(
   60|  1.66M|            this, static_cast<GCCell *>(hv.getPointer(gc.getPointerBase()))));
   61|  1.66M|  }
   62|  4.16M|  if (NeedsBarriers::value)
  ------------------
  |  Branch (62:7): [Folded - Ignored]
  ------------------
   63|  4.16M|    gc.writeBarrier(this, hv);
   64|  4.16M|  HVType::setNoBarrier(hv);
   65|  4.16M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE3setINSt3__117integral_constantIbLb1EEEEEvS2_RNS0_7HadesGCE:
   52|  4.34k|inline void GCHermesValueBase<HVType>::set(HVType hv, GC &gc) {
   53|  4.34k|  if (hv.isPointer()) {
  ------------------
  |  Branch (53:7): [True: 4.24k, False: 104]
  ------------------
   54|  4.24k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  4.24k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
   55|      0|        gc.validPointer(hv.getPointer(gc.getPointerBase())) &&
   56|      0|        "Setting an invalid pointer into a GCHermesValue");
   57|      0|    assert(
   58|  4.24k|        NeedsBarriers::value ||
   59|  4.24k|        !gc.needsWriteBarrier(
   60|  4.24k|            this, static_cast<GCCell *>(hv.getPointer(gc.getPointerBase()))));
   61|  4.24k|  }
   62|  4.34k|  if (NeedsBarriers::value)
  ------------------
  |  Branch (62:7): [Folded - Ignored]
  ------------------
   63|  4.34k|    gc.writeBarrier(this, hv);
   64|  4.34k|  HVType::setNoBarrier(hv);
   65|  4.34k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE18uninitialized_fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
  106|    452|    GC &gc) {
  107|    452|  if (fill.isPointer()) {
  ------------------
  |  Branch (107:7): [True: 0, False: 452]
  ------------------
  108|      0|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (108:28): [True: 0, False: 0]
  ------------------
  109|       |      // Use the constructor write barrier. Assume it needs barriers.
  110|      0|      new (&*cur) GCHermesValueBase<HVType>(fill, gc);
  111|      0|    }
  112|    452|  } else {
  113|  4.12k|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (113:28): [True: 3.67k, False: 452]
  ------------------
  114|       |      // Use a constructor that doesn't handle pointer values.
  115|  3.67k|      new (&*cur) GCHermesValueBase<HVType>(fill, gc, nullptr);
  116|  3.67k|    }
  117|    452|  }
  118|    452|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE18uninitialized_fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
  106|  2.19M|    GC &gc) {
  107|  2.19M|  if (fill.isPointer()) {
  ------------------
  |  Branch (107:7): [True: 0, False: 2.19M]
  ------------------
  108|      0|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (108:28): [True: 0, False: 0]
  ------------------
  109|       |      // Use the constructor write barrier. Assume it needs barriers.
  110|      0|      new (&*cur) GCHermesValueBase<HVType>(fill, gc);
  111|      0|    }
  112|  2.19M|  } else {
  113|  5.86M|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (113:28): [True: 3.66M, False: 2.19M]
  ------------------
  114|       |      // Use a constructor that doesn't handle pointer values.
  115|  3.66M|      new (&*cur) GCHermesValueBase<HVType>(fill, gc, nullptr);
  116|  3.66M|    }
  117|  2.19M|  }
  118|  2.19M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCE:
   34|     99|GCHermesValueBase<HVType>::GCHermesValueBase(HVType hv, GC &gc) : HVType{hv} {
   35|     99|  assert(!hv.isPointer() || hv.getPointer());
   36|     99|  if (NeedsBarriers::value)
  ------------------
  |  Branch (36:7): [Folded - Ignored]
  ------------------
   37|     99|    gc.constructorWriteBarrier(this, hv);
   38|     99|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCE:
   34|     24|GCHermesValueBase<HVType>::GCHermesValueBase(HVType hv, GC &gc) : HVType{hv} {
   35|     24|  assert(!hv.isPointer() || hv.getPointer());
   36|     24|  if (NeedsBarriers::value)
  ------------------
  |  Branch (36:7): [Folded - Ignored]
  ------------------
   37|     24|    gc.constructorWriteBarrier(this, hv);
   38|     24|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCEDn:
   43|  3.66M|    : HVType{hv} {
   44|  3.66M|  assert(!hv.isPointer());
   45|       |  // No need to invoke any write barriers here, since the old value is
   46|       |  // uninitialized (so the snapshot barrier does not apply), and the new value
   47|       |  // is not a pointer (so the generational/relocation barrier does not apply).
   48|  3.66M|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEE9setNonPtrES2_RNS0_7HadesGCE:
   68|    198|void GCHermesValueBase<HVType>::setNonPtr(HVType hv, GC &gc) {
   69|    198|  assert(!hv.isPointer());
   70|      0|  gc.snapshotWriteBarrier(this);
   71|    198|  HVType::setNoBarrier(hv);
   72|    198|}
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2INSt3__117integral_constantIbLb1EEEEES2_RNS0_7HadesGCEDn:
   43|  3.67k|    : HVType{hv} {
   44|  3.67k|  assert(!hv.isPointer());
   45|       |  // No need to invoke any write barriers here, since the old value is
   46|       |  // uninitialized (so the snapshot barrier does not apply), and the new value
   47|       |  // is not a pointer (so the generational/relocation barrier does not apply).
   48|  3.67k|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE18uninitialized_copyEPS3_S4_S4_RNS0_7HadesGCE:
  188|  5.87k|    GC &gc) {
  189|  5.87k|#ifndef NDEBUG
  190|  5.87k|  uintptr_t fromFirst = reinterpret_cast<uintptr_t>(first),
  191|  5.87k|            fromLast = reinterpret_cast<uintptr_t>(last);
  192|  5.87k|  uintptr_t toFirst = reinterpret_cast<uintptr_t>(result),
  193|  5.87k|            toLast = toFirst + fromFirst - fromLast;
  194|  5.87k|  assert(
  195|  5.87k|      (toLast < fromFirst || fromLast < toFirst) &&
  196|  5.87k|      "Uninitialized range cannot overlap with an initialized one.");
  197|      0|#endif
  198|       |
  199|      0|  gc.constructorWriteBarrierRange(result, last - first);
  200|       |  // memcpy is fine for an uninitialized copy.
  201|  5.87k|  std::memcpy(
  202|  5.87k|      reinterpret_cast<void *>(result), first, (last - first) * sizeof(HVType));
  203|  5.87k|  return result + (last - first);
  204|  5.87k|}
_ZN6hermes2vm17PinnedHermesValueaSINS0_11HermesValueEEERS1_ONS0_12PseudoHandleIT_EE:
   26|     99|inline PinnedHermesValue &PinnedHermesValue::operator=(PseudoHandle<T> &&hv) {
   27|     99|  setNoBarrier(hv.getHermesValue());
   28|     99|  hv.invalidate();
   29|     99|  return *this;
   30|     99|}
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EE4fillIPS3_EEvT_S6_S2_RNS0_7HadesGCE:
   87|     24|    GC &gc) {
   88|     24|  if (fill.isPointer()) {
  ------------------
  |  Branch (88:7): [True: 0, False: 24]
  ------------------
   89|      0|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (89:28): [True: 0, False: 0]
  ------------------
   90|      0|      cur->set(fill, gc);
   91|      0|    }
   92|     24|  } else {
   93|     24|    for (auto cur = start; cur != end; ++cur) {
  ------------------
  |  Branch (93:28): [True: 0, False: 24]
  ------------------
   94|      0|      cur->setNonPtr(fill, gc);
   95|      0|    }
   96|     24|  }
   97|     24|}

_ZN6hermes2vm11HermesValue14encodeNaNValueEv:
  356|     99|  static HermesValue encodeNaNValue() {
  357|     99|    return HermesValue(
  358|     99|        llvh::DoubleToBits(std::numeric_limits<double>::quiet_NaN()));
  359|     99|  }
_ZN6hermes2vm11HermesValueC2Em:
  539|  3.37M|  constexpr explicit HermesValue(uint64_t val) : raw_(val) {}
_ZN6hermes2vm11HermesValue17encodeDoubleValueEd:
  326|  1.73M|  inline static HermesValue encodeDoubleValue(double num) {
  327|  1.73M|    HermesValue RV(llvh::DoubleToBits(num));
  328|  1.73M|    assert(RV.isDouble());
  329|      0|    return RV;
  330|  1.73M|  }
_ZNK6hermes2vm11HermesValue8isDoubleEv:
  406|  10.5M|  inline bool isDouble() const {
  407|  10.5M|    return raw_ < ((uint64_t)Tag::First << kNumDataBits);
  408|  10.5M|  }
_ZNK6hermes2vm11HermesValue9getObjectEv:
  462|  32.0M|  inline void *getObject() const {
  463|  32.0M|    assert(isObject());
  464|      0|    return getPointer();
  465|  32.0M|  }
_ZNK6hermes2vm11HermesValue10getPointerEv:
  420|  57.0M|  inline void *getPointer() const {
  421|  57.0M|    assert(isPointer());
  422|       |    // Mask out the tag.
  423|      0|    return reinterpret_cast<void *>(raw_ & kDataMask);
  424|  57.0M|  }
_ZNK6hermes2vm11HermesValue9isPointerEv:
  409|  67.7M|  inline bool isPointer() const {
  410|  67.7M|    return raw_ >= ((uint64_t)Tag::FirstPointer << kNumDataBits);
  411|  67.7M|  }
_ZNK6hermes2vm11HermesValue8isBigIntEv:
  403|    818|  inline bool isBigInt() const {
  404|    818|    return getTag() == Tag::BigInt;
  405|    818|  }
_ZNK6hermes2vm11HermesValue6getTagEv:
  223|  57.7M|  inline Tag getTag() const {
  224|  57.7M|    return (Tag)((int64_t)raw_ >> kNumDataBits);
  225|  57.7M|  }
_ZNK6hermes2vm11HermesValue9getStringEv:
  452|  14.5M|  inline StringPrimitive *getString() const {
  453|  14.5M|    assert(isString());
  454|      0|    return static_cast<StringPrimitive *>(getPointer());
  455|  14.5M|  }
_ZNK6hermes2vm11HermesValue9getSymbolEv:
  442|   210k|  inline SymbolID getSymbol() const {
  443|   210k|    assert(isSymbol());
  444|      0|    return SymbolID::unsafeCreate((uint32_t)raw_);
  445|   210k|  }
_ZNK6hermes2vm11HermesValue8isSymbolEv:
  391|   733k|  inline bool isSymbol() const {
  392|   733k|    return getETag() == ETag::Symbol;
  393|   733k|  }
_ZNK6hermes2vm11HermesValue7getETagEv:
  226|  70.2M|  inline ETag getETag() const {
  227|  70.2M|    return (ETag)((int64_t)raw_ >> (kNumDataBits - 1));
  228|  70.2M|  }
_ZN6hermes2vm11HermesValue15encodeNullValueEv:
  308|    796|  inline static constexpr HermesValue encodeNullValue() {
  309|    796|    return HermesValue(0, ETag::Null);
  310|    796|  }
_ZN6hermes2vm11HermesValueC2EmNS1_4ETagE:
  543|  3.86M|      : raw_(val | ((uint64_t)etag << (kNumDataBits - 1))) {}
_ZN6hermes2vm11HermesValue15encodeBoolValueEb:
  304|  3.80k|  constexpr inline static HermesValue encodeBoolValue(bool val) {
  305|  3.80k|    return HermesValue((uint64_t)(val), ETag::Bool);
  306|  3.80k|  }
_ZN6hermes2vm11HermesValue17encodeObjectValueEPv:
  267|   949k|  inline static HermesValue encodeObjectValue(void *val) {
  268|   949k|    assert(val && "Null pointers require special handling.");
  269|      0|    return encodeObjectValueUnsafe(val);
  270|   949k|  }
_ZN6hermes2vm11HermesValue23encodeObjectValueUnsafeEPv:
  244|  3.54M|  inline static HermesValue encodeObjectValueUnsafe(void *val) {
  245|  3.54M|    validatePointer(val);
  246|  3.54M|    HermesValue RV(reinterpret_cast<uintptr_t>(val), Tag::Object);
  247|  3.54M|    assert(RV.isObject());
  248|      0|    return RV;
  249|  3.54M|  }
_ZN6hermes2vm11HermesValue15validatePointerEPKv:
  199|  8.11M|  static void validatePointer(const void *ptr) {
  200|  8.11M|#if LLVM_PTR_SIZE == 8
  201|  8.11M|    assert(
  202|  8.11M|        (reinterpret_cast<uintptr_t>(ptr) & ~kDataMask) == 0 &&
  203|  8.11M|        "Pointer top bits are set");
  204|  8.11M|#endif
  205|  8.11M|  }
_ZN6hermes2vm11HermesValueC2EmNS1_3TagE:
  541|  8.56M|      : raw_(val | ((uint64_t)tag << kNumDataBits)) {}
_ZNK6hermes2vm11HermesValue11isUndefinedEv:
  377|   623k|  inline bool isUndefined() const {
  378|   623k|    return getETag() == ETag::Undefined;
  379|   623k|  }
_ZNK6hermes2vm11HermesValue7isEmptyEv:
  380|   464k|  inline bool isEmpty() const {
  381|   464k|    return getETag() == ETag::Empty;
  382|   464k|  }
_ZNK6hermes2vm11HermesValue6isNullEv:
  374|   526k|  inline bool isNull() const {
  375|   526k|    return getETag() == ETag::Null;
  376|   526k|  }
_ZNK6hermes2vm11HermesValue6isBoolEv:
  394|  4.13k|  inline bool isBool() const {
  395|  4.13k|    return getETag() == ETag::Bool;
  396|  4.13k|  }
_ZNK6hermes2vm11HermesValue7getBoolEv:
  447|  3.75k|  inline bool getBool() const {
  448|  3.75k|    assert(isBool());
  449|      0|    return (bool)(raw_ & 0x1);
  450|  3.75k|  }
_ZN6hermes2vm17PinnedHermesValueC2ENS0_11HermesValueE:
  577|  7.00M|  constexpr PinnedHermesValue(HermesValue v) : HermesValue(v) {}
_ZNK6hermes2vm11HermesValue9isInvalidEv:
  384|  64.3M|  inline bool isInvalid() const {
  385|  64.3M|    return getETag() == ETag::Invalid;
  386|  64.3M|  }
_ZNK6hermes2vm11HermesValue8isStringEv:
  400|  19.0M|  inline bool isString() const {
  401|  19.0M|    return getTag() == Tag::Str;
  402|  19.0M|  }
_ZNK6hermes2vm11HermesValue8isNumberEv:
  412|  1.59M|  inline bool isNumber() const {
  413|  1.59M|    return isDouble();
  414|  1.59M|  }
_ZNK6hermes2vm11HermesValue9getNumberEv:
  467|  3.03M|  inline double getNumber() const {
  468|  3.03M|    return getDouble();
  469|  3.03M|  }
_ZN6hermes2vm11HermesValue20encodeUndefinedValueEv:
  312|  1.09M|  inline static constexpr HermesValue encodeUndefinedValue() {
  313|  1.09M|    return HermesValue(0, ETag::Undefined);
  314|  1.09M|  }
_ZN6hermes2vm11HermesValue19encodeNativePointerEPKv:
  290|  1.63M|  inline static HermesValue encodeNativePointer(const void *p) {
  291|  1.63M|    HermesValue RV(reinterpret_cast<uintptr_t>(p));
  292|  1.63M|    assert(
  293|  1.63M|        RV.isDouble() && RV.getNativePointer<void>() == p &&
  294|  1.63M|        "Native pointer cannot be represented as a double");
  295|      0|    return RV;
  296|  1.63M|  }
_ZNK6hermes2vm11HermesValue16getNativePointerIvEEPT_v:
  437|  1.63M|  inline T *getNativePointer() const {
  438|  1.63M|    assert(isDouble() && "Native pointers must look like doubles.");
  439|      0|    return reinterpret_cast<T *>(raw_);
  440|  1.63M|  }
_ZN6hermes2vm11HermesValue18encodeNativeUInt32Ej:
  282|   409k|  inline static HermesValue encodeNativeUInt32(uint32_t val) {
  283|   409k|    HermesValue RV(val, Tag::NativeValue);
  284|   409k|    assert(
  285|   409k|        RV.isNativeValue() && RV.getNativeUInt32() == val &&
  286|   409k|        "native value doesn't fit");
  287|      0|    return RV;
  288|   409k|  }
_ZNK6hermes2vm11HermesValue13isNativeValueEv:
  388|  2.05M|  inline bool isNativeValue() const {
  389|  2.05M|    return getTag() == Tag::NativeValue;
  390|  2.05M|  }
_ZNK6hermes2vm11HermesValue15getNativeUInt32Ev:
  431|  1.63M|  inline uint32_t getNativeUInt32() const {
  432|  1.63M|    assert(isNativeValue());
  433|      0|    return (uint32_t)raw_;
  434|  1.63M|  }
_ZN6hermes2vm11HermesValue18encodeInvalidValueEv:
  321|  2.49M|  inline static constexpr HermesValue encodeInvalidValue() {
  322|  2.49M|    return HermesValue(0, ETag::Invalid);
  323|  2.49M|  }
_ZN6hermes2vm17PinnedHermesValueaSERKNS0_11HermesValueE:
  583|  35.0M|  PinnedHermesValue &operator=(const HermesValue &hv) {
  584|  35.0M|    setNoBarrier(hv);
  585|  35.0M|    return *this;
  586|  35.0M|  }
_ZN6hermes2vm11HermesValue12setNoBarrierES1_:
  534|  35.1M|  void setNoBarrier(HermesValue hv) {
  535|  35.1M|    raw_ = hv.raw_;
  536|  35.1M|  }
_ZNK6hermes2vm11HermesValue8isObjectEv:
  397|  36.5M|  inline bool isObject() const {
  398|  36.5M|    return getTag() == Tag::Object;
  399|  36.5M|  }
_ZNK6hermes2vm11HermesValue6getRawEv:
  416|  14.5k|  inline RawType getRaw() const {
  417|  14.5k|    return raw_;
  418|  14.5k|  }
_ZN6hermes2vm11HermesValue16encodeEmptyValueEv:
  316|    217|  inline static constexpr HermesValue encodeEmptyValue() {
  317|    217|    return HermesValue(0, ETag::Empty);
  318|    217|  }
_ZNK6hermes2vm11HermesValue9getDoubleEv:
  426|  3.15M|  inline double getDouble() const {
  427|  3.15M|    assert(isDouble());
  428|      0|    return llvh::BitsToDouble(raw_);
  429|  3.15M|  }
_ZN6hermes2vm11HermesValue23encodeStringValueUnsafeEPKNS0_15StringPrimitiveE:
  252|  4.56M|      const StringPrimitive *val) {
  253|  4.56M|    validatePointer(val);
  254|  4.56M|    HermesValue RV(reinterpret_cast<uintptr_t>(val), Tag::Str);
  255|  4.56M|    assert(RV.isString());
  256|      0|    return RV;
  257|  4.56M|  }
_ZN6hermes2vm11HermesValue17encodeSymbolValueENS0_8SymbolIDE:
  298|   281k|  inline static HermesValue encodeSymbolValue(SymbolID val) {
  299|   281k|    HermesValue RV(val.unsafeGetRaw(), ETag::Symbol);
  300|   281k|    assert(RV.isSymbol());
  301|      0|    return RV;
  302|   281k|  }
_ZN6hermes2vm11HermesValue17encodeNumberValueImEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|  1.08k|      encodeNumberValue(T num) {
  352|  1.08k|    assert((double)num == num && "value not representable as double");
  353|      0|    return encodeDoubleValue((double)num);
  354|  1.08k|  }
_ZN6hermes2vm11HermesValue7fromRawEm:
  216|  2.27k|  constexpr inline static HermesValue fromRaw(RawType raw) {
  217|  2.27k|    return HermesValue(raw);
  218|  2.27k|  }
_ZN6hermes2vm11HermesValue12combineETagsENS1_4ETagES2_:
  231|    594|  inline static constexpr unsigned combineETags(ETag aTag, ETag bTag) {
  232|    594|    using UTagType = std::make_unsigned<TagType>::type;
  233|    594|    auto a = static_cast<UTagType>(aTag), b = static_cast<UTagType>(bTag);
  234|    594|    return ((a & kETagMask) << kETagWidth) | (b & kETagMask);
  235|    594|  }
_ZN6hermes2vm11HermesValue17encodeStringValueEPKNS0_15StringPrimitiveE:
  272|  1.72M|  inline static HermesValue encodeStringValue(const StringPrimitive *val) {
  273|  1.72M|    assert(val && "Null pointers require special handling.");
  274|      0|    return encodeStringValueUnsafe(val);
  275|  1.72M|  }
_ZN6hermes2vm11HermesValue17encodeNumberValueEd:
  341|   123k|  inline static HermesValue encodeNumberValue(double num) {
  342|   123k|    return encodeDoubleValue(num);
  343|   123k|  }
_ZNK6hermes2vm11HermesValue13updatePointerEPv:
  362|  36.1k|  inline HermesValue updatePointer(void *val) const {
  363|  36.1k|    assert(isPointer());
  364|      0|    HermesValue V(reinterpret_cast<uintptr_t>(val), getTag());
  365|  36.1k|    assert(V.isPointer());
  366|      0|    return V;
  367|  36.1k|  }
_ZNK6hermes2vm11HermesValue10getPointerERNS0_11PointerBaseE:
  511|  4.24k|  GCCell *getPointer(PointerBase &) const {
  512|  4.24k|    return static_cast<GCCell *>(getPointer());
  513|  4.24k|  }
_ZN6hermes2vm11HermesValue17encodeHermesValueES1_RNS0_7RuntimeE:
  518|     99|  static HermesValue encodeHermesValue(HermesValue hv, Runtime &) {
  519|     99|    return hv;
  520|     99|  }
_ZN6hermes2vm17PinnedHermesValueC2Ev:
  576|  34.0k|      : HermesValue(HermesValue::encodeUndefinedValue()) {}
_ZN6hermes2vm17PinnedHermesValueaSERKS1_:
  579|   144k|  PinnedHermesValue &operator=(const PinnedHermesValue &phv) {
  580|   144k|    setNoBarrier(phv);
  581|   144k|    return *this;
  582|   144k|  }
_ZNK6hermes2vm11HermesValue16getNativePointerIKNS_4inst4InstEEEPT_v:
  437|   414k|  inline T *getNativePointer() const {
  438|   414k|    assert(isDouble() && "Native pointers must look like doubles.");
  439|      0|    return reinterpret_cast<T *>(raw_);
  440|   414k|  }
_ZNK6hermes2vm11HermesValue16getNativePointerINS0_17PinnedHermesValueEEEPT_v:
  437|   409k|  inline T *getNativePointer() const {
  438|   409k|    assert(isDouble() && "Native pointers must look like doubles.");
  439|      0|    return reinterpret_cast<T *>(raw_);
  440|   409k|  }
_ZN6hermes2vm11HermesValue17encodeNumberValueIiEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|   862k|      encodeNumberValue(T num) {
  352|   862k|    assert((double)num == num && "value not representable as double");
  353|      0|    return encodeDoubleValue((double)num);
  354|   862k|  }
_ZN6hermes2vm11HermesValue17encodeNumberValueIjEENSt3__19enable_ifIXsr3std11is_integralIT_EE5valueES1_E4typeES5_:
  351|  67.1k|      encodeNumberValue(T num) {
  352|  67.1k|    assert((double)num == num && "value not representable as double");
  353|      0|    return encodeDoubleValue((double)num);
  354|  67.1k|  }
_ZN6hermes2vm17GCHermesValueBaseINS0_13HermesValue32EEC2Ev:
  598|  1.11M|  GCHermesValueBase() : HVType(HVType::encodeUndefinedValue()) {}
_ZNK6hermes2vm11HermesValue16getNativePointerINS0_9CodeBlockEEEPT_v:
  437|  1.94k|  inline T *getNativePointer() const {
  438|  1.94k|    assert(isDouble() && "Native pointers must look like doubles.");
  439|      0|    return reinterpret_cast<T *>(raw_);
  440|  1.94k|  }
_ZNK6hermes2vm11HermesValue11getNumberAsIjEENSt3__19enable_ifIXsr11is_integralIT_EE5valueES5_E4typeEv:
  473|   122k|  getNumberAs() const {
  474|   122k|    double num = getDouble();
  475|   122k|    assert(
  476|   122k|        num >= std::numeric_limits<T>::lowest() &&
  477|       |        // The cast is to ignore the following warning:
  478|       |        // implicit conversion from 'int64_t' to 'double' changes value.
  479|   122k|        num <= (double)std::numeric_limits<T>::max() && (T)num == num &&
  480|   122k|        "value not representable as type");
  481|      0|    return num;
  482|   122k|  }
_ZNK6hermes2vm11HermesValue11getNumberAsIiEENSt3__19enable_ifIXsr11is_integralIT_EE5valueES5_E4typeEv:
  473|    444|  getNumberAs() const {
  474|    444|    double num = getDouble();
  475|    444|    assert(
  476|    444|        num >= std::numeric_limits<T>::lowest() &&
  477|       |        // The cast is to ignore the following warning:
  478|       |        // implicit conversion from 'int64_t' to 'double' changes value.
  479|    444|        num <= (double)std::numeric_limits<T>::max() && (T)num == num &&
  480|    444|        "value not representable as type");
  481|      0|    return num;
  482|    444|  }
_ZN6hermes2vm17GCHermesValueBaseINS0_11HermesValueEEC2Ev:
  598|    873|  GCHermesValueBase() : HVType(HVType::encodeUndefinedValue()) {}

_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE6decodeES2_:
  155|  4.41M|  static HermesValue decode(value_type value) {
  156|  4.41M|    return value;
  157|  4.41M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE6encodeES2_:
  151|  3.03M|  static value_type encode(HermesValue value) {
  152|  3.03M|    return value;
  153|  3.03M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE5arrowERKNS0_11HermesValueE:
  267|   408k|  static arrow_type arrow(const HermesValue &value) {
  268|   408k|    auto *res = decode(value);
  269|   408k|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|   408k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE6decodeENS0_11HermesValueE:
  264|   828k|  static T *decode(HermesValue value) {
  265|   828k|    return static_cast<T *>(value.getObject());
  266|   828k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE5arrowERKS2_:
  158|  3.21M|  static const HermesValue *arrow(const HermesValue &value) {
  159|  3.21M|    return &value;
  160|  3.21M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE5arrowERKNS0_11HermesValueE:
  267|  14.7M|  static arrow_type arrow(const HermesValue &value) {
  268|  14.7M|    auto *res = decode(value);
  269|  14.7M|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|  14.7M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE6decodeENS0_11HermesValueE:
  264|  19.7M|  static T *decode(HermesValue value) {
  265|  19.7M|    return static_cast<T *>(value.getObject());
  266|  19.7M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE6encodeEPS2_:
  261|   572k|  static HermesValue encode(T *value) {
  262|   572k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|   572k|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE6decodeENS0_11HermesValueE:
  228|  12.8M|  static T *decode(HermesValue value) {
  229|  12.8M|    return (T *)value.getString();
  230|  12.8M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE6decodeENS0_11HermesValueE:
  185|   207k|  static value_type decode(HermesValue value) {
  186|   207k|    return value.getSymbol();
  187|   207k|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE6encodeEPS2_:
  225|  2.83M|  static HermesValue encode(T *value) {
  226|  2.83M|    return HermesValue::encodeStringValueUnsafe(value);
  227|  2.83M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE12defaultValueEv:
  179|  71.5k|  static value_type defaultValue() {
  180|  71.5k|    return SymbolID{};
  181|  71.5k|  };
_ZN6hermes2vm17HermesValueTraitsINS0_8SymbolIDELb0EE6encodeES2_:
  182|   279k|  static HermesValue encode(SymbolID value) {
  183|   279k|    return HermesValue::encodeSymbolValue(value);
  184|   279k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE5arrowERKNS0_11HermesValueE:
  267|   538k|  static arrow_type arrow(const HermesValue &value) {
  268|   538k|    auto *res = decode(value);
  269|   538k|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|   538k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE6decodeENS0_11HermesValueE:
  264|  3.69M|  static T *decode(HermesValue value) {
  265|  3.69M|    return static_cast<T *>(value.getObject());
  266|  3.69M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HermesValueELb0EE12defaultValueEv:
  147|   231k|  static constexpr value_type defaultValue() {
  148|   231k|    return HermesValue::encodeUndefinedValue();
  149|   231k|  };
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE6decodeENS0_11HermesValueE:
  264|  4.51M|  static T *decode(HermesValue value) {
  265|  4.51M|    return static_cast<T *>(value.getObject());
  266|  4.51M|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE5arrowERKNS0_11HermesValueE:
  231|  10.5M|  static arrow_type arrow(const HermesValue &value) {
  232|  10.5M|    auto *res = decode(value);
  233|  10.5M|    assert(res && "dereferencing null handle");
  234|      0|    return res;
  235|  10.5M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE5arrowEPS2_:
  272|   461k|  static arrow_type arrow(value_type ptr) {
  273|   461k|    assert(ptr && "dereferencing null handle");
  274|      0|    return ptr;
  275|   461k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE5arrowERKNS0_11HermesValueE:
  267|    928|  static arrow_type arrow(const HermesValue &value) {
  268|    928|    auto *res = decode(value);
  269|    928|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|    928|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE6decodeENS0_11HermesValueE:
  264|  6.35k|  static T *decode(HermesValue value) {
  265|  6.35k|    return static_cast<T *>(value.getObject());
  266|  6.35k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11EnvironmentELb1EE6decodeENS0_11HermesValueE:
  264|  4.95k|  static T *decode(HermesValue value) {
  265|  4.95k|    return static_cast<T *>(value.getObject());
  266|  4.95k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_11HermesValueEEELb1EE6decodeES3_:
  264|    198|  static T *decode(HermesValue value) {
  265|    198|    return static_cast<T *>(value.getObject());
  266|    198|  }
_ZN6hermes2vm17HermesValueTraitsINS0_6DomainELb1EE6encodeEPS2_:
  261|  5.45k|  static HermesValue encode(T *value) {
  262|  5.45k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  5.45k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE5arrowERKNS0_11HermesValueE:
  267|    222|  static arrow_type arrow(const HermesValue &value) {
  268|    222|    auto *res = decode(value);
  269|    222|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|    222|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE6decodeENS0_11HermesValueE:
  264|    444|  static T *decode(HermesValue value) {
  265|    444|    return static_cast<T *>(value.getObject());
  266|    444|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8CallableELb1EE6encodeEPS2_:
  261|  2.10k|  static HermesValue encode(T *value) {
  262|  2.10k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  2.10k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9ArrayImplELb1EE5arrowERKNS0_11HermesValueE:
  267|   206k|  static arrow_type arrow(const HermesValue &value) {
  268|   206k|    auto *res = decode(value);
  269|   206k|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|   206k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9ArrayImplELb1EE6decodeENS0_11HermesValueE:
  264|   217k|  static T *decode(HermesValue value) {
  265|   217k|    return static_cast<T *>(value.getObject());
  266|   217k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_11HermesValueEEELb1EE6encodeEPS4_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_13BoundFunctionELb1EE6encodeEPS2_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE6encodeEPS2_:
  261|  55.2k|  static HermesValue encode(T *value) {
  262|  55.2k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  55.2k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE5arrowEPS2_:
  272|  4.50k|  static arrow_type arrow(value_type ptr) {
  273|  4.50k|    assert(ptr && "dereferencing null handle");
  274|      0|    return ptr;
  275|  4.50k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE6decodeENS0_11HermesValueE:
  264|  5.84k|  static T *decode(HermesValue value) {
  265|  5.84k|    return static_cast<T *>(value.getObject());
  266|  5.84k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE6encodeEPS2_:
  261|   483k|  static HermesValue encode(T *value) {
  262|   483k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|   483k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE5arrowERKNS0_11HermesValueE:
  267|  3.52M|  static arrow_type arrow(const HermesValue &value) {
  268|  3.52M|    auto *res = decode(value);
  269|  3.52M|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|  3.52M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_11HiddenClassELb1EE5arrowEPS2_:
  272|  4.90M|  static arrow_type arrow(value_type ptr) {
  273|  4.90M|    assert(ptr && "dereferencing null handle");
  274|      0|    return ptr;
  275|  4.90M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15DictPropertyMapELb1EE6encodeEPS2_:
  261|   210k|  static HermesValue encode(T *value) {
  262|   210k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|   210k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_15DictPropertyMapELb1EE6decodeENS0_11HermesValueE:
  264|   448k|  static T *decode(HermesValue value) {
  265|   448k|    return static_cast<T *>(value.getObject());
  266|   448k|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE5arrowEPS2_:
  236|   240k|  static arrow_type arrow(value_type ptr) {
  237|   240k|    assert(ptr && "dereferencing null handle");
  238|      0|    return ptr;
  239|   240k|  }
_ZN6hermes2vm16StringTraitsImplINS0_15StringPrimitiveEE12defaultValueEv:
  222|   459k|  static constexpr value_type defaultValue() {
  223|   459k|    return value_type{};
  224|   459k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSObjectELb1EE12defaultValueEv:
  258|  67.9k|  static constexpr value_type defaultValue() {
  259|  67.9k|    return value_type{};
  260|  67.9k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_10JSFunctionELb1EE6encodeEPS2_:
  261|  4.50k|  static HermesValue encode(T *value) {
  262|  4.50k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  4.50k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE6encodeEPS2_:
  261|    242|  static HermesValue encode(T *value) {
  262|    242|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    242|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE6encodeEPS2_:
  261|     48|  static HermesValue encode(T *value) {
  262|     48|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     48|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16PropertyAccessorELb1EE6encodeEPS2_:
  261|  4.15k|  static HermesValue encode(T *value) {
  262|  4.15k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  4.15k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE6encodeEPS4_:
  261|  1.27k|  static HermesValue encode(T *value) {
  262|  1.27k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  1.27k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE6decodeENS0_11HermesValueE:
  264|  9.62k|  static T *decode(HermesValue value) {
  265|  9.62k|    return static_cast<T *>(value.getObject());
  266|  9.62k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE5arrowERKNS0_11HermesValueE:
  267|  7.94k|  static arrow_type arrow(const HermesValue &value) {
  268|  7.94k|    auto *res = decode(value);
  269|  7.94k|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|  7.94k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE6encodeEPS2_:
  261|  1.23M|  static HermesValue encode(T *value) {
  262|  1.23M|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  1.23M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE6encodeEPS4_:
  261|  17.4k|  static HermesValue encode(T *value) {
  262|  17.4k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  17.4k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE5arrowERKNS0_11HermesValueE:
  267|    312|  static arrow_type arrow(const HermesValue &value) {
  268|    312|    auto *res = decode(value);
  269|    312|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|    312|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSErrorELb1EE6decodeENS0_11HermesValueE:
  264|    312|  static T *decode(HermesValue value) {
  265|    312|    return static_cast<T *>(value.getObject());
  266|    312|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE5arrowERKNS0_11HermesValueE:
  267|  23.1k|  static arrow_type arrow(const HermesValue &value) {
  268|  23.1k|    auto *res = decode(value);
  269|  23.1k|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|  23.1k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_16ArrayStorageBaseINS0_13HermesValue32EEELb1EE6decodeENS0_11HermesValueE:
  264|  46.4k|  static T *decode(HermesValue value) {
  265|  46.4k|    return static_cast<T *>(value.getObject());
  266|  46.4k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14OrderedHashMapELb1EE6encodeEPS2_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE5arrowERKNS0_11HermesValueE:
  267|  2.02M|  static arrow_type arrow(const HermesValue &value) {
  268|  2.02M|    auto *res = decode(value);
  269|  2.02M|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|  2.02M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSRegExpELb1EE6decodeENS0_11HermesValueE:
  264|  2.42M|  static T *decode(HermesValue value) {
  265|  2.42M|    return static_cast<T *>(value.getObject());
  266|  2.42M|  }
_ZN6hermes2vm17HermesValueTraitsINS0_9JSBooleanELb1EE6encodeEPS2_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSNumberELb1EE6encodeEPS2_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_8JSStringELb1EE6encodeEPS2_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELb1EE5arrowEPS4_:
  272|  3.79k|  static arrow_type arrow(value_type ptr) {
  273|  3.79k|    assert(ptr && "dereferencing null handle");
  274|      0|    return ptr;
  275|  3.79k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE6decodeENS0_11HermesValueE:
  264|    324|  static T *decode(HermesValue value) {
  265|    324|    return static_cast<T *>(value.getObject());
  266|    324|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE5arrowERKNS0_11HermesValueE:
  267|    162|  static arrow_type arrow(const HermesValue &value) {
  268|    162|    auto *res = decode(value);
  269|    162|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|    162|  }
_ZN6hermes2vm16StringTraitsImplINS0_23BufferedStringPrimitiveIDsEEE6decodeENS0_11HermesValueE:
  228|    152|  static T *decode(HermesValue value) {
  229|    152|    return (T *)value.getString();
  230|    152|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIDsEELb1EE6encodeEPS3_:
  261|    162|  static HermesValue encode(T *value) {
  262|    162|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    162|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIcEELb1EE6decodeENS0_11HermesValueE:
  264|  1.42k|  static T *decode(HermesValue value) {
  265|  1.42k|    return static_cast<T *>(value.getObject());
  266|  1.42k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIcEELb1EE5arrowERKNS0_11HermesValueE:
  267|    711|  static arrow_type arrow(const HermesValue &value) {
  268|    711|    auto *res = decode(value);
  269|    711|    assert(res && "dereferencing null handle");
  270|      0|    return res;
  271|    711|  }
_ZN6hermes2vm16StringTraitsImplINS0_23BufferedStringPrimitiveIcEEE6decodeENS0_11HermesValueE:
  228|    651|  static T *decode(HermesValue value) {
  229|    651|    return (T *)value.getString();
  230|    651|  }
_ZN6hermes2vm17HermesValueTraitsINS0_23ExternalStringPrimitiveIcEELb1EE6encodeEPS3_:
  261|    711|  static HermesValue encode(T *value) {
  262|    711|    return HermesValue::encodeObjectValueUnsafe(value);
  263|    711|  }
_ZN6hermes2vm17HermesValueTraitsINS0_7JSArrayELb1EE12defaultValueEv:
  258|   404k|  static constexpr value_type defaultValue() {
  259|   404k|    return value_type{};
  260|   404k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_17NativeConstructorELb1EE6encodeEPS2_:
  261|  4.05k|  static HermesValue encode(T *value) {
  262|  4.05k|    return HermesValue::encodeObjectValueUnsafe(value);
  263|  4.05k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_14NativeFunctionELb1EE12defaultValueEv:
  258|  8.31k|  static constexpr value_type defaultValue() {
  259|  8.31k|    return value_type{};
  260|  8.31k|  }
_ZN6hermes2vm17HermesValueTraitsINS0_12SingleObjectILNS0_8CellKindE60EEELb1EE6encodeEPS4_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }
_ZN6hermes2vm17HermesValueTraitsINS0_12SingleObjectILNS0_8CellKindE59EEELb1EE6encodeEPS4_:
  261|     99|  static HermesValue encode(T *value) {
  262|     99|    return HermesValue::encodeObjectValueUnsafe(value);
  263|     99|  }

_ZN6hermes2vm11HiddenClass7classofEPKNS0_6GCCellE:
  281|  5.73M|  static bool classof(const GCCell *cell) {
  282|  5.73M|    return cell->getKind() == CellKind::HiddenClassKind;
  283|  5.73M|  }
_ZN6hermes2vm10ClassFlagsC2Ev:
   64|     99|  ClassFlags() {
   65|     99|    ::memset(this, 0, sizeof(*this));
   66|     99|  }
_ZN6hermes2vm6detail10TransitionC2ENS0_8SymbolIDE:
  136|   377k|      : symbolID(symbolID), propertyFlags() {}
_ZN6hermes2vm6detail10TransitionC2ENS0_8SymbolIDENS0_13PropertyFlagsE:
  138|   228k|      : symbolID(symbolID), propertyFlags(flags) {}
_ZNK6hermes2vm6detail10TransitioneqERKS2_:
  140|   878k|  bool operator==(const Transition &a) const {
  141|   878k|    return symbolID == a.symbolID && propertyFlags == a.propertyFlags;
  ------------------
  |  Branch (141:12): [True: 370k, False: 507k]
  |  Branch (141:38): [True: 370k, False: 0]
  ------------------
  142|   878k|  }
_ZN6hermes2vm6detail13TransitionMapD2Ev:
  149|  56.9k|  ~TransitionMap() {
  150|  56.9k|    if (isLarge())
  ------------------
  |  Branch (150:9): [True: 1.32k, False: 55.6k]
  ------------------
  151|  1.32k|      delete large();
  152|  56.9k|  }
_ZN6hermes2vm6detail13TransitionMap11containsKeyERKNS1_10TransitionERNS0_7HadesGCE:
  155|  2.61k|  bool containsKey(const Transition &key, GC &gc) {
  156|  2.61k|    return (smallKey_ == key && smallValue().isValid()) ||
  ------------------
  |  Branch (156:13): [True: 1.48k, False: 1.13k]
  |  Branch (156:33): [True: 1.48k, False: 0]
  ------------------
  157|  2.61k|        (isLarge() && large()->containsKey(key));
  ------------------
  |  Branch (157:10): [True: 898, False: 232]
  |  Branch (157:23): [True: 495, False: 403]
  ------------------
  158|  2.61k|  }
_ZN6hermes2vm6detail13TransitionMap6lookupERNS0_7RuntimeERKNS1_10TransitionE:
  162|   169k|  HiddenClass *lookup(Runtime &runtime, const Transition &key) {
  163|   169k|    if (smallKey_ == key) {
  ------------------
  |  Branch (163:9): [True: 50.9k, False: 118k]
  ------------------
  164|  50.9k|      return smallValue().get(runtime);
  165|   118k|    } else if (isLarge()) {
  ------------------
  |  Branch (165:16): [True: 65.8k, False: 52.5k]
  ------------------
  166|  65.8k|      return large()->lookup(runtime, key);
  167|  65.8k|    } else {
  168|  52.5k|      return nullptr;
  169|  52.5k|    }
  170|   169k|  }
_ZN6hermes2vm6detail13TransitionMap9insertNewERNS0_7RuntimeERKNS1_10TransitionENS0_6HandleINS0_11HiddenClassEEE:
  177|  56.8k|      Handle<HiddenClass> value) {
  178|  56.8k|    assert(
  179|  56.8k|        key.symbolID != SymbolID::empty() &&
  180|  56.8k|        "Should never insert an empty key");
  181|  56.8k|    if (smallKey_ == key && smallValue().isValid()) {
  ------------------
  |  Branch (181:9): [True: 0, False: 56.8k]
  |  Branch (181:29): [True: 0, False: 0]
  ------------------
  182|      0|      return false;
  183|      0|    }
  184|       |    // Need to hold the lock when mutating smallKey and smallValue.
  185|  56.8k|    WeakRefLock lk{runtime.getHeap().weakRefMutex()};
  186|  56.8k|    if (isClean()) {
  ------------------
  |  Branch (186:9): [True: 51.2k, False: 5.64k]
  ------------------
  187|  51.2k|      smallKey_ = key;
  188|  51.2k|      smallValue() = WeakRef<HiddenClass>(runtime, value);
  189|  51.2k|      return true;
  190|  51.2k|    }
  191|  5.64k|    if (!isLarge())
  ------------------
  |  Branch (191:9): [True: 1.32k, False: 4.32k]
  ------------------
  192|  1.32k|      uncleanMakeLarge(runtime);
  193|  5.64k|    return large()->insertNewLocked(runtime, key, value);
  194|  56.8k|  }
_ZN6hermes2vm6detail13TransitionMap12markWeakRefsERNS0_15WeakRefAcceptorE:
  197|   503k|  void markWeakRefs(WeakRefAcceptor &acceptor) {
  198|   503k|    if (isLarge()) {
  ------------------
  |  Branch (198:9): [True: 12.4k, False: 491k]
  ------------------
  199|  12.4k|      large()->markWeakRefs(acceptor);
  200|   491k|    } else if (!isClean()) {
  ------------------
  |  Branch (200:16): [True: 442k, False: 48.8k]
  ------------------
  201|   442k|      acceptor.accept(smallValue());
  202|   442k|    }
  203|   503k|  }
_ZNK6hermes2vm6detail13TransitionMap7isCleanEv:
  231|   549k|  bool isClean() const {
  232|   549k|    return smallKey_.symbolID == SymbolID::empty();
  233|   549k|  }
_ZNK6hermes2vm6detail13TransitionMap7isLargeEv:
  236|  1.38M|  bool isLarge() const {
  237|  1.38M|    return smallKey_.symbolID == SymbolID::deleted();
  238|  1.38M|  }
_ZN6hermes2vm6detail13TransitionMap10smallValueEv:
  244|   547k|  WeakRef<HiddenClass> &smallValue() {
  245|   547k|    assert(!isLarge());
  246|      0|    return u.smallValue_;
  247|   547k|  }
_ZNK6hermes2vm6detail13TransitionMap5largeEv:
  252|  87.4k|  WeakValueMap<Transition, HiddenClass> *large() const {
  253|  87.4k|    assert(isLarge());
  254|      0|    return u.large_;
  255|  87.4k|  }
_ZN6hermes2vm6detail13TransitionMap1UC2Ev:
  259|  56.9k|    U() : smallValue_((WeakRefSlot *)nullptr) {}
_ZN6hermes2vm11HiddenClass11getCellKindEv:
  278|   113k|  static constexpr CellKind getCellKind() {
  279|   113k|    return CellKind::HiddenClassKind;
  280|   113k|  }
_ZNK6hermes2vm11HiddenClass16getNumPropertiesEv:
  298|   834k|  unsigned getNumProperties() const {
  299|   834k|    return numProperties_;
  300|   834k|  }
_ZNK6hermes2vm11HiddenClass12isDictionaryEv:
  304|   307k|  bool isDictionary() const {
  305|   307k|    return flags_.dictionaryMode;
  306|   307k|  }
_ZNK6hermes2vm11HiddenClass19isDictionaryNoCacheEv:
  312|  2.12k|  bool isDictionaryNoCache() const {
  313|  2.12k|    assert(
  314|  2.12k|        (!flags_.dictionaryNoCacheMode || flags_.dictionaryMode) &&
  315|  2.12k|        "dictionaryNoCacheMode should only be set if dictionaryMode is set.");
  316|      0|    return flags_.dictionaryNoCacheMode;
  317|  2.12k|  }
_ZNK6hermes2vm11HiddenClass25getHasIndexLikePropertiesEv:
  319|   723k|  bool getHasIndexLikeProperties() const {
  320|   723k|    return flags_.hasIndexLikeProperties;
  321|   723k|  }
_ZN6hermes2vm11HiddenClassC2ERNS0_7RuntimeENS0_10ClassFlagsENS0_6HandleIS1_EENS0_8SymbolIDENS0_13PropertyFlagsEj:
  502|  56.9k|        parent_(runtime, *parent, runtime.getHeap()) {
  503|  56.9k|    assert(propertyFlags.isValid() && "propertyFlags must be valid");
  504|  56.9k|  }
_ZN6hermes2vm11HiddenClass19tryFindPropertyFastEPKS1_RNS0_11PointerBaseENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
  647|  6.07k|    NamedPropertyDescriptor &desc) {
  648|  6.07k|  if (LLVM_LIKELY(self->propertyMap_)) {
  ------------------
  |  |  188|  6.07k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.50k, False: 2.57k]
  |  |  ------------------
  ------------------
  649|  3.50k|    auto found =
  650|  3.50k|        DictPropertyMap::find(self->propertyMap_.getNonNull(base), name);
  651|  3.50k|    if (LLVM_LIKELY(found)) {
  ------------------
  |  |  188|  3.50k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.09k, False: 1.40k]
  |  |  ------------------
  ------------------
  652|  2.09k|      desc = DictPropertyMap::getDescriptorPair(
  653|  2.09k|                 self->propertyMap_.getNonNull(base), *found)
  654|  2.09k|                 ->second;
  655|  2.09k|    }
  656|  3.50k|    return found.hasValue();
  657|  3.50k|  } else if (self->numProperties_ == 0) {
  ------------------
  |  Branch (657:14): [True: 693, False: 1.88k]
  ------------------
  658|    693|    return false;
  659|    693|  }
  660|  1.88k|  return llvh::None;
  661|  6.07k|}
_ZN6hermes2vm11HiddenClass12computeFlagsENS0_10ClassFlagsENS0_13PropertyFlagsEb:
  665|   190k|    bool addedIndexLike) {
  666|   190k|  flags.hasIndexLikeProperties |= addedIndexLike;
  667|       |  // Carry over the the existing mayHaveAccessor flag. Once an accessor property
  668|       |  // has been set, all subsequent classes must have this property marked.
  669|   190k|  flags.mayHaveAccessor |= pf.accessor;
  670|   190k|  return flags;
  671|   190k|}
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE11getEmptyKeyEv:
  683|   164k|  static inline HiddenClass::Transition getEmptyKey() {
  684|   164k|    return HiddenClass::Transition(SymbolID::empty());
  685|   164k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE15getTombstoneKeyEv:
  687|   155k|  static inline HiddenClass::Transition getTombstoneKey() {
  688|   155k|    return HiddenClass::Transition(SymbolID::deleted());
  689|   155k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE12getHashValueES4_:
  691|  76.0k|  static inline unsigned getHashValue(HiddenClass::Transition transition) {
  692|  76.0k|    return transition.symbolID.unsafeGetRaw() ^ transition.propertyFlags._flags;
  693|  76.0k|  }
_ZN4llvh12DenseMapInfoIN6hermes2vm6detail10TransitionEE7isEqualERKS4_S7_:
  697|   649k|      const HiddenClass::Transition &b) {
  698|   649k|    return a == b;
  699|   649k|  }

_ZN6hermes2vm10HostObject7classofEPKNS0_6GCCellE:
  102|     99|  static bool classof(const GCCell *cell) {
  103|     99|    return cell->getKind() == CellKind::HostObjectKind;
  104|     99|  }
_ZN6hermes2vm10HostObject11getCellKindEv:
   99|    198|  static constexpr CellKind getCellKind() {
  100|    198|    return CellKind::HostObjectKind;
  101|    198|  }
_ZN6hermes2vm10HostObjectC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENS9_14default_deleteISB_EEEE:
  136|     99|      : DecoratedObject(runtime, parent, clazz, std::move(proxy)) {}

_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
   89|     99|  CallResult<Handle<SymbolID>> getSymbolHandle(Runtime &runtime, UTF16Ref str) {
   90|     99|    return getSymbolHandle(runtime, str, hermes::hashString(str));
   91|     99|  }
_ZN6hermes2vm15IdentifierTable7reserveEj:
  148|    353|  void reserve(uint32_t count) {
  149|    353|    lookupVector_.reserve(count);
  150|    353|    hashTable_.reserve(count);
  151|    353|    markedSymbols_.reserve(count);
  152|    353|  }
_ZNK6hermes2vm15IdentifierTable13getSymbolsEndEv:
  180|    286|  unsigned getSymbolsEnd() const {
  181|    286|    return lookupVector_.size();
  182|    286|  }
_ZN6hermes2vm15IdentifierTable11LookupEntryC2EN4llvh8ArrayRefIcEEjb:
  277|  59.2k|          hash_(hash) {}
_ZN6hermes2vm15IdentifierTable11LookupEntryC2EN4llvh8ArrayRefIDsEEj:
  289|    273|          hash_(hash) {}
_ZN6hermes2vm15IdentifierTable11LookupEntryC2Ev:
  304|   130k|    LookupEntry() : strPrim_(nullptr), num_(FREE_LIST_END) {}
_ZNK6hermes2vm15IdentifierTable11LookupEntry11isLazyASCIIEv:
  306|   190k|    bool isLazyASCII() const {
  307|   190k|      return asciiPtr_ && !isUTF16_;
  ------------------
  |  Branch (307:14): [True: 190k, False: 0]
  |  Branch (307:27): [True: 190k, False: 317]
  ------------------
  308|   190k|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry11isLazyUTF16Ev:
  309|    317|    bool isLazyUTF16() const {
  310|    317|      return utf16Ptr_ && isUTF16_;
  ------------------
  |  Branch (310:14): [True: 317, False: 0]
  |  Branch (310:27): [True: 317, False: 0]
  ------------------
  311|    317|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry12isStringPrimEv:
  312|  4.00M|    bool isStringPrim() const {
  313|  4.00M|      return strPrim_ && num_ >= NON_LAZY_STRING_PRIM_TAG;
  ------------------
  |  Branch (313:14): [True: 4.00M, False: 0]
  |  Branch (313:26): [True: 3.29M, False: 709k]
  ------------------
  314|  4.00M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry19isNonLazyStringPrimEv:
  318|  26.9k|    bool isNonLazyStringPrim() const {
  319|  26.9k|      return strPrim_ && num_ == NON_LAZY_STRING_PRIM_TAG;
  ------------------
  |  Branch (319:14): [True: 21.6k, False: 5.21k]
  |  Branch (319:26): [True: 546, False: 21.1k]
  ------------------
  320|  26.9k|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry10isFreeSlotEv:
  321|  1.76M|    bool isFreeSlot() const {
  322|       |      // union is not necessarily a StringPrimitive*. However the purpose here
  323|       |      // is a null check, and checking one pointer element is sufficient.
  324|  1.76M|      return !strPrim_;
  325|  1.76M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry12isNotUniquedEv:
  326|    273|    bool isNotUniqued() const {
  327|    273|      return isNotUniqued_;
  328|    273|    }
_ZN6hermes2vm15IdentifierTable11LookupEntry11materializeEPNS0_15StringPrimitiveE:
  331|  34.1k|    void materialize(StringPrimitive *str) {
  332|  34.1k|      assert(str && "Invalid string primitive pointer");
  333|      0|      strPrim_ = str;
  334|  34.1k|      num_ = LAZY_STRING_PRIM_TAG;
  335|  34.1k|    }
_ZN6hermes2vm15IdentifierTable11LookupEntry4freeEi:
  338|    273|    void free(int32_t nextFreeSlotID) {
  339|    273|      assert(isStringPrim() && "Cannot free this slot");
  340|      0|      strPrim_ = nullptr;
  341|    273|      num_ = nextFreeSlotID;
  342|    273|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry15getLazyASCIIRefEv:
  344|  78.0k|    ASCIIRef getLazyASCIIRef() const {
  345|  78.0k|      assert(isLazyASCII() && "Not an ASCII lazy identifier");
  346|      0|      return ASCIIRef(asciiPtr_, num_);
  347|  78.0k|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry15getLazyUTF16RefEv:
  348|    271|    UTF16Ref getLazyUTF16Ref() const {
  349|    271|      assert(isLazyUTF16() && "Not a UTF16 lazy identifier");
  350|      0|      return UTF16Ref(utf16Ptr_, num_);
  351|    271|    }
_ZN6hermes2vm15IdentifierTable11LookupEntry16getStringPrimRefEv:
  352|   696k|    StringPrimitive *&getStringPrimRef() {
  353|   696k|      assert(isStringPrim() && "Not a valid string primitive");
  354|      0|      return strPrim_;
  355|   696k|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry13getStringPrimEv:
  356|  1.11M|    const StringPrimitive *getStringPrim() const {
  357|  1.11M|      assert(isStringPrim() && "Not a valid string primitive");
  358|      0|      return strPrim_;
  359|  1.11M|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry15getNextFreeSlotEv:
  361|      8|    int32_t getNextFreeSlot() const {
  362|      8|      assert(isFreeSlot() && "Not a free slot");
  363|      0|      return num_;
  364|      8|    }
_ZNK6hermes2vm15IdentifierTable11LookupEntry7getHashEv:
  365|   496k|    uint32_t getHash() const {
  366|   496k|      return hash_;
  367|   496k|    }
_ZN6hermes2vm15IdentifierTable19getLookupTableEntryENS0_8SymbolIDE:
  408|   112k|  LookupEntry &getLookupTableEntry(SymbolID id) {
  409|   112k|    return getLookupTableEntry(id.unsafeGetIndex());
  410|   112k|  }
_ZNK6hermes2vm15IdentifierTable19getLookupTableEntryENS0_8SymbolIDE:
  412|  2.37M|  const LookupEntry &getLookupTableEntry(SymbolID id) const {
  413|  2.37M|    return getLookupTableEntry(id.unsafeGetIndex());
  414|  2.37M|  }
_ZN6hermes2vm15IdentifierTable19getLookupTableEntryEj:
  416|   609k|  LookupEntry &getLookupTableEntry(uint32_t id) {
  417|   609k|    assert(id < lookupVector_.size() && "Identifier ID out of bound");
  418|      0|    return lookupVector_[id];
  419|   609k|  }
_ZNK6hermes2vm15IdentifierTable19getLookupTableEntryEj:
  421|  2.37M|  const LookupEntry &getLookupTableEntry(uint32_t id) const {
  422|  2.37M|    assert(id < lookupVector_.size() && "Identifier ID out of bound");
  423|      0|    return lookupVector_[id];
  424|  2.37M|  }
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIcEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEE:
  447|   205k|      Handle<StringPrimitive> primHandle) {
  448|   205k|    return getOrCreateIdentifier(
  449|   205k|        runtime, str, primHandle, hermes::hashString(str));
  450|   205k|  }
_ZN6hermes2vm15IdentifierTable18ConservativeVectorINS1_11LookupEntryEE12emplace_backEv:
  385|   130k|    void emplace_back() {
  386|   130k|      auto cap = capacity();
  387|   130k|      if (size() == cap) {
  ------------------
  |  Branch (387:11): [True: 172, False: 130k]
  ------------------
  388|    172|        reserve(cap + cap / 4);
  389|    172|      }
  390|   130k|      Base::emplace_back();
  391|   130k|    }

_ZN6hermes2vm16InternalProperty11getSymbolIDEj:
   39|    693|inline SymbolID getSymbolID(unsigned i) {
   40|    693|  assert(i < NumInternalProperties && "Unsupported internal property index");
   41|      0|  return Predefined::getSymbolID(
   42|    693|      static_cast<Predefined::IProp>(Predefined::InternalProperty0 + i));
   43|    693|}

_ZN6hermes2vm16InterpreterStateC2Ev:
   29|     99|  InterpreterState() {}
_ZN6hermes2vm16InterpreterStateC2EPNS0_9CodeBlockEj:
   32|    155|      : codeBlock(codeBlock), offset(offset) {}

_ZN6hermes2vm7JSArray7classofEPKNS0_6GCCellE:
  291|   927k|  static bool classof(const GCCell *cell) {
  292|   927k|    return cell->getKind() == CellKind::JSArrayKind;
  293|   927k|  }
_ZN6hermes2vm9ArrayImpl12setElementAtENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
   54|   986k|      Handle<> value) {
   55|   986k|    auto result = _setOwnIndexedImpl(selfHandle, runtime, index, value);
   56|   986k|    (void)result;
   57|   986k|    assert(
   58|   986k|        result != ExecutionStatus::EXCEPTION && *result &&
   59|   986k|        "JSArrayImpl::setElementAt() failing");
   60|   986k|  }
_ZN6hermes2vm9ArrayImpl7classofEPKNS0_6GCCellE:
   24|  3.22M|  static bool classof(const GCCell *cell) {
   25|  3.22M|    return kindInRange(
   26|  3.22M|        cell->getKind(),
   27|  3.22M|        CellKind::ArrayImplKind_first,
   28|  3.22M|        CellKind::ArrayImplKind_last);
   29|  3.22M|  }
_ZN6hermes2vm9ArrayImpl26unsafeSetExistingElementAtEPS1_RNS0_7RuntimeEjNS0_13HermesValue32E:
   70|   457k|      SmallHermesValue value) {
   71|       |    // The array must be extendable (and by implication is not frozen or sealed)
   72|       |    // because we don't know whether the element being set is empty or not.
   73|   457k|    assert(!self->flags_.noExtend && "this array cannot be extended");
   74|       |
   75|      0|    assert(
   76|   457k|        index >= self->beginIndex_ && index < self->endIndex_ &&
   77|   457k|        "array index out of range");
   78|      0|    self->getIndexedStorage(runtime)->set(
   79|   457k|        runtime, index - self->beginIndex_, value);
   80|   457k|  }
_ZNK6hermes2vm9ArrayImpl2atERNS0_7RuntimeEj:
  104|   581k|  const SmallHermesValue at(Runtime &runtime, size_type index) const {
  105|   581k|    return index >= beginIndex_ && index < endIndex_
  ------------------
  |  Branch (105:12): [True: 581k, False: 0]
  |  Branch (105:36): [True: 581k, False: 0]
  ------------------
  106|   581k|        ? getIndexedStorage(runtime)->at(runtime, index - beginIndex_)
  107|   581k|        : SmallHermesValue::encodeEmptyValue();
  108|   581k|  }
_ZNK6hermes2vm9ArrayImpl17getIndexedStorageERNS0_11PointerBaseE:
  117|  3.47M|  StorageType *getIndexedStorage(PointerBase &base) const {
  118|  3.47M|    return indexedStorage_.get(base);
  119|  3.47M|  }
_ZN6hermes2vm9ArrayImpl17setIndexedStorageERNS0_11PointerBaseEPNS0_18SegmentedArrayBaseINS0_13HermesValue32EEERNS0_7HadesGCE:
  123|   416k|  void setIndexedStorage(PointerBase &base, StorageType *p, GC &gc) {
  124|   416k|    indexedStorage_.set(base, p, gc);
  125|   416k|  }
_ZN6hermes2vm7JSArray20jsArrayPropertyCountEv:
  267|   428k|  static constexpr SlotIndex jsArrayPropertyCount() {
  268|   428k|    return numOverlapSlots<JSArray>() + NAMED_PROPERTY_SLOTS;
  269|   428k|  }
_ZN6hermes2vm7JSArray15lengthPropIndexEv:
  271|    198|  static constexpr inline SlotIndex lengthPropIndex() {
  272|    198|    return jsArrayPropertyCount() - 1;
  273|    198|  }
_ZN6hermes2vm7JSArray11getCellKindEv:
  288|   856k|  static constexpr CellKind getCellKind() {
  289|   856k|    return CellKind::JSArrayKind;
  290|   856k|  }
_ZN6hermes2vm7JSArray9getLengthEPKS1_RNS0_11PointerBaseE:
  295|   499k|  static uint32_t getLength(const JSArray *self, PointerBase &pb) {
  296|   499k|    return getDirectSlotValue<lengthPropIndex()>(self).getNumber(pb);
  297|   499k|  }
_ZN6hermes2vm7JSArray17setLengthPropertyENS0_6HandleIS1_EERNS0_7RuntimeEjNS0_11PropOpFlagsE:
  353|      7|      PropOpFlags opFlags = PropOpFlags{}) {
  354|       |    // TODO: optimize this now that we know the index of the property slot.
  355|      7|    return putNamed_RJS(
  356|      7|        selfHandle,
  357|      7|        runtime,
  358|      7|        Predefined::getSymbolID(Predefined::length),
  359|      7|        runtime.makeHandle(HermesValue::encodeNumberValue(newValue)));
  360|      7|  }
_ZN6hermes2vm7JSArray9putLengthEPS1_RNS0_7RuntimeENS0_13HermesValue32E:
  373|   573k|  putLength(JSArray *self, Runtime &runtime, SmallHermesValue newLength) {
  374|   573k|    setDirectSlotValue<lengthPropIndex()>(self, newLength, runtime.getHeap());
  375|   573k|  }
_ZN6hermes2vm7JSArrayC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEET_:
  368|   428k|      : ArrayImpl(runtime, *parent, *clazz, needsBarrier) {}
_ZN6hermes2vm9ArrayImplC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeEPNS0_8JSObjectEPNS0_11HiddenClassET_:
  145|   428k|      : JSObject(runtime, parent, clazz, needsBarriers) {
  146|   428k|    flags_.indexedStorage = true;
  147|   428k|    flags_.fastIndexProperties = true;
  148|   428k|  }

_ZN6hermes2vm14StackTraceInfoC2EPNS0_9CodeBlockEj:
   33|     48|      : codeBlock(codeBlock), bytecodeOffset(bytecodeOffset) {}
_ZN6hermes2vm7JSError11getCellKindEv:
   48|     48|  static constexpr CellKind getCellKind() {
   49|     48|    return CellKind::JSErrorKind;
   50|     48|  }
_ZN6hermes2vm7JSError7classofEPKNS0_6GCCellE:
   51|    168|  static bool classof(const GCCell *cell) {
   52|    168|    return cell->getKind() == CellKind::JSErrorKind;
   53|    168|  }
_ZNK6hermes2vm7JSError13getStackTraceEv:
   98|     24|  const StackTrace *getStackTrace() const {
   99|     24|    return stacktrace_.get();
  100|     24|  }
_ZNK6hermes2vm7JSError9catchableEv:
  102|     24|  bool catchable() const {
  103|     24|    return catchable_;
  104|     24|  }
_ZN6hermes2vm7JSErrorC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEb:
  142|     24|      : JSObject(runtime, *parent, *clazz), catchable_{catchable} {}

_ZNK6hermes2vm8JSObject13isProxyObjectEv:
  446|  7.12k|  bool isProxyObject() const {
  447|  7.12k|    return flags_.proxyObject;
  448|  7.12k|  }
_ZNK6hermes2vm8JSObject12isHostObjectEv:
  441|  3.86k|  bool isHostObject() const {
  442|  3.86k|    return flags_.hostObject;
  443|  3.86k|  }
_ZN6hermes2vm8JSObject21getOwnNamedDescriptorENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1858|  1.42M|    NamedPropertyDescriptor &desc) {
 1859|  1.42M|  return findProperty(selfHandle, runtime, name, desc).hasValue();
 1860|  1.42M|}
_ZN6hermes2vm8JSObject12findPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1986|  1.61M|    NamedPropertyDescriptor &desc) {
 1987|  1.61M|  return findProperty(
 1988|  1.61M|      selfHandle, runtime, name, PropertyFlags::invalid(), desc);
 1989|  1.61M|}
_ZN6hermes2vm8JSObject12findPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
 1996|  2.44M|    NamedPropertyDescriptor &desc) {
 1997|  2.44M|  auto ret = HiddenClass::findProperty(
 1998|  2.44M|      createPseudoHandle(selfHandle->clazz_.getNonNull(runtime)),
 1999|  2.44M|      runtime,
 2000|  2.44M|      name,
 2001|  2.44M|      expectedFlags,
 2002|  2.44M|      desc);
 2003|  2.44M|  assert(
 2004|  2.44M|      !(selfHandle->flags_.proxyObject && ret) &&
 2005|  2.44M|      "Proxy objects should never have own properties");
 2006|      0|  return ret;
 2007|  2.44M|}
_ZN6hermes2vm8JSObject17defineOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 1103|  56.3k|      PropOpFlags opFlags = PropOpFlags()) {
 1104|  56.3k|#ifdef HERMES_SLOW_DEBUG
 1105|       |    // In slow debug, check if the symbol looks like an array index. If that's
 1106|       |    // the case, it should be using defineOwnComputed instead.
 1107|  56.3k|    auto nameView = runtime.getIdentifierTable().getStringView(runtime, name);
 1108|  56.3k|    assert(
 1109|  56.3k|        !toArrayIndex(nameView) &&
 1110|  56.3k|        "Array index property should use defineOwnComputed instead");
 1111|      0|#endif
 1112|      0|    return defineOwnPropertyInternal(
 1113|  56.3k|        selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 1114|  56.3k|  }
_ZN6hermes2vm19DefinePropertyFlags26getDefaultNewPropertyFlagsEv:
   72|   227k|  static DefinePropertyFlags getDefaultNewPropertyFlags() {
   73|   227k|    DefinePropertyFlags dpf{};
   74|   227k|    dpf.setEnumerable = 1;
   75|   227k|    dpf.enumerable = 1;
   76|   227k|    dpf.setWritable = 1;
   77|   227k|    dpf.writable = 1;
   78|   227k|    dpf.setConfigurable = 1;
   79|   227k|    dpf.configurable = 1;
   80|   227k|    dpf.setValue = 1;
   81|   227k|    return dpf;
   82|   227k|  }
_ZN6hermes2vm19DefinePropertyFlagsC2Ev:
   50|   272k|  DefinePropertyFlags() {
   51|   272k|    _flags = 0;
   52|   272k|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeEPS1_RNS0_11PointerBaseENS0_23NamedPropertyDescriptorE:
  617|   482k|      NamedPropertyDescriptor desc) {
  618|   482k|    assert(
  619|   482k|        !self->flags_.proxyObject && !desc.flags.proxyObject &&
  620|   482k|        "getNamedSlotValueUnsafe called on a Proxy");
  621|      0|    assert(
  622|   482k|        !desc.flags.hostObject &&
  623|   482k|        "getNamedSlotValueUnsafe called on a HostObject");
  624|      0|    return getNamedSlotValueUnsafe(self, runtime, desc.slot);
  625|   482k|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE0EEES4_PS1_RNS0_11PointerBaseEj:
 1692|   482k|    SlotIndex index) {
 1693|   482k|  assert(!self->flags_.proxyObject && "getNamedSlotValue called on a Proxy");
 1694|       |
 1695|   482k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   482k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 406k, False: 76.0k]
  |  |  ------------------
  ------------------
 1696|   406k|    return self->directProps()[index];
 1697|       |
 1698|  76.0k|  return self->propStorage_.getNonNull(runtime)->at<inl>(
 1699|  76.0k|      index - DIRECT_PROPERTY_SLOTS);
 1700|   482k|}
_ZN6hermes2vm8JSObject11directPropsEv:
 1531|  2.39M|GCSmallHermesValue *JSObject::directProps() {
 1532|  2.39M|  return static_cast<JSObjectAndDirectProps *>(this)->directProps_;
 1533|  2.39M|}
_ZN6hermes2vm8JSObject15getComputed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEE:
 1939|   527k|    Handle<> nameValHandle) {
 1940|   527k|  return getComputedWithReceiver_RJS(
 1941|   527k|      selfHandle, runtime, nameValHandle, selfHandle);
 1942|   527k|}
_ZN6hermes2vm8JSObject15putComputed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_NS0_11PropOpFlagsE:
 1959|     99|    PropOpFlags opFlags) {
 1960|     99|  return putComputedWithReceiver_RJS(
 1961|     99|      selfHandle, runtime, nameValHandle, valueHandle, selfHandle, opFlags);
 1962|     99|}
_ZN6hermes2vm8JSObject12getNamed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_11PropOpFlagsEPNS0_18PropertyCacheEntryE:
 1931|   412k|    PropertyCacheEntry *cacheEntry) {
 1932|   412k|  return getNamedWithReceiver_RJS(
 1933|   412k|      selfHandle, runtime, name, selfHandle, opFlags, cacheEntry);
 1934|   412k|}
_ZN6hermes2vm8JSObject7classofEPKNS0_6GCCellE:
  382|  1.58M|  static bool classof(const GCCell *cell) {
  383|  1.58M|    return kindInRange(
  384|  1.58M|        cell->getKind(), CellKind::ObjectKind_first, CellKind::ObjectKind_last);
  385|  1.58M|  }
_ZNK6hermes2vm19DefinePropertyFlags7isEmptyEv:
   55|    756|  bool isEmpty() const {
   56|    756|    return _flags == 0;
   57|    756|  }
_ZNK6hermes2vm19DefinePropertyFlags10isAccessorEv:
   65|  1.01M|  bool isAccessor() const {
   66|  1.01M|    return setGetter || setSetter;
  ------------------
  |  Branch (66:12): [True: 12.5k, False: 1.00M]
  |  Branch (66:25): [True: 0, False: 1.00M]
  ------------------
   67|  1.01M|  }
_ZN6hermes2vm19DefinePropertyFlags24getNewNonEnumerableFlagsEv:
   87|  40.0k|  static DefinePropertyFlags getNewNonEnumerableFlags() {
   88|  40.0k|    DefinePropertyFlags dpf{};
   89|  40.0k|    dpf.setEnumerable = 1;
   90|  40.0k|    dpf.enumerable = 0;
   91|  40.0k|    dpf.setWritable = 1;
   92|  40.0k|    dpf.writable = 1;
   93|  40.0k|    dpf.setConfigurable = 1;
   94|  40.0k|    dpf.configurable = 1;
   95|  40.0k|    dpf.setValue = 1;
   96|  40.0k|    return dpf;
   97|  40.0k|  }
_ZN6hermes2vm11ObjectFlagsC2Ev:
  141|   490k|  ObjectFlags() {
  142|   490k|    ::memset(this, 0, sizeof(*this));
  143|   490k|  }
_ZN6hermes2vm8JSObjectC2ERNS0_7RuntimeEPS1_PNS0_11HiddenClassE:
  354|  51.9k|      : JSObject(runtime, parent, clazz, GCPointerBase::NoBarriers()) {
  355|       |    // Direct property slots are initialized by initDirectPropStorage.
  356|  51.9k|  }
_ZN6hermes2vm8JSObject11getCellKindEv:
  379|  21.8k|  static constexpr CellKind getCellKind() {
  380|  21.8k|    return CellKind::JSObjectKind;
  381|  21.8k|  }
_ZNK6hermes2vm8JSObject12isExtensibleEv:
  431|   548k|  bool isExtensible() const {
  432|   548k|    return !flags_.noExtend;
  433|   548k|  }
_ZNK6hermes2vm8JSObject6isLazyEv:
  436|  1.35k|  bool isLazy() const {
  437|  1.35k|    return flags_.lazyObject;
  438|  1.35k|  }
_ZNK6hermes2vm8JSObject9getParentERNS0_7RuntimeE:
  457|  1.48k|  JSObject *getParent(Runtime &runtime) const {
  458|  1.48k|    assert(
  459|  1.48k|        !flags_.proxyObject && "getParent cannot be used with proxy objects");
  460|      0|    return parent_.get(runtime);
  461|  1.48k|  }
_ZNK6hermes2vm8JSObject8getClassERNS0_11PointerBaseE:
  464|  67.4k|  HiddenClass *getClass(PointerBase &base) const {
  465|  67.4k|    return clazz_.getNonNull(base);
  466|  67.4k|  }
_ZNK6hermes2vm8JSObject13getClassGCPtrEv:
  469|   818k|  const GCPointer<HiddenClass> &getClassGCPtr() const {
  470|   818k|    return clazz_;
  471|   818k|  }
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeEPS1_RNS0_7RuntimeENS0_23NamedPropertyDescriptorENS0_13HermesValue32E:
  666|  1.21M|      SmallHermesValue value) {
  667|  1.21M|    assert(!desc.flags.proxyObject && "setNamedSlotValue called on a Proxy");
  668|      0|    assert(
  669|  1.21M|        !desc.flags.hostObject && "setNamedSlotValue called on a HostObject");
  670|      0|    setNamedSlotValueUnsafe(self, runtime, desc.slot, value);
  671|  1.21M|  }
_ZN6hermes2vm8JSObject13getOwnIndexedENS0_12PseudoHandleIS1_EERNS0_7RuntimeEj:
 1052|   459k|  getOwnIndexed(PseudoHandle<JSObject> self, Runtime &runtime, uint32_t index) {
 1053|   459k|    return self->getVT()->getOwnIndexed(std::move(self), runtime, index);
 1054|   459k|  }
_ZN6hermes2vm8JSObject13setOwnIndexedENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
 1061|   219k|      Handle<> value) {
 1062|   219k|    return selfHandle->getVT()->setOwnIndexed(
 1063|   219k|        selfHandle, runtime, index, value);
 1064|   219k|  }
_ZNK6hermes2vm8JSObject5getVTEv:
 1352|  1.03M|  const ObjectVTable *getVT() const {
 1353|  1.03M|    return static_cast<const ObjectVTable *>(GCCell::getVT());
 1354|  1.03M|  }
_ZNK6hermes2vm8JSObject11directPropsEv:
 1535|   499k|const GCSmallHermesValue *JSObject::directProps() const {
 1536|   499k|  return static_cast<const JSObjectAndDirectProps *>(this)->directProps_;
 1537|   499k|}
_ZN6hermes2vm8JSObject17directPropsOffsetEv:
 1539|   982k|constexpr size_t JSObject::directPropsOffset() {
 1540|   982k|  return llvh::alignTo<alignof(GCSmallHermesValue)>(sizeof(JSObject));
 1541|   982k|}
_ZN6hermes2vm8JSObject16cellSizeJSObjectEv:
 1543|   439k|constexpr size_t JSObject::cellSizeJSObject() {
 1544|   439k|  static_assert(
 1545|   439k|      sizeof(JSObjectAndDirectProps) ==
 1546|   439k|          directPropsOffset() +
 1547|   439k|              sizeof(GCSmallHermesValue) * DIRECT_PROPERTY_SLOTS,
 1548|   439k|      "unexpected padding");
 1549|   439k|  static_assert(
 1550|   439k|      heapAlignSize(sizeof(JSObjectAndDirectProps)) ==
 1551|   439k|          sizeof(JSObjectAndDirectProps),
 1552|   439k|      "Wasted direct slot due to alignment");
 1553|   439k|  return sizeof(JSObjectAndDirectProps);
 1554|   439k|}
_ZN6hermes2vm8JSObject19allocatePropStorageENS0_6HandleIS1_EERNS0_7RuntimeEj:
 1630|   446k|    PropStorage::size_type size) {
 1631|   446k|  if (LLVM_LIKELY(size <= DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   446k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 42.4k, False: 404k]
  |  |  ------------------
  ------------------
 1632|  42.4k|    return ExecutionStatus::RETURNED;
 1633|       |
 1634|   404k|  auto res = PropStorage::create(
 1635|   404k|      runtime, size - DIRECT_PROPERTY_SLOTS, size - DIRECT_PROPERTY_SLOTS);
 1636|   404k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
 1637|      0|    return ExecutionStatus::EXCEPTION;
 1638|       |
 1639|   404k|  selfHandle->propStorage_.setNonNull(
 1640|   404k|      runtime, vmcast<PropStorage>(*res), runtime.getHeap());
 1641|   404k|  return ExecutionStatus::RETURNED;
 1642|   404k|}
_ZN6hermes2vm8JSObject19allocatePropStorageENS0_12PseudoHandleIS1_EERNS0_7RuntimeEj:
 1647|    877|    PropStorage::size_type size) {
 1648|    877|  if (LLVM_LIKELY(size <= DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|    877|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 877, False: 0]
  |  |  ------------------
  ------------------
 1649|    877|    return self;
 1650|       |
 1651|      0|  Handle<JSObject> selfHandle = runtime.makeHandle(std::move(self));
 1652|      0|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1653|      0|          allocatePropStorage(selfHandle, runtime, size) ==
 1654|      0|          ExecutionStatus::EXCEPTION)) {
 1655|      0|    return ExecutionStatus::EXCEPTION;
 1656|      0|  }
 1657|       |
 1658|      0|  return PseudoHandle<JSObject>{selfHandle};
 1659|      0|}
_ZN6hermes2vm8JSObject17getNamedSlotValueENS0_6HandleIS1_EERNS0_7RuntimeENS0_23NamedPropertyDescriptorE:
 1719|     99|    NamedPropertyDescriptor desc) {
 1720|     99|  if (LLVM_UNLIKELY(desc.flags.proxyObject) ||
  ------------------
  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1721|     99|      LLVM_UNLIKELY(desc.flags.hostObject)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1722|      0|    SymbolID name = SymbolID::unsafeCreate(desc.slot);
 1723|      0|    assert(name.isValid() && "invalid SymbolID in descriptor");
 1724|      0|    return getNamed_RJS(self, runtime, name);
 1725|      0|  }
 1726|     99|  return createPseudoHandle(
 1727|     99|      getNamedSlotValueUnsafe(self.get(), runtime, desc).unboxToHV(runtime));
 1728|     99|}
_ZN6hermes2vm8JSObject26getComputedSlotValueUnsafeENS0_12PseudoHandleIS1_EERNS0_7RuntimeENS0_26ComputedPropertyDescriptorE:
 1796|  67.3k|    ComputedPropertyDescriptor desc) {
 1797|  67.3k|  if (LLVM_LIKELY(desc.flags.indexed)) {
  ------------------
  |  |  188|  67.3k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 67.3k]
  |  |  ------------------
  ------------------
 1798|      0|    assert(
 1799|      0|        self->flags_.indexedStorage &&
 1800|      0|        "indexed flag set but no indexed storage");
 1801|      0|    return getOwnIndexed(std::move(self), runtime, desc.slot);
 1802|      0|  }
 1803|       |  // Call is valid because this function cannot be called with a Proxy.
 1804|  67.3k|  return getNamedSlotValueUnsafe(
 1805|  67.3k|             self.get(), runtime, desc.castToNamedPropertyDescriptorRef())
 1806|  67.3k|      .unboxToHV(runtime);
 1807|  67.3k|}
_ZN6hermes2vm8JSObject28tryGetOwnNamedDescriptorFastEPS1_RNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1866|  6.07k|    NamedPropertyDescriptor &desc) {
 1867|  6.07k|  return HiddenClass::tryFindPropertyFast(
 1868|  6.07k|      self->clazz_.getNonNull(runtime), runtime, name, desc);
 1869|  6.07k|}
_ZN6hermes2vm8JSObject28getNamedDescriptorPredefinedENS0_6HandleIS1_EERNS0_7RuntimeENS0_10Predefined3StrERNS0_23NamedPropertyDescriptorE:
 1895|     48|    NamedPropertyDescriptor &desc) {
 1896|     48|  return getNamedDescriptorUnsafe(
 1897|     48|      selfHandle,
 1898|     48|      runtime,
 1899|     48|      Predefined::getSymbolID(name),
 1900|     48|      PropertyFlags::invalid(),
 1901|     48|      desc);
 1902|     48|}
_ZN6hermes2vm8JSObject24getNamedDescriptorUnsafeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDERNS0_23NamedPropertyDescriptorE:
 1921|   412k|    NamedPropertyDescriptor &desc) {
 1922|   412k|  return getNamedDescriptorUnsafe(
 1923|   412k|      selfHandle, runtime, name, PropertyFlags::invalid(), desc);
 1924|   412k|}
_ZN6hermes2vm8JSObject12putNamed_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 1949|  3.76k|    PropOpFlags opFlags) {
 1950|  3.76k|  return putNamedWithReceiver_RJS(
 1951|  3.76k|      selfHandle, runtime, name, valueHandle, selfHandle, opFlags);
 1952|  3.76k|}
_ZN6hermes2vm8JSObject26getOwnIndexedPropertyFlagsEPS1_RNS0_7RuntimeEj:
 1978|   354k|    uint32_t index) {
 1979|   354k|  return self->getVT()->getOwnIndexedPropertyFlags(self, runtime, index);
 1980|   354k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_14NativeFunctionEEEjv:
 1516|  84.8k|  static constexpr unsigned numOverlapSlots() {
 1517|  84.8k|    static_assert(
 1518|  84.8k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|  84.8k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|  84.8k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|  84.8k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|  84.8k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17NativeConstructorEEEjv:
 1516|  8.11k|  static constexpr unsigned numOverlapSlots() {
 1517|  8.11k|    static_assert(
 1518|  8.11k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|  8.11k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|  8.11k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|  8.11k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|  8.11k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15DecoratedObjectEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSArrayEEEjv:
 1516|   856k|  static constexpr unsigned numOverlapSlots() {
 1517|   856k|    static_assert(
 1518|   856k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|   856k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|   856k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|   856k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|   856k|  }
_ZN6hermes2vm8JSObject23getNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE1EEES4_PS1_RNS0_11PointerBaseEj:
 1692|   405k|    SlotIndex index) {
 1693|   405k|  assert(!self->flags_.proxyObject && "getNamedSlotValue called on a Proxy");
 1694|       |
 1695|   405k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   405k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 405k]
  |  |  ------------------
  ------------------
 1696|     99|    return self->directProps()[index];
 1697|       |
 1698|   405k|  return self->propStorage_.getNonNull(runtime)->at<inl>(
 1699|   405k|      index - DIRECT_PROPERTY_SLOTS);
 1700|   405k|}
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE1EEEvPS1_RNS0_7RuntimeEjS4_:
 1755|   406k|    SmallHermesValue value) {
 1756|       |  // NOTE: even though it is tempting to implement this in terms of assignment
 1757|       |  // to namedSlotRef(), it is a slight performance regression, which is not
 1758|       |  // entirely unexpected.
 1759|   406k|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|   406k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 990, False: 405k]
  |  |  ------------------
  ------------------
 1760|    990|    return self->directProps()[index].set(value, runtime.getHeap());
 1761|       |
 1762|   405k|  self->propStorage_.getNonNull(runtime)->set<inl>(
 1763|   405k|      index - DIRECT_PROPERTY_SLOTS, value, runtime.getHeap());
 1764|   405k|}
_ZN6hermes2vm8JSObject23setNamedSlotValueUnsafeILNS0_16ArrayStorageBaseINS0_13HermesValue32EE6InlineE0EEEvPS1_RNS0_7RuntimeEjS4_:
 1755|  1.21M|    SmallHermesValue value) {
 1756|       |  // NOTE: even though it is tempting to implement this in terms of assignment
 1757|       |  // to namedSlotRef(), it is a slight performance regression, which is not
 1758|       |  // entirely unexpected.
 1759|  1.21M|  if (LLVM_LIKELY(index < DIRECT_PROPERTY_SLOTS))
  ------------------
  |  |  188|  1.21M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 406k, False: 808k]
  |  |  ------------------
  ------------------
 1760|   406k|    return self->directProps()[index].set(value, runtime.getHeap());
 1761|       |
 1762|   808k|  self->propStorage_.getNonNull(runtime)->set<inl>(
 1763|   808k|      index - DIRECT_PROPERTY_SLOTS, value, runtime.getHeap());
 1764|   808k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_17NativeConstructorEEEjv:
 1502|  4.05k|  static constexpr uint32_t cellSizeImpl() {
 1503|  4.05k|    static_assert(
 1504|  4.05k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|  4.05k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|  4.05k|  }
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_17NativeConstructorEEEPT_RNS0_7RuntimeES5_:
 1662|  4.05k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|  4.05k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|  4.05k|  static_assert(
 1665|  4.05k|      count <= DIRECT_PROPERTY_SLOTS,
 1666|  4.05k|      "smallPropStorage size must fit in direct properties");
 1667|  4.05k|  GCSmallHermesValue::uninitialized_fill(
 1668|  4.05k|      self->directProps() + numOverlapSlots<T>(),
 1669|  4.05k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|  4.05k|      SmallHermesValue::encodeUndefinedValue(),
 1671|  4.05k|      runtime.getHeap());
 1672|  4.05k|  return self;
 1673|  4.05k|}
_ZN6hermes2vm8JSObject18getDirectSlotValueILj3EEENS0_13HermesValue32EPKS1_:
 1676|   499k|inline SmallHermesValue JSObject::getDirectSlotValue(const JSObject *self) {
 1677|   499k|  static_assert(index < DIRECT_PROPERTY_SLOTS, "Must be a direct property");
 1678|   499k|  return self->directProps()[index];
 1679|   499k|}
_ZN6hermes2vm8JSObject18setDirectSlotValueILj3EEEvPS1_NS0_13HermesValue32ERNS0_7HadesGCE:
 1683|   573k|JSObject::setDirectSlotValue(JSObject *self, SmallHermesValue value, GC &gc) {
 1684|   573k|  static_assert(index < DIRECT_PROPERTY_SLOTS, "Must be a direct property");
 1685|   573k|  self->directProps()[index].set(value, gc);
 1686|   573k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8CallableEEEjv:
 1516|      9|  static constexpr unsigned numOverlapSlots() {
 1517|      9|    static_assert(
 1518|      9|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      9|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      9|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      9|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      9|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13BoundFunctionEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSFunctionEEEjv:
 1516|  9.00k|  static constexpr unsigned numOverlapSlots() {
 1517|  9.00k|    static_assert(
 1518|  9.00k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|  9.00k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|  9.00k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|  9.00k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|  9.00k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSAsyncFunctionEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_19JSGeneratorFunctionEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_22GeneratorInnerFunctionEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObjectC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeEPS1_PNS0_11HiddenClassET_:
  334|   480k|        propStorage_(nullptr) {
  335|       |    // Direct property slots are initialized by initDirectPropStorage.
  336|   480k|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_13BoundFunctionEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_13BoundFunctionEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1577|     99|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1578|       |  // Check that the object looks well-formed.
 1579|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1580|      0|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1581|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_13BoundFunctionEEEPT_RNS0_7RuntimeES5_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_14NativeFunctionEEEjv:
 1502|  42.4k|  static constexpr uint32_t cellSizeImpl() {
 1503|  42.4k|    static_assert(
 1504|  42.4k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|  42.4k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|  42.4k|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_14NativeFunctionEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1577|  42.4k|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1578|       |  // Check that the object looks well-formed.
 1579|  42.4k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1580|      0|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1581|  42.4k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_14NativeFunctionEEEPT_RNS0_7RuntimeES5_:
 1662|  42.4k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|  42.4k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|  42.4k|  static_assert(
 1665|  42.4k|      count <= DIRECT_PROPERTY_SLOTS,
 1666|  42.4k|      "smallPropStorage size must fit in direct properties");
 1667|  42.4k|  GCSmallHermesValue::uninitialized_fill(
 1668|  42.4k|      self->directProps() + numOverlapSlots<T>(),
 1669|  42.4k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|  42.4k|      SmallHermesValue::encodeUndefinedValue(),
 1671|  42.4k|      runtime.getHeap());
 1672|  42.4k|  return self;
 1673|  42.4k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_10JSFunctionEEEjv:
 1502|  4.50k|  static constexpr uint32_t cellSizeImpl() {
 1503|  4.50k|    static_assert(
 1504|  4.50k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|  4.50k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|  4.50k|  }
Callable.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_10JSFunctionEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|  4.50k|    JSObjectType *obj) {
 1588|  4.50k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|  4.50k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_10JSFunctionEEEPT_RNS0_7RuntimeES5_:
 1662|  4.50k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|  4.50k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|  4.50k|  static_assert(
 1665|  4.50k|      count <= DIRECT_PROPERTY_SLOTS,
 1666|  4.50k|      "smallPropStorage size must fit in direct properties");
 1667|  4.50k|  GCSmallHermesValue::uninitialized_fill(
 1668|  4.50k|      self->directProps() + numOverlapSlots<T>(),
 1669|  4.50k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|  4.50k|      SmallHermesValue::encodeUndefinedValue(),
 1671|  4.50k|      runtime.getHeap());
 1672|  4.50k|  return self;
 1673|  4.50k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_14RequireContextEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsIS1_EEjv:
 1516|  22.0k|  static constexpr unsigned numOverlapSlots() {
 1517|  22.0k|    static_assert(
 1518|  22.0k|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|  22.0k|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|  22.0k|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|  22.0k|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|  22.0k|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9ArrayImplEEEjv:
 1516|      2|  static constexpr unsigned numOverlapSlots() {
 1517|      2|    static_assert(
 1518|      2|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      2|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      2|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      2|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      2|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9ArgumentsEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSArrayIteratorEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_7JSArrayEEEjv:
 1502|   428k|  static constexpr uint32_t cellSizeImpl() {
 1503|   428k|    static_assert(
 1504|   428k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|   428k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|   428k|  }
JSArray.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_7JSArrayEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1577|   428k|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1578|       |  // Check that the object looks well-formed.
 1579|   428k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1580|      0|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1581|   428k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_7JSArrayEEEPT_RNS0_7RuntimeES5_:
 1662|   428k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|   428k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|   428k|  static_assert(
 1665|   428k|      count <= DIRECT_PROPERTY_SLOTS,
 1666|   428k|      "smallPropStorage size must fit in direct properties");
 1667|   428k|  GCSmallHermesValue::uninitialized_fill(
 1668|   428k|      self->directProps() + numOverlapSlots<T>(),
 1669|   428k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|   428k|      SmallHermesValue::encodeUndefinedValue(),
 1671|   428k|      runtime.getHeap());
 1672|   428k|  return self;
 1673|   428k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSArrayBufferEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSDataViewEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_6JSDateEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSErrorEEEjv:
 1516|     49|  static constexpr unsigned numOverlapSlots() {
 1517|     49|    static_assert(
 1518|     49|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|     49|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|     49|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|     49|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|     49|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_7JSErrorEEEjv:
 1502|     24|  static constexpr uint32_t cellSizeImpl() {
 1503|     24|    static_assert(
 1504|     24|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     24|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     24|  }
JSError.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_7JSErrorEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|     24|    JSObjectType *obj) {
 1588|     24|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|     24|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_7JSErrorEEEPT_RNS0_7RuntimeES5_:
 1662|     24|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     24|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     24|  static_assert(
 1665|     24|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     24|      "smallPropStorage size must fit in direct properties");
 1667|     24|  GCSmallHermesValue::uninitialized_fill(
 1668|     24|      self->directProps() + numOverlapSlots<T>(),
 1669|     24|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     24|      SmallHermesValue::encodeUndefinedValue(),
 1671|     24|      runtime.getHeap());
 1672|     24|  return self;
 1673|     24|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_11JSGeneratorEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObjectC2INS0_13GCPointerBase10NoBarriersEEERNS0_7RuntimeENS0_6HandleIS1_EENS7_INS0_11HiddenClassEEET_:
  346|  10.9k|        propStorage_(nullptr) {
  347|       |    // Direct property slots are initialized by initDirectPropStorage.
  348|  10.9k|  }
_ZN6hermes2vm8JSObject12cellSizeImplIS1_EEjv:
 1502|  10.9k|  static constexpr uint32_t cellSizeImpl() {
 1503|  10.9k|    static_assert(
 1504|  10.9k|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|  10.9k|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|  10.9k|  }
JSObject.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSObjectEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|  10.9k|    JSObjectType *obj) {
 1588|  10.9k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|  10.9k|}
_ZN6hermes2vm8JSObject21initDirectPropStorageIS1_EEPT_RNS0_7RuntimeES4_:
 1662|  10.9k|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|  10.9k|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|  10.9k|  static_assert(
 1665|  10.9k|      count <= DIRECT_PROPERTY_SLOTS,
 1666|  10.9k|      "smallPropStorage size must fit in direct properties");
 1667|  10.9k|  GCSmallHermesValue::uninitialized_fill(
 1668|  10.9k|      self->directProps() + numOverlapSlots<T>(),
 1669|  10.9k|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|  10.9k|      SmallHermesValue::encodeUndefinedValue(),
 1671|  10.9k|      runtime.getHeap());
 1672|  10.9k|  return self;
 1673|  10.9k|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_7JSProxyEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSRegExpEEEjv:
 1516|    485|  static constexpr unsigned numOverlapSlots() {
 1517|    485|    static_assert(
 1518|    485|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    485|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    485|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    485|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    485|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSRegExpEEEjv:
 1502|    242|  static constexpr uint32_t cellSizeImpl() {
 1503|    242|    static_assert(
 1504|    242|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|    242|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|    242|  }
JSRegExp.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSRegExpEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|    242|    JSObjectType *obj) {
 1588|    242|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|    242|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSRegExpEEEPT_RNS0_7RuntimeES5_:
 1662|    242|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|    242|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|    242|  static_assert(
 1665|    242|      count <= DIRECT_PROPERTY_SLOTS,
 1666|    242|      "smallPropStorage size must fit in direct properties");
 1667|    242|  GCSmallHermesValue::uninitialized_fill(
 1668|    242|      self->directProps() + numOverlapSlots<T>(),
 1669|    242|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|    242|      SmallHermesValue::encodeUndefinedValue(),
 1671|    242|      runtime.getHeap());
 1672|    242|  return self;
 1673|    242|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSMapImplILNS0_8CellKindE47EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSMapImplILNS0_8CellKindE48EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSMapIteratorImplILNS0_8CellKindE50EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSMapIteratorImplILNS0_8CellKindE49EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_16JSTypedArrayBaseEEEjv:
 1516|     11|  static constexpr unsigned numOverlapSlots() {
 1517|     11|    static_assert(
 1518|     11|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|     11|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|     11|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|     11|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|     11|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSWeakMapImplILNS0_8CellKindE51EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_13JSWeakMapImplILNS0_8CellKindE52EEEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_17JSWeakMapImplBaseEEEjv:
 1516|      2|  static constexpr unsigned numOverlapSlots() {
 1517|      2|    static_assert(
 1518|      2|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      2|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      2|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      2|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      2|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSWeakRefEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_25FinalizableNativeFunctionEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10HostObjectEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_10HostObjectEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
HostModel.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_10HostObjectEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1594|     99|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1595|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1596|      0|  return HermesValue::encodeObjectValue(
 1597|     99|      JSObjectType::initDirectPropStorage(runtime, obj));
 1598|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_10HostObjectEEEPT_RNS0_7RuntimeES5_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSStringEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_16JSStringIteratorEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSBigIntEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSNumberEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_9JSBooleanEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_8JSSymbolEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSStringEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL12initToHandleINS0_8JSStringEEENS0_6HandleIT_EERNS0_7RuntimeEPS5_:
 1577|     99|static Handle<JSObjectType> initToHandle(Runtime &runtime, JSObjectType *obj) {
 1578|       |  // Check that the object looks well-formed.
 1579|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1580|      0|  return runtime.makeHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1581|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSStringEEEPT_RNS0_7RuntimeES5_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_8JSNumberEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_8JSNumberEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|     99|    JSObjectType *obj) {
 1588|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_8JSNumberEEEPT_RNS0_7RuntimeES5_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_9JSBooleanEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
PrimitiveBox.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_9JSBooleanEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|     99|    JSObjectType *obj) {
 1588|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_9JSBooleanEEEPT_RNS0_7RuntimeES5_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
AsyncFunction.cpp:_ZN6hermes2vm12JSObjectInitL18initToPseudoHandleINS0_17NativeConstructorEEENS0_12PseudoHandleIT_EERNS0_7RuntimeEPS5_:
 1587|  4.05k|    JSObjectType *obj) {
 1588|  4.05k|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1589|      0|  return createPseudoHandle(JSObjectType::initDirectPropStorage(runtime, obj));
 1590|  4.05k|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_12SingleObjectILNS0_8CellKindE60EEEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
Math.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_12SingleObjectILNS0_8CellKindE60EEEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1594|     99|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1595|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1596|      0|  return HermesValue::encodeObjectValue(
 1597|     99|      JSObjectType::initDirectPropStorage(runtime, obj));
 1598|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_12SingleObjectILNS0_8CellKindE60EEEEEPT_RNS0_7RuntimeES7_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject12cellSizeImplINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
 1502|     99|  static constexpr uint32_t cellSizeImpl() {
 1503|     99|    static_assert(
 1504|     99|        std::is_convertible<C *, JSObject *>::value, "must be a JSObject");
 1505|     99|    return sizeof(C) < cellSizeJSObject() ? cellSizeJSObject() : sizeof(C);
  ------------------
  |  Branch (1505:12): [Folded - Ignored]
  ------------------
 1506|     99|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_12SingleObjectILNS0_8CellKindE59EEEEEjv:
 1516|    199|  static constexpr unsigned numOverlapSlots() {
 1517|    199|    static_assert(
 1518|    199|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|    199|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|    199|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|    199|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|    199|  }
JSON.cpp:_ZN6hermes2vm12JSObjectInitL17initToHermesValueINS0_12SingleObjectILNS0_8CellKindE59EEEEENS0_11HermesValueERNS0_7RuntimeEPT_:
 1594|     99|static HermesValue initToHermesValue(Runtime &runtime, JSObjectType *obj) {
 1595|     99|  assert(JSObjectType::classof(obj) && "Mismatched CellKind");
 1596|      0|  return HermesValue::encodeObjectValue(
 1597|     99|      JSObjectType::initDirectPropStorage(runtime, obj));
 1598|     99|}
_ZN6hermes2vm8JSObject21initDirectPropStorageINS0_12SingleObjectILNS0_8CellKindE59EEEEEPT_RNS0_7RuntimeES7_:
 1662|     99|inline T *JSObject::initDirectPropStorage(Runtime &runtime, T *self) {
 1663|     99|  constexpr auto count = numOverlapSlots<T>() + T::NAMED_PROPERTY_SLOTS;
 1664|     99|  static_assert(
 1665|     99|      count <= DIRECT_PROPERTY_SLOTS,
 1666|     99|      "smallPropStorage size must fit in direct properties");
 1667|     99|  GCSmallHermesValue::uninitialized_fill(
 1668|     99|      self->directProps() + numOverlapSlots<T>(),
 1669|     99|      self->directProps() + DIRECT_PROPERTY_SLOTS,
 1670|     99|      SmallHermesValue::encodeUndefinedValue(),
 1671|     99|      runtime.getHeap());
 1672|     99|  return self;
 1673|     99|}
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_10JSCallSiteEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_15JSCallableProxyEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }
_ZN6hermes2vm8JSObject15numOverlapSlotsINS0_22JSRegExpStringIteratorEEEjv:
 1516|      1|  static constexpr unsigned numOverlapSlots() {
 1517|      1|    static_assert(
 1518|      1|        std::is_convertible<Derived *, JSObject *>::value, "must be subclass");
 1519|      1|    auto aligned = llvh::alignTo<sizeof(GCSmallHermesValue)>(sizeof(Derived));
 1520|      1|    auto excess = (aligned - directPropsOffset()) / sizeof(GCSmallHermesValue);
 1521|      1|    return std::min<size_t>(excess, DIRECT_PROPERTY_SLOTS);
 1522|      1|  }

_ZN6hermes2vm8JSRegExp11getCellKindEv:
   28|    484|  static constexpr CellKind getCellKind() {
   29|    484|    return CellKind::JSRegExpKind;
   30|    484|  }
_ZN6hermes2vm8JSRegExp7classofEPKNS0_6GCCellE:
   31|   812k|  static bool classof(const GCCell *cell) {
   32|   812k|    return cell->getKind() == CellKind::JSRegExpKind;
   33|   812k|  }
_ZN6hermes2vm8JSRegExp6createERNS0_7RuntimeE:
   42|    242|  static PseudoHandle<JSRegExp> create(Runtime &runtime) {
   43|    242|    return create(runtime, Handle<JSObject>::vmcast(&runtime.regExpPrototype));
   44|    242|  }
_ZN6hermes2vm8JSRegExp14getSyntaxFlagsEPS1_:
   97|   405k|  static regex::SyntaxFlags getSyntaxFlags(JSRegExp *self) {
   98|   405k|    return self->syntaxFlags_;
   99|   405k|  }
_ZN6hermes2vm8JSRegExpC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  134|    242|            runtime.getHeap()) {}

_ZN6hermes2vm13JSWeakMapImplILNS0_8CellKindE51EE7classofEPKNS0_6GCCellE:
  321|   802k|  static bool classof(const GCCell *cell) {
  322|   802k|    return cell->getKind() == C;
  323|   802k|  }

_ZN6hermes2vm14MarkBitArrayNC4sizeEv:
  111|    602|/* static */ constexpr size_t MarkBitArrayNC::size() {
  112|    602|  return kNumBits;
  113|    602|}
_ZNK6hermes2vm14MarkBitArrayNC14addressToIndexEPKv:
  115|  7.24M|size_t MarkBitArrayNC::addressToIndex(const void *p) const {
  116|  7.24M|  assert(
  117|  7.24M|      base() <= p && p < AlignedStorage::end(base()) &&
  118|  7.24M|      "precondition: argument must be within the covered range");
  119|      0|  auto cp = reinterpret_cast<const char *>(p);
  120|  7.24M|  return (cp - base()) >> LogHeapAlign;
  121|  7.24M|}
_ZNK6hermes2vm14MarkBitArrayNC2atEm:
  133|  5.82M|bool MarkBitArrayNC::at(size_t ind) const {
  134|  5.82M|  assert(ind < kNumBits && "precondition: ind must be within the index range");
  135|      0|  return bitArray_.at(ind);
  136|  5.82M|}
_ZN6hermes2vm14MarkBitArrayNC4markEm:
  138|  1.41M|void MarkBitArrayNC::mark(size_t ind) {
  139|  1.41M|  assert(ind < kNumBits && "precondition: ind must be within the index range");
  140|      0|  bitArray_.set(ind, true);
  141|  1.41M|}
_ZN6hermes2vm14MarkBitArrayNC5clearEv:
  143|    150|void MarkBitArrayNC::clear() {
  144|    150|  bitArray_.reset();
  145|    150|}
_ZN6hermes2vm14MarkBitArrayNC7markAllEv:
  147|    203|void MarkBitArrayNC::markAll() {
  148|    203|  bitArray_.set();
  149|    203|}
_ZN6hermes2vm14MarkBitArrayNC23findNextUnmarkedBitFromEm:
  155|    602|size_t MarkBitArrayNC::findNextUnmarkedBitFrom(size_t ind) {
  156|    602|  return bitArray_.findNextZeroBitFrom(ind);
  157|    602|}
_ZNK6hermes2vm14MarkBitArrayNC4baseEv:
  167|  21.7M|char *MarkBitArrayNC::base() const {
  168|       |  // As we know the mark bit array is laid out inline before the allocation
  169|       |  // region of its aligned heap segment, we can use its own this pointer as the
  170|       |  // base address. It is safe to cast away the const because we never use the
  171|       |  // resulting pointer to index back into the array, but rather to index past it
  172|       |  // into the allocation region.
  173|  21.7M|  return const_cast<char *>(reinterpret_cast<const char *>(this));
  174|  21.7M|}
_ZN6hermes2vm14MarkBitArrayNCC2Ev:
   25|    203|  MarkBitArrayNC() = default;

_ZN6hermes2vm8Metadata9ArrayDataC2ENS2_9ArrayTypeEhhh:
   59|      8|          stride(stride) {}
_ZN6hermes2vm8Metadata7Builder8addArrayEPKNS0_17GCHermesValueBaseINS0_11HermesValueEEEPKNSt3__16atomicIjEEm:
   96|      1|      std::size_t stride) {                                 \
   97|      1|    addArray(                                               \
   98|      1|        nullptr,                                            \
   99|      1|        ArrayData::ArrayType::type,                         \
  100|      1|        startLocation,                                      \
  101|      1|        lengthLocation,                                     \
  102|      1|        stride);                                            \
  103|      1|  }                                                         \
_ZN6hermes2vm8Metadata7Builder8addArrayEPKcPKNS0_17GCHermesValueBaseINS0_11HermesValueEEEPKNSt3__16atomicIjEEm:
  109|      3|      std::size_t stride) {                                 \
  110|      3|    addArray(                                               \
  111|      3|        name,                                               \
  112|      3|        ArrayData::ArrayType::type,                         \
  113|      3|        startLocation,                                      \
  114|      3|        lengthLocation,                                     \
  115|      3|        stride);                                            \
  116|      3|  }
_ZN6hermes2vm8Metadata7Builder8addArrayEPKcPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEEPKNSt3__16atomicIjEEm:
  109|      3|      std::size_t stride) {                                 \
  110|      3|    addArray(                                               \
  111|      3|        name,                                               \
  112|      3|        ArrayData::ArrayType::type,                         \
  113|      3|        startLocation,                                      \
  114|      3|        lengthLocation,                                     \
  115|      3|        stride);                                            \
  116|      3|  }
_ZN6hermes2vm8Metadata7Builder8addArrayEPKNS0_10GCSymbolIDEPKNSt3__16atomicIjEEm:
   96|      1|      std::size_t stride) {                                 \
   97|      1|    addArray(                                               \
   98|      1|        nullptr,                                            \
   99|      1|        ArrayData::ArrayType::type,                         \
  100|      1|        startLocation,                                      \
  101|      1|        lengthLocation,                                     \
  102|      1|        stride);                                            \
  103|      1|  }                                                         \
_ZN6hermes2vm8Metadata7Builder23addJSObjectOverlapSlotsEj:
  129|    120|    void addJSObjectOverlapSlots(unsigned num) {
  130|    120|      if (!jsObjectOverlapSlots_) {
  ------------------
  |  Branch (130:11): [True: 51, False: 69]
  ------------------
  131|     51|        jsObjectOverlapSlots_ = num;
  132|     69|      } else {
  133|       |        // Subsequent calls do nothing but assert that order of calls is sane.
  134|     69|        assert(
  135|     69|            num <= *jsObjectOverlapSlots_ &&
  136|     69|            "most derived class should call this method first");
  137|     69|      }
  138|    120|    }
_ZNK6hermes2vm8Metadata7Builder23getJSObjectOverlapSlotsEv:
  142|     51|    unsigned getJSObjectOverlapSlots() const {
  143|     51|      assert(
  144|     51|          jsObjectOverlapSlots_ && "missing call to addJSObjectOverlapSlots");
  145|      0|      return *jsObjectOverlapSlots_;
  146|     51|    }
_ZN6hermes2vm8Metadata7Builder9setVTableEPKNS0_6VTableE:
  148|    144|    void setVTable(const VTable *vtp) {
  149|    144|      vtp_ = vtp;
  150|    144|    }
_ZN6hermes2vm8MetadataC2Ev:
  183|    158|  constexpr Metadata() = default;

_ZN6hermes2vm17MockedEnvironmentC2Ev:
   63|     99|  MockedEnvironment() = default;

_ZNK6hermes2vm10NativeArgs5beginEv:
  222|  1.35M|  ConstArgIterator begin() const {
  223|  1.35M|    return firstArg_;
  224|  1.35M|  }
_ZNK6hermes2vm10NativeArgs3endEv:
  225|      5|  ConstArgIterator end() const {
  226|      5|    return begin() + argCount_;
  227|      5|  }
_ZNK6hermes2vm10NativeArgs10getThisArgEv:
   78|   814k|  const PinnedHermesValue &getThisArg() const {
   79|   814k|    return begin()[-1];
   80|   814k|  }
_ZN6hermes2vm10NativeArgsC2ENSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEEjS6_:
   43|   408k|      : firstArg_(firstArg), argCount_(argCount), newTarget_(newTarget) {}
_ZNK6hermes2vm10NativeArgs11getArgCountEv:
   73|    456|  unsigned getArgCount() const {
   74|    456|    return argCount_;
   75|    456|  }
_ZNK6hermes2vm10NativeArgs13getThisHandleEv:
   83|    662|  Handle<> getThisHandle() const {
   84|    662|    return Handle<>(&getThisArg());
   85|    662|  }
_ZNK6hermes2vm10NativeArgs6getArgEj:
  103|   135k|  HermesValue getArg(unsigned index) const {
  104|   135k|    return index < argCount_ ? static_cast<HermesValue>(begin()[index])
  ------------------
  |  Branch (104:12): [True: 135k, False: 153]
  ------------------
  105|   135k|                             : HermesValue::encodeUndefinedValue();
  106|   135k|  }
_ZNK6hermes2vm10NativeArgs12getArgHandleEj:
  111|   404k|  Handle<> getArgHandle(unsigned index) const {
  112|   404k|    return index < argCount_ ? Handle<>(&begin()[index])
  ------------------
  |  Branch (112:12): [True: 404k, False: 3]
  ------------------
  113|   404k|                             : HandleRootOwner::getUndefinedValue();
  114|   404k|  }
_ZN6hermes2vm10NativeArgs15handle_iteratorC2ENSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEE:
  144|     10|    explicit handle_iterator(ConstArgIterator arg) : arg_(arg) {}
_ZNK6hermes2vm10NativeArgs15handle_iteratorneERKS2_:
  156|  67.1k|    bool operator!=(const handle_iterator &o) const {
  157|  67.1k|      return arg_ != o.arg_;
  158|  67.1k|    }
_ZNK6hermes2vm10NativeArgs15handle_iteratordeEv:
  163|  67.1k|    Handle<> operator*() const {
  164|  67.1k|      return Handle<>(&*arg_);
  165|  67.1k|    }
_ZN6hermes2vm10NativeArgs15handle_iteratorppEv:
  173|  67.1k|    handle_iterator &operator++() {
  174|  67.1k|      ++arg_;
  175|  67.1k|      return *this;
  176|  67.1k|    }
_ZNK6hermes2vm10NativeArgs7handlesEv:
  218|      5|  llvh::iterator_range<handle_iterator> handles() const {
  219|      5|    return llvh::make_range(handle_iterator(begin()), handle_iterator(end()));
  220|      5|  };
_ZNK6hermes2vm10NativeArgs11dyncastThisINS0_8JSObjectEEENS0_6HandleIT_EEv:
   90|    754|  Handle<T> dyncastThis() const {
   91|    754|    return vmisa<T>(getThisArg()) ? Handle<T>::vmcast(&getThisArg())
  ------------------
  |  Branch (91:12): [True: 754, False: 0]
  ------------------
   92|    754|                                  : HandleRootOwner::makeNullHandle<T>();
   93|    754|  }
_ZNK6hermes2vm10NativeArgs11dyncastThisINS0_8JSRegExpEEENS0_6HandleIT_EEv:
   90|   406k|  Handle<T> dyncastThis() const {
   91|   406k|    return vmisa<T>(getThisArg()) ? Handle<T>::vmcast(&getThisArg())
  ------------------
  |  Branch (91:12): [True: 406k, False: 0]
  ------------------
   92|   406k|                                  : HandleRootOwner::makeNullHandle<T>();
   93|   406k|  }

_ZN6hermes2vm21toPropertyKeyIfObjectERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  130|  67.8k|    Handle<> valueHandle) {
  131|  67.8k|  if (LLVM_UNLIKELY(valueHandle->isObject())) {
  ------------------
  |  |  189|  67.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 67.8k]
  |  |  ------------------
  ------------------
  132|      0|    return toPropertyKey(runtime, valueHandle);
  133|      0|  }
  134|  67.8k|  return valueHandle;
  135|  67.8k|}
_ZN6hermes2vm20checkObjectCoercibleERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  162|     12|    Handle<> valueHandle) {
  163|     12|  if (LLVM_UNLIKELY(valueHandle->isUndefined() || valueHandle->isNull())) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 12]
  |  |  |  Branch (189:53): [True: 0, False: 12]
  |  |  |  Branch (189:53): [True: 0, False: 12]
  |  |  ------------------
  ------------------
  164|      0|    return runtime.raiseTypeError("Value not coercible to object");
  165|      0|  }
  166|     12|  return ExecutionStatus::RETURNED;
  167|     12|}
_ZN6hermes2vm20toArrayIndexFastPathENS0_11HermesValueE:
  226|   882k|inline OptValue<uint32_t> toArrayIndexFastPath(HermesValue value) {
  227|   882k|  if (value.isNumber()) {
  ------------------
  |  Branch (227:7): [True: 880k, False: 1.83k]
  ------------------
  228|   880k|    return hermes::doubleToArrayIndex(value.getNumber());
  229|   880k|  }
  230|  1.83k|  return llvh::None;
  231|   882k|}
_ZN6hermes2vm16isWhiteSpaceCharEDs:
  259|    488|inline bool isWhiteSpaceChar(char16_t c) {
  260|    488|  return c == u'\u0009' || c == u'\u000B' || c == u'\u000C' || c == u'\u0020' ||
  ------------------
  |  Branch (260:10): [True: 0, False: 488]
  |  Branch (260:28): [True: 0, False: 488]
  |  Branch (260:46): [True: 0, False: 488]
  |  Branch (260:64): [True: 0, False: 488]
  ------------------
  261|    488|      c == u'\u00A0' || c == u'\uFEFF' || c == u'\u1680' ||
  ------------------
  |  Branch (261:7): [True: 0, False: 488]
  |  Branch (261:25): [True: 0, False: 488]
  |  Branch (261:43): [True: 0, False: 488]
  ------------------
  262|    488|      (c >= u'\u2000' && c <= u'\u200A') || c == u'\u202F' || c == u'\u205F' ||
  ------------------
  |  Branch (262:8): [True: 0, False: 488]
  |  Branch (262:26): [True: 0, False: 0]
  |  Branch (262:45): [True: 0, False: 488]
  |  Branch (262:63): [True: 0, False: 488]
  ------------------
  263|    488|      c == u'\u3000';
  ------------------
  |  Branch (263:7): [True: 0, False: 488]
  ------------------
  264|    488|}
_ZN6hermes2vm20isLineTerminatorCharEDs:
  267|    488|inline bool isLineTerminatorChar(char16_t c) {
  268|    488|  return c == u'\u000A' || c == u'\u000D' || c == u'\u2028' || c == u'\u2029';
  ------------------
  |  Branch (268:10): [True: 0, False: 488]
  |  Branch (268:28): [True: 0, False: 488]
  |  Branch (268:46): [True: 0, False: 488]
  |  Branch (268:64): [True: 0, False: 488]
  ------------------
  269|    488|}
_ZN6hermes2vm13letterToLowerEDs:
  272|    239|inline char16_t letterToLower(char16_t c) {
  273|    239|  return c | 32;
  274|    239|}

_ZN6hermes2vm14OrderedHashMap11getCellKindEv:
   88|    198|  static constexpr CellKind getCellKind() {
   89|    198|    return CellKind::OrderedHashMapKind;
   90|    198|  }

_ZNK6hermes2vm11PointerBase21basedToPointerNonNullENS0_12BasedPointerE:
  161|  42.1M|inline void *PointerBase::basedToPointerNonNull(BasedPointer ptr) const {
  162|  42.1M|  assert(ptr && "Null pointer given to basedToPointerNonNull");
  163|      0|  uintptr_t addr = reinterpret_cast<uintptr_t>(this) + ptr.getRawValue();
  164|  42.1M|  return reinterpret_cast<void *>(addr);
  165|  42.1M|}
_ZNK6hermes2vm12BasedPointercvbEv:
  148|  75.2M|inline BasedPointer::operator bool() const {
  149|  75.2M|  return raw_ != 0;
  150|  75.2M|}
_ZNK6hermes2vm12BasedPointer11getRawValueEv:
  144|  46.9M|inline BasedPointer::StorageType BasedPointer::getRawValue() const {
  145|  46.9M|  return raw_;
  146|  46.9M|}
_ZN6hermes2vm12BasedPointerC2Ej:
  137|  29.9M|inline BasedPointer::BasedPointer(StorageType raw) : raw_(raw) {}
_ZNK6hermes2vm11PointerBase14basedToPointerENS0_12BasedPointerE:
  173|  21.8M|inline void *PointerBase::basedToPointer(BasedPointer ptr) const {
  174|  21.8M|  return ptr ? basedToPointerNonNull(ptr) : nullptr;
  ------------------
  |  Branch (174:10): [True: 19.0M, False: 2.80M]
  ------------------
  175|  21.8M|}
_ZNK6hermes2vm11PointerBase14pointerToBasedEPKv:
  184|  6.52M|inline BasedPointer PointerBase::pointerToBased(const void *ptr) const {
  185|  6.52M|  return ptr ? pointerToBasedNonNull(ptr) : BasedPointer{nullptr};
  ------------------
  |  Branch (185:10): [True: 5.24M, False: 1.27M]
  ------------------
  186|  6.52M|}
_ZNK6hermes2vm11PointerBase21pointerToBasedNonNullEPKv:
  177|  9.16M|inline BasedPointer PointerBase::pointerToBasedNonNull(const void *ptr) const {
  178|  9.16M|  assert(ptr && "Null pointer given to pointerToBasedNonNull");
  179|      0|  uintptr_t offset = (uintptr_t)ptr - (uintptr_t)this;
  180|  9.16M|  assert(llvh::isUInt<32>(offset) && "Pointer out of range");
  181|      0|  return BasedPointer{static_cast<uint32_t>(offset)};
  182|  9.16M|}
_ZN6hermes2vm12BasedPointerC2EDn:
  136|  1.27M|inline BasedPointer::BasedPointer(std::nullptr_t) : raw_(0) {}
_ZNK6hermes2vm12BasedPointereqES1_:
  152|  3.10M|inline bool BasedPointer::operator==(BasedPointer other) const {
  153|  3.10M|  return raw_ == other.raw_;
  154|  3.10M|}
_ZN6hermes2vm11PointerBase10setSegmentEjPv:
  188|    203|inline void PointerBase::setSegment(unsigned idx, void *segStart) {
  189|    203|  assert(segStart == AlignedStorage::start(segStart) && "Precondition");
  190|      0|  SegmentInfo::setSegmentIndexFromStart(segStart, idx);
  191|    203|}
_ZN6hermes2vm11PointerBaseC2Ev:
  167|     99|inline PointerBase::PointerBase() {
  168|       |  // The PointerBase must be segment aligned, so that the compressed pointer
  169|       |  // corresponding to the start of a segment is also segment aligned.
  170|     99|  assert(llvh::alignmentAdjustment(this, AlignedStorage::size()) == 0);
  171|     99|}

_ZN6hermes2vm10Predefined11getSymbolIDENS1_5IPropE:
   42|  1.90k|constexpr SymbolID getSymbolID(IProp predefined) {
   43|  1.90k|  return SymbolID::unsafeCreateNotUniqued(predefined);
   44|  1.90k|}
_ZN6hermes2vm10Predefined11getSymbolIDENS1_3StrE:
   46|  2.01M|constexpr SymbolID getSymbolID(Str predefined) {
   47|  2.01M|  return SymbolID::unsafeCreate(predefined);
   48|  2.01M|}
_ZN6hermes2vm10Predefined11getSymbolIDENS1_3SymE:
   50|  5.86k|constexpr SymbolID getSymbolID(Sym predefined) {
   51|  5.86k|  return SymbolID::unsafeCreateNotUniqued(predefined);
   52|  5.86k|}

_ZN6hermes2vm8JSString11getCellKindEv:
   29|    198|  static constexpr CellKind getCellKind() {
   30|    198|    return CellKind::JSStringKind;
   31|    198|  }
_ZN6hermes2vm8JSString7classofEPKNS0_6GCCellE:
   32|    198|  static bool classof(const GCCell *cell) {
   33|    198|    return cell->getKind() == CellKind::JSStringKind;
   34|    198|  }
_ZN6hermes2vm8JSStringC2ERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEENS4_INS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
   69|     99|        primitiveValue_(runtime, *value, runtime.getHeap()) {
   70|     99|    flags_.indexedStorage = true;
   71|     99|    flags_.fastIndexProperties = true;
   72|     99|  }
_ZN6hermes2vm8JSNumber11getCellKindEv:
  235|    198|  static constexpr CellKind getCellKind() {
  236|    198|    return CellKind::JSNumberKind;
  237|    198|  }
_ZN6hermes2vm8JSNumber7classofEPKNS0_6GCCellE:
  238|    198|  static bool classof(const GCCell *cell) {
  239|    198|    return cell->getKind() == CellKind::JSNumberKind;
  240|    198|  }
_ZN6hermes2vm8JSNumberC2ERNS0_7RuntimeEdNS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  256|     99|      : JSObject(runtime, *parent, *clazz), primitiveValue_(value) {}
_ZN6hermes2vm9JSBoolean11getCellKindEv:
  275|    198|  static constexpr CellKind getCellKind() {
  276|    198|    return CellKind::JSBooleanKind;
  277|    198|  }
_ZN6hermes2vm9JSBoolean7classofEPKNS0_6GCCellE:
  278|    198|  static bool classof(const GCCell *cell) {
  279|    198|    return cell->getKind() == CellKind::JSBooleanKind;
  280|    198|  }
_ZN6hermes2vm9JSBooleanC2ERNS0_7RuntimeEbNS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEE:
  296|     99|      : JSObject(runtime, *parent, *clazz), primitiveValue_(value) {}

_ZN6hermes2vm20CodeCoverageProfiler15globallyEnabledEv:
   71|     56|  static bool globallyEnabled() {
   72|     56|    return globalEnabledFlag().load(std::memory_order_relaxed);
   73|     56|  }
_ZN6hermes2vm20CodeCoverageProfiler17globalEnabledFlagEv:
  108|     56|  static std::atomic<bool> &globalEnabledFlag() {
  109|     56|    static std::atomic<bool> globalEnabledFlag;
  110|     56|    return globalEnabledFlag;
  111|     56|  }
_ZN6hermes2vm20CodeCoverageProfilerC2ERNS0_7RuntimeE:
   45|     99|  explicit CodeCoverageProfiler(Runtime &runtime) : runtime_(runtime) {
   46|     99|    std::lock_guard<std::mutex> lk(globalMutex());
   47|     99|    allProfilers().insert(this);
   48|     99|  }
_ZN6hermes2vm20CodeCoverageProfilerD2Ev:
   50|     99|  ~CodeCoverageProfiler() {
   51|     99|    std::lock_guard<std::mutex> lk(globalMutex());
   52|     99|    allProfilers().erase(this);
   53|     99|  }
_ZNK6hermes2vm20CodeCoverageProfiler9isEnabledEv:
   76|  1.64k|  bool isEnabled() const {
   77|  1.64k|    return !localDisabled_ && globallyEnabled();
  ------------------
  |  Branch (77:12): [True: 56, False: 1.58k]
  |  Branch (77:31): [True: 0, False: 56]
  ------------------
   78|  1.64k|  }
_ZN6hermes2vm20CodeCoverageProfiler7restoreEv:
   81|     99|  void restore() {
   82|     99|    localDisabled_ = false;
   83|     99|  }
_ZN6hermes2vm20CodeCoverageProfiler7disableEv:
   87|     99|  void disable() {
   88|     99|    localDisabled_ = true;
   89|     99|  }
_ZN6hermes2vm20CodeCoverageProfiler12markExecutedEPNS0_9CodeBlockE:
   95|  1.64k|  inline void markExecuted(CodeBlock *codeBlock) {
   96|  1.64k|    if (LLVM_LIKELY(!isEnabled())) {
  ------------------
  |  |  188|  1.64k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.64k, False: 0]
  |  |  ------------------
  ------------------
   97|  1.64k|      return;
   98|  1.64k|    }
   99|      0|    markExecutedSlowPath(codeBlock);
  100|      0|  }

_ZN6hermes2vm16PropertyAccessor7classofEPKNS0_6GCCellE:
   31|  6.38k|  static bool classof(const GCCell *cell) {
   32|  6.38k|    return cell->getKind() == CellKind::PropertyAccessorKind;
   33|  6.38k|  }
_ZN6hermes2vm16PropertyAccessorC2ERNS0_7RuntimeENS0_6HandleINS0_8CallableEEES6_:
   24|  4.28k|        setter(runtime, *setter, runtime.getHeap()) {}
_ZN6hermes2vm16PropertyAccessor11getCellKindEv:
   28|  8.56k|  static constexpr CellKind getCellKind() {
   29|  8.56k|    return CellKind::PropertyAccessorKind;
   30|  8.56k|  }

_ZN6hermes2vm23NamedPropertyDescriptorC2Ev:
  168|  1.97M|  NamedPropertyDescriptor() = default;
_ZN6hermes2vm18PropertyDescriptorC2Ev:
  159|  2.04M|  PropertyDescriptor() : _altFlags(0), slot(INVALID_SLOT_INDEX) {}
_ZN6hermes2vm13PropertyFlags7invalidEv:
  111|  2.44M|  static PropertyFlags invalid() {
  112|  2.44M|    PropertyFlags pf{};
  113|  2.44M|    pf.invalidFlags = 1;
  114|  2.44M|    return pf;
  115|  2.44M|  }
_ZN6hermes2vm13PropertyFlagsC2Ev:
   69|  3.42M|  PropertyFlags() {
   70|  3.42M|    _flags = 0;
   71|  3.42M|  }
_ZN6hermes2vm13PropertyFlags5clearEv:
   73|  55.3k|  void clear() {
   74|  55.3k|    _flags = 0;
   75|  55.3k|  }
_ZNK6hermes2vm13PropertyFlagseqES1_:
   77|   370k|  bool operator==(PropertyFlags f) const {
   78|   370k|    return _flags == f._flags;
   79|   370k|  }
_ZNK6hermes2vm13PropertyFlagsneES1_:
   80|    756|  bool operator!=(PropertyFlags f) const {
   81|    756|    return _flags != f._flags;
   82|    756|  }
_ZNK6hermes2vm13PropertyFlags7isValidEv:
   86|   371k|  bool isValid() const {
   87|   371k|    return !invalidFlags;
   88|   371k|  }
_ZN6hermes2vm13PropertyFlags28defaultNewNamedPropertyFlagsEv:
   92|  10.7k|  static PropertyFlags defaultNewNamedPropertyFlags() {
   93|  10.7k|    PropertyFlags pf{};
   94|  10.7k|    pf.enumerable = 1;
   95|  10.7k|    pf.writable = 1;
   96|  10.7k|    pf.configurable = 1;
   97|  10.7k|    return pf;
   98|  10.7k|  }
_ZN6hermes2vm18PropertyDescriptor15PropertyFlags32C2ENS0_13PropertyFlagsE:
  138|   229k|    PropertyFlags32(PropertyFlags flags) : PropertyFlags(flags), _padding(0) {}
_ZN6hermes2vm18PropertyDescriptorC2ENS0_13PropertyFlagsEj:
  157|   190k|      : flags(flags), slot(slot) {}
_ZN6hermes2vm23NamedPropertyDescriptorC2ENS0_13PropertyFlagsEj:
  166|   190k|      : PropertyDescriptor(flags, slot) {}
_ZN6hermes2vm26ComputedPropertyDescriptor32castToNamedPropertyDescriptorRefEv:
  183|   136k|  NamedPropertyDescriptor &castToNamedPropertyDescriptorRef() {
  184|   136k|    return *static_cast<NamedPropertyDescriptor *>(
  185|   136k|        static_cast<PropertyDescriptor *>(this));
  186|   136k|  }
_ZN6hermes2vm26ComputedPropertyDescriptorC2Ev:
  177|  67.8k|  ComputedPropertyDescriptor() = default;

_ZN6hermes2vm19WeakAcceptorDefault10acceptWeakERNS0_12WeakRootBaseE:
  146|   451k|inline void WeakAcceptorDefault::acceptWeak(WeakRootBase &ptr) {
  147|   451k|  GCCell *p = ptr.getNoBarrierUnsafe(pointerBaseForWeakRoot_);
  148|   451k|  acceptWeak(p);
  149|   451k|  ptr = CompressedPointer::encode(p, pointerBaseForWeakRoot_);
  150|   451k|}
_ZN6hermes2vm19WeakAcceptorDefaultC2ERNS0_11PointerBaseE:
  130|    745|      : pointerBaseForWeakRoot_(base) {}
_ZN6hermes2vm26RootAndSlotAcceptorDefaultC2ERNS0_11PointerBaseE:
   24|    745|      : pointerBase_(pointerBase) {}
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERNS0_13GCPointerBaseE:
   28|  4.53M|  void accept(GCPointerBase &ptr) final {
   29|  4.53M|    auto *p = ptr.get(pointerBase_);
   30|  4.53M|    accept(p);
   31|  4.53M|    ptr.setInGC(CompressedPointer::encode(p, pointerBase_));
   32|  4.53M|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERNS0_17PinnedHermesValueE:
   34|   304k|  void accept(PinnedHermesValue &hv) final {
   35|   304k|    assert((!hv.isPointer() || hv.getPointer()) && "Value is not nullable.");
   36|      0|    acceptHV(hv);
   37|   304k|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault14acceptNullableERNS0_17PinnedHermesValueE:
   38|  3.02k|  void acceptNullable(PinnedHermesValue &hv) final {
   39|  3.02k|    acceptHV(hv);
   40|  3.02k|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
   42|  32.9k|  void accept(GCHermesValue &hv) final {
   43|  32.9k|    acceptHV(hv);
   44|  32.9k|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
   48|  6.34M|  void accept(GCSmallHermesValue &shv) final {
   49|  6.34M|    acceptSHV(shv);
   50|  6.34M|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERKNS0_10GCSymbolIDE:
   54|   970k|  void accept(const GCSymbolID &sym) final {
   55|   970k|    acceptSym(sym);
   56|   970k|  }
_ZN6hermes2vm26RootAndSlotAcceptorDefault6acceptERKNS0_12RootSymbolIDE:
   58|  81.8k|  void accept(const RootSymbolID &sym) final {
   59|  81.8k|    acceptSym(sym);
   60|  81.8k|  }

_ZN6hermes2vm7Runtime18getBuiltinCallableEj:
   17|    283|inline Callable *Runtime::getBuiltinCallable(unsigned builtinMethodID) {
   18|    283|  assert(
   19|    283|      builtinMethodID < BuiltinMethod::_count &&
   20|    283|      "out of bound builtinMethodID");
   21|      0|  return builtins_[builtinMethodID];
   22|    283|}
_ZN6hermes2vm7Runtime26getHiddenClassForPrototypeEPNS0_8JSObjectEj:
   30|  63.2k|    unsigned reservedSlots) {
   31|  63.2k|  assert(
   32|  63.2k|      reservedSlots <= InternalProperty::NumAnonymousInternalProperties &&
   33|  63.2k|      "out of bounds");
   34|      0|  PinnedHermesValue *clazz = &rootClazzes_[reservedSlots];
   35|  63.2k|  assert(!clazz->isUndefined() && "must initialize root classes before use");
   36|      0|  return Handle<HiddenClass>::vmcast(clazz);
   37|  63.2k|}

_ZN6hermes2vm7Runtime7getHeapEv:
  384|  16.2M|  GC &getHeap() {
  385|  16.2M|    return *heapStorage_.get();
  386|  16.2M|  }
_ZN6hermes2vm7Runtime11runBytecodeEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefENS0_6HandleINS0_11EnvironmentEEE:
  275|    155|      Handle<Environment> environment) {
  276|    155|    getHeap().runtimeWillExecute();
  277|    155|    return runBytecode(
  278|    155|        std::move(bytecode),
  279|    155|        runtimeModuleFlags,
  280|    155|        sourceURL,
  281|    155|        environment,
  282|    155|        Handle<>(&global_));
  283|    155|  }
_ZNK6hermes2vm7Runtime17hasMicrotaskQueueEv:
  870|    297|  bool hasMicrotaskQueue() const {
  871|    297|    return hasMicrotaskQueue_;
  872|    297|  }
_ZN6hermes2vm7Runtime18getIdentifierTableEv:
  425|   466k|  IdentifierTable &getIdentifierTable() {
  426|   466k|    return identifierTable_;
  427|   466k|  }
_ZN6hermes2vm12NoAllocScopeC2ERNS0_7RuntimeE:
 1807|  4.45M|  explicit NoAllocScope(Runtime &runtime) : NoAllocScope(runtime.getHeap()) {}
_ZN6hermes2vm12NoAllocScopeC2ERNS0_7HadesGCE:
 1808|  4.45M|  explicit NoAllocScope(GC &gc) : BaseNoScope(&gc.noAllocLevel_) {}
_ZN6hermes2vm11BaseNoScopeC2EPj:
 1747|  4.45M|  explicit BaseNoScope(uint32_t *level) : level_(level) {
 1748|  4.45M|    assert(level_ && "constructing BaseNoScope with moved/release object");
 1749|      0|    ++*level_;
 1750|  4.45M|  }
_ZN6hermes2vm11BaseNoScopeD2Ev:
 1758|  4.45M|  ~BaseNoScope() {
 1759|  4.45M|    if (level_)
  ------------------
  |  Branch (1759:9): [True: 4.45M, False: 803]
  ------------------
 1760|  4.45M|      release();
 1761|  4.45M|  }
_ZN6hermes2vm11BaseNoScope7releaseEv:
 1781|  4.45M|  void release() {
 1782|  4.45M|    assert(level_ && "already released");
 1783|      0|    assert(*level_ > 0 && "unbalanced no alloc");
 1784|      0|    --*level_;
 1785|  4.45M|    level_ = nullptr;
 1786|  4.45M|  }
_ZNK6hermes2vm7Runtime14hasArrayBufferEv:
  866|     99|  bool hasArrayBuffer() const {
  867|     99|    return hasArrayBuffer_;
  868|     99|  }
_ZN6hermes2vm7Runtime19checkAvailableStackEj:
 1951|   817k|inline bool Runtime::checkAvailableStack(uint32_t count) {
 1952|       |  // Note: use 64-bit arithmetic to avoid overflow. We could also do it with
 1953|       |  // a couple of comparisons, but that is likely to be slower.
 1954|   817k|  return availableStackSize() >= (uint64_t)count + STACK_RESERVE;
 1955|   817k|}
_ZNK6hermes2vm7Runtime18availableStackSizeEv:
 1947|  1.63M|inline uint32_t Runtime::availableStackSize() const {
 1948|  1.63M|  return (uint32_t)(registerStackEnd_ - stackPointer_);
 1949|  1.63M|}
_ZN6hermes2vm21ScopedNativeCallFrameC2ERNS0_7RuntimeEjNS0_11HermesValueES4_S4_:
 1638|   407k|      : runtime_(runtime), savedSP_(runtime.getStackPointer()) {
 1639|   407k|    runtime.nativeCallFrameDepth_++;
 1640|   407k|    uint32_t registersNeeded =
 1641|   407k|        StackFrameLayout::callerOutgoingRegisters(argCount);
 1642|   407k|    overflowed_ = !runtimeCanAllocateFrame(runtime, registersNeeded);
 1643|   407k|    if (LLVM_UNLIKELY(overflowed_)) {
  ------------------
  |  |  189|   407k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 407k]
  |  |  ------------------
  ------------------
 1644|      0|      return;
 1645|      0|    }
 1646|       |
 1647|       |    // We have enough space. Increment the call frame depth and construct the
 1648|       |    // frame. The ScopedNativeCallFrame will restore both.
 1649|   407k|    auto *stack = runtime.allocUninitializedStack(registersNeeded);
 1650|   407k|    frame_ = StackFramePtr::initFrame(
 1651|   407k|        stack,
 1652|   407k|        runtime.currentFrame_,
 1653|   407k|        nullptr,
 1654|   407k|        nullptr,
 1655|   407k|        argCount,
 1656|   407k|        callee,
 1657|   407k|        newTarget);
 1658|   407k|    frame_.getThisArgRef() = thisArg;
 1659|   407k|#if HERMES_SLOW_DEBUG
 1660|       |    // Poison the initial arguments to ensure the caller sets all of them before
 1661|       |    // a GC.
 1662|   407k|    assert(!overflowed_ && "Overflow should return early");
 1663|      0|    overflowHasBeenChecked_ = true;
 1664|   407k|    fillArguments(argCount, HermesValue::encodeInvalidValue());
 1665|       |    // We still want the user to check for overflow.
 1666|   407k|    overflowHasBeenChecked_ = false;
 1667|   407k|#endif
 1668|   407k|  }
_ZN6hermes2vm7Runtime15getStackPointerEv:
  461|   407k|  PinnedHermesValue *getStackPointer() {
  462|   407k|    return stackPointer_;
  463|   407k|  }
_ZN6hermes2vm21ScopedNativeCallFrame23runtimeCanAllocateFrameERNS0_7RuntimeEj:
 1616|   407k|      uint32_t registersNeeded) {
 1617|   407k|    return runtime.checkAvailableStack(registersNeeded) &&
  ------------------
  |  Branch (1617:12): [True: 407k, False: 0]
  ------------------
 1618|   407k|        runtime.nativeCallFrameDepth_ <= Runtime::MAX_NATIVE_CALL_FRAME_DEPTH;
  ------------------
  |  Branch (1618:9): [True: 407k, False: 0]
  ------------------
 1619|   407k|  }
_ZN6hermes2vm7Runtime23allocUninitializedStackEj:
 1957|   817k|inline PinnedHermesValue *Runtime::allocUninitializedStack(uint32_t count) {
 1958|   817k|  assert(availableStackSize() >= count && "register stack overflow");
 1959|      0|  return stackPointer_ += count;
 1960|   817k|}
_ZN6hermes2vm21ScopedNativeCallFrame13fillArgumentsEjNS0_11HermesValueE:
 1702|   407k|  void fillArguments(uint32_t argCount, HermesValue fillValue) {
 1703|   407k|    assert(overflowHasBeenChecked_ && "ScopedNativeCallFrame could overflow");
 1704|      0|    assert(argCount == frame_.getArgCount() && "Arg count mismatch.");
 1705|      0|    std::uninitialized_fill_n(frame_.argsBegin(), argCount, fillValue);
 1706|   407k|  }
_ZNK6hermes2vm21ScopedNativeCallFrame10overflowedEv:
 1709|   407k|  bool overflowed() const {
 1710|   407k|#ifndef NDEBUG
 1711|   407k|    overflowHasBeenChecked_ = !overflowed_;
 1712|   407k|#endif
 1713|   407k|    return overflowed_;
 1714|   407k|  }
_ZN6hermes2vm21ScopedNativeCallFrameptEv:
 1717|   404k|  StackFramePtr operator->() {
 1718|   404k|    assert(overflowHasBeenChecked_ && "ScopedNativeCallFrame could overflow");
 1719|      0|    return frame_;
 1720|   404k|  }
_ZN6hermes2vm7Runtime19potentiallyMoveHeapEv:
 2028|  1.19M|inline void Runtime::potentiallyMoveHeap() {}
_ZN6hermes2vm21ScopedNativeCallFrameD2Ev:
 1690|   407k|  ~ScopedNativeCallFrame() {
 1691|       |    // Note that we unconditionally increment the native call frame depth and
 1692|       |    // save the SP to avoid branching in the dtor.
 1693|   407k|    runtime_.nativeCallFrameDepth_--;
 1694|   407k|    runtime_.popToSavedStackPointer(savedSP_);
 1695|   407k|#ifndef NDEBUG
 1696|       |    // Clear the frame to detect use-after-free.
 1697|   407k|    frame_ = StackFramePtr{};
 1698|   407k|#endif
 1699|   407k|  }
_ZN6hermes2vm7Runtime22popToSavedStackPointerEPNS0_17PinnedHermesValueE:
 1936|   407k|inline void Runtime::popToSavedStackPointer(PinnedHermesValue *stackPointer) {
 1937|   407k|  assert(
 1938|   407k|      stackPointer <= stackPointer_ &&
 1939|   407k|      "attempting to pop the stack to a higher level");
 1940|      0|  stackPointer_ = stackPointer;
 1941|   407k|}
_ZNK6hermes2vm7Runtime14getThrownValueEv:
  548|     24|  HermesValue getThrownValue() const {
  549|     24|    return thrownValue_;
  550|     24|  }
_ZN6hermes2vm7Runtime16clearThrownValueEv:
 2019|    203|inline void Runtime::clearThrownValue() {
 2020|    203|  thrownValue_ = HermesValue::encodeEmptyValue();
 2021|    203|}
_ZN6hermes2vm24ScopedNativeDepthTrackerC2ERNS0_7RuntimeE:
 1546|   408k|  explicit ScopedNativeDepthTracker(Runtime &runtime) : runtime_(runtime) {
 1547|   408k|    ++runtime.nativeCallFrameDepth_;
 1548|   408k|  }
_ZNK6hermes2vm24ScopedNativeDepthTracker10overflowedEv:
 1554|   408k|  bool overflowed() const {
 1555|   408k|    return runtime_.nativeCallFrameDepth_ >
 1556|   408k|        Runtime::MAX_NATIVE_CALL_FRAME_DEPTH;
 1557|   408k|  }
_ZN6hermes2vm24ScopedNativeDepthReducerC2ERNS0_7RuntimeE:
 1571|     24|  explicit ScopedNativeDepthReducer(Runtime &runtime) : runtime_(runtime) {
 1572|     24|    if (runtime.nativeCallFrameDepth_ >= kDepthAdjustment) {
  ------------------
  |  Branch (1572:9): [True: 24, False: 0]
  ------------------
 1573|     24|      runtime.nativeCallFrameDepth_ -= kDepthAdjustment;
 1574|     24|      undo = true;
 1575|     24|    }
 1576|     24|  }
_ZN6hermes2vm24ScopedNativeDepthReducerD2Ev:
 1577|     24|  ~ScopedNativeDepthReducer() {
 1578|     24|    if (undo) {
  ------------------
  |  Branch (1578:9): [True: 24, False: 0]
  ------------------
 1579|     24|      runtime_.nativeCallFrameDepth_ += kDepthAdjustment;
 1580|     24|    }
 1581|     24|  }
_ZN6hermes2vm24ScopedNativeDepthTrackerD2Ev:
 1549|   408k|  ~ScopedNativeDepthTracker() {
 1550|   408k|    --runtime_.nativeCallFrameDepth_;
 1551|   408k|  }
_ZN6hermes2vm7Runtime11getDebuggerEv:
  845|  1.89k|  Debugger &getDebugger() {
  846|  1.89k|    return debugger_;
  847|  1.89k|  }
_ZN6hermes2vm7Runtime7collectENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  338|    133|  void collect(std::string cause) {
  339|    133|    getHeap().collect(std::move(cause));
  340|    133|  }
_ZNK6hermes2vm7Runtime12getCurrentIPEv:
 1397|  5.28M|  inline const inst::Inst *getCurrentIP() const {
 1398|       |#ifdef NDEBUG
 1399|       |    return currentIP_;
 1400|       |#else
 1401|  5.28M|    assert(
 1402|  5.28M|        currentIP_.hasValue() &&
 1403|  5.28M|        "Current IP unknown - this probably means a CAPTURE_IP_* is missing in the interpreter.");
 1404|      0|    return *currentIP_;
 1405|  5.28M|#endif
 1406|  5.28M|  }
_ZN6hermes2vm7Runtime14setThrownValueENS0_11HermesValueE:
 2014|     48|inline ExecutionStatus Runtime::setThrownValue(HermesValue value) {
 2015|     48|  thrownValue_ = value;
 2016|     48|  return ExecutionStatus::EXCEPTION;
 2017|     48|}
_ZN6hermes2vm7Runtime22addCustomRootsFunctionENSt3__18functionIFvPNS0_7HadesGCERNS0_12RootAcceptorEEEE:
 1818|     99|    std::function<void(GC *, RootAcceptor &)> markRootsFn) {
 1819|     99|  customMarkRootFuncs_.emplace_back(std::move(markRootsFn));
 1820|     99|}
_ZN6hermes2vm7Runtime26addCustomWeakRootsFunctionENSt3__18functionIFvPNS0_7HadesGCERNS0_16WeakRootAcceptorEEEE:
 1823|     99|    std::function<void(GC *, WeakRootAcceptor &)> markRootsFn) {
 1824|     99|  customMarkWeakRootFuncs_.emplace_back(std::move(markRootsFn));
 1825|     99|}
_ZN6hermes2vm7Runtime25addCustomSnapshotFunctionENSt3__18functionIFvRNS0_12HeapSnapshotEEEES7_:
 1829|     99|    std::function<void(HeapSnapshot &)> edges) {
 1830|     99|  customSnapshotNodeFuncs_.emplace_back(std::move(nodes));
 1831|     99|  customSnapshotEdgeFuncs_.emplace_back(std::move(edges));
 1832|     99|}
_ZN6hermes2vm7Runtime15getCurrentFrameEv:
  500|  2.83k|  StackFramePtr getCurrentFrame() {
  501|  2.83k|    return currentFrame_;
  502|  2.83k|  }
_ZN6hermes2vm7Runtime23getCodeCoverageProfilerEv:
  826|  1.64k|  CodeCoverageProfiler &getCodeCoverageProfiler() {
  827|  1.64k|    return *codeCoverageProfiler_;
  828|  1.64k|  }
_ZNK6hermes2vm7Runtime13hasES6PromiseEv:
  854|    198|  bool hasES6Promise() const {
  855|    198|    return hasES6Promise_;
  856|    198|  }
_ZNK6hermes2vm7Runtime11hasES6ProxyEv:
  858|    198|  bool hasES6Proxy() const {
  859|    198|    return hasES6Proxy_;
  860|    198|  }
_ZNK6hermes2vm7Runtime20getVMExperimentFlagsEv:
  880|  1.22k|  experiments::VMExperimentFlags getVMExperimentFlags() const {
  881|  1.22k|    return vmExperimentFlags_;
  882|  1.22k|  }
_ZN6hermes2vm7Runtime16addRuntimeModuleEPNS0_13RuntimeModuleE:
 1097|    928|  void addRuntimeModule(RuntimeModule *rm) {
 1098|    928|    runtimeModuleList_.push_back(*rm);
 1099|    928|  }
_ZN6hermes2vm7Runtime37testAndClearDebuggerAsyncBreakRequestEv:
 1313|  3.88k|  uint8_t testAndClearDebuggerAsyncBreakRequest() {
 1314|  3.88k|    return testAndClearAsyncBreakRequest(
 1315|  3.88k|        (uint8_t)AsyncBreakReasonBits::DebuggerExplicit |
 1316|  3.88k|        (uint8_t)AsyncBreakReasonBits::DebuggerImplicit);
 1317|  3.88k|  }
_ZNK6hermes2vm7Runtime13hasAsyncBreakEv:
 1333|     33|  bool hasAsyncBreak() const {
 1334|     33|    return asyncBreakRequestFlag_.load(std::memory_order_relaxed) != 0;
 1335|     33|  }
_ZN6hermes2vm7Runtime29testAndClearAsyncBreakRequestEh:
 1339|  3.88k|  uint8_t testAndClearAsyncBreakRequest(uint8_t reasonBits) {
 1340|       |    /// Note that while the triggerTimeoutAsyncBreak() function may be called
 1341|       |    /// from any thread, this one may only be called from within the Interpreter
 1342|       |    /// loop.
 1343|  3.88k|    uint8_t flag = asyncBreakRequestFlag_.load(std::memory_order_relaxed);
 1344|  3.88k|    if (LLVM_LIKELY((flag & (uint8_t)reasonBits) == 0)) {
  ------------------
  |  |  188|  3.88k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.88k, False: 0]
  |  |  ------------------
  ------------------
 1345|       |      // Fast path.
 1346|  3.88k|      return false;
 1347|  3.88k|    }
 1348|       |    // Clear the flag using CAS.
 1349|      0|    uint8_t oldFlag = asyncBreakRequestFlag_.fetch_and(
 1350|      0|        ~(uint8_t)reasonBits, std::memory_order_relaxed);
 1351|      0|    assert(oldFlag != 0 && "Why is oldFlag zero?");
 1352|      0|    return oldFlag;
 1353|  3.88k|  }
_ZN6hermes2vm7Runtime12setCurrentIPEPKNS_4inst4InstE:
 1389|   289k|  inline void setCurrentIP(const inst::Inst *ip) {
 1390|   289k|    currentIP_ = ip;
 1391|   289k|  }
_ZNK6hermes2vm7Runtime16getCurrentIPSlowEv:
 1409|  2.29M|  inline const inst::Inst *getCurrentIPSlow() const override {
 1410|  2.29M|    return getCurrentIP();
 1411|  2.29M|  }
_ZN6hermes2vm7Runtime19invalidateCurrentIPEv:
 1416|   289k|  void invalidateCurrentIP() {
 1417|   289k|    currentIP_.reset();
 1418|   289k|  }
_ZN6hermes2vm7Runtime24saveCallerIPInStackFrameEv:
 1424|   409k|  void saveCallerIPInStackFrame() {
 1425|   409k|#ifndef NDEBUG
 1426|   409k|    assert(
 1427|   409k|        (!currentFrame_.getSavedIP() ||
 1428|   409k|         (currentIP_.hasValue() && currentFrame_.getSavedIP() == currentIP_)) &&
 1429|   409k|        "The ip should either be null or already have the expected value");
 1430|      0|#endif
 1431|      0|    currentFrame_.getSavedIPRef() =
 1432|   409k|        HermesValue::encodeNativePointer(getCurrentIP());
 1433|   409k|  }
_ZN6hermes2vm7Runtime13pushCallStackEPKNS0_9CodeBlockEPKNS_4inst4InstE:
 1466|  1.64k|  inline void pushCallStack(const CodeBlock *codeBlock, const inst::Inst *ip) {
 1467|  1.64k|    if (stackTracesTree_) {
  ------------------
  |  Branch (1467:9): [True: 0, False: 1.64k]
  ------------------
 1468|      0|      pushCallStackImpl(codeBlock, ip);
 1469|      0|    }
 1470|  1.64k|  }
_ZN6hermes2vm7Runtime12popCallStackEv:
 1473|  1.64k|  inline void popCallStack() {
 1474|  1.64k|    if (stackTracesTree_) {
  ------------------
  |  Branch (1474:9): [True: 0, False: 1.64k]
  ------------------
 1475|      0|      popCallStackImpl();
 1476|      0|    }
 1477|  1.64k|  }
_ZN6hermes2vm7Runtime23ignoreAllocationFailureENS0_15ExecutionStatusE:
 1878|   446k|inline void Runtime::ignoreAllocationFailure(ExecutionStatus status) {
 1879|   446k|  if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   446k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 446k]
  |  |  ------------------
  ------------------
 1880|      0|    hermes_fatal("Unhandled out of memory exception");
 1881|   446k|}
_ZN6hermes2vm7Runtime19getPredefinedStringENS0_10Predefined3StrE:
 1899|  29.9k|    Predefined::Str predefined) {
 1900|  29.9k|  return getStringPrimFromSymbolID(Predefined::getSymbolID(predefined));
 1901|  29.9k|}
_ZN6hermes2vm7Runtime25getPredefinedStringHandleENS0_10Predefined3StrE:
 1909|  3.12k|    Predefined::Str predefined) {
 1910|  3.12k|  return makeHandle(getPredefinedString(predefined));
 1911|  3.12k|}
_ZN6hermes2vm7Runtime25getStringPrimFromSymbolIDENS0_8SymbolIDE:
 1918|  78.5k|inline StringPrimitive *Runtime::getStringPrimFromSymbolID(SymbolID id) {
 1919|  78.5k|  return identifierTable_.getStringPrim(*this, id);
 1920|  78.5k|}
_ZN6hermes2vm7Runtime18checkAndAllocStackEjNS0_11HermesValueE:
 1962|   409k|inline bool Runtime::checkAndAllocStack(uint32_t count, HermesValue initValue) {
 1963|   409k|  if (!checkAvailableStack(count))
  ------------------
  |  Branch (1963:7): [True: 0, False: 409k]
  ------------------
 1964|      0|    return false;
 1965|   409k|  allocStack(count, initValue);
 1966|   409k|  return true;
 1967|   409k|}
_ZN6hermes2vm7Runtime27setCurrentFrameToTopOfStackEv:
 1984|   409k|inline StackFramePtr Runtime::setCurrentFrameToTopOfStack() {
 1985|   409k|  return currentFrame_ = StackFramePtr(stackPointer_);
 1986|   409k|}
_ZN6hermes2vm7Runtime28restoreStackAndPreviousFrameENS0_14StackFramePtrTILb0EEE:
 1989|   409k|    StackFramePtr currentFrame) {
 1990|   409k|  assert(
 1991|   409k|      currentFrame_ == currentFrame &&
 1992|   409k|      "currentFrame parameter must match currentFrame_");
 1993|      0|  stackPointer_ = currentFrame.ptr();
 1994|   409k|  return currentFrame_ = currentFrame.getPreviousFrame();
 1995|   409k|}
_ZN6hermes2vm7Runtime14getStackFramesEv:
 2001|    403|inline llvh::iterator_range<StackFrameIterator> Runtime::getStackFrames() {
 2002|    403|  return {
 2003|    403|      StackFrameIterator{currentFrame_},
 2004|    403|      StackFrameIterator{registerStackStart_}};
 2005|    403|};
_ZN6hermes2vm7Runtime15getCrashManagerEv:
 2023|  1.38k|inline CrashManager &Runtime::getCrashManager() {
 2024|  1.38k|  return *crashMgr_;
 2025|  1.38k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_11HermesValueEEET_NS0_10CallResultIS4_Xsr6detail23GetCallResultSpecializeIS4_EE5valueEEE:
 1869|   135k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|   135k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   135k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 135k]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|   135k|  return std::move(res.getValue());
 1876|   135k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_11BoxedDoubleELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRdEEEPT_DpOT2_:
 1839|  1.79k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  1.79k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  1.79k|  (void)getCurrentIP();
 1846|  1.79k|#endif
 1847|  1.79k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  1.79k|      std::forward<Args>(args)...);
 1849|  1.79k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_16ArrayStorageBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1856|   459k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|   459k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|   459k|  (void)getCurrentIP();
 1863|   459k|#endif
 1864|   459k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|   459k|      size, std::forward<Args>(args)...);
 1866|   459k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_11EnvironmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleIS3_EERjEEEPT_jDpOT2_:
 1856|    452|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|    452|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|    452|  (void)getCurrentIP();
 1863|    452|#endif
 1864|    452|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|    452|      size, std::forward<Args>(args)...);
 1866|    452|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_17NativeConstructorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESD_S6_NS0_10NativeArgsEERPFNSF_INS0_12PseudoHandleIS8_EELSI_6EEES6_S9_SD_ERNS0_8CellKindEEEEPT_DpOT2_:
 1839|  4.05k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  4.05k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  4.05k|  (void)getCurrentIP();
 1846|  4.05k|#endif
 1847|  4.05k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  4.05k|      std::forward<Args>(args)...);
 1849|  4.05k|}
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3setERNS0_7RuntimeEPS2_:
 1523|  4.50k|  void set(Runtime &runtime, T *ptr) {
 1524|  4.50k|    set(runtime.getHeap(), ptr);
 1525|  4.50k|  }
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3setERNS0_7HadesGCEPS2_:
 1526|  4.50k|  void set(GC &gc, T *ptr) {
 1527|  4.50k|    bits_ = reinterpret_cast<uintptr_t>(ptr) ^ gc.pointerEncryptionKey_[K];
 1528|  4.50k|  }
_ZNK6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3getERNS0_7RuntimeE:
 1529|  1.73k|  T *get(Runtime &runtime) const {
 1530|  1.73k|    return get(runtime.getHeap());
 1531|  1.73k|  }
_ZNK6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EE3getERNS0_7HadesGCE:
 1532|  1.73k|  T *get(GC &gc) const {
 1533|  1.73k|    return reinterpret_cast<T *>(bits_ ^ gc.pointerEncryptionKey_[K]);
 1534|  1.73k|  }
_ZN6hermes2vm7Runtime13makeAVariableINS0_16ArrayStorageBaseINS0_11HermesValueEEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1856|     99|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|     99|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|     99|  (void)getCurrentIP();
 1863|     99|#endif
 1864|     99|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|     99|      size, std::forward<Args>(args)...);
 1866|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_13BoundFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_NS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERNS7_INS0_8CallableEEERNS0_13MutableHandleINS0_16ArrayStorageBaseINS0_11HermesValueEEEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_14NativeFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERPvRPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEESD_S6_NS0_10NativeArgsEEEEEPT_DpOT2_:
 1839|  42.4k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  42.4k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  42.4k|  (void)getCurrentIP();
 1846|  42.4k|#endif
 1847|  42.4k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  42.4k|      std::forward<Args>(args)...);
 1849|  42.4k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_10JSFunctionELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_6DomainEEERNS7_INS0_8JSObjectEEENS7_INS0_11HiddenClassEEERNS7_INS0_11EnvironmentEEERPNS0_9CodeBlockEEEEPT_DpOT2_:
 1839|  4.50k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  4.50k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  4.50k|  (void)getCurrentIP();
 1846|  4.50k|#endif
 1847|  4.50k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  4.50k|      std::forward<Args>(args)...);
 1849|  4.50k|}
_ZN6hermes2vm6XorPtrINS0_9CodeBlockELNS0_11XorPtrKeyIDE1EEC2ERNS0_7RuntimeEPS2_:
 1520|  4.50k|  XorPtr(Runtime &runtime, T *ptr) {
 1521|  4.50k|    set(runtime, ptr);
 1522|  4.50k|  }
_ZN6hermes2vm7Runtime10makeAFixedINS0_6DomainELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
 1839|    254|T *Runtime::makeAFixed(Args &&...args) {
 1840|    254|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|    254|  (void)getCurrentIP();
 1846|    254|#endif
 1847|    254|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|    254|      std::forward<Args>(args)...);
 1849|    254|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_11HiddenClassELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJRS1_RNS0_10ClassFlagsERNS0_6HandleIS3_EERNS0_8SymbolIDERNS0_13PropertyFlagsERjEEEPT_DpOT2_:
 1839|  56.9k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  56.9k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  56.9k|  (void)getCurrentIP();
 1846|  56.9k|#endif
 1847|  56.9k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  56.9k|      std::forward<Args>(args)...);
 1849|  56.9k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
 1856|   105k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|   105k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|   105k|  (void)getCurrentIP();
 1863|   105k|#endif
 1864|   105k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|   105k|      size, std::forward<Args>(args)...);
 1866|   105k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb1EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRmEEEPT_jDpOT2_:
 1856|    132|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|    132|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|    132|  (void)getCurrentIP();
 1863|    132|#endif
 1864|    132|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|    132|      size, std::forward<Args>(args)...);
 1866|    132|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_12PseudoHandleINS0_15StringPrimitiveEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|  34.1k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|  34.1k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  34.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 34.1k]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|  34.1k|  return std::move(res.getValue());
 1876|  34.1k|}
_ZN6hermes2vm7Runtime10makeHandleINS0_8CallableEEENS0_6HandleIT_EERKNS0_9GCPointerIS5_EE:
 1889|  1.90k|inline Handle<T> Runtime::makeHandle(const GCPointer<T> &p) {
 1890|  1.90k|  return Handle<T>(*this, p.get(*this));
 1891|  1.90k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_7JSArrayELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEERNS7_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
 1839|   428k|T *Runtime::makeAFixed(Args &&...args) {
 1840|   428k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|   428k|  (void)getCurrentIP();
 1846|   428k|#endif
 1847|   428k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|   428k|      std::forward<Args>(args)...);
 1849|   428k|}
_ZN6hermes2vm7Runtime10makeHandleINS0_11HiddenClassEEENS0_6HandleIT_EERKNS0_9GCPointerIS5_EE:
 1889|   301k|inline Handle<T> Runtime::makeHandle(const GCPointer<T> &p) {
 1890|   301k|  return Handle<T>(*this, p.get(*this));
 1891|   301k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_7JSErrorELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEERbEEEPT_DpOT2_:
 1839|     24|T *Runtime::makeAFixed(Args &&...args) {
 1840|     24|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     24|  (void)getCurrentIP();
 1846|     24|#endif
 1847|     24|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     24|      std::forward<Args>(args)...);
 1849|     24|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSObjectELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleIS3_EENS7_INS0_11HiddenClassEEENS0_13GCPointerBase10NoBarriersEEEEPT_DpOT2_:
 1839|  10.9k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  10.9k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  10.9k|  (void)getCurrentIP();
 1846|  10.9k|#endif
 1847|  10.9k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  10.9k|      std::forward<Args>(args)...);
 1849|  10.9k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_12PseudoHandleINS0_8JSObjectEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|    877|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|    877|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    877|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 877]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|    877|  return std::move(res.getValue());
 1876|    877|}
_ZN6hermes2vm7Runtime17makeMutableHandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEENS0_13MutableHandleIT_EERKNS0_9GCPointerIS7_EE:
 1894|  5.76k|inline MutableHandle<T> Runtime::makeMutableHandle(const GCPointer<T> &p) {
 1895|  5.76k|  return MutableHandle<T>(*this, p.get(*this));
 1896|  5.76k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSRegExpELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|    242|T *Runtime::makeAFixed(Args &&...args) {
 1840|    242|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|    242|  (void)getCurrentIP();
 1846|    242|#endif
 1847|    242|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|    242|      std::forward<Args>(args)...);
 1849|    242|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_10HostObjectELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS7_INS0_11HiddenClassEEENSt3__110unique_ptrINS0_15HostObjectProxyENSD_14default_deleteISF_EEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSStringELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_15StringPrimitiveEEERNS7_INS0_8JSObjectEEERNS7_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_8JSNumberELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RdRNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_9JSBooleanELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RbRNS0_6HandleINS0_8JSObjectEEERNS8_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_16PropertyAccessorELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8CallableEEESA_EEEPT_DpOT2_:
 1839|  4.28k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  4.28k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  4.28k|  (void)getCurrentIP();
 1846|  4.28k|#endif
 1847|  4.28k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  4.28k|      std::forward<Args>(args)...);
 1849|  4.28k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureIbEET_NS0_10CallResultIS3_Xsr6detail23GetCallResultSpecializeIS3_EE5valueEEE:
 1869|  3.06k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|  3.06k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  3.06k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.06k]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|  3.06k|  return std::move(res.getValue());
 1876|  3.06k|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_8SymbolIDEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|  4.35k|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|  4.35k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|  4.35k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.35k]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|  4.35k|  return std::move(res.getValue());
 1876|  4.35k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_18SegmentedArrayBaseINS0_13HermesValue32EE7SegmentELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_DpOT2_:
 1839|  1.09k|T *Runtime::makeAFixed(Args &&...args) {
 1840|  1.09k|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|  1.09k|  (void)getCurrentIP();
 1846|  1.09k|#endif
 1847|  1.09k|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|  1.09k|      std::forward<Args>(args)...);
 1849|  1.09k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_18SegmentedArrayBaseINS0_13HermesValue32EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJEEEPT_jDpOT2_:
 1856|   415k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|   415k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|   415k|  (void)getCurrentIP();
 1863|   415k|#endif
 1864|   415k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|   415k|      size, std::forward<Args>(args)...);
 1866|   415k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
 1856|      8|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|      8|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|      8|  (void)getCurrentIP();
 1863|      8|#endif
 1864|      8|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|      8|      size, std::forward<Args>(args)...);
 1866|      8|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIDsEEEEEPT_jDpOT2_:
 1856|  12.6k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|  12.6k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|  12.6k|  (void)getCurrentIP();
 1863|  12.6k|#endif
 1864|  12.6k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|  12.6k|      size, std::forward<Args>(args)...);
 1866|  12.6k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIDsLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
 1856|   410k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|   410k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|   410k|  (void)getCurrentIP();
 1863|   410k|#endif
 1864|   410k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|   410k|      size, std::forward<Args>(args)...);
 1866|   410k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
 1856|   249k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|   249k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|   249k|  (void)getCurrentIP();
 1863|   249k|#endif
 1864|   249k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|   249k|      size, std::forward<Args>(args)...);
 1866|   249k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE1EJRN4llvh8ArrayRefIcEEEEEPT_jDpOT2_:
 1856|  12.6k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|  12.6k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|  12.6k|  (void)getCurrentIP();
 1863|  12.6k|#endif
 1864|  12.6k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|  12.6k|      size, std::forward<Args>(args)...);
 1866|  12.6k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_22DynamicStringPrimitiveIcLb0EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjEEEPT_jDpOT2_:
 1856|  49.4k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|  49.4k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|  49.4k|  (void)getCurrentIP();
 1863|  49.4k|#endif
 1864|  49.4k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|  49.4k|      size, std::forward<Args>(args)...);
 1866|  49.4k|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
 1856|     13|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|     13|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|     13|  (void)getCurrentIP();
 1863|     13|#endif
 1864|     13|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|     13|      size, std::forward<Args>(args)...);
 1866|     13|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE1EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
 1856|      5|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|      5|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|      5|  (void)getCurrentIP();
 1863|      5|#endif
 1864|      5|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|      5|      size, std::forward<Args>(args)...);
 1866|      5|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIcEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEEEEEPT_jDpOT2_:
 1856|     60|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|     60|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|     60|  (void)getCurrentIP();
 1863|     60|#endif
 1864|     60|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|     60|      size, std::forward<Args>(args)...);
 1866|     60|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23ExternalStringPrimitiveIDsEELNS0_12HasFinalizerE1ELNS0_9LongLivedE0EJNSt3__112basic_stringIDsNS7_11char_traitsIDsEENS7_9allocatorIDsEEEEEEEPT_jDpOT2_:
 1856|     48|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|     48|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|     48|  (void)getCurrentIP();
 1863|     48|#endif
 1864|     48|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|     48|      size, std::forward<Args>(args)...);
 1866|     48|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23BufferedStringPrimitiveIDsEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RjRNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEEEEEPT_jDpOT2_:
 1856|    162|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|    162|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|    162|  (void)getCurrentIP();
 1863|    162|#endif
 1864|    162|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|    162|      size, std::forward<Args>(args)...);
 1866|    162|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_23BufferedStringPrimitiveIcEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RjRNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEEEEEPT_jDpOT2_:
 1856|    711|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|    711|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|    711|  (void)getCurrentIP();
 1863|    711|#endif
 1864|    711|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|    711|      size, std::forward<Args>(args)...);
 1866|    711|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_12PseudoHandleINS0_11HermesValueEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|    495|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|    495|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    495|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 495]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|    495|  return std::move(res.getValue());
 1876|    495|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_8JSStringEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|     99|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|     99|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|     99|  return std::move(res.getValue());
 1876|     99|}
_ZN6hermes2vm7Runtime23ignoreAllocationFailureINS0_6HandleINS0_7JSArrayEEEEET_NS0_10CallResultIS6_Xsr6detail23GetCallResultSpecializeIS6_EE5valueEEE:
 1869|     99|inline T Runtime::ignoreAllocationFailure(CallResult<T> res) {
 1870|     99|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1871|      0|    hermes_fatal("Unhandled out of memory exception");
 1872|       |  // Use std::move here to account for specializations of CallResult,
 1873|       |  // (in particular, CallResult<PseudoHandle<U>>)
 1874|       |  // which wrap a class with a deleted copy constructor.
 1875|     99|  return std::move(res.getValue());
 1876|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_12SingleObjectILNS0_8CellKindE60EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_12SingleObjectILNS0_8CellKindE59EEELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_8JSObjectEEENS9_INS0_11HiddenClassEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}
_ZN6hermes2vm7Runtime13makeAVariableINS0_15DictPropertyMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRjS6_EEEPT_jDpOT2_:
 1856|  19.2k|T *Runtime::makeAVariable(uint32_t size, Args &&...args) {
 1857|  19.2k|#ifndef NDEBUG
 1858|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1859|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1860|       |  // allows us to leverage our whole test-suite to find missing cases of
 1861|       |  // CAPTURE_IP* macros in the interpreter loop.
 1862|  19.2k|  (void)getCurrentIP();
 1863|  19.2k|#endif
 1864|  19.2k|  return getHeap().makeAVariable<T, hasFinalizer, longLived>(
 1865|  19.2k|      size, std::forward<Args>(args)...);
 1866|  19.2k|}
_ZN6hermes2vm7Runtime10makeAFixedINS0_14OrderedHashMapELNS0_12HasFinalizerE0ELNS0_9LongLivedE0EJRS1_RNS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEEEEEPT_DpOT2_:
 1839|     99|T *Runtime::makeAFixed(Args &&...args) {
 1840|     99|#ifndef NDEBUG
 1841|       |  // We always call getCurrentIP() in a debug build as this has the effect of
 1842|       |  // asserting the IP is correctly set (not invalidated) at this point. This
 1843|       |  // allows us to leverage our whole test-suite to find missing cases of
 1844|       |  // CAPTURE_IP* macros in the interpreter loop.
 1845|     99|  (void)getCurrentIP();
 1846|     99|#endif
 1847|     99|  return getHeap().makeAFixed<T, hasFinalizer, longLived>(
 1848|     99|      std::forward<Args>(args)...);
 1849|     99|}

_ZN6hermes2vm13RuntimeModule9getDomainERNS0_7RuntimeE:
   17|  5.19k|inline Handle<Domain> RuntimeModule::getDomain(Runtime &runtime) {
   18|  5.19k|  return runtime.makeHandle(getDomainUnsafe(runtime));
   19|  5.19k|}
_ZN6hermes2vm13RuntimeModule15getDomainUnsafeERNS0_7RuntimeE:
   21|  5.19k|inline Domain *RuntimeModule::getDomainUnsafe(Runtime &runtime) {
   22|  5.19k|  Domain *domain = domain_.get(runtime_, runtime_.getHeap());
   23|  5.19k|  assert(domain && "RuntimeModule has an invalid Domain");
   24|      0|  return domain;
   25|  5.19k|}

_ZN6hermes2vm18RuntimeModuleFlagsC2Ev:
   58|    971|  RuntimeModuleFlags() : flags(0) {}
_ZNK6hermes2vm13RuntimeModule20getOnlyLazyCodeBlockEv:
  186|    674|  CodeBlock *getOnlyLazyCodeBlock() const {
  187|    674|    assert(functionMap_.size() == 1 && functionMap_[0] && "Not a lazy module?");
  188|      0|    return functionMap_[0];
  189|    674|  }
_ZN6hermes2vm13RuntimeModule17getLazyRootModuleEv:
  206|    155|  RuntimeModule *getLazyRootModule() {
  207|       |#if defined(HERMESVM_LEAN)
  208|       |    return this;
  209|       |#else
  210|    155|    return lazyRoot_;
  211|    155|#endif
  212|    155|  }
_ZN6hermes2vm13RuntimeModule20getSymbolIDMustExistEj:
  235|  12.7k|  SymbolID getSymbolIDMustExist(StringID stringID) {
  236|  12.7k|    assert(
  237|  12.7k|        stringIDMap_[stringID].isValid() &&
  238|  12.7k|        "Symbol must exist for this string ID");
  239|      0|    return stringIDMap_[stringID];
  240|  12.7k|  }
_ZN6hermes2vm13RuntimeModule34getSymbolIDFromStringIDMayAllocateEj:
  245|  2.87k|  SymbolID getSymbolIDFromStringIDMayAllocate(StringID stringID) {
  246|  2.87k|    SymbolID id = stringIDMap_[stringID];
  247|  2.87k|    if (LLVM_UNLIKELY(!id.isValid())) {
  ------------------
  |  |  189|  2.87k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 565, False: 2.31k]
  |  |  ------------------
  ------------------
  248|       |      // Materialize this lazily created symbol.
  249|    565|      auto entry = bcProvider_->getStringTableEntry(stringID);
  250|    565|      id = createSymbolFromStringIDMayAllocate(stringID, entry, llvh::None);
  251|    565|    }
  252|  2.87k|    assert(id.isValid() && "Failed to create symbol for stringID");
  253|      0|    return id;
  254|  2.87k|  }
_ZN6hermes2vm13RuntimeModule23getCodeBlockMayAllocateEj:
  277|  4.69k|  inline CodeBlock *getCodeBlockMayAllocate(unsigned index) {
  278|  4.69k|    if (LLVM_LIKELY(functionMap_[index])) {
  ------------------
  |  |  188|  4.69k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 4.69k]
  |  |  ------------------
  ------------------
  279|      0|      return functionMap_[index];
  280|      0|    }
  281|  4.69k|    return getCodeBlockSlowPath(index);
  282|  4.69k|  }
_ZNK6hermes2vm13RuntimeModule13isInitializedEv:
  285|  5.37k|  bool isInitialized() const {
  286|  5.37k|    return !bcProvider_->isLazy();
  287|  5.37k|  }
_ZNK6hermes2vm13RuntimeModule11getBytecodeEv:
  289|    310|  const hbc::BCProvider *getBytecode() const {
  290|    310|    return bcProvider_.get();
  291|    310|  }
_ZN6hermes2vm13RuntimeModule11getBytecodeEv:
  293|  14.0k|  hbc::BCProvider *getBytecode() {
  294|  14.0k|    return bcProvider_.get();
  295|  14.0k|  }
_ZNK6hermes2vm13RuntimeModule13hasCJSModulesEv:
  303|    155|  bool hasCJSModules() const {
  304|    155|    return !getBytecode()->getCJSModuleTable().empty();
  305|    155|  }
_ZNK6hermes2vm13RuntimeModule19hasCJSModulesStaticEv:
  309|    155|  bool hasCJSModulesStatic() const {
  310|    155|    return !getBytecode()->getCJSModuleTableStatic().empty();
  311|    155|  }
_ZN6hermes2vm13RuntimeModule13markDomainRefERNS0_16WeakRootAcceptorE:
  361|  17.0k|  void markDomainRef(WeakRootAcceptor &acceptor) {
  362|  17.0k|    acceptor.acceptWeak(domain_);
  363|  17.0k|  }
_ZN6hermes2vm13RuntimeModule24findCachedTemplateObjectEj:
  396|    283|  JSObject *findCachedTemplateObject(uint32_t templateObjID) {
  397|    283|    return templateMap_.lookup(templateObjID);
  398|    283|  }
_ZN6hermes2vm13RuntimeModule19cacheTemplateObjectEjNS0_6HandleINS0_8JSObjectEEE:
  407|     69|      Handle<JSObject> templateObj) {
  408|     69|    assert(
  409|     69|        templateMap_.count(templateObjID) == 0 &&
  410|     69|        "The template object already exists.");
  411|      0|    templateMap_[templateObjID] = templateObj.get();
  412|     69|  }
_ZN6hermes2vm13RuntimeModule33getLiteralHiddenClassCacheHashKeyEjj:
  456|  1.34k|      unsigned numLiterals) {
  457|  1.34k|    assert(
  458|  1.34k|        canGenerateLiteralHiddenClassCacheKey(keyBufferIndex, numLiterals) &&
  459|  1.34k|        "<keyBufferIndex, numLiterals> tuple can't be used as cache key.");
  460|      0|    return ((uint32_t)keyBufferIndex << 8) | numLiterals;
  461|  1.34k|  }
_ZN6hermes2vm13RuntimeModule37canGenerateLiteralHiddenClassCacheKeyEjj:
  469|  2.68k|      unsigned numLiterals) {
  470|  2.68k|    return (keyBufferIndex & 0xFF000000) == 0 && numLiterals < 256;
  ------------------
  |  Branch (470:12): [True: 2.68k, False: 0]
  |  Branch (470:50): [True: 2.68k, False: 0]
  ------------------
  471|  2.68k|  }

_ZN6hermes2vm11SegmentInfo24setSegmentIndexFromStartEPvj:
   47|    203|  static void setSegmentIndexFromStart(void *lowLim, unsigned index) {
   48|    203|    assert(lowLim == AlignedStorage::start(lowLim) && "Precondition.");
   49|      0|    get(lowLim)->index = index;
   50|    203|  }
_ZN6hermes2vm11SegmentInfo3getEPv:
   56|    203|  static SegmentInfo *get(void *lowLim) {
   57|    203|    assert(lowLim == AlignedStorage::start(lowLim) && "Precondition.");
   58|      0|    return reinterpret_cast<SegmentInfo *>(lowLim);
   59|    203|  }

_ZNK6hermes2vm18SegmentedArrayBaseINS0_11HermesValueEE13inlineStorageEv:
  515|      1|  const GCHVType *inlineStorage() const {
  516|      1|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  517|      1|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE22allocationSizeForSlotsEj:
  472|  8.66M|  static constexpr uint32_t allocationSizeForSlots(SegmentNumber numSlots) {
  473|  8.66M|    return SegmentedArrayBase::template totalSizeToAlloc<GCHVType>(numSlots);
  474|  8.66M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE19numSlotsForCapacityEj:
  431|   416k|  static constexpr SegmentNumber numSlotsForCapacity(size_type capacity) {
  432|   416k|    if (capacity <= kValueToSegmentThreshold)
  ------------------
  |  Branch (432:9): [True: 415k, False: 610]
  ------------------
  433|   415k|      return capacity;
  434|       |    // Enough segments to hold the capacity excluding inline storage.
  435|    610|    const size_t numSegments = llvh::alignTo<Segment::kMaxLength>(
  436|    610|                                   capacity - kValueToSegmentThreshold) /
  437|    610|        Segment::kMaxLength;
  438|       |    // The slots for inline storage plus the slots need to hold the
  439|       |    // number of segments that can hold the capacity.
  440|    610|    return kValueToSegmentThreshold + numSegments;
  441|   416k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE25allocationSizeForCapacityEj:
  328|   415k|  static constexpr uint32_t allocationSizeForCapacity(size_type capacity) {
  329|   415k|    return allocationSizeForSlots(numSlotsForCapacity(capacity));
  330|   415k|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE29slotCapacityForAllocationSizeEj:
  147|  8.24M|  static constexpr size_type slotCapacityForAllocationSize(uint32_t allocSize) {
  148|  8.24M|    return (allocSize - allocationSizeForSlots(0)) / sizeof(HVType);
  149|  8.24M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE29maxNumSegmentsWithoutOverflowEv:
  629|   842k|SegmentedArrayBase<HVType>::maxNumSegmentsWithoutOverflow() {
  630|   842k|  return (
  631|   842k|      (std::numeric_limits<uint32_t>::max() - kValueToSegmentThreshold) /
  632|   842k|      Segment::kMaxLength);
  633|   842k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE14maxNumSegmentsEv:
  619|   842k|SegmentedArrayBase<HVType>::maxNumSegments() {
  620|   842k|  const SegmentedArrayBase::SegmentNumber maxAllocSlots =
  621|   842k|      slotCapacityForAllocationSize(GC::maxAllocationSize());
  622|   842k|  const SegmentedArrayBase::SegmentNumber maxAllocSegments =
  623|   842k|      maxAllocSlots - kValueToSegmentThreshold;
  624|   842k|  return std::min(maxAllocSegments, maxNumSegmentsWithoutOverflow());
  625|   842k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11maxElementsEv:
  613|   842k|SegmentedArrayBase<HVType>::maxElements() {
  614|   842k|  return maxNumSegments() * Segment::kMaxLength + kValueToSegmentThreshold;
  615|   842k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE3setILNS3_6InlineE0EEEvRNS0_7RuntimeEjS2_:
  294|  1.66M|  void set(Runtime &runtime, TotalIndex index, HVType val) {
  295|  1.66M|    atRef<inl>(runtime, index).set(val, runtime.getHeap());
  296|  1.66M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE5atRefILNS3_6InlineE0EEERNS0_17GCHermesValueBaseIS2_EERNS0_11PointerBaseEj:
  269|  1.66M|  GCHVType &atRef(PointerBase &base, TotalIndex index) {
  270|  1.66M|    if (inl == Inline::Yes) {
  ------------------
  |  Branch (270:9): [Folded - Ignored]
  ------------------
  271|      0|      assert(
  272|      0|          index < kValueToSegmentThreshold && index < size(base) &&
  273|      0|          "Using the inline storage accessor when the index is larger than the "
  274|      0|          "inline storage");
  275|      0|      return inlineStorage()[index];
  276|  1.66M|    } else {
  277|  1.66M|      return *(begin(base) + index);
  278|  1.66M|    }
  279|  1.66M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE4sizeERNS0_11PointerBaseE:
  304|  7.80M|  size_type size(PointerBase &base) const {
  305|  7.80M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  306|  7.80M|    if (LLVM_LIKELY(numSlotsUsed <= kValueToSegmentThreshold)) {
  ------------------
  |  |  188|  7.80M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.97M, False: 4.83M]
  |  |  ------------------
  ------------------
  307|  2.97M|      return numSlotsUsed;
  308|  4.83M|    } else {
  309|  4.83M|      const SegmentNumber numSegments = numSlotsUsed - kValueToSegmentThreshold;
  310|  4.83M|      const size_type numBeforeLastSegment =
  311|  4.83M|          kValueToSegmentThreshold + (numSegments - 1) * Segment::kMaxLength;
  312|  4.83M|      const uint32_t numInLastSegment =
  313|  4.83M|          segmentAt(base, numSegments - 1)->length();
  314|  4.83M|      return numBeforeLastSegment + numInLastSegment;
  315|  4.83M|    }
  316|  7.80M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9segmentAtERNS0_11PointerBaseEj:
  487|  6.77M|  const Segment *segmentAt(PointerBase &base, SegmentNumber segment) const {
  488|  6.77M|    assert(
  489|  6.77M|        segment < numUsedSegments() &&
  490|  6.77M|        "Trying to get a segment that does not exist");
  491|      0|    return vmcast<Segment>(
  492|  6.77M|        segmentAtPossiblyUnallocated(segment)->getObject(base));
  493|  6.77M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE15numUsedSegmentsEv:
  542|  6.77M|  SegmentNumber numUsedSegments() const {
  543|  6.77M|    const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  544|  6.77M|    return numSlotsUsed <= kValueToSegmentThreshold
  ------------------
  |  Branch (544:12): [True: 0, False: 6.77M]
  ------------------
  545|  6.77M|        ? 0
  546|  6.77M|        : numSlotsUsed - kValueToSegmentThreshold;
  547|  6.77M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE28segmentAtPossiblyUnallocatedEj:
  502|  6.77M|  const GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) const {
  503|  6.77M|    assert(
  504|  6.77M|        segment < numSegments() &&
  505|  6.77M|        "Trying to get a segment that does not exist");
  506|      0|    return segments() + segment;
  507|  6.77M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11numSegmentsEv:
  534|  6.77M|  SegmentNumber numSegments() const {
  535|  6.77M|    const auto slotCap = slotCapacity();
  536|  6.77M|    return slotCap <= kValueToSegmentThreshold
  ------------------
  |  Branch (536:12): [True: 0, False: 6.77M]
  ------------------
  537|  6.77M|        ? 0
  538|  6.77M|        : slotCap - kValueToSegmentThreshold;
  539|  6.77M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE12slotCapacityEv:
  154|  8.24M|  size_type slotCapacity() const {
  155|  8.24M|    return slotCapacityForAllocationSize(getAllocatedSize());
  156|  8.24M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8segmentsEv:
  526|  6.77M|  const GCHVType *segments() const {
  527|  6.77M|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>() +
  528|  6.77M|        kValueToSegmentThreshold;
  529|  6.77M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment11getCellKindEv:
   65|  6.77M|    static constexpr CellKind getCellKind() {
   66|  6.77M|      static_assert(
   67|  6.77M|          std::is_same<HVType, HermesValue>::value ||
   68|  6.77M|              std::is_same<HVType, SmallHermesValue>::value,
   69|  6.77M|          "Illegal HVType.");
   70|  6.77M|      return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (70:14): [Folded - Ignored]
  ------------------
   71|  6.77M|          ? CellKind::SegmentKind
   72|  6.77M|          : CellKind::SegmentSmallKind;
   73|  6.77M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment7classofEPKNS0_6GCCellE:
   74|  6.77M|    static bool classof(const GCCell *cell) {
   75|  6.77M|      return cell->getKind() == getCellKind();
   76|  6.77M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment6lengthEv:
   93|  6.77M|    uint32_t length() const {
   94|  6.77M|      return length_.load(std::memory_order_relaxed);
   95|  6.77M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE13inlineStorageEv:
  510|  1.53M|  GCHVType *inlineStorage() {
  511|  1.53M|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  512|  1.53M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE5beginERNS0_11PointerBaseE:
  405|  1.66M|  iterator begin(PointerBase &base) {
  406|  1.66M|    return iterator(this, 0, base);
  407|  1.66M|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratorplEj:
  209|  1.66M|    iterator operator+(TotalIndex index) const {
  210|  1.66M|      assert(
  211|  1.66M|          index_ <= std::numeric_limits<TotalIndex>::max() - index &&
  212|  1.66M|          "Overflow in addition");
  213|      0|      return iterator(owner_, index_ + index, base_);
  214|  1.66M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratordeEv:
  232|  1.66M|    reference operator*() {
  233|  1.66M|      assert(
  234|  1.66M|          index_ < owner_->size(base_) &&
  235|  1.66M|          "Trying to read from an index outside the size");
  236|       |      // Almost all arrays fit entirely in the inline storage.
  237|  1.66M|      if (LLVM_LIKELY(index_ < kValueToSegmentThreshold)) {
  ------------------
  |  |  188|  1.66M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 558k, False: 1.10M]
  |  |  ------------------
  ------------------
  238|   558k|        return owner_->inlineStorage()[index_];
  239|  1.10M|      } else {
  240|  1.10M|        return owner_->segmentAt(base_, toSegment(index_))
  241|  1.10M|            ->at(toInterior(index_));
  242|  1.10M|      }
  243|  1.66M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9toSegmentEj:
  447|  1.93M|  static SegmentNumber toSegment(TotalIndex index) {
  448|  1.93M|    assert(
  449|  1.93M|        index >= kValueToSegmentThreshold &&
  450|  1.93M|        "Cannot get the segment of an element in the inline storage");
  451|      0|    return (index - kValueToSegmentThreshold) / Segment::kMaxLength;
  452|  1.93M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9segmentAtERNS0_11PointerBaseEj:
  481|  1.63M|  Segment *segmentAt(PointerBase &base, SegmentNumber segment) {
  482|  1.63M|    return const_cast<Segment *>(
  483|  1.63M|        static_cast<const SegmentedArrayBase *>(this)->segmentAt(
  484|  1.63M|            base, segment));
  485|  1.63M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE10toInteriorEj:
  457|  1.93M|  static InteriorIndex toInterior(TotalIndex index) {
  458|  1.93M|    assert(
  459|  1.93M|        index >= kValueToSegmentThreshold &&
  460|  1.93M|        "Cannot get the interior index of an element in the inline storage");
  461|      0|    return (index - kValueToSegmentThreshold) % Segment::kMaxLength;
  462|  1.93M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment2atEj:
   78|  1.10M|    GCHVType &at(uint32_t index) {
   79|  1.10M|      assert(
   80|  1.10M|          index < length() &&
   81|  1.10M|          "Cannot get an index outside of the length of a segment");
   82|      0|      return data_[index];
   83|  1.10M|    }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE2atILNS3_6InlineE0EEES2_RNS0_11PointerBaseEj:
  283|   777k|  HVType at(PointerBase &base, size_type index) const {
  284|   777k|    assert(index < size(base) && "Invalid index.");
  285|   777k|    if (inl == Inline::Yes || index < kValueToSegmentThreshold) {
  ------------------
  |  Branch (285:9): [Folded - Ignored]
  |  Branch (285:31): [True: 477k, False: 300k]
  ------------------
  286|   477k|      return inlineStorage()[index];
  287|   477k|    } else {
  288|   300k|      return segmentAt(base, toSegment(index))->at(toInterior(index));
  289|   300k|    }
  290|   777k|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE13inlineStorageEv:
  515|   477k|  const GCHVType *inlineStorage() const {
  516|   477k|    return SegmentedArrayBase::template getTrailingObjects<GCHVType>();
  517|   477k|  }
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment2atEj:
   86|   300k|    const GCHVType &at(uint32_t index) const {
   87|   300k|      assert(
   88|   300k|          index < length() &&
   89|   300k|          "Cannot get an index outside of the length of a segment");
   90|      0|      return data_[index];
   91|   300k|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE11getCellKindEv:
  370|  7.77M|  static constexpr CellKind getCellKind() {
  371|  7.77M|    static_assert(
  372|  7.77M|        std::is_same<HVType, HermesValue>::value ||
  373|  7.77M|            std::is_same<HVType, SmallHermesValue>::value,
  374|  7.77M|        "Illegal HVType.");
  375|  7.77M|    return std::is_same<HVType, HermesValue>::value
  ------------------
  |  Branch (375:12): [Folded - Ignored]
  ------------------
  376|  7.77M|        ? CellKind::SegmentedArrayKind
  377|  7.77M|        : CellKind::SegmentedArraySmallKind;
  378|  7.77M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7classofEPKNS0_6GCCellE:
  379|  6.94M|  static bool classof(const GCCell *cell) {
  380|  6.94M|    return cell->getKind() == getCellKind();
  381|  6.94M|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8iteratorC2EPS3_jRNS0_11PointerBaseE:
  181|  3.32M|        : owner_(owner), index_(index), base_(base) {
  182|  3.32M|      assert(
  183|  3.32M|          index_ <= owner_->size(base_) &&
  184|  3.32M|          "Cannot make an iterator that points outside of the storage");
  185|  3.32M|    }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20calculateNewCapacityEjj:
  421|    107|      size_type newSize) {
  422|       |    // Either double the current size, or increase to be barely big enough to
  423|       |    // hold the new size, whichever is larger.
  424|       |    // It's ok if currentSize * 2 overflows, since we know that the returned
  425|       |    // capacity will still be >= newSize, which is all that is required.
  426|    107|    return std::max(currentSize * 2, newSize);
  427|    107|  }
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE28segmentAtPossiblyUnallocatedEj:
  497|  2.72k|  GCHVType *segmentAtPossiblyUnallocated(SegmentNumber segment) {
  498|  2.72k|    return const_cast<GCHVType *>(static_cast<const SegmentedArrayBase *>(this)
  499|  2.72k|                                      ->segmentAtPossiblyUnallocated(segment));
  500|  2.72k|  }

_ZN6hermes2vm23SerializedLiteralParserC2EN4llvh8ArrayRefIhEEjPNS0_13RuntimeModuleE:
   45|  12.9k|        runtimeModule_(runtimeModule) {}

_ZN6hermes2vm12SingleObjectILNS0_8CellKindE60EE6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
   33|     99|      Handle<JSObject> parentHandle) {
   34|     99|    auto *cell = runtime.makeAFixed<SingleObject>(
   35|     99|        runtime,
   36|     99|        parentHandle,
   37|     99|        runtime.getHiddenClassForPrototype(
   38|     99|            *parentHandle, numOverlapSlots<SingleObject>()));
   39|     99|    return JSObjectInit::initToHermesValue(runtime, cell);
   40|     99|  }
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE60EE11getCellKindEv:
   23|    198|  static constexpr CellKind getCellKind() {
   24|    198|    return kind;
   25|    198|  }
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE60EEC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEE:
   46|     99|      : JSObject(runtime, *parent, *clazz) {}
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE60EE7classofEPKNS0_6GCCellE:
   26|    198|  static bool classof(const GCCell *cell) {
   27|    198|    return cell->getKind() == kind;
   28|    198|  }
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE59EE6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
   33|     99|      Handle<JSObject> parentHandle) {
   34|     99|    auto *cell = runtime.makeAFixed<SingleObject>(
   35|     99|        runtime,
   36|     99|        parentHandle,
   37|     99|        runtime.getHiddenClassForPrototype(
   38|     99|            *parentHandle, numOverlapSlots<SingleObject>()));
   39|     99|    return JSObjectInit::initToHermesValue(runtime, cell);
   40|     99|  }
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE59EE11getCellKindEv:
   23|    198|  static constexpr CellKind getCellKind() {
   24|    198|    return kind;
   25|    198|  }
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE59EEC2ERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS6_INS0_11HiddenClassEEE:
   46|     99|      : JSObject(runtime, *parent, *clazz) {}
_ZN6hermes2vm12SingleObjectILNS0_8CellKindE59EE7classofEPKNS0_6GCCellE:
   26|    198|  static bool classof(const GCCell *cell) {
   27|    198|    return cell->getKind() == kind;
   28|    198|  }

_ZN6hermes2vm20SkipWeakRefsAcceptorINS0_7HadesGC12MarkAcceptorEEC2ERS2_PS3_:
   28|    141|      : acceptor_(acceptor) {}

_ZN6hermes2vm19RootSectionAcceptor16beginRootSectionENS1_7SectionE:
   60|  18.8k|  virtual void beginRootSection(Section section) {}
_ZN6hermes2vm19RootSectionAcceptor14endRootSectionEv:
   61|  18.8k|  virtual void endRootSection() {}
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERPNS0_6GCCellE:
   87|   400k|  void accept(GCCell *&ptr) final {
   88|   400k|    accept(ptr, nullptr);
   89|   400k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERNS0_17PinnedHermesValueE:
   92|   306k|  void accept(PinnedHermesValue &hv) final {
   93|   306k|    accept(hv, nullptr);
   94|   306k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames14acceptNullableERNS0_17PinnedHermesValueE:
   95|  4.82k|  void acceptNullable(PinnedHermesValue &hv) final {
   96|  4.82k|    acceptNullable(hv, nullptr);
   97|  4.82k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames6acceptERKNS0_12RootSymbolIDE:
  101|  96.5k|  void accept(const RootSymbolID &sym) final {
  102|  96.5k|    accept(sym, nullptr);
  103|  96.5k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames15provideSnapshotERKNSt3__18functionIFvRNS0_12HeapSnapshotEEEE:
  134|  4.15k|      const std::function<void(HeapSnapshot &)> &func) {}
_ZN6hermes2vm19RootSectionAcceptorD2Ev:
   50|  3.70k|  virtual ~RootSectionAcceptor() = default;
_ZN6hermes2vm12SlotAcceptorD2Ev:
   35|  3.26k|  virtual ~SlotAcceptor() = default;
_ZN6hermes2vm15WeakRefAcceptorD2Ev:
   45|    888|  virtual ~WeakRefAcceptor() = default;
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_15StringPrimitiveEEEvRPT_:
   76|   326k|  void acceptPtr(T *&ptr) {
   77|   326k|    accept(reinterpret_cast<GCCell *&>(ptr));
   78|   326k|  }
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_8JSObjectEEEvRPT_:
   76|  12.3k|  void acceptPtr(T *&ptr) {
   77|  12.3k|    accept(reinterpret_cast<GCCell *&>(ptr));
   78|  12.3k|  }
_ZN6hermes2vm12RootAcceptor9acceptPtrINS0_8CallableEEEvRPT_:
   76|  61.8k|  void acceptPtr(T *&ptr) {
   77|  61.8k|    accept(reinterpret_cast<GCCell *&>(ptr));
   78|  61.8k|  }
_ZN6hermes2vm28RootAndSlotAcceptorWithNames9acceptPtrINS0_8JSObjectEEEvRPT_PKc:
  108|  2.37k|  void acceptPtr(T *&ptr, const char *name) {
  109|  2.37k|    accept(reinterpret_cast<GCCell *&>(ptr), name);
  110|  2.37k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12MarkAcceptorEEC2ERS3_:
  152|    284|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12MarkAcceptorEE6acceptERPNS0_6GCCellEPKc:
  156|  61.7k|  void accept(GCCell *&ptr, const char *) override {
  157|  61.7k|    acceptor.accept(ptr);
  158|  61.7k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12MarkAcceptorEE6acceptERNS0_17PinnedHermesValueEPKc:
  164|  58.5k|  void accept(PinnedHermesValue &hv, const char *) override {
  165|  58.5k|    acceptor.accept(hv);
  166|  58.5k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12MarkAcceptorEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  167|    553|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  168|    553|    acceptor.acceptNullable(hv);
  169|    553|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12MarkAcceptorEE6acceptERKNS0_12RootSymbolIDEPKc:
  179|  14.6k|  void accept(const RootSymbolID &sym, const char *) override {
  180|  14.6k|    acceptor.accept(sym);
  181|  14.6k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb1EEEEC2ERS4_:
  152|      1|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb1EEEE6acceptERPNS0_6GCCellEPKc:
  156|     56|  void accept(GCCell *&ptr, const char *) override {
  157|     56|    acceptor.accept(ptr);
  158|     56|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb1EEEE6acceptERNS0_17PinnedHermesValueEPKc:
  164|    131|  void accept(PinnedHermesValue &hv, const char *) override {
  165|    131|    acceptor.accept(hv);
  166|    131|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb1EEEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  167|      9|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  168|      9|    acceptor.acceptNullable(hv);
  169|      9|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEEC2ERS4_:
  152|    300|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE6acceptERPNS0_6GCCellEPKc:
  156|  19.2k|  void accept(GCCell *&ptr, const char *) override {
  157|  19.2k|    acceptor.accept(ptr);
  158|  19.2k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE6acceptERNS0_17PinnedHermesValueEPKc:
  164|  45.7k|  void accept(PinnedHermesValue &hv, const char *) override {
  165|  45.7k|    acceptor.accept(hv);
  166|  45.7k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_7HadesGC12EvacAcceptorILb0EEEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  167|  1.22k|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  168|  1.22k|    acceptor.acceptNullable(hv);
  169|  1.22k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEEC2ERS2_:
  152|    745|  explicit DroppingAcceptor(Acceptor &acceptor) : acceptor(acceptor) {}
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERPNS0_6GCCellEPKc:
  156|   321k|  void accept(GCCell *&ptr, const char *) override {
  157|   321k|    acceptor.accept(ptr);
  158|   321k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERNS0_17PinnedHermesValueEPKc:
  164|   304k|  void accept(PinnedHermesValue &hv, const char *) override {
  165|   304k|    acceptor.accept(hv);
  166|   304k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE14acceptNullableERNS0_17PinnedHermesValueEPKc:
  167|  3.02k|  void acceptNullable(PinnedHermesValue &hv, const char *) override {
  168|  3.02k|    acceptor.acceptNullable(hv);
  169|  3.02k|  }
_ZN6hermes2vm16DroppingAcceptorINS0_27CheckHeapWellFormedAcceptorEE6acceptERKNS0_12RootSymbolIDEPKc:
  179|  81.8k|  void accept(const RootSymbolID &sym, const char *) override {
  180|  81.8k|    acceptor.accept(sym);
  181|  81.8k|  }

_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEEC2ERS3_:
  109|   801k|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|   801k|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|   801k|    auto *ptr = reinterpret_cast<char *>(cell);
  118|   801k|    visitFields(ptr, offsets);
  119|   801k|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 83.2k, False: 717k]
  ------------------
  120|  83.2k|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|  83.2k|    }
  122|   801k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|   801k|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|   801k|    size_t i = 0;
  153|   801k|#define SLOT_TYPE(type)              \
  154|   801k|  for (; i < offsets.end##type; ++i) \
  155|   801k|    visitSlot<type>(base + offsets.fields[i]);
  156|   801k|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|   801k|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|  1.38M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 588k, False: 801k]
  |  |  |  |  ------------------
  |  |  |  |  155|   801k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|   801k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|   801k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 728, False: 801k]
  |  |  |  |  ------------------
  |  |  |  |  155|   801k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|   801k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|   851k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 50.5k, False: 801k]
  |  |  |  |  ------------------
  |  |  |  |  155|   801k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|   801k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|   881k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 80.6k, False: 801k]
  |  |  |  |  ------------------
  |  |  |  |  155|   801k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|   801k|#undef SLOT_TYPE
  158|   801k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|   588k|  void visitSlot(char *const slot) {
  143|   588k|    assert(
  144|   588k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   588k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   588k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|    728|  void visitSlot(char *const slot) {
  143|    728|    assert(
  144|    728|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|    728|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|    728|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|  50.5k|  void visitSlot(char *const slot) {
  143|  50.5k|    assert(
  144|  50.5k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  50.5k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  50.5k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12MarkAcceptorEE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|  80.6k|  void visitSlot(char *const slot) {
  143|  80.6k|    assert(
  144|  80.6k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  80.6k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  80.6k|  }
_ZN6hermes2vm11BaseVisitor10visitArrayINS0_7HadesGC12MarkAcceptorELb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|  83.2k|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|  83.2k|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|  83.2k|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|  83.2k|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|  83.2k|                            base + array.lengthOffset)
   33|  83.2k|                            ->load(std::memory_order_acquire);
   34|  83.2k|    const auto stride = array.stride;
   35|  83.2k|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 83.2k]
  ------------------
   36|      0|#define SLOT_TYPE(type)                          \
   37|      0|  case ArrayType::type:                          \
   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
   39|      0|        acceptor, start, length, stride);        \
   40|      0|    break;
   41|      0|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      0|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |   37|      0|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 0, False: 83.2k]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|    852|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|    852|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 852, False: 82.4k]
  |  |  |  |  ------------------
  |  |  |  |   38|    852|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|    852|        acceptor, start, length, stride);        \
  |  |  |  |   40|    852|    break;
  |  |  ------------------
  |  |   12|  74.7k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|  74.7k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 74.7k, False: 8.53k]
  |  |  |  |  ------------------
  |  |  |  |   38|  74.7k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  74.7k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  74.7k|    break;
  |  |  ------------------
  |  |   13|  7.68k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|  7.68k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 7.68k, False: 75.5k]
  |  |  |  |  ------------------
  |  |  |  |   38|  7.68k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  7.68k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  7.68k|    break;
  |  |  ------------------
  ------------------
   42|  83.2k|#undef SLOT_TYPE
   43|  83.2k|    }
   44|  83.2k|  }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12MarkAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|    852|      std::size_t stride) {
   84|  6.24k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 5.39k, False: 852]
  ------------------
   85|  5.39k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  5.39k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  5.39k|      start += stride;
   88|  5.39k|    }
   89|    852|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12MarkAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS4_RS7_j:
   65|  5.39k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  5.39k|      acceptor.accept(elem);
   67|  5.39k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12MarkAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|  74.7k|      std::size_t stride) {
   84|   731k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 656k, False: 74.7k]
  ------------------
   85|   656k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   656k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   656k|      start += stride;
   88|   656k|    }
   89|  74.7k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12MarkAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS4_RS7_j:
   65|   656k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   656k|      acceptor.accept(elem);
   67|   656k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12MarkAcceptorENS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|  7.68k|      std::size_t stride) {
   84|   110k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 102k, False: 7.68k]
  ------------------
   85|   102k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   102k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   102k|      start += stride;
   88|   102k|    }
   89|  7.68k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12MarkAcceptorENS0_10GCSymbolIDELb0EE4implERS4_RS5_j:
   65|   102k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   102k|      acceptor.accept(elem);
   67|   102k|    }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb1EEEEC2ERS4_:
  109|      2|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb1EEEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|      1|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|      1|    auto *ptr = reinterpret_cast<char *>(cell);
  118|      1|    visitFields(ptr, offsets);
  119|      1|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 0, False: 1]
  ------------------
  120|      0|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|      0|    }
  122|      1|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb1EEEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|      1|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|      1|    size_t i = 0;
  153|      1|#define SLOT_TYPE(type)              \
  154|      1|  for (; i < offsets.end##type; ++i) \
  155|      1|    visitSlot<type>(base + offsets.fields[i]);
  156|      1|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      1|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|      1|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  155|      1|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|      1|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|      1|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  155|      1|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|      1|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|      1|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  155|      1|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|      1|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|      1|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  |  |  155|      1|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|      1|#undef SLOT_TYPE
  158|      1|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEEC2ERS4_:
  109|   429k|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE16visitWithinRangeEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsEPKcSD_:
  130|    339|      const char *end) {
  131|    339|    auto *ptr = reinterpret_cast<char *>(cell);
  132|    339|    visitFieldsWithinRange(ptr, offsets, begin, end);
  133|    339|    if (offsets.array) {
  ------------------
  |  Branch (133:9): [True: 82, False: 257]
  ------------------
  134|     82|      visitArrayWithinRange(ptr, *offsets.array, begin, end);
  135|     82|    }
  136|    339|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE22visitFieldsWithinRangeEPcRKNS0_8Metadata11SlotOffsetsEPKcSC_:
  166|    339|      const char *end) {
  167|    339|    size_t i = 0;
  168|    339|#define SLOT_TYPE(type)                    \
  169|    339|  for (; i < offsets.end##type; ++i) {     \
  170|    339|    char *slot = base + offsets.fields[i]; \
  171|    339|    if (slot < begin)                      \
  172|    339|      continue;                            \
  173|    339|    if (slot >= end) {                     \
  174|    339|      i = offsets.end##type;               \
  175|    339|      break;                               \
  176|    339|    }                                      \
  177|    339|    visitSlot<type>(slot);                 \
  178|    339|  }
  179|    339|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|    339|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  169|    702|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 429, False: 273]
  |  |  |  |  ------------------
  |  |  |  |  170|    429|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|    429|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 66, False: 363]
  |  |  |  |  ------------------
  |  |  |  |  172|    429|      continue;                            \
  |  |  |  |  173|    429|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 66, False: 297]
  |  |  |  |  ------------------
  |  |  |  |  174|     66|      i = offsets.end##type;               \
  |  |  |  |  175|     66|      break;                               \
  |  |  |  |  176|     66|    }                                      \
  |  |  |  |  177|    363|    visitSlot<type>(slot);                 \
  |  |  |  |  178|    297|  }
  |  |  ------------------
  |  |   11|    339|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  169|    352|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 16, False: 336]
  |  |  |  |  ------------------
  |  |  |  |  170|     16|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|     16|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 0, False: 16]
  |  |  |  |  ------------------
  |  |  |  |  172|     16|      continue;                            \
  |  |  |  |  173|     16|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 3, False: 13]
  |  |  |  |  ------------------
  |  |  |  |  174|      3|      i = offsets.end##type;               \
  |  |  |  |  175|      3|      break;                               \
  |  |  |  |  176|      3|    }                                      \
  |  |  |  |  177|     16|    visitSlot<type>(slot);                 \
  |  |  |  |  178|     13|  }
  |  |  ------------------
  |  |   12|    339|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  169|    367|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 29, False: 338]
  |  |  |  |  ------------------
  |  |  |  |  170|     29|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|     29|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 0, False: 29]
  |  |  |  |  ------------------
  |  |  |  |  172|     29|      continue;                            \
  |  |  |  |  173|     29|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 1, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  174|      1|      i = offsets.end##type;               \
  |  |  |  |  175|      1|      break;                               \
  |  |  |  |  176|      1|    }                                      \
  |  |  |  |  177|     29|    visitSlot<type>(slot);                 \
  |  |  |  |  178|     28|  }
  |  |  ------------------
  |  |   13|    339|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  169|    456|  for (; i < offsets.end##type; ++i) {     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (169:10): [True: 117, False: 339]
  |  |  |  |  ------------------
  |  |  |  |  170|    117|    char *slot = base + offsets.fields[i]; \
  |  |  |  |  171|    117|    if (slot < begin)                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (171:9): [True: 55, False: 62]
  |  |  |  |  ------------------
  |  |  |  |  172|    117|      continue;                            \
  |  |  |  |  173|    117|    if (slot >= end) {                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (173:9): [True: 0, False: 62]
  |  |  |  |  ------------------
  |  |  |  |  174|      0|      i = offsets.end##type;               \
  |  |  |  |  175|      0|      break;                               \
  |  |  |  |  176|      0|    }                                      \
  |  |  |  |  177|     62|    visitSlot<type>(slot);                 \
  |  |  |  |  178|     62|  }
  |  |  ------------------
  ------------------
  180|    339|#undef SLOT_TYPE
  181|    339|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|  39.8k|  void visitSlot(char *const slot) {
  143|  39.8k|    assert(
  144|  39.8k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  39.8k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  39.8k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|    204|  void visitSlot(char *const slot) {
  143|    204|    assert(
  144|    204|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|    204|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|    204|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|  3.53k|  void visitSlot(char *const slot) {
  143|  3.53k|    assert(
  144|  3.53k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  3.53k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  3.53k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|  5.69k|  void visitSlot(char *const slot) {
  143|  5.69k|    assert(
  144|  5.69k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  5.69k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  5.69k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE21visitArrayWithinRangeEPcRKNS0_8Metadata9ArrayDataEPKcSC_:
  211|     82|      const char *end) {
  212|     82|    using ArrayType = Metadata::ArrayData::ArrayType;
  213|     82|    char *start = base + array.startOffset;
  214|     82|    const auto length =
  215|     82|        *reinterpret_cast<std::uint32_t *>(base + array.lengthOffset);
  216|     82|    const auto stride = array.stride;
  217|     82|    switch (array.type) {
  ------------------
  |  Branch (217:13): [True: 0, False: 82]
  ------------------
  218|      0|#define SLOT_TYPE(type)                                                   \
  219|      0|  case ArrayType::type:                                                   \
  220|      0|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  221|      0|    break;
  222|      0|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      0|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  219|      0|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 0, False: 82]
  |  |  |  |  ------------------
  |  |  |  |  220|      0|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|      0|    break;
  |  |  ------------------
  |  |   11|     12|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  219|     12|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 12, False: 70]
  |  |  |  |  ------------------
  |  |  |  |  220|     12|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|     12|    break;
  |  |  ------------------
  |  |   12|     67|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  219|     67|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 67, False: 15]
  |  |  |  |  ------------------
  |  |  |  |  220|     67|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|     67|    break;
  |  |  ------------------
  |  |   13|      3|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  219|      3|  case ArrayType::type:                                                   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (219:3): [True: 3, False: 79]
  |  |  |  |  ------------------
  |  |  |  |  220|      3|    visitArrayObjectWithinRange<type>(start, length, stride, begin, end); \
  |  |  |  |  221|      3|    break;
  |  |  ------------------
  ------------------
  223|     82|#undef SLOT_TYPE
  224|     82|    }
  225|     82|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPcmmPKcSC_:
  191|     12|      const char *end) {
  192|       |    // start is the beginning of the array, begin is where the dirty card
  193|       |    // begins, end is where the dirty card ends.
  194|     12|    const char *const endOfObject = start + length * stride;
  195|     12|    char *const alignedStartOfCard =
  196|     12|        const_cast<char *>(begin - (begin - start) % stride);
  197|     12|    start = std::max(start, alignedStartOfCard);
  198|     12|    end = std::min(endOfObject, end);
  199|     12|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 0, False: 12]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|      0|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|      0|      start += stride;
  203|      0|    }
  204|     12|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPcmmPKcSC_:
  191|     67|      const char *end) {
  192|       |    // start is the beginning of the array, begin is where the dirty card
  193|       |    // begins, end is where the dirty card ends.
  194|     67|    const char *const endOfObject = start + length * stride;
  195|     67|    char *const alignedStartOfCard =
  196|     67|        const_cast<char *>(begin - (begin - start) % stride);
  197|     67|    start = std::max(start, alignedStartOfCard);
  198|     67|    end = std::min(endOfObject, end);
  199|  12.6k|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 12.6k, False: 67]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|  12.6k|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|  12.6k|      start += stride;
  203|  12.6k|    }
  204|     67|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE27visitArrayObjectWithinRangeINS0_10GCSymbolIDEEEvPcmmPKcSA_:
  191|      3|      const char *end) {
  192|       |    // start is the beginning of the array, begin is where the dirty card
  193|       |    // begins, end is where the dirty card ends.
  194|      3|    const char *const endOfObject = start + length * stride;
  195|      3|    char *const alignedStartOfCard =
  196|      3|        const_cast<char *>(begin - (begin - start) % stride);
  197|      3|    start = std::max(start, alignedStartOfCard);
  198|      3|    end = std::min(endOfObject, end);
  199|      5|    while (start < end) {
  ------------------
  |  Branch (199:12): [True: 2, False: 3]
  ------------------
  200|       |      // Selects which type to cast to based on the type of array given.
  201|      2|      acceptor_.accept(*reinterpret_cast<ElementType *>(start));
  202|      2|      start += stride;
  203|      2|    }
  204|      3|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|   438k|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|   438k|    auto *ptr = reinterpret_cast<char *>(cell);
  118|   438k|    visitFields(ptr, offsets);
  119|   438k|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 5.75k, False: 433k]
  ------------------
  120|  5.75k|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|  5.75k|    }
  122|   438k|  }
_ZN6hermes2vm11SlotVisitorINS0_7HadesGC12EvacAcceptorILb0EEEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|   438k|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|   438k|    size_t i = 0;
  153|   438k|#define SLOT_TYPE(type)              \
  154|   438k|  for (; i < offsets.end##type; ++i) \
  155|   438k|    visitSlot<type>(base + offsets.fields[i]);
  156|   438k|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|   438k|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|   478k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 39.5k, False: 438k]
  |  |  |  |  ------------------
  |  |  |  |  155|   438k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|   438k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|   439k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 191, False: 438k]
  |  |  |  |  ------------------
  |  |  |  |  155|   438k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|   438k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|   442k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 3.50k, False: 438k]
  |  |  |  |  ------------------
  |  |  |  |  155|   438k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|   438k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|   444k|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 5.63k, False: 438k]
  |  |  |  |  ------------------
  |  |  |  |  155|   438k|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|   438k|#undef SLOT_TYPE
  158|   438k|  }
_ZN6hermes2vm11BaseVisitor10visitArrayINS0_7HadesGC12EvacAcceptorILb0EEELb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|  5.75k|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|  5.75k|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|  5.75k|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|  5.75k|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|  5.75k|                            base + array.lengthOffset)
   33|  5.75k|                            ->load(std::memory_order_acquire);
   34|  5.75k|    const auto stride = array.stride;
   35|  5.75k|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 5.75k]
  ------------------
   36|      0|#define SLOT_TYPE(type)                          \
   37|      0|  case ArrayType::type:                          \
   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
   39|      0|        acceptor, start, length, stride);        \
   40|      0|    break;
   41|      0|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      0|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |   37|      0|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 0, False: 5.75k]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|     91|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|     91|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 91, False: 5.66k]
  |  |  |  |  ------------------
  |  |  |  |   38|     91|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|     91|        acceptor, start, length, stride);        \
  |  |  |  |   40|     91|    break;
  |  |  ------------------
  |  |   12|  5.15k|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|  5.15k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 5.15k, False: 604]
  |  |  |  |  ------------------
  |  |  |  |   38|  5.15k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  5.15k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  5.15k|    break;
  |  |  ------------------
  |  |   13|    513|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|    513|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 513, False: 5.24k]
  |  |  |  |  ------------------
  |  |  |  |   38|    513|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|    513|        acceptor, start, length, stride);        \
  |  |  |  |   40|    513|    break;
  |  |  ------------------
  ------------------
   42|  5.75k|#undef SLOT_TYPE
   43|  5.75k|    }
   44|  5.75k|  }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|     91|      std::size_t stride) {
   84|    433|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 342, False: 91]
  ------------------
   85|    342|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|    342|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|    342|      start += stride;
   88|    342|    }
   89|     91|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS5_RS8_j:
   65|    342|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|    342|      acceptor.accept(elem);
   67|    342|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|  5.15k|      std::size_t stride) {
   84|   481k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 475k, False: 5.15k]
  ------------------
   85|   475k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   475k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   475k|      start += stride;
   88|   475k|    }
   89|  5.15k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS5_RS8_j:
   65|   475k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   475k|      acceptor.accept(elem);
   67|   475k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_7HadesGC12EvacAcceptorILb0EEENS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|    513|      std::size_t stride) {
   84|  7.13k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 6.62k, False: 513]
  ------------------
   85|  6.62k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  6.62k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  6.62k|      start += stride;
   88|  6.62k|    }
   89|    513|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_7HadesGC12EvacAcceptorILb0EEENS0_10GCSymbolIDELb0EE4implERS5_RS6_j:
   65|  6.62k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  6.62k|      acceptor.accept(elem);
   67|  6.62k|    }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEEC2ERS2_:
  109|  5.65M|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|  5.65M|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|  5.65M|    auto *ptr = reinterpret_cast<char *>(cell);
  118|  5.65M|    visitFields(ptr, offsets);
  119|  5.65M|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 1.16M, False: 4.48M]
  ------------------
  120|  1.16M|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|  1.16M|    }
  122|  5.65M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|  5.65M|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|  5.65M|    size_t i = 0;
  153|  5.65M|#define SLOT_TYPE(type)              \
  154|  5.65M|  for (; i < offsets.end##type; ++i) \
  155|  5.65M|    visitSlot<type>(base + offsets.fields[i]);
  156|  5.65M|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|  5.65M|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|  10.1M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 4.53M, False: 5.65M]
  |  |  |  |  ------------------
  |  |  |  |  155|  5.65M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|  5.65M|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|  5.65M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 4.63k, False: 5.65M]
  |  |  |  |  ------------------
  |  |  |  |  155|  5.65M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|  5.65M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|  6.64M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 989k, False: 5.65M]
  |  |  |  |  ------------------
  |  |  |  |  155|  5.65M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|  5.65M|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|  6.07M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 423k, False: 5.65M]
  |  |  |  |  ------------------
  |  |  |  |  155|  5.65M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|  5.65M|#undef SLOT_TYPE
  158|  5.65M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|  4.53M|  void visitSlot(char *const slot) {
  143|  4.53M|    assert(
  144|  4.53M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  4.53M|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  4.53M|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|  4.63k|  void visitSlot(char *const slot) {
  143|  4.63k|    assert(
  144|  4.63k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  4.63k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  4.63k|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|   989k|  void visitSlot(char *const slot) {
  143|   989k|    assert(
  144|   989k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   989k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   989k|  }
_ZN6hermes2vm11SlotVisitorINS0_27CheckHeapWellFormedAcceptorEE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|   423k|  void visitSlot(char *const slot) {
  143|   423k|    assert(
  144|   423k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   423k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   423k|  }
_ZN6hermes2vm11BaseVisitor10visitArrayINS0_27CheckHeapWellFormedAcceptorELb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|  1.16M|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|  1.16M|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|  1.16M|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|  1.16M|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|  1.16M|                            base + array.lengthOffset)
   33|  1.16M|                            ->load(std::memory_order_acquire);
   34|  1.16M|    const auto stride = array.stride;
   35|  1.16M|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 1.16M]
  ------------------
   36|      0|#define SLOT_TYPE(type)                          \
   37|      0|  case ArrayType::type:                          \
   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
   39|      0|        acceptor, start, length, stride);        \
   40|      0|    break;
   41|      0|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      0|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |   37|      0|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 0, False: 1.16M]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|  4.46k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|  4.46k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 4.46k, False: 1.15M]
  |  |  |  |  ------------------
  |  |  |  |   38|  4.46k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  4.46k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  4.46k|    break;
  |  |  ------------------
  |  |   12|  1.11M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|  1.11M|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 1.11M, False: 46.2k]
  |  |  |  |  ------------------
  |  |  |  |   38|  1.11M|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  1.11M|        acceptor, start, length, stride);        \
  |  |  |  |   40|  1.11M|    break;
  |  |  ------------------
  |  |   13|  41.7k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|  41.7k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 41.7k, False: 1.12M]
  |  |  |  |  ------------------
  |  |  |  |   38|  41.7k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  41.7k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  41.7k|    break;
  |  |  ------------------
  ------------------
   42|  1.16M|#undef SLOT_TYPE
   43|  1.16M|    }
   44|  1.16M|  }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|  4.46k|      std::size_t stride) {
   84|  32.7k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 28.3k, False: 4.46k]
  ------------------
   85|  28.3k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  28.3k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  28.3k|      start += stride;
   88|  28.3k|    }
   89|  4.46k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS3_RS6_j:
   65|  28.3k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  28.3k|      acceptor.accept(elem);
   67|  28.3k|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|  1.11M|      std::size_t stride) {
   84|  6.47M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 5.35M, False: 1.11M]
  ------------------
   85|  5.35M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  5.35M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  5.35M|      start += stride;
   88|  5.35M|    }
   89|  1.11M|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS3_RS6_j:
   65|  5.35M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  5.35M|      acceptor.accept(elem);
   67|  5.35M|    }
_ZN6hermes2vm11BaseVisitor16visitArrayObjectINS0_27CheckHeapWellFormedAcceptorENS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|  41.7k|      std::size_t stride) {
   84|   588k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 546k, False: 41.7k]
  ------------------
   85|   546k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   546k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   546k|      start += stride;
   88|   546k|    }
   89|  41.7k|  }
_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptINS0_27CheckHeapWellFormedAcceptorENS0_10GCSymbolIDELb0EE4implERS3_RS4_j:
   65|   546k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   546k|      acceptor.accept(elem);
   67|   546k|    }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorEC2ERS3_:
  109|  4.82M|  SlotVisitor(Acceptor &acceptor) : acceptor_(acceptor) {}
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE5visitEPNS0_6GCCellERKNS0_8Metadata11SlotOffsetsE:
  116|  4.82M|  void visit(GCCell *cell, const Metadata::SlotOffsets &offsets) {
  117|  4.82M|    auto *ptr = reinterpret_cast<char *>(cell);
  118|  4.82M|    visitFields(ptr, offsets);
  119|  4.82M|    if (offsets.array) {
  ------------------
  |  Branch (119:9): [True: 1.07M, False: 3.74M]
  ------------------
  120|  1.07M|      visitArray<Acceptor, /*WithNames*/ false>(acceptor_, ptr, *offsets.array);
  121|  1.07M|    }
  122|  4.82M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE11visitFieldsEPcRKNS0_8Metadata11SlotOffsetsE:
  151|  4.82M|  void visitFields(char *base, const Metadata::SlotOffsets &offsets) {
  152|  4.82M|    size_t i = 0;
  153|  4.82M|#define SLOT_TYPE(type)              \
  154|  4.82M|  for (; i < offsets.end##type; ++i) \
  155|  4.82M|    visitSlot<type>(base + offsets.fields[i]);
  156|  4.82M|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|  4.82M|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |  154|  8.77M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 3.94M, False: 4.82M]
  |  |  |  |  ------------------
  |  |  |  |  155|  4.82M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   11|  4.82M|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |  154|  4.83M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 3.80k, False: 4.82M]
  |  |  |  |  ------------------
  |  |  |  |  155|  4.82M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   12|  4.82M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |  154|  5.76M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 938k, False: 4.82M]
  |  |  |  |  ------------------
  |  |  |  |  155|  4.82M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  |  |   13|  4.82M|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |  154|  5.17M|  for (; i < offsets.end##type; ++i) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (154:10): [True: 342k, False: 4.82M]
  |  |  |  |  ------------------
  |  |  |  |  155|  4.82M|    visitSlot<type>(base + offsets.fields[i]);
  |  |  ------------------
  ------------------
  157|  4.82M|#undef SLOT_TYPE
  158|  4.82M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_13GCPointerBaseEEEvPc:
  142|  3.94M|  void visitSlot(char *const slot) {
  143|  3.94M|    assert(
  144|  3.94M|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  3.94M|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  3.94M|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_17GCHermesValueBaseINS0_11HermesValueEEEEEvPc:
  142|  3.80k|  void visitSlot(char *const slot) {
  143|  3.80k|    assert(
  144|  3.80k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|  3.80k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|  3.80k|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_17GCHermesValueBaseINS0_13HermesValue32EEEEEvPc:
  142|   938k|  void visitSlot(char *const slot) {
  143|   938k|    assert(
  144|   938k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   938k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   938k|  }
HadesGC.cpp:_ZN6hermes2vm11SlotVisitorIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorE9visitSlotINS0_10GCSymbolIDEEEvPc:
  142|   342k|  void visitSlot(char *const slot) {
  143|   342k|    assert(
  144|   342k|        reinterpret_cast<uintptr_t>(slot) % alignof(T) == 0 &&
  145|   342k|        "Should be aligned to the same alignment as T");
  146|      0|    acceptor_.accept(*reinterpret_cast<T *>(slot));
  147|   342k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor10visitArrayIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorLb0EEEvRT_PcRKNS0_8Metadata9ArrayDataE:
   26|  1.07M|  visitArray(Acceptor &acceptor, char *base, const Metadata::ArrayData &array) {
   27|  1.07M|    using ArrayType = Metadata::ArrayData::ArrayType;
   28|  1.07M|    char *start = base + array.startOffset;
   29|       |    // Load the length, making sure all dependent writes have completed with
   30|       |    // memory_order_acquire.
   31|  1.07M|    const auto length = reinterpret_cast<AtomicIfConcurrentGC<std::uint32_t> *>(
   32|  1.07M|                            base + array.lengthOffset)
   33|  1.07M|                            ->load(std::memory_order_acquire);
   34|  1.07M|    const auto stride = array.stride;
   35|  1.07M|    switch (array.type) {
  ------------------
  |  Branch (35:13): [True: 0, False: 1.07M]
  ------------------
   36|      0|#define SLOT_TYPE(type)                          \
   37|      0|  case ArrayType::type:                          \
   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
   39|      0|        acceptor, start, length, stride);        \
   40|      0|    break;
   41|      0|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|      0|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |   37|      0|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 0, False: 1.07M]
  |  |  |  |  ------------------
  |  |  |  |   38|      0|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|      0|        acceptor, start, length, stride);        \
  |  |  |  |   40|      0|    break;
  |  |  ------------------
  |  |   11|  3.61k|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   37|  3.61k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 3.61k, False: 1.07M]
  |  |  |  |  ------------------
  |  |  |  |   38|  3.61k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  3.61k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  3.61k|    break;
  |  |  ------------------
  |  |   12|  1.04M|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   37|  1.04M|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 1.04M, False: 37.6k]
  |  |  |  |  ------------------
  |  |  |  |   38|  1.04M|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  1.04M|        acceptor, start, length, stride);        \
  |  |  |  |   40|  1.04M|    break;
  |  |  ------------------
  |  |   13|  34.0k|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   37|  34.0k|  case ArrayType::type:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (37:3): [True: 34.0k, False: 1.04M]
  |  |  |  |  ------------------
  |  |  |  |   38|  34.0k|    visitArrayObject<Acceptor, type, WithNames>( \
  |  |  |  |   39|  34.0k|        acceptor, start, length, stride);        \
  |  |  |  |   40|  34.0k|    break;
  |  |  ------------------
  ------------------
   42|  1.07M|#undef SLOT_TYPE
   43|  1.07M|    }
   44|  1.07M|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EEEvRT_Pcjm:
   83|  3.61k|      std::size_t stride) {
   84|  26.4k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 22.8k, False: 3.61k]
  ------------------
   85|  22.8k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  22.8k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  22.8k|      start += stride;
   88|  22.8k|    }
   89|  3.61k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_11HermesValueEEELb0EE4implERS4_RS7_j:
   65|  22.8k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  22.8k|      acceptor.accept(elem);
   67|  22.8k|    }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EEEvRT_Pcjm:
   83|  1.04M|      std::size_t stride) {
   84|  5.71M|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 4.66M, False: 1.04M]
  ------------------
   85|  4.66M|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|  4.66M|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|  4.66M|      start += stride;
   88|  4.66M|    }
   89|  1.04M|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_17GCHermesValueBaseINS0_13HermesValue32EEELb0EE4implERS4_RS7_j:
   65|  4.66M|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|  4.66M|      acceptor.accept(elem);
   67|  4.66M|    }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor16visitArrayObjectIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_10GCSymbolIDELb0EEEvRT_Pcjm:
   83|  34.0k|      std::size_t stride) {
   84|   477k|    for (std::uint32_t i = 0; i < length; ++i) {
  ------------------
  |  Branch (84:31): [True: 443k, False: 34.0k]
  ------------------
   85|   443k|      ArrayElementAccept<Acceptor, ElementType, WithNames>::impl(
   86|   443k|          acceptor, *reinterpret_cast<ElementType *>(start), i);
   87|   443k|      start += stride;
   88|   443k|    }
   89|  34.0k|  }
HadesGC.cpp:_ZN6hermes2vm11BaseVisitor18ArrayElementAcceptIZNS0_7HadesGC15verifyCardTableEvE23VerifyCardDirtyAcceptorNS0_10GCSymbolIDELb0EE4implERS4_RS5_j:
   65|   443k|    static void impl(Acceptor &acceptor, ElementType &elem, uint32_t) {
   66|   443k|      acceptor.accept(elem);
   67|   443k|    }

_ZN6hermes2vm13HermesValue327setInGCES1_RNS0_7HadesGCE:
   35|   485k|void HermesValue32::setInGC(HermesValue32 hv, GC &gc) {
   36|   485k|  setNoBarrier(hv);
   37|   485k|  assert(gc.calledByGC());
   38|   485k|}
_ZNK6hermes2vm13HermesValue329unboxToHVERNS0_11PointerBaseE:
   40|  1.34M|HermesValue HermesValue32::unboxToHV(PointerBase &pb) const {
   41|  1.34M|  switch (getETag()) {
   42|  52.9k|    case ETag::Object1:
  ------------------
  |  Branch (42:5): [True: 52.9k, False: 1.29M]
  ------------------
   43|   414k|    case ETag::Object2:
  ------------------
  |  Branch (43:5): [True: 361k, False: 984k]
  ------------------
   44|   414k|      return HermesValue::encodeObjectValue(getObject(pb));
   45|      0|    case ETag::BigInt1:
  ------------------
  |  Branch (45:5): [True: 0, False: 1.34M]
  ------------------
   46|      0|    case ETag::BigInt2:
  ------------------
  |  Branch (46:5): [True: 0, False: 1.34M]
  ------------------
   47|      0|      return HermesValue::encodeBigIntValue(getBigInt(pb));
   48|   320k|    case ETag::String1:
  ------------------
  |  Branch (48:5): [True: 320k, False: 1.02M]
  ------------------
   49|   526k|    case ETag::String2:
  ------------------
  |  Branch (49:5): [True: 206k, False: 1.13M]
  ------------------
   50|   526k|      return HermesValue::encodeStringValue(getString(pb));
   51|      0|    case ETag::BoxedDouble1:
  ------------------
  |  Branch (51:5): [True: 0, False: 1.34M]
  ------------------
   52|      0|    case ETag::BoxedDouble2:
  ------------------
  |  Branch (52:5): [True: 0, False: 1.34M]
  ------------------
   53|      0|      return HermesValue::encodeNumberValue(
   54|      0|          vmcast<BoxedDouble>(getPointer(pb))->get());
   55|   202k|    case ETag::SmallInt1:
  ------------------
  |  Branch (55:5): [True: 202k, False: 1.14M]
  ------------------
   56|   405k|    case ETag::SmallInt2:
  ------------------
  |  Branch (56:5): [True: 202k, False: 1.14M]
  ------------------
   57|   405k|      return HermesValue::encodeNumberValue(getSmallInt());
   58|      0|    case ETag::Symbol1:
  ------------------
  |  Branch (58:5): [True: 0, False: 1.34M]
  ------------------
   59|      0|    case ETag::Symbol2:
  ------------------
  |  Branch (59:5): [True: 0, False: 1.34M]
  ------------------
   60|      0|      return HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(getValue()));
   61|      0|    case ETag::Bool:
  ------------------
  |  Branch (61:5): [True: 0, False: 1.34M]
  ------------------
   62|      0|      return HermesValue::encodeBoolValue(getETagValue());
   63|      0|    case ETag::Undefined:
  ------------------
  |  Branch (63:5): [True: 0, False: 1.34M]
  ------------------
   64|      0|      return HermesValue::encodeUndefinedValue();
   65|      0|    case ETag::Empty:
  ------------------
  |  Branch (65:5): [True: 0, False: 1.34M]
  ------------------
   66|      0|      return HermesValue::encodeEmptyValue();
   67|      0|    case ETag::Null:
  ------------------
  |  Branch (67:5): [True: 0, False: 1.34M]
  ------------------
   68|      0|      return HermesValue::encodeNullValue();
   69|      0|    default:
  ------------------
  |  Branch (69:5): [True: 0, False: 1.34M]
  ------------------
   70|      0|      llvm_unreachable("No other tag");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   71|  1.34M|  }
   72|  1.34M|}
_ZNK6hermes2vm13HermesValue329getStringERNS0_11PointerBaseE:
   85|   649k|StringPrimitive *HermesValue32::getString(PointerBase &pb) const {
   86|   649k|  assert(isString());
   87|      0|  return vmcast<StringPrimitive>(getPointer(pb));
   88|   649k|}
_ZNK6hermes2vm13HermesValue329getNumberERNS0_11PointerBaseE:
   90|   499k|double HermesValue32::getNumber(PointerBase &pb) const {
   91|   499k|  assert(isNumber());
   92|   499k|  if (LLVM_LIKELY(getTag() == Tag::SmallInt))
  ------------------
  |  |  188|   499k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 499k, False: 0]
  |  |  ------------------
  ------------------
   93|   499k|    return getSmallInt();
   94|      0|  return vmcast<BoxedDouble>(getPointer(pb))->get();
   95|   499k|}
_ZN6hermes2vm13HermesValue3217encodeHermesValueENS0_11HermesValueERNS0_7RuntimeE:
   99|  1.97M|    Runtime &runtime) {
  100|       |#ifdef HERMESVM_SANITIZE_HANDLES
  101|       |  // When Handle-SAN is on, make a double so that this function always
  102|       |  // allocates. Note we can't do this for pointer values since they would get
  103|       |  // invalidated.
  104|       |  if (!hv.isPointer())
  105|       |    encodeNumberValue(0.0, runtime);
  106|       |#endif
  107|  1.97M|  switch (hv.getETag()) {
  108|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (108:5): [True: 0, False: 1.97M]
  ------------------
  109|      0|      return encodeEmptyValue();
  110|    200|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (110:5): [True: 200, False: 1.97M]
  ------------------
  111|    200|      return encodeUndefinedValue();
  112|  2.87k|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (112:5): [True: 2.87k, False: 1.96M]
  ------------------
  113|  2.87k|      return encodeNullValue();
  114|  2.06k|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (114:5): [True: 2.06k, False: 1.97M]
  ------------------
  115|  2.06k|      return encodeBoolValue(hv.getBool());
  116|    990|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (116:5): [True: 990, False: 1.97M]
  ------------------
  117|    990|      return encodeSymbolValue(hv.getSymbol());
  118|  1.17M|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (118:5): [True: 1.17M, False: 800k]
  ------------------
  119|  1.17M|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (119:5): [True: 0, False: 1.97M]
  ------------------
  120|  1.17M|      return encodeStringValue(hv.getString(), runtime);
  121|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (121:5): [True: 0, False: 1.97M]
  ------------------
  122|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (122:5): [True: 0, False: 1.97M]
  ------------------
  123|      0|      return encodeBigIntValue(hv.getBigInt(), runtime);
  124|  87.4k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (124:5): [True: 87.4k, False: 1.88M]
  ------------------
  125|  87.4k|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (125:5): [True: 0, False: 1.97M]
  ------------------
  126|  87.4k|      return encodeObjectValue(static_cast<GCCell *>(hv.getObject()), runtime);
  127|   706k|    default:
  ------------------
  |  Branch (127:5): [True: 706k, False: 1.26M]
  ------------------
  128|   706k|      assert(
  129|   706k|          hv.isNumber() && "Native values are forbidden in SmallHermesValue");
  130|      0|      return encodeNumberValue(hv.getNumber(), runtime);
  131|  1.97M|  }
  132|  1.97M|}
_ZN6hermes2vm13HermesValue3217encodeNumberValueEdRNS0_7RuntimeE:
  136|  2.08M|    Runtime &runtime) {
  137|       |  // Always box values when Handle-SAN is on so we can catch any mistakes.
  138|  2.08M|#ifndef HERMESVM_SANITIZE_HANDLES
  139|  2.08M|  const SmiType i = doubleToSmi(d);
  140|  2.08M|  if (LLVM_LIKELY(llvh::DoubleToBits(d) == llvh::DoubleToBits(i)))
  ------------------
  |  |  188|  2.08M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.08M, False: 1.79k]
  |  |  ------------------
  ------------------
  141|  2.08M|    return fromTagAndValue(Tag::SmallInt, i);
  142|  1.79k|#endif
  143|  1.79k|  return encodePointerImpl(
  144|  1.79k|      BoxedDouble::create(d, runtime), Tag::BoxedDouble, runtime);
  145|  2.08M|}
_ZN6hermes2vm13HermesValue3217encodeObjectValueEPNS0_6GCCellERNS0_11PointerBaseE:
  149|  88.5k|    PointerBase &pb) {
  150|  88.5k|  assert(
  151|  88.5k|      (!ptr || !vmisa<StringPrimitive>(ptr) || !vmisa<BigIntPrimitive>(ptr)) &&
  152|  88.5k|      "Strings must use encodeStringValue; BigInts, encodeBigIntValue");
  153|      0|  return encodePointerImpl(ptr, Tag::Object, pb);
  154|  88.5k|}

_ZNK6hermes2vm13HermesValue329getObjectERNS0_11PointerBaseE:
  388|  7.18M|  GCCell *getObject(PointerBase &pb) const {
  389|  7.18M|    assert(isObject());
  390|       |    // Since object pointers are the most common type, we have them as the
  391|       |    // zero-tag and can decode them without needing to remove the tag.
  392|      0|    static_assert(
  393|  7.18M|        static_cast<uint8_t>(Tag::Object) == 0,
  394|  7.18M|        "Object tag must be zero for fast path.");
  395|  7.18M|    return CompressedPointer::fromRaw(raw_).get(pb);
  396|  7.18M|  }
_ZNK6hermes2vm13HermesValue328isObjectEv:
  345|  7.18M|  bool isObject() const {
  346|  7.18M|    return getTag() == Tag::Object;
  347|  7.18M|  }
_ZNK6hermes2vm13HermesValue326getTagEv:
  286|  60.1M|  Tag getTag() const {
  287|  60.1M|    return static_cast<Tag>(
  288|  60.1M|        raw_ & llvh::maskTrailingOnes<RawType>(kNumTagBits));
  289|  60.1M|  }
_ZN6hermes2vm13HermesValue327fromRawEj:
  248|  7.76M|  static constexpr HermesValue32 fromRaw(RawType raw) {
  249|  7.76M|    return HermesValue32(raw);
  250|  7.76M|  }
_ZN6hermes2vm13HermesValue3215fromTagAndValueENS1_3TagEj:
  252|  2.08M|  static constexpr HermesValue32 fromTagAndValue(Tag tag, RawType value) {
  253|       |    // Only a small integer can have its top bits set (if it's negative).
  254|  2.08M|    assert(
  255|  2.08M|        (llvh::isUInt<kNumValueBits>(value) || tag == Tag::SmallInt) &&
  256|  2.08M|        "Value out of range.");
  257|      0|    return fromRaw((value << kNumTagBits) | static_cast<uint8_t>(tag));
  258|  2.08M|  }
_ZN6hermes2vm13HermesValue3216fromETagAndValueENS1_4ETagEj:
  259|  3.52M|  static constexpr HermesValue32 fromETagAndValue(ETag etag, RawType value) {
  260|  3.52M|    assert(
  261|  3.52M|        llvh::isUInt<kNumETagValueBits>(value) &&
  262|  3.52M|        "Value must fit in value bits.");
  263|      0|    assert(
  264|  3.52M|        static_cast<uint8_t>(etag) % kETagOffset >= kFirstExtendedTag &&
  265|  3.52M|        "Not an extended type.");
  266|      0|    return fromRaw((value << kNumETagBits) | static_cast<uint8_t>(etag));
  267|  3.52M|  }
_ZNK6hermes2vm13HermesValue328getValueEv:
  269|  8.89k|  RawType getValue() const {
  270|  8.89k|    assert(getTag() != Tag::SmallInt && "SMIs must use getSmallInt.");
  271|      0|    assert(
  272|  8.89k|        static_cast<uint8_t>(getTag()) < kFirstExtendedTag &&
  273|  8.89k|        "Values for ETags should use getETagValue.");
  274|      0|    return raw_ >> kNumTagBits;
  275|  8.89k|  }
_ZNK6hermes2vm13HermesValue3211getSmallIntEv:
  282|   904k|  SmiType getSmallInt() const {
  283|   904k|    assert(getTag() == Tag::SmallInt && "Must be a SMI.");
  284|      0|    return static_cast<SmiType>(raw_) >> kNumTagBits;
  285|   904k|  }
_ZNK6hermes2vm13HermesValue327getETagEv:
  290|  1.34M|  ETag getETag() const {
  291|  1.34M|    return static_cast<ETag>(
  292|  1.34M|        raw_ & llvh::maskTrailingOnes<RawType>(kNumETagBits));
  293|  1.34M|  }
_ZN6hermes2vm13HermesValue3215validatePointerEj:
  296|  2.15M|  static void validatePointer(RawType rawPtr) {
  297|  2.15M|    assert(llvh::countTrailingZeros(rawPtr) >= 3 && "Pointer low bits are set");
  298|  2.15M|  }
_ZN6hermes2vm13HermesValue32C2Ej:
  300|  7.76M|  constexpr explicit HermesValue32(RawType raw) : raw_(raw) {}
_ZN6hermes2vm13HermesValue3217encodePointerImplEPNS0_6GCCellENS1_3TagERNS0_11PointerBaseE:
  303|  1.66M|  encodePointerImpl(GCCell *ptr, Tag tag, PointerBase &pb) {
  304|  1.66M|    return encodePointerImpl(CompressedPointer::encodeNonNull(ptr, pb), tag);
  305|  1.66M|  }
_ZN6hermes2vm13HermesValue3217encodePointerImplENS0_17CompressedPointerENS1_3TagE:
  307|  2.15M|  static HermesValue32 encodePointerImpl(CompressedPointer ptr, Tag tag) {
  308|  2.15M|    RawType p = ptr.getRaw();
  309|  2.15M|    validatePointer(p);
  310|  2.15M|    return fromRaw(p | static_cast<RawType>(tag));
  311|  2.15M|  }
_ZN6hermes2vm13HermesValue3214truncateDoubleEd:
  314|  2.08M|      LLVM_NO_SANITIZE("float-cast-overflow") {
  315|  2.08M|    return d;
  316|  2.08M|  }
_ZZN6hermes2vm13HermesValue3211doubleToSmiEdENKUlT_E_clIdEEDaS2_:
  322|  2.08M|    return [](auto d) {
  323|  2.08M|      if constexpr (kNumSmiBits <= 32)
  ------------------
  |  Branch (323:21): [Folded - Ignored]
  ------------------
  324|  2.08M|        return llvh::SignExtend32<kNumSmiBits>(truncateDouble(d));
  325|  2.08M|      else
  326|  2.08M|        return llvh::SignExtend64<kNumSmiBits>(truncateDouble(d));
  327|  2.08M|    }(d);
_ZN6hermes2vm13HermesValue3211doubleToSmiEd:
  319|  2.08M|  static SmiType doubleToSmi(double d) {
  320|       |    // Use a generic lambda here so the inactive case of the if constexpr does
  321|       |    // not need to compile.
  322|  2.08M|    return [](auto d) {
  323|  2.08M|      if constexpr (kNumSmiBits <= 32)
  324|  2.08M|        return llvh::SignExtend32<kNumSmiBits>(truncateDouble(d));
  325|  2.08M|      else
  326|  2.08M|        return llvh::SignExtend64<kNumSmiBits>(truncateDouble(d));
  327|  2.08M|    }(d);
  328|  2.08M|  }
_ZNK6hermes2vm13HermesValue329isPointerEv:
  342|  48.0M|  bool isPointer() const {
  343|  48.0M|    return static_cast<uint8_t>(getTag()) <= kLastPointerTag;
  344|  48.0M|  }
_ZNK6hermes2vm13HermesValue328isStringEv:
  351|   649k|  bool isString() const {
  352|   649k|    return getTag() == Tag::String;
  353|   649k|  }
_ZNK6hermes2vm13HermesValue328isNumberEv:
  354|   499k|  bool isNumber() const {
  355|   499k|    Tag tag = getTag();
  356|   499k|    return tag == Tag::BoxedDouble || tag == Tag::SmallInt;
  ------------------
  |  Branch (356:12): [True: 0, False: 499k]
  |  Branch (356:39): [True: 499k, False: 0]
  ------------------
  357|   499k|  }
_ZNK6hermes2vm13HermesValue328isSymbolEv:
  358|  1.84M|  bool isSymbol() const {
  359|  1.84M|    return getTag() == Tag::Symbol;
  360|  1.84M|  }
_ZNK6hermes2vm13HermesValue327isEmptyEv:
  364|   197k|  bool isEmpty() const {
  365|   197k|    return raw_ == encodeEmptyValue().raw_;
  366|   197k|  }
_ZNK6hermes2vm13HermesValue3210getPointerERNS0_11PointerBaseE:
  384|  11.7M|  GCCell *getPointer(PointerBase &pb) const {
  385|  11.7M|    assert(isPointer());
  386|      0|    return getPointer().getNonNull(pb);
  387|  11.7M|  }
_ZNK6hermes2vm13HermesValue3210getPointerEv:
  402|  12.2M|  CompressedPointer getPointer() const {
  403|  12.2M|    assert(isPointer());
  404|      0|    RawType rawPtr = raw_ & llvh::maskLeadingOnes<RawType>(kNumValueBits);
  405|  12.2M|    return CompressedPointer::fromRaw(rawPtr);
  406|  12.2M|  }
_ZNK6hermes2vm13HermesValue329getSymbolEv:
  408|  8.89k|  SymbolID getSymbol() const {
  409|  8.89k|    assert(isSymbol());
  410|      0|    return SymbolID::unsafeCreate(getValue());
  411|  8.89k|  }
_ZNK6hermes2vm13HermesValue3213updatePointerENS0_17CompressedPointerE:
  425|   485k|  HermesValue32 updatePointer(CompressedPointer ptr) const {
  426|   485k|    assert(isPointer());
  427|      0|    return encodePointerImpl(ptr, getTag());
  428|   485k|  }
_ZN6hermes2vm13HermesValue3217encodeStringValueEPNS0_15StringPrimitiveERNS0_11PointerBaseE:
  456|  1.57M|      PointerBase &pb) {
  457|  1.57M|    return encodePointerImpl(reinterpret_cast<GCCell *>(ptr), Tag::String, pb);
  458|  1.57M|  }
_ZN6hermes2vm13HermesValue3217encodeSymbolValueENS0_8SymbolIDE:
  460|    990|  static HermesValue32 encodeSymbolValue(SymbolID s) {
  461|    990|    return fromTagAndValue(Tag::Symbol, s.unsafeGetRaw());
  462|    990|  }
_ZN6hermes2vm13HermesValue3215encodeBoolValueEb:
  463|  2.06k|  static constexpr HermesValue32 encodeBoolValue(bool b) {
  464|  2.06k|    return fromETagAndValue(ETag::Bool, b);
  465|  2.06k|  }
_ZN6hermes2vm13HermesValue3215encodeNullValueEv:
  466|  2.87k|  static constexpr HermesValue32 encodeNullValue() {
  467|  2.87k|    return fromETagAndValue(ETag::Null, 0);
  468|  2.87k|  }
_ZN6hermes2vm13HermesValue3220encodeUndefinedValueEv:
  469|  1.60M|  static constexpr HermesValue32 encodeUndefinedValue() {
  470|  1.60M|    return fromETagAndValue(ETag::Undefined, 0);
  471|  1.60M|  }
_ZN6hermes2vm13HermesValue3216encodeEmptyValueEv:
  472|  1.90M|  static constexpr HermesValue32 encodeEmptyValue() {
  473|  1.90M|    return fromETagAndValue(ETag::Empty, 0);
  474|  1.90M|  }
_ZN6hermes2vm13HermesValue3212setNoBarrierES1_:
  481|  4.64M|  inline void setNoBarrier(HermesValue32 other) {
  482|  4.64M|    raw_ = other.raw_;
  483|  4.64M|  }

_ZN6hermes2vm12SmallXStringIDsLj32EEC2Ev:
   29|  67.7k|  SmallXString() {}
_ZN6hermes2vm12SmallXStringIDsLj32EEC2EN4llvh9StringRefE:
   37|     99|      : Super(strRef.bytes_begin(), strRef.bytes_end()) {}
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendINS0_10StringView14const_iteratorEEERS2_T_S7_:
   73|     99|  SmallXString &append(in_iter start, in_iter end) {
   74|     99|    Super::append(start, end);
   75|     99|    return *this;
   76|     99|  }
_ZNK6hermes2vm12SmallXStringIDsLj32EE8arrayRefEv:
   78|    234|  llvh::ArrayRef<T> arrayRef() const {
   79|    234|    return llvh::ArrayRef<T>(Super::begin(), Super::end());
   80|    234|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEPKDs:
   49|     48|  SmallXString &append(const T *strz) {
   50|     48|    Super::append(strz, strz + std::char_traits<T>::length(strz));
   51|     48|    return *this;
   52|     48|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEN4llvh9StringRefE:
   55|     72|  SmallXString &append(llvh::StringRef strRef) {
   56|     72|    Super::append(strRef.bytes_begin(), strRef.bytes_end());
   57|     72|    return *this;
   58|     72|  }
_ZN6hermes2vm12SmallXStringIDsLj32EE6appendEDs:
   61|   871k|  SmallXString &append(T ch) {
   62|   871k|    Super::push_back(ch);
   63|   871k|    return *this;
   64|   871k|  }
_ZN6hermes2vm12SmallXStringIDsLj64EEC2Ev:
   29|     24|  SmallXString() {}

_ZNK6hermes2vm14StackFramePtrTILb0EE22getCalleeClosureUnsafeEv:
   17|  1.73k|inline Callable *StackFramePtrT<isConst>::getCalleeClosureUnsafe() const {
   18|  1.73k|  return vmcast<Callable>(getCalleeClosureOrCBRef());
   19|  1.73k|}
_ZNK6hermes2vm14StackFramePtrTILb0EE18getCalleeCodeBlockERNS0_7RuntimeE:
   29|     28|StackFramePtrT<isConst>::getCalleeCodeBlock(Runtime &runtime) const {
   30|     28|  auto &ref = getCalleeClosureOrCBRef();
   31|     28|  if (ref.isObject()) {
  ------------------
  |  Branch (31:7): [True: 28, False: 0]
  ------------------
   32|     28|    if (auto *func = dyn_vmcast<JSFunction>(ref))
  ------------------
  |  Branch (32:15): [True: 28, False: 0]
  ------------------
   33|     28|      return func->getCodeBlock(runtime);
   34|      0|    else
   35|      0|      return nullptr;
   36|     28|  } else {
   37|      0|    return ref.template getNativePointer<CodeBlock>();
   38|      0|  }
   39|     28|}

_ZN6hermes2vm14StackFramePtrTILb0EEC2Ev:
   50|   814k|  explicit StackFramePtrT() : frame_(nullptr) {}
_ZN6hermes2vm14StackFramePtrTILb0EE9initFrameEPNS0_17PinnedHermesValueES2_PKNS_4inst4InstEPKNS0_9CodeBlockEjNS0_11HermesValueESC_:
  226|   409k|      HermesValue newTarget) {
  227|   409k|    stackPointer[StackFrameLayout::PreviousFrame] =
  228|   409k|        HermesValue::encodeNativePointer(previousFrame.ptr());
  229|   409k|    stackPointer[StackFrameLayout::SavedIP] =
  230|   409k|        HermesValue::encodeNativePointer(savedIP);
  231|   409k|    stackPointer[StackFrameLayout::SavedCodeBlock] =
  232|   409k|        HermesValue::encodeNativePointer(savedCodeBlock);
  233|   409k|    stackPointer[StackFrameLayout::ArgCount] =
  234|   409k|        HermesValue::encodeNativeUInt32(argCount);
  235|   409k|    stackPointer[StackFrameLayout::NewTarget] = newTarget;
  236|   409k|    stackPointer[StackFrameLayout::CalleeClosureOrCB] = calleeClosureOrCB;
  237|       |
  238|   409k|    return StackFramePtrT<false>{stackPointer};
  239|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE3ptrEv:
   91|   819k|  QualifiedHV *ptr() const {
   92|   819k|    return frame_;
   93|   819k|  }
_ZN6hermes2vm14StackFramePtrTILb0EEC2EPNS0_17PinnedHermesValueE:
   53|  1.24M|  explicit StackFramePtrT(QualifiedHV *frame) : frame_(frame) {}
_ZNK6hermes2vm14StackFramePtrTILb0EE13getThisArgRefEv:
   97|  1.63M|  QualifiedHV &get##name##Ref() const {       \
   98|  1.63M|    return frame_[StackFrameLayout::name];    \
   99|  1.63M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE11getArgCountEv:
  161|  1.22M|  uint32_t getArgCount() const {
  162|  1.22M|    return getArgCountRef().getNativeUInt32();
  163|  1.22M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE14getArgCountRefEv:
   97|  1.22M|  QualifiedHV &get##name##Ref() const {       \
   98|  1.22M|    return frame_[StackFrameLayout::name];    \
   99|  1.22M|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE9argsBeginEv:
  193|  1.22M|  ArgIteratorT<isConst> argsBegin() const {
  194|  1.22M|    return ArgIteratorT<isConst>(&getThisArgRef());
  195|  1.22M|  }
_ZN6hermes2vm14StackFramePtrTILb0EEptEv:
   80|   407k|  StackFramePtrT *operator->() {
   81|   407k|    return this;
   82|   407k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE9getArgRefEi:
  200|   406k|  QualifiedHV &getArgRef(int32_t n) const {
  201|   406k|    assert(n >= -1 && n < (int64_t)getArgCount() && "invalid argument index");
  202|      0|    return argsBegin()[n];
  203|   406k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE10getSavedIPEv:
  129|   414k|  const Inst *getSavedIP() const {
  130|   414k|    return getSavedIPRef().template getNativePointer<const Inst>();
  131|   414k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE13getSavedIPRefEv:
   97|   823k|  QualifiedHV &get##name##Ref() const {       \
   98|   823k|    return frame_[StackFrameLayout::name];    \
   99|   823k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EEeqES2_:
   69|   409k|  bool operator==(StackFramePtrT o) const {
   70|   409k|    return frame_ == o.frame_;
   71|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE16getPreviousFrameEv:
  123|   409k|  StackFramePtrT<isConst> getPreviousFrame() const {
  124|   409k|    return StackFramePtrT<isConst>{getPreviousFramePointer()};
  125|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE23getPreviousFramePointerEv:
  118|   409k|  QualifiedHV *getPreviousFramePointer() const {
  119|   409k|    return getPreviousFrameRef().template getNativePointer<PinnedHermesValue>();
  120|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE19getPreviousFrameRefEv:
   97|   409k|  QualifiedHV &get##name##Ref() const {       \
   98|   409k|    return frame_[StackFrameLayout::name];    \
   99|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE13getNativeArgsEv:
  264|   408k|  NativeArgs getNativeArgs() const {
  265|   408k|    return NativeArgs{argsBegin(), getArgCount(), &getNewTargetRef()};
  266|   408k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE15getNewTargetRefEv:
   97|   409k|  QualifiedHV &get##name##Ref() const {       \
   98|   409k|    return frame_[StackFrameLayout::name];    \
   99|   409k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE23getCalleeClosureOrCBRefEv:
   97|  1.79k|  QualifiedHV &get##name##Ref() const {       \
   98|  1.79k|    return frame_[StackFrameLayout::name];    \
   99|  1.79k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE17isConstructorCallEv:
  188|  1.64k|  bool isConstructorCall() const {
  189|  1.64k|    return !getNewTargetRef().isUndefined();
  190|  1.64k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE16getFirstLocalRefEv:
   97|  3.28k|  QualifiedHV &get##name##Ref() const {       \
   98|  3.28k|    return frame_[StackFrameLayout::name];    \
   99|  3.28k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE15getArgRefUnsafeEi:
  207|  2.17k|  QualifiedHV &getArgRefUnsafe(int32_t n) const {
  208|  2.17k|    return argsBegin()[n];
  209|  2.17k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE17getSavedCodeBlockEv:
  135|  1.94k|  QualifiedCB *getSavedCodeBlock() const {
  136|  1.94k|    return getSavedCodeBlockRef().template getNativePointer<CodeBlock>();
  137|  1.94k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE20getSavedCodeBlockRefEv:
   97|  1.94k|  QualifiedHV &get##name##Ref() const {       \
   98|  1.94k|    return frame_[StackFrameLayout::name];    \
   99|  1.94k|  }
_ZNK6hermes2vm14StackFramePtrTILb0EE22getDebugEnvironmentRefEv:
   97|    452|  QualifiedHV &get##name##Ref() const {       \
   98|    452|    return frame_[StackFrameLayout::name];    \
   99|    452|  }
_ZN6hermes2vm14StackFramePtrTILb0EE9initFrameEPNS0_17PinnedHermesValueES2_PKNS_4inst4InstEPKNS0_9CodeBlockEjPNS0_8CallableEb:
  250|    283|      bool construct) {
  251|    283|    return initFrame(
  252|    283|        stackPointer,
  253|    283|        previousFrame,
  254|    283|        savedIP,
  255|    283|        savedCodeBlock,
  256|    283|        argCount,
  257|    283|        HermesValue::encodeObjectValue(calleeClosure),
  258|    283|        construct ? HermesValue::encodeObjectValue(calleeClosure)
  ------------------
  |  Branch (258:9): [True: 0, False: 283]
  ------------------
  259|    283|                  : HermesValue::encodeUndefinedValue());
  260|    283|  }
_ZN6hermes2vm19StackFrameIteratorTILb0EEC2ENS0_14StackFramePtrTILb0EEE:
  315|    403|  StackFrameIteratorT(StackFramePtrT<isConst> frame) : frame_(frame) {}
_ZN6hermes2vm19StackFrameIteratorTILb0EEC2EPNS0_17PinnedHermesValueE:
  313|    403|  StackFrameIteratorT(QualifiedHV *frame) : frame_(frame) {}
_ZNK6hermes2vm19StackFrameIteratorTILb0EEneES2_:
  332|    120|  bool operator!=(StackFrameIteratorT o) const {
  333|    120|    return frame_ != o.frame_;
  334|    120|  }
_ZN6hermes2vm19StackFrameIteratorTILb0EEppEv:
  336|     48|  StackFrameIteratorT &operator++() {
  337|     48|    frame_ = frame_.getPreviousFrame();
  338|     48|    return *this;
  339|     48|  }
_ZNK6hermes2vm19StackFrameIteratorTILb0EEdeEv:
  349|     72|  StackFramePtrT<isConst> operator*() const {
  350|     72|    return frame_;
  351|     72|  }
_ZNK6hermes2vm19StackFrameIteratorTILb0EEptEv:
  346|    307|  StackFramePtrT<isConst> operator->() const {
  347|    307|    return frame_;
  348|    307|  }
_ZNK6hermes2vm14StackFramePtrTILb0EEneES2_:
   73|    144|  bool operator!=(StackFramePtrT o) const {
   74|    144|    return frame_ != o.frame_;
   75|    144|  }

_ZN6hermes2vm15StorageProviderC2Ev:
   23|     99|  StorageProvider() = default;

_ZN6hermes2vm13StringBuilder19createStringBuilderERNS0_7RuntimeENS_10SafeUInt32Eb:
   45|   459k|      bool isASCII = false) {
   46|   459k|    if (length.isOverflowed()) {
  ------------------
  |  Branch (46:9): [True: 0, False: 459k]
  ------------------
   47|      0|      return runtime.raiseRangeError("String length exceeds limit");
   48|      0|    }
   49|   459k|    auto crtRes = StringPrimitive::create(runtime, *length, isASCII);
   50|   459k|    if (LLVM_UNLIKELY(crtRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   459k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 459k]
  |  |  ------------------
  ------------------
   51|      0|      return ExecutionStatus::EXCEPTION;
   52|      0|    }
   53|   459k|    return StringBuilder(runtime, crtRes->getString());
   54|   459k|  }
_ZN6hermes2vm13StringBuilder14appendUTF16RefEN4llvh8ArrayRefIDsEE:
   58|   486k|  void appendUTF16Ref(UTF16Ref str) {
   59|   486k|    assert(
   60|   486k|        index_ + str.size() <= strPrim_->getStringLength() &&
   61|   486k|        "StringBuilder append out of bound");
   62|   486k|    if (LLVM_UNLIKELY((*strPrim_)->isASCII())) {
  ------------------
  |  |  189|   486k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 486k]
  |  |  ------------------
  ------------------
   63|       |      // If we are appending a UTF16 string to an ASCII, we have to recreate
   64|       |      // the string. This can cause performance issues if misused.
   65|       |      // The allocation can fail in theory, but in practice, since we are
   66|       |      // dropping one string and replace it with another, this should be safe.
   67|      0|      auto strRes = runtime_->ignoreAllocationFailure(StringPrimitive::create(
   68|      0|          *runtime_, strPrim_->getStringLength(), /*asciiNotUTF16*/ false));
   69|      0|      auto currentPartialString =
   70|      0|          ASCIIRef(strPrim_->castToASCIIPointer(), index_);
   71|      0|      strPrim_ = strRes.getString();
   72|      0|      index_ = 0;
   73|      0|      appendASCIIRef(currentPartialString);
   74|      0|    }
   75|   486k|    std::copy(
   76|   486k|        str.data(),
   77|   486k|        str.data() + str.size(),
   78|   486k|        strPrim_->castToUTF16PointerForWrite() + index_);
   79|   486k|    index_ += str.size();
   80|   486k|  }
_ZN6hermes2vm13StringBuilder14appendASCIIRefEN4llvh8ArrayRefIcEE:
   82|   409k|  void appendASCIIRef(ASCIIRef ascii) {
   83|   409k|    assert(
   84|   409k|        index_ + ascii.size() <= strPrim_->getStringLength() &&
   85|   409k|        "StringBuilder append out of bound");
   86|   409k|    if (LLVM_LIKELY(strPrim_->isASCII())) {
  ------------------
  |  |  188|   409k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 49.0k, False: 360k]
  |  |  ------------------
  ------------------
   87|  49.0k|      std::copy(
   88|  49.0k|          ascii.data(),
   89|  49.0k|          ascii.data() + ascii.size(),
   90|  49.0k|          strPrim_->castToASCIIPointerForWrite() + index_);
   91|   360k|    } else {
   92|   360k|      std::copy(
   93|   360k|          ascii.data(),
   94|   360k|          ascii.data() + ascii.size(),
   95|   360k|          strPrim_->castToUTF16PointerForWrite() + index_);
   96|   360k|    }
   97|   409k|    index_ += ascii.size();
   98|   409k|  }
_ZN6hermes2vm13StringBuilder16appendStringPrimENS0_6HandleINS0_15StringPrimitiveEEEj:
  119|   436k|  void appendStringPrim(Handle<StringPrimitive> other, uint32_t length) {
  120|   436k|    assert(
  121|   436k|        index_ + length <= strPrim_->getStringLength() &&
  122|   436k|        "StringBuilder append out of bound");
  123|   436k|    if (other->isASCII()) {
  ------------------
  |  Branch (123:9): [True: 360k, False: 75.8k]
  ------------------
  124|   360k|      appendASCIIRef({other->castToASCIIPointer(), length});
  125|   360k|    } else if (!strPrim_->isASCII()) {
  ------------------
  |  Branch (125:16): [True: 75.8k, False: 0]
  ------------------
  126|  75.8k|      appendUTF16Ref({other->castToUTF16Pointer(), length});
  127|  75.8k|    } else {
  128|       |      // strPrim_ is ASCII, while other is UTF16. We have to recreate string.
  129|      0|      auto strRes = runtime_->ignoreAllocationFailure(StringPrimitive::create(
  130|      0|          *runtime_, strPrim_->getStringLength(), /*asciiNotUTF16*/ false));
  131|      0|      auto currentPartialString =
  132|      0|          ASCIIRef(strPrim_->castToASCIIPointer(), index_);
  133|       |      // Set strPrim_ to the newly created string.
  134|      0|      strPrim_ = strRes.getString();
  135|      0|      index_ = 0;
  136|       |      // Append original string and other.
  137|      0|      appendASCIIRef(currentPartialString);
  138|      0|      appendUTF16Ref({other->castToUTF16Pointer(), length});
  139|      0|    }
  140|   436k|  }
_ZN6hermes2vm13StringBuilder16appendStringPrimENS0_6HandleINS0_15StringPrimitiveEEE:
  143|   436k|  void appendStringPrim(Handle<StringPrimitive> other) {
  144|   436k|    return appendStringPrim(other, other->getStringLength());
  145|   436k|  }
_ZNK6hermes2vm13StringBuilder18getStringPrimitiveEv:
  148|   459k|  Handle<StringPrimitive> getStringPrimitive() const {
  149|   459k|    assert(
  150|   459k|        index_ == strPrim_->getStringLength() &&
  151|   459k|        "String content is not fully filled yet.");
  152|      0|    return Handle<StringPrimitive>::vmcast(strPrim_);
  153|   459k|  }
_ZN6hermes2vm13StringBuilderC2ERNS0_7RuntimeEPNS0_15StringPrimitiveE:
  157|   459k|      : strPrim_(runtime, strPrim), index_(0), runtime_(&runtime) {}

_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  924|   249k|    ASCIIRef str) {
  925|   249k|  static_assert(
  926|   249k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  927|   249k|      "External string threshold should be smaller than max string size.");
  928|   249k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|   249k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 249k, False: 0]
  |  |  ------------------
  ------------------
  929|   249k|    return DynamicASCIIStringPrimitive::create(runtime, str);
  930|   249k|  } else {
  931|      0|    return ExternalStringPrimitive<char>::create(runtime, arrayToString(str));
  932|      0|  }
  933|   249k|}
_ZN6hermes2vm15StringPrimitive16isExternalLengthEj:
  107|  1.95M|  static bool isExternalLength(uint32_t length) {
  108|  1.95M|    return length >= EXTERNAL_STRING_THRESHOLD;
  109|  1.95M|  }
_ZN6hermes2vm15StringPrimitive7classofEPKNS0_6GCCellE:
  142|  2.81M|  static bool classof(const GCCell *cell) {
  143|  2.81M|    return kindInRange(
  144|  2.81M|        cell->getKind(),
  145|  2.81M|        CellKind::StringPrimitiveKind_first,
  146|  2.81M|        CellKind::StringPrimitiveKind_last);
  147|  2.81M|  }
_ZNK6hermes2vm15StringPrimitive18castToASCIIPointerEv:
 1015|  1.34M|inline const char *StringPrimitive::castToASCIIPointer() const {
 1016|  1.34M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  1.34M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.34M]
  |  |  ------------------
  ------------------
 1017|      0|    return vmcast<ExternalASCIIStringPrimitive>(this)->getRawPointer();
 1018|  1.34M|  } else if (vmisa<DynamicUniquedASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1018:14): [True: 919k, False: 422k]
  ------------------
 1019|   919k|    return vmcast<DynamicUniquedASCIIStringPrimitive>(this)->getRawPointer();
 1020|   919k|  } else if (vmisa<DynamicASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1020:14): [True: 422k, False: 5]
  ------------------
 1021|   422k|    return vmcast<DynamicASCIIStringPrimitive>(this)->getRawPointer();
 1022|   422k|  } else {
 1023|      5|    return vmcast<BufferedASCIIStringPrimitive>(this)->getRawPointer();
 1024|      5|  }
 1025|  1.34M|}
_ZNK6hermes2vm15StringPrimitive10isExternalEv:
 1100|  3.41M|inline bool StringPrimitive::isExternal() const {
 1101|       |  // We require that external cell kinds be larger than dynamic cell kinds.
 1102|  3.41M|  static_assert(
 1103|  3.41M|      cellKindsContiguousAscending(
 1104|  3.41M|          CellKind::DynamicUTF16StringPrimitiveKind,
 1105|  3.41M|          CellKind::DynamicASCIIStringPrimitiveKind,
 1106|  3.41M|          CellKind::BufferedUTF16StringPrimitiveKind,
 1107|  3.41M|          CellKind::BufferedASCIIStringPrimitiveKind,
 1108|  3.41M|          CellKind::DynamicUniquedUTF16StringPrimitiveKind,
 1109|  3.41M|          CellKind::DynamicUniquedASCIIStringPrimitiveKind,
 1110|  3.41M|          CellKind::ExternalUTF16StringPrimitiveKind,
 1111|  3.41M|          CellKind::ExternalASCIIStringPrimitiveKind),
 1112|  3.41M|      "Cell kinds in unexpected order");
 1113|  3.41M|  return getKind() >= CellKind::ExternalUTF16StringPrimitiveKind;
 1114|  3.41M|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE7classofEPKNS0_6GCCellE:
  566|  1.43k|  static bool classof(const GCCell *cell) {
  567|  1.43k|    return cell->getKind() == ExternalStringPrimitive::getCellKind();
  568|  1.43k|  }
_ZN6hermes2vm23ExternalStringPrimitiveIcE11getCellKindEv:
  560|  1.56k|  static constexpr CellKind getCellKind() {
  561|  1.56k|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (561:12): [Folded - Ignored]
  ------------------
  562|  1.56k|        ? CellKind::ExternalUTF16StringPrimitiveKind
  563|  1.56k|        : CellKind::ExternalASCIIStringPrimitiveKind;
  564|  1.56k|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIcE13getRawPointerEv:
  606|      5|  const T *getRawPointer() const {
  607|       |    // C++11 defines this to be valid even if the string is empty.
  608|      5|    return &contents_[0];
  609|      5|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE7classofEPKNS0_6GCCellE:
  472|  2.31M|  static bool classof(const GCCell *cell) {
  473|  2.31M|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|  2.31M|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE11getCellKindEv:
  464|  2.52M|  static constexpr CellKind getCellKind() {
  465|  2.52M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  2.52M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|      0|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  2.52M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|  2.52M|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  2.52M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIcLb1EE13getRawPointerEv:
  515|   919k|  const T *getRawPointer() const {
  516|   919k|    return this->template getTrailingObjects<T>();
  517|   919k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE7classofEPKNS0_6GCCellE:
  472|   893k|  static bool classof(const GCCell *cell) {
  473|   893k|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|   893k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE11getCellKindEv:
  464|  1.51M|  static constexpr CellKind getCellKind() {
  465|  1.51M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  1.51M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|      0|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  1.51M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|  1.51M|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  1.51M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIcLb0EE13getRawPointerEv:
  515|   422k|  const T *getRawPointer() const {
  516|   422k|    return this->template getTrailingObjects<T>();
  517|   422k|  }
_ZN6hermes2vm23BufferedStringPrimitiveIcE7classofEPKNS0_6GCCellE:
  684|  2.01k|  static bool classof(const GCCell *cell) {
  685|  2.01k|    return cell->getKind() == BufferedStringPrimitive::getCellKind();
  686|  2.01k|  }
_ZN6hermes2vm23BufferedStringPrimitiveIcE11getCellKindEv:
  678|  3.44k|  static constexpr CellKind getCellKind() {
  679|  3.44k|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (679:12): [Folded - Ignored]
  ------------------
  680|  3.44k|        ? CellKind::BufferedUTF16StringPrimitiveKind
  681|  3.44k|        : CellKind::BufferedASCIIStringPrimitiveKind;
  682|  3.44k|  }
_ZNK6hermes2vm23BufferedStringPrimitiveIcE13getRawPointerEv:
  753|      5|  const T *getRawPointer() const {
  754|      5|    return getConcatBuffer()->getRawPointer();
  755|      5|  }
_ZNK6hermes2vm23BufferedStringPrimitiveIcE15getConcatBufferEv:
  760|  1.30k|  ExternalStringPrimitive<T> *getConcatBuffer() const {
  761|  1.30k|    return vmcast<ExternalStringPrimitive<T>>(concatBufferHV_);
  762|  1.30k|  }
_ZNK6hermes2vm15StringPrimitive18castToUTF16PointerEv:
 1027|  1.17M|inline const char16_t *StringPrimitive::castToUTF16Pointer() const {
 1028|  1.17M|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  1.17M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 985k, False: 186k]
  |  |  ------------------
  ------------------
 1029|   985k|    return vmcast<ExternalUTF16StringPrimitive>(this)->getRawPointer();
 1030|   985k|  } else if (vmisa<DynamicUniquedUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1030:14): [True: 20.9k, False: 165k]
  ------------------
 1031|  20.9k|    return vmcast<DynamicUniquedUTF16StringPrimitive>(this)->getRawPointer();
 1032|   165k|  } else if (vmisa<DynamicUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1032:14): [True: 165k, False: 0]
  ------------------
 1033|   165k|    return vmcast<DynamicUTF16StringPrimitive>(this)->getRawPointer();
 1034|   165k|  } else {
 1035|      0|    return vmcast<BufferedUTF16StringPrimitive>(this)->getRawPointer();
 1036|      0|  }
 1037|  1.17M|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE7classofEPKNS0_6GCCellE:
  566|  1.28M|  static bool classof(const GCCell *cell) {
  567|  1.28M|    return cell->getKind() == ExternalStringPrimitive::getCellKind();
  568|  1.28M|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsE11getCellKindEv:
  560|  1.28M|  static constexpr CellKind getCellKind() {
  561|  1.28M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (561:12): [Folded - Ignored]
  ------------------
  562|  1.28M|        ? CellKind::ExternalUTF16StringPrimitiveKind
  563|  1.28M|        : CellKind::ExternalASCIIStringPrimitiveKind;
  564|  1.28M|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIDsE13getRawPointerEv:
  606|   985k|  const T *getRawPointer() const {
  607|       |    // C++11 defines this to be valid even if the string is empty.
  608|   985k|    return &contents_[0];
  609|   985k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE7classofEPKNS0_6GCCellE:
  472|   752k|  static bool classof(const GCCell *cell) {
  473|   752k|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|   752k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE11getCellKindEv:
  464|   752k|  static constexpr CellKind getCellKind() {
  465|   752k|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|   752k|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|   752k|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|   752k|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|      0|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|   752k|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIDsLb1EE13getRawPointerEv:
  515|  20.9k|  const T *getRawPointer() const {
  516|  20.9k|    return this->template getTrailingObjects<T>();
  517|  20.9k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE7classofEPKNS0_6GCCellE:
  472|   875k|  static bool classof(const GCCell *cell) {
  473|   875k|    return cell->getKind() == DynamicStringPrimitive::getCellKind();
  474|   875k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE11getCellKindEv:
  464|  1.72M|  static constexpr CellKind getCellKind() {
  465|  1.72M|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (465:12): [Folded - Ignored]
  ------------------
  466|  1.72M|        ? (Uniqued ? CellKind::DynamicUniquedUTF16StringPrimitiveKind
  ------------------
  |  Branch (466:12): [Folded - Ignored]
  ------------------
  467|  1.72M|                   : CellKind::DynamicUTF16StringPrimitiveKind)
  468|  1.72M|        : (Uniqued ? CellKind::DynamicUniquedASCIIStringPrimitiveKind
  ------------------
  |  Branch (468:12): [Folded - Ignored]
  ------------------
  469|      0|                   : CellKind::DynamicASCIIStringPrimitiveKind);
  470|  1.72M|  }
_ZNK6hermes2vm22DynamicStringPrimitiveIDsLb0EE13getRawPointerEv:
  515|   165k|  const T *getRawPointer() const {
  516|   165k|    return this->template getTrailingObjects<T>();
  517|   165k|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsE7classofEPKNS0_6GCCellE:
  684|    466|  static bool classof(const GCCell *cell) {
  685|    466|    return cell->getKind() == BufferedStringPrimitive::getCellKind();
  686|    466|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsE11getCellKindEv:
  678|    790|  static constexpr CellKind getCellKind() {
  679|    790|    return std::is_same<T, char16_t>::value
  ------------------
  |  Branch (679:12): [Folded - Ignored]
  ------------------
  680|    790|        ? CellKind::BufferedUTF16StringPrimitiveKind
  681|    790|        : CellKind::BufferedASCIIStringPrimitiveKind;
  682|    790|  }
_ZNK6hermes2vm23BufferedStringPrimitiveIDsE15getConcatBufferEv:
  760|    304|  ExternalStringPrimitive<T> *getConcatBuffer() const {
  761|    304|    return vmcast<ExternalStringPrimitive<T>>(concatBufferHV_);
  762|    304|  }
_ZN6hermes2vm15StringPrimitiveC2Ej:
  102|   840k|  explicit StringPrimitive(uint32_t length) : lengthAndUniquedFlag_(length) {}
_ZNK6hermes2vm15StringPrimitive15getStringLengthEv:
  225|  5.71M|  uint32_t getStringLength() const {
  226|  5.71M|    return lengthAndUniquedFlag_ & ~LENGTH_FLAG_UNIQUED;
  227|  5.71M|  }
_ZNK6hermes2vm15StringPrimitive9isUniquedEv:
  230|   622k|  bool isUniqued() const {
  231|   622k|    return (lengthAndUniquedFlag_ & LENGTH_FLAG_UNIQUED) != 0;
  232|   622k|  }
_ZN6hermes2vm15StringPrimitive10ensureFlatERNS0_7RuntimeENS0_6HandleIS1_EE:
  270|   788k|      Handle<StringPrimitive> self) {
  271|       |    // In the future, ensureFlat may trigger GC as it might allocate for
  272|       |    // ropes. Move the heap here.
  273|   788k|    runtime.potentiallyMoveHeap();
  274|   788k|    return self;
  275|       |    // TODO: Deal with different subclasses (e.g. rope)
  276|   788k|  }
_ZNK6hermes2vm15StringPrimitive6isFlatEv:
  279|   276k|  bool isFlat() const {
  280|   276k|    return true;
  281|   276k|  }
_ZNK6hermes2vm15StringPrimitive14castToUTF16RefEjj:
  335|    122|  UTF16Ref castToUTF16Ref(uint32_t start, uint32_t length) const {
  336|    122|    return UTF16Ref(castToUTF16Pointer() + start, length);
  337|    122|  }
_ZNK6hermes2vm15StringPrimitive14castToASCIIRefEjj:
  340|   455k|  ASCIIRef castToASCIIRef(uint32_t start, uint32_t length) const {
  341|   455k|    return ASCIIRef(castToASCIIPointer() + start, length);
  342|   455k|  }
_ZNK6hermes2vm15StringPrimitive14castToUTF16RefEv:
  344|    122|  UTF16Ref castToUTF16Ref() const {
  345|    122|    return castToUTF16Ref(0, getStringLength());
  346|    122|  }
_ZNK6hermes2vm15StringPrimitive14castToASCIIRefEv:
  348|   455k|  ASCIIRef castToASCIIRef() const {
  349|   455k|    return castToASCIIRef(0, getStringLength());
  350|   455k|  }
_ZN6hermes2vm15StringPrimitive15clearUniquedBitEv:
  371|    273|  void clearUniquedBit() {
  372|    273|    lengthAndUniquedFlag_ &= ~LENGTH_FLAG_UNIQUED;
  373|    273|  }
_ZN6hermes2vm21SymbolStringPrimitive7classofEPKNS0_6GCCellE:
  398|   210k|  static bool classof(const GCCell *cell) {
  399|   210k|    static_assert(
  400|   210k|        cellKindsContiguousAscending(
  401|   210k|            CellKind::DynamicUniquedUTF16StringPrimitiveKind,
  402|   210k|            CellKind::DynamicUniquedASCIIStringPrimitiveKind,
  403|   210k|            CellKind::ExternalUTF16StringPrimitiveKind,
  404|   210k|            CellKind::ExternalASCIIStringPrimitiveKind),
  405|   210k|        "Unexpected CellKind ordering");
  406|   210k|    return kindInRange(
  407|   210k|        cell->getKind(),
  408|   210k|        CellKind::DynamicUniquedUTF16StringPrimitiveKind,
  409|   210k|        CellKind::ExternalASCIIStringPrimitiveKind);
  410|   210k|  }
_ZN6hermes2vm21SymbolStringPrimitive14updateUniqueIDENS0_8SymbolIDE:
  417|   105k|  void updateUniqueID(SymbolID id) {
  418|   105k|    assert(isUniqued() && "StringPrimitive is not uniqued");
  419|      0|    weakUniqueID_ = id;
  420|   105k|  }
_ZNK6hermes2vm21SymbolStringPrimitive11getUniqueIDEv:
  423|    288|  SymbolID getUniqueID() const {
  424|    288|    assert(isUniqued() && "StringPrimitive is not uniqued");
  425|      0|    return weakUniqueID_;
  426|    288|  }
_ZN6hermes2vm25isBufferedStringPrimitiveEPKNS0_6GCCellE:
  777|    141|inline bool isBufferedStringPrimitive(const GCCell *cell) {
  778|    141|  return cell->getKind() == CellKind::BufferedUTF16StringPrimitiveKind ||
  ------------------
  |  Branch (778:10): [True: 0, False: 141]
  ------------------
  779|    141|      cell->getKind() == CellKind::BufferedASCIIStringPrimitiveKind;
  ------------------
  |  Branch (779:7): [True: 0, False: 141]
  ------------------
  780|    141|}
_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEjb:
  903|   459k|StringPrimitive::create(Runtime &runtime, uint32_t length, bool asciiNotUTF16) {
  904|   459k|  static_assert(
  905|   459k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  906|   459k|      "External string threshold should be smaller than max string size.");
  907|   459k|  if (LLVM_LIKELY(!isExternalLength(length))) {
  ------------------
  |  |  188|   459k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 459k, False: 18]
  |  |  ------------------
  ------------------
  908|   459k|    if (asciiNotUTF16) {
  ------------------
  |  Branch (908:9): [True: 49.0k, False: 410k]
  ------------------
  909|  49.0k|      return DynamicASCIIStringPrimitive::create(runtime, length);
  910|   410k|    } else {
  911|   410k|      return DynamicUTF16StringPrimitive::create(runtime, length);
  912|   410k|    }
  913|   459k|  } else {
  914|     18|    if (asciiNotUTF16) {
  ------------------
  |  Branch (914:9): [True: 0, False: 18]
  ------------------
  915|      0|      return ExternalStringPrimitive<char>::create(runtime, length);
  916|     18|    } else {
  917|     18|      return ExternalStringPrimitive<char16_t>::create(runtime, length);
  918|     18|    }
  919|     18|  }
  920|   459k|}
_ZN6hermes2vm15StringPrimitive6createERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  937|    419|    UTF16Ref str) {
  938|    419|  static_assert(
  939|    419|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  940|    419|      "External string threshold should be smaller than max string size.");
  941|    419|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|    419|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 399, False: 20]
  |  |  ------------------
  ------------------
  942|    399|    return createDynamic(runtime, str);
  943|    399|  } else {
  944|     20|    return ExternalStringPrimitive<char16_t>::create(
  945|     20|        runtime, arrayToString(str));
  946|     20|  }
  947|    419|}
_ZN6hermes2vm15StringPrimitive15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  966|  12.6k|    ASCIIRef str) {
  967|  12.6k|  static_assert(
  968|  12.6k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  969|  12.6k|      "External string threshold should be smaller than max string size.");
  970|  12.6k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|  12.6k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 12.6k, False: 0]
  |  |  ------------------
  ------------------
  971|  12.6k|    return DynamicASCIIStringPrimitive::createLongLived(runtime, str);
  972|  12.6k|  } else {
  973|      0|    return ExternalStringPrimitive<char>::createLongLived(
  974|      0|        runtime, arrayToString(str));
  975|      0|  }
  976|  12.6k|}
_ZN6hermes2vm15StringPrimitive15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  980|  12.6k|    UTF16Ref str) {
  981|  12.6k|  static_assert(
  982|  12.6k|      EXTERNAL_STRING_THRESHOLD < MAX_STRING_LENGTH,
  983|  12.6k|      "External string threshold should be smaller than max string size.");
  984|  12.6k|  if (LLVM_LIKELY(!isExternalLength(str.size()))) {
  ------------------
  |  |  188|  12.6k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 12.6k, False: 0]
  |  |  ------------------
  ------------------
  985|  12.6k|    return DynamicUTF16StringPrimitive::createLongLived(runtime, str);
  986|  12.6k|  } else {
  987|      0|    return ExternalStringPrimitive<char16_t>::createLongLived(
  988|      0|        runtime, arrayToString(str));
  989|      0|  }
  990|  12.6k|}
_ZNK6hermes2vm15StringPrimitive12canBeUniquedEv:
  992|   105k|inline bool StringPrimitive::canBeUniqued() const {
  993|   105k|  return vmisa<SymbolStringPrimitive>(this);
  994|   105k|}
_ZN6hermes2vm15StringPrimitive16convertToUniquedENS0_8SymbolIDE:
  996|   105k|inline void StringPrimitive::convertToUniqued(hermes::vm::SymbolID uniqueID) {
  997|   105k|  assert(canBeUniqued() && "StringPrimitive cannot be uniqued");
  998|      0|  assert(!isUniqued() && "StringPrimitive is already uniqued");
  999|      0|  assert(
 1000|   105k|      uniqueID.isValid() && uniqueID.isUniqued() &&
 1001|   105k|      "uniqueID SymbolID is not valid and uniqued");
 1002|      0|  this->lengthAndUniquedFlag_ |= LENGTH_FLAG_UNIQUED;
 1003|   105k|  vmcast<SymbolStringPrimitive>(this)->updateUniqueID(uniqueID);
 1004|   105k|}
_ZNK6hermes2vm15StringPrimitive13castToPointerIcEEPKT_v:
 1007|  70.9k|inline const char *StringPrimitive::castToPointer<char>() const {
 1008|  70.9k|  return castToASCIIPointer();
 1009|  70.9k|}
_ZN6hermes2vm15StringPrimitive26castToASCIIPointerForWriteEv:
 1039|  49.5k|inline char *StringPrimitive::castToASCIIPointerForWrite() {
 1040|  49.5k|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|  49.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 49.5k]
  |  |  ------------------
  ------------------
 1041|      0|    return vmcast<ExternalASCIIStringPrimitive>(this)->getRawPointerForWrite();
 1042|  49.5k|  } else if (vmisa<DynamicUniquedASCIIStringPrimitive>(this)) {
  ------------------
  |  Branch (1042:14): [True: 0, False: 49.5k]
  ------------------
 1043|      0|    return vmcast<DynamicUniquedASCIIStringPrimitive>(this)
 1044|      0|        ->getRawPointerForWrite();
 1045|  49.5k|  } else {
 1046|  49.5k|    return vmcast<DynamicASCIIStringPrimitive>(this)->getRawPointerForWrite();
 1047|  49.5k|  }
 1048|  49.5k|}
_ZN6hermes2vm15StringPrimitive26castToUTF16PointerForWriteEv:
 1050|   846k|inline char16_t *StringPrimitive::castToUTF16PointerForWrite() {
 1051|   846k|  if (LLVM_UNLIKELY(isExternal())) {
  ------------------
  |  |  189|   846k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 301k, False: 544k]
  |  |  ------------------
  ------------------
 1052|   301k|    return vmcast<ExternalUTF16StringPrimitive>(this)->getRawPointerForWrite();
 1053|   544k|  } else if (vmisa<DynamicUniquedUTF16StringPrimitive>(this)) {
  ------------------
  |  Branch (1053:14): [True: 0, False: 544k]
  ------------------
 1054|      0|    return vmcast<DynamicUniquedUTF16StringPrimitive>(this)
 1055|      0|        ->getRawPointerForWrite();
 1056|   544k|  } else {
 1057|   544k|    return vmcast<DynamicUTF16StringPrimitive>(this)->getRawPointerForWrite();
 1058|   544k|  }
 1059|   846k|}
_ZNK6hermes2vm15StringPrimitive11getUniqueIDEv:
 1061|    288|inline SymbolID StringPrimitive::getUniqueID() const {
 1062|    288|  assert(this->isUniqued() && "StringPrimitive is not uniqued");
 1063|      0|  return vmcast<SymbolStringPrimitive>(this)->getUniqueID();
 1064|    288|}
_ZNK6hermes2vm15StringPrimitive7isASCIIEv:
 1075|  3.65M|inline bool StringPrimitive::isASCII() const {
 1076|       |  // Abstractly, we're doing the following test:
 1077|       |  // return getKind() == CellKind::DynamicASCIIStringPrimitiveKind ||
 1078|       |  //        getKind() == CellKind::DynamicUniquedASCIIStringPrimitiveKind ||
 1079|       |  //        getKind() == CellKind::ExternalASCIIStringPrimitiveKind;
 1080|       |  // We speed this up by making the assumption that the string primitive kinds
 1081|       |  // are defined consecutively, alternating between ASCII and UTF16.
 1082|       |  // We statically enforce this:
 1083|  3.65M|  static_assert(
 1084|  3.65M|      cellKindsContiguousAscending(
 1085|  3.65M|          CellKind::DynamicUTF16StringPrimitiveKind,
 1086|  3.65M|          CellKind::DynamicASCIIStringPrimitiveKind,
 1087|  3.65M|          CellKind::BufferedUTF16StringPrimitiveKind,
 1088|  3.65M|          CellKind::BufferedASCIIStringPrimitiveKind,
 1089|  3.65M|          CellKind::DynamicUniquedUTF16StringPrimitiveKind,
 1090|  3.65M|          CellKind::DynamicUniquedASCIIStringPrimitiveKind,
 1091|  3.65M|          CellKind::ExternalUTF16StringPrimitiveKind,
 1092|  3.65M|          CellKind::ExternalASCIIStringPrimitiveKind),
 1093|  3.65M|      "Cell kinds in unexpected order");
 1094|       |  // Given this assumption, the ASCII versions are either both odd or both
 1095|       |  // even.
 1096|  3.65M|  return (static_cast<uint32_t>(getKind()) & 1u) ==
 1097|  3.65M|      (static_cast<uint32_t>(CellKind::DynamicASCIIStringPrimitiveKind) & 1u);
 1098|  3.65M|}
_ZN6hermes2vm15StringPrimitive13arrayToStringIDsEENSt3__112basic_stringIT_NS3_11char_traitsIS5_EENS3_9allocatorIS5_EEEEN4llvh8ArrayRefIS5_EE:
   83|     20|  static std::basic_string<CharT> arrayToString(llvh::ArrayRef<CharT> arr) {
   84|     20|    return std::basic_string<CharT>{arr.begin(), arr.end()};
   85|     20|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE21getRawPointerForWriteEv:
  523|   105k|  T *getRawPointerForWrite() {
  524|   105k|    return this->template getTrailingObjects<T>();
  525|   105k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE21getRawPointerForWriteEv:
  523|  49.5k|  T *getRawPointerForWrite() {
  524|  49.5k|    return this->template getTrailingObjects<T>();
  525|  49.5k|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsE21getRawPointerForWriteEv:
  615|   301k|  T *getRawPointerForWrite() {
  616|       |    // C++11 defines this to be valid even if the string is empty.
  617|   301k|    return &contents_[0];
  618|   301k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE21getRawPointerForWriteEv:
  523|    132|  T *getRawPointerForWrite() {
  524|    132|    return this->template getTrailingObjects<T>();
  525|    132|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE21getRawPointerForWriteEv:
  523|   544k|  T *getRawPointerForWrite() {
  524|   544k|    return this->template getTrailingObjects<T>();
  525|   544k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EEC2Ej:
  483|   105k|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|   105k|    assert(!isExternalLength(length) && "length should not be external");
  485|   105k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb1EE14allocationSizeEj:
  507|   105k|  static uint32_t allocationSize(uint32_t length) {
  508|       |    // In the future it would be better to have the GC return a new size
  509|       |    // instead of having the caller decide.
  510|   105k|    return std::max(
  511|   105k|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|   105k|        static_cast<size_t>(GC::minAllocationSize()));
  513|   105k|  }
_ZNK6hermes2vm15StringPrimitive12getStringRefIcEEN4llvh8ArrayRefIT_EEv:
  307|  70.9k|  llvh::ArrayRef<T> getStringRef() const {
  308|  70.9k|    return llvh::ArrayRef<T>{castToPointer<T>(), getStringLength()};
  309|  70.9k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EEC2Ej:
  483|    132|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|    132|    assert(!isExternalLength(length) && "length should not be external");
  485|    132|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb1EE14allocationSizeEj:
  507|    132|  static uint32_t allocationSize(uint32_t length) {
  508|       |    // In the future it would be better to have the GC return a new size
  509|       |    // instead of having the caller decide.
  510|    132|    return std::max(
  511|    132|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|    132|        static_cast<size_t>(GC::minAllocationSize()));
  513|    132|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EEC2Ej:
  483|   311k|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|   311k|    assert(!isExternalLength(length) && "length should not be external");
  485|   311k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE14allocationSizeEj:
  507|   311k|  static uint32_t allocationSize(uint32_t length) {
  508|       |    // In the future it would be better to have the GC return a new size
  509|       |    // instead of having the caller decide.
  510|   311k|    return std::max(
  511|   311k|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|   311k|        static_cast<size_t>(GC::minAllocationSize()));
  513|   311k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EEC2Ej:
  483|   423k|      : OptSymbolStringPrimitive<Uniqued>(length) {
  484|   423k|    assert(!isExternalLength(length) && "length should not be external");
  485|   423k|  }
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE14allocationSizeEj:
  507|   423k|  static uint32_t allocationSize(uint32_t length) {
  508|       |    // In the future it would be better to have the GC return a new size
  509|       |    // instead of having the caller decide.
  510|   423k|    return std::max(
  511|   423k|        DynamicStringPrimitive::template totalSizeToAlloc<T>(length),
  512|   423k|        static_cast<size_t>(GC::minAllocationSize()));
  513|   423k|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIDsE22calcExternalMemorySizeEv:
  573|    426|  size_t calcExternalMemorySize() const {
  574|    426|    return contents_.capacity() * sizeof(T);
  575|    426|  }
_ZNK6hermes2vm23ExternalStringPrimitiveIcE22calcExternalMemorySizeEv:
  573|  1.43k|  size_t calcExternalMemorySize() const {
  574|  1.43k|    return contents_.capacity() * sizeof(T);
  575|  1.43k|  }
_ZN6hermes2vm23BufferedStringPrimitiveIDsEC2ERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEE:
  706|    162|      : StringPrimitive(length) {
  707|    162|    concatBufferHV_.set(
  708|    162|        HermesValue::encodeObjectValue(*concatBuffer), runtime.getHeap());
  709|    162|    assert(
  710|    162|        concatBuffer->contents_.size() >= length &&
  711|    162|        "length exceeds size of concatenation buffer");
  712|    162|  }
_ZN6hermes2vm23BufferedStringPrimitiveIcEC2ERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEE:
  706|    711|      : StringPrimitive(length) {
  707|    711|    concatBufferHV_.set(
  708|    711|        HermesValue::encodeObjectValue(*concatBuffer), runtime.getHeap());
  709|    711|    assert(
  710|    711|        concatBuffer->contents_.size() >= length &&
  711|    711|        "length exceeds size of concatenation buffer");
  712|    711|  }
_ZN6hermes2vm23ExternalStringPrimitiveIDsED2Ev:
  585|     61|  ~ExternalStringPrimitive() = default;
_ZN6hermes2vm23ExternalStringPrimitiveIcED2Ev:
  585|     65|  ~ExternalStringPrimitive() = default;

_ZN6hermes2vm15stringRefEqualsIccEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|   140k|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|   140k|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 1.46k, False: 139k]
  ------------------
   42|  1.46k|    return false;
   43|  1.46k|  }
   44|   139k|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|   140k|}
_ZN6hermes2vm15stringRefEqualsIDscEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|     44|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|     44|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 44, False: 0]
  ------------------
   42|     44|    return false;
   43|     44|  }
   44|      0|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|     44|}
_ZN6hermes2vm15stringRefEqualsIcDsEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|    275|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|    275|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 44, False: 231]
  ------------------
   42|     44|    return false;
   43|     44|  }
   44|    231|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|    275|}
_ZN6hermes2vm15stringRefEqualsIDsDsEEbN4llvh8ArrayRefIT_EENS3_IT0_EE:
   40|     13|bool stringRefEquals(llvh::ArrayRef<T1> str1, llvh::ArrayRef<T2> str2) {
   41|     13|  if (str1.size() != str2.size()) {
  ------------------
  |  Branch (41:7): [True: 3, False: 10]
  ------------------
   42|      3|    return false;
   43|      3|  }
   44|     10|  return std::equal(str1.begin(), str1.end(), str2.begin());
   45|     13|}

_ZNK6hermes2vm10StringView11getUTF16RefERN4llvh15SmallVectorImplIDsEE:
  330|  67.1k|  UTF16Ref getUTF16Ref(llvh::SmallVectorImpl<char16_t> &allocator) const {
  331|  67.1k|    assert(allocator.empty() && "Shouldn't use a non-empty allocator");
  332|      0|    return getUTF16Ref(allocator, false);
  333|  67.1k|  }
_ZN6hermes2vm10StringViewD2Ev:
  242|   946k|  ~StringView() {
  243|   946k|    if (isHandle_)
  ------------------
  |  Branch (243:9): [True: 892k, False: 54.2k]
  ------------------
  244|   892k|      strPrim().~Handle<StringPrimitive>();
  245|   946k|  }
_ZN6hermes2vm10StringView7strPrimEv:
  421|   892k|  Handle<StringPrimitive> &strPrim() {
  422|   892k|    assert(isHandle_ && "must be a handle");
  423|       |    // Need to go through a variable to placate gcc4.9.
  424|      0|    char *buffer = strPrim_.buffer;
  425|   892k|    return *reinterpret_cast<Handle<StringPrimitive> *>(buffer);
  426|   892k|  }
_ZN6hermes2vm10StringViewC2ERKS1_:
  225|   111k|  StringView(const StringView &other) {
  226|   111k|    ::memcpy(this, &other, sizeof(*this));
  227|   111k|    if (isHandle_)
  ------------------
  |  Branch (227:9): [True: 95.7k, False: 15.8k]
  ------------------
  228|  95.7k|      new (strPrim_.buffer) Handle<StringPrimitive>(other.strPrim());
  229|   111k|  }
_ZNK6hermes2vm10StringView7strPrimEv:
  427|  1.11M|  const Handle<StringPrimitive> &strPrim() const {
  428|  1.11M|    assert(isHandle_ && "must be a handle");
  429|       |    // Need to go through a variable to placate gcc4.9.
  430|      0|    const char *buffer = strPrim_.buffer;
  431|  1.11M|    return *reinterpret_cast<const Handle<StringPrimitive> *>(buffer);
  432|  1.11M|  }
_ZNK6hermes2vm10StringViewcvNS0_11TwineChar16EEv:
  385|     20|  operator TwineChar16() const {
  386|     20|    return toTwine();
  387|     20|  }
_ZNK6hermes2vm10StringView7toTwineEv:
  378|     20|  TwineChar16 toTwine() const {
  379|     20|    if (isASCII()) {
  ------------------
  |  Branch (379:9): [True: 20, False: 0]
  ------------------
  380|     20|      return TwineChar16(llvh::StringRef(castToCharPtr(), length()));
  381|     20|    }
  382|      0|    return TwineChar16(UTF16Ref(castToChar16Ptr(), length()));
  383|     20|  }
_ZNK6hermes2vm10StringView7isASCIIEv:
  290|  2.12M|  bool isASCII() const {
  291|  2.12M|    return isASCII_;
  292|  2.12M|  }
_ZNK6hermes2vm10StringView13castToCharPtrEv:
  342|   372k|  const char *castToCharPtr() const {
  343|   372k|    assert(isASCII() && "Cannot cast char16_t pointer to char pointer");
  344|   372k|    if (!isHandle_) {
  ------------------
  |  Branch (344:9): [True: 38.1k, False: 334k]
  ------------------
  345|  38.1k|      return static_cast<const char *>(nonManagedStringPtr_) + startIndex_;
  346|  38.1k|    }
  347|   334k|    assert(isHandle_ && "StringView does not contain a valid string");
  348|      0|    return (*strPrim())->castToASCIIPointer() + startIndex_;
  349|   372k|  }
_ZNK6hermes2vm10StringView6lengthEv:
  280|  1.19M|  size_t length() const {
  281|  1.19M|    return length_;
  282|  1.19M|  }
_ZNK6hermes2vm10StringView15castToChar16PtrEv:
  352|   685k|  const char16_t *castToChar16Ptr() const {
  353|   685k|    assert(!isASCII() && "Cannot cast char pointer to char16 pointer");
  354|   685k|    if (!isHandle_) {
  ------------------
  |  Branch (354:9): [True: 222, False: 685k]
  ------------------
  355|    222|      return static_cast<const char16_t *>(nonManagedStringPtr_) + startIndex_;
  356|    222|    }
  357|   685k|    assert(isHandle_ && "StringView does not contain a valid string");
  358|      0|    return (*strPrim())->castToUTF16Pointer() + startIndex_;
  359|   685k|  }
_ZN6hermes2vm10StringView14const_iteratorC2EPKcPKDs:
   85|   442k|        : charPtr_(charPtr), char16Ptr_(char16Ptr) {
   86|   442k|      assert(
   87|   442k|          ((!charPtr_) ^ (!char16Ptr_)) &&
   88|   442k|          "Must provide one of char or char16 pointer");
   89|   442k|    }
_ZN6hermes2vm10StringView14const_iteratorC2EPKc:
   91|  1.82k|    explicit const_iterator(const char *ptr) : const_iterator(ptr, nullptr) {}
_ZN6hermes2vm10StringView14const_iteratorC2EPKDs:
   94|   330k|        : const_iterator(nullptr, ptr) {}
_ZN6hermes2vm10StringView14const_iteratorppEv:
  109|  16.0M|    const_iterator &operator++() {
  110|  16.0M|      if (charPtr_) {
  ------------------
  |  Branch (110:11): [True: 891, False: 16.0M]
  ------------------
  111|    891|        ++charPtr_;
  112|  16.0M|      } else {
  113|  16.0M|        ++char16Ptr_;
  114|  16.0M|      }
  115|  16.0M|      return *this;
  116|  16.0M|    }
_ZNK6hermes2vm10StringView14const_iteratormiERKS2_:
  160|   165k|    difference_type operator-(const const_iterator &rhs) const {
  161|   165k|      if (charPtr_) {
  ------------------
  |  Branch (161:11): [True: 565, False: 164k]
  ------------------
  162|    565|        return charPtr_ - rhs.charPtr_;
  163|    565|      }
  164|   164k|      return char16Ptr_ - rhs.char16Ptr_;
  165|   165k|    }
_ZNK6hermes2vm10StringView14const_iteratormiEl:
  167|  55.4k|    const_iterator operator-(difference_type rhs) const {
  168|  55.4k|      if (charPtr_) {
  ------------------
  |  Branch (168:11): [True: 466, False: 54.9k]
  ------------------
  169|    466|        return const_iterator(charPtr_ - rhs, char16Ptr_);
  170|    466|      }
  171|  54.9k|      return const_iterator(charPtr_, char16Ptr_ - rhs);
  172|  55.4k|    }
_ZNK6hermes2vm10StringView14const_iteratorplEl:
  173|  54.9k|    const_iterator operator+(difference_type rhs) const {
  174|  54.9k|      if (charPtr_) {
  ------------------
  |  Branch (174:11): [True: 0, False: 54.9k]
  ------------------
  175|      0|        return const_iterator(charPtr_ + rhs, char16Ptr_);
  176|      0|      }
  177|  54.9k|      return const_iterator(charPtr_, char16Ptr_ + rhs);
  178|  54.9k|    }
_ZNK6hermes2vm10StringView14const_iteratordeEv:
  182|  28.7M|    char16_t operator*() const {
  183|  28.7M|      return charPtr_ ? *charPtr_ : *char16Ptr_;
  ------------------
  |  Branch (183:14): [True: 2.05k, False: 28.7M]
  ------------------
  184|  28.7M|    }
_ZNK6hermes2vm10StringView14const_iteratoreqERKS2_:
  187|  15.2M|    bool operator==(const const_iterator &rhs) const {
  188|  15.2M|      if (charPtr_) {
  ------------------
  |  Branch (188:11): [True: 2.15k, False: 15.2M]
  ------------------
  189|  2.15k|        return charPtr_ == rhs.charPtr_;
  190|  2.15k|      }
  191|  15.2M|      return char16Ptr_ == rhs.char16Ptr_;
  192|  15.2M|    }
_ZNK6hermes2vm10StringView14const_iteratorneERKS2_:
  193|  1.51M|    bool operator!=(const const_iterator &rhs) const {
  194|  1.51M|      return !(*this == rhs);
  195|  1.51M|    }
_ZNK6hermes2vm10StringView5beginEv:
  254|   166k|  const_iterator begin() const {
  255|   166k|    if (isASCII()) {
  ------------------
  |  Branch (255:9): [True: 1.02k, False: 165k]
  ------------------
  256|  1.02k|      return const_iterator(castToCharPtr());
  257|  1.02k|    }
  258|   165k|    return const_iterator(castToChar16Ptr());
  259|   166k|  }
_ZNK6hermes2vm10StringView3endEv:
  262|   165k|  const_iterator end() const {
  263|   165k|    if (isASCII()) {
  ------------------
  |  Branch (263:9): [True: 796, False: 165k]
  ------------------
  264|    796|      return const_iterator(castToCharPtr() + length_);
  265|    796|    }
  266|   165k|    return const_iterator(castToChar16Ptr() + length_);
  267|   165k|  }
_ZNK6hermes2vm10StringViewixEj:
  295|    726|  char16_t operator[](uint32_t index) const {
  296|    726|    assert(index < length_ && "Out of bound indexing");
  297|    726|    if (isASCII()) {
  ------------------
  |  Branch (297:9): [True: 693, False: 33]
  ------------------
  298|    693|      return castToCharPtr()[index];
  299|    693|    }
  300|     33|    return castToChar16Ptr()[index];
  301|    726|  }
_ZNK6hermes2vm10StringView5sliceEjj:
  305|  55.2k|  StringView slice(uint32_t start, uint32_t length) const {
  306|  55.2k|    assert(start + length <= length_ && "Out of bound slicing");
  307|      0|    auto newStringView = *this;
  308|  55.2k|    newStringView.startIndex_ += start;
  309|  55.2k|    newStringView.length_ = length;
  310|  55.2k|    return newStringView;
  311|  55.2k|  }
_ZNK6hermes2vm10StringView5sliceEj:
  315|  54.9k|  StringView slice(uint32_t start) const {
  316|  54.9k|    assert(start <= length_ && "Out of bound slicing");
  317|      0|    return slice(start, length_ - start);
  318|  54.9k|  }
_ZNK6hermes2vm10StringView5sliceENS1_14const_iteratorES2_:
  321|    244|  StringView slice(const_iterator first, const_iterator last) const {
  322|    244|    return slice(first - begin(), last - first);
  323|    244|  }
_ZNK6hermes2vm10StringView6equalsERKS1_:
  362|    976|  bool equals(const StringView &other) const {
  363|    976|    if (other.isASCII()) {
  ------------------
  |  Branch (363:9): [True: 976, False: 0]
  ------------------
  364|    976|      return equals(ASCIIRef(other.castToCharPtr(), other.length()));
  365|    976|    }
  366|      0|    return equals(UTF16Ref(other.castToChar16Ptr(), other.length()));
  367|    976|  }
_ZN6hermes2vm10StringViewC2ENS0_6HandleINS0_15StringPrimitiveEEE:
  398|   796k|        length_(str->getStringLength()) {
  399|   796k|    new (strPrim_.buffer) Handle<StringPrimitive>(str);
  400|   796k|  }
_ZN6hermes2vm10StringViewC2EN4llvh8ArrayRefIcEE:
  408|  38.0k|        length_(asciiRef.size()) {}
_ZN6hermes2vm10StringViewC2EN4llvh8ArrayRefIDsEE:
  414|    222|        length_(utf16Ref.size()) {}
_ZNK6hermes2vm10StringView6equalsIcEEbRKN4llvh8ArrayRefIT_EE:
  371|  1.90k|  bool equals(const llvh::ArrayRef<T> &other) const {
  372|  1.90k|    if (isASCII()) {
  ------------------
  |  Branch (372:9): [True: 1.86k, False: 44]
  ------------------
  373|  1.86k|      return stringRefEquals(ASCIIRef(castToCharPtr(), length()), other);
  374|  1.86k|    }
  375|     44|    return stringRefEquals(UTF16Ref(castToChar16Ptr(), length()), other);
  376|  1.90k|  }
_ZNK6hermes2vm10StringView6equalsIDsEEbRKN4llvh8ArrayRefIT_EE:
  371|    278|  bool equals(const llvh::ArrayRef<T> &other) const {
  372|    278|    if (isASCII()) {
  ------------------
  |  Branch (372:9): [True: 275, False: 3]
  ------------------
  373|    275|      return stringRefEquals(ASCIIRef(castToCharPtr(), length()), other);
  374|    275|    }
  375|      3|    return stringRefEquals(UTF16Ref(castToChar16Ptr(), length()), other);
  376|    278|  }

_ZN6hermes2vm10GCSymbolID3setENS0_8SymbolIDERNS0_7HadesGCE:
   18|   228k|inline GCSymbolID &GCSymbolID::set(SymbolID sym, GC &gc) {
   19|   228k|  gc.snapshotWriteBarrier(this);
   20|   228k|  id_ = sym.unsafeGetRaw();
   21|   228k|  return *this;
   22|   228k|}

_ZN6hermes2vm8SymbolID12unsafeCreateEj:
  115|  2.57M|  static constexpr SymbolID unsafeCreate(RawType id) {
  116|  2.57M|    assert(id <= LAST_INVALID_ID && "ID outside valid range");
  117|      0|    return SymbolID{id};
  118|  2.57M|  }
_ZN6hermes2vm8SymbolIDC2Ej:
  149|  4.94M|  explicit constexpr SymbolID(RawType id) : id_(id) {}
_ZNK6hermes2vm8SymbolIDeqES1_:
  103|  5.35M|  bool operator==(SymbolID sym) const {
  104|  5.35M|    return id_ == sym.id_;
  105|  5.35M|  }
_ZN6hermes2vm8SymbolID22unsafeCreateNotUniquedEj:
  141|  9.94k|  static constexpr SymbolID unsafeCreateNotUniqued(uint32_t index) {
  142|  9.94k|    assert(index <= LAST_INDEX && "Index outside valid range");
  143|      0|    return SymbolID{index | NOT_UNIQUED_MASK};
  144|  9.94k|  }
_ZNK6hermes2vm8SymbolID12unsafeGetRawEv:
   81|  10.3M|  RawType unsafeGetRaw() const {
   82|  10.3M|    return id_;
   83|  10.3M|  }
_ZN6hermes2vm8SymbolIDC2Ev:
   65|   609k|  constexpr SymbolID() : id_(EMPTY_ID) {}
_ZNK6hermes2vm8SymbolID14unsafeGetIndexEv:
   74|  2.81M|  constexpr uint32_t unsafeGetIndex() const {
   75|  2.81M|    return id_ & (VALUE_MASK >> 1);
   76|  2.81M|  }
_ZNK6hermes2vm8SymbolID7isValidEv:
   85|  4.35M|  bool isValid() const {
   86|  4.35M|    return id_ < FIRST_INVALID_ID;
   87|  4.35M|  }
_ZNK6hermes2vm8SymbolID9isInvalidEv:
   88|   776k|  bool isInvalid() const {
   89|   776k|    return id_ >= FIRST_INVALID_ID;
   90|   776k|  }
_ZNK6hermes2vm8SymbolID12isNotUniquedEv:
   94|   139k|  constexpr bool isNotUniqued() const {
   95|   139k|    return id_ & NOT_UNIQUED_MASK;
   96|   139k|  }
_ZNK6hermes2vm8SymbolID9isUniquedEv:
   99|   139k|  constexpr bool isUniqued() const {
  100|   139k|    return !isNotUniqued();
  101|   139k|  }
_ZNK6hermes2vm8SymbolIDneES1_:
  106|  56.8k|  bool operator!=(SymbolID sym) const {
  107|  56.8k|    return id_ != sym.id_;
  108|  56.8k|  }
_ZN6hermes2vm8SymbolID5emptyEv:
  125|   828k|  static constexpr SymbolID empty() {
  126|   828k|    return SymbolID{EMPTY_ID};
  127|   828k|  }
_ZN6hermes2vm8SymbolID7deletedEv:
  130|  1.53M|  static constexpr SymbolID deleted() {
  131|  1.53M|    return SymbolID{DELETED_ID};
  132|  1.53M|  }
_ZN6hermes2vm10GCSymbolIDC2ENS0_8SymbolIDE:
  161|   297k|  explicit GCSymbolID(SymbolID id) : SymbolID(id) {}
_ZN6hermes2vm12RootSymbolIDC2Ev:
  177|     99|  constexpr RootSymbolID() : SymbolID() {}
_ZN6hermes2vm12RootSymbolIDC2ENS0_8SymbolIDE:
  179|  9.23k|  explicit RootSymbolID(SymbolID id) : SymbolID(id) {}

_ZN6hermes2vm14SymbolRegistryC2Ev:
   53|     99|  explicit SymbolRegistry() {}

_ZN6hermes2vm11TwineChar16C2EPKc:
  121|     52|  TwineChar16(const char *str) : TwineChar16(llvh::StringRef(str)) {}
_ZN6hermes2vm11TwineChar16C2EN4llvh9StringRefE:
  125|     72|      : rightKind_(EmptyKind), leftSize_(str.size()), rightSize_(0) {
  126|     72|    if (str.size() == 0) {
  ------------------
  |  Branch (126:9): [True: 0, False: 72]
  ------------------
  127|      0|      leftKind_ = EmptyKind;
  128|     72|    } else {
  129|     72|      leftChild_.charStr = str.begin();
  130|     72|      leftKind_ = CharStrKind;
  131|     72|    }
  132|     72|    assert(isValid());
  133|     72|  }
_ZNK6hermes2vm11TwineChar167isValidEv:
  364|    440|  inline bool isValid() const {
  365|       |    // Right side never gets assigned null, only the left does.
  366|    440|    if (rightKind_ == NullKind) {
  ------------------
  |  Branch (366:9): [True: 0, False: 440]
  ------------------
  367|      0|      fprintf(stderr, "null right\n");
  368|      0|      return false;
  369|      0|    }
  370|       |
  371|       |    // Nullary strings must have an empty right side.
  372|    440|    if (isNullary() && rightKind_ != EmptyKind) {
  ------------------
  |  Branch (372:9): [True: 0, False: 440]
  |  Branch (372:24): [True: 0, False: 0]
  ------------------
  373|      0|      fprintf(stderr, "nullary with nonempty right\n");
  374|      0|      return false;
  375|      0|    }
  376|       |
  377|       |    // If the left side is empty, then it have anything on the right.
  378|    440|    if (leftKind_ == EmptyKind && rightKind_ != EmptyKind) {
  ------------------
  |  Branch (378:9): [True: 0, False: 440]
  |  Branch (378:35): [True: 0, False: 0]
  ------------------
  379|      0|      fprintf(stderr, "left empty, right not\n");
  380|      0|      return false;
  381|      0|    }
  382|       |
  383|       |    // If twines are stored as children, they should be binary.
  384|    440|    if ((leftKind_ == TwineKind && !leftChild_.twine->isBinary()) ||
  ------------------
  |  Branch (384:10): [True: 92, False: 348]
  |  Branch (384:36): [True: 0, False: 92]
  ------------------
  385|    440|        (rightKind_ == TwineKind && !rightChild_.twine->isBinary())) {
  ------------------
  |  Branch (385:10): [True: 0, False: 440]
  |  Branch (385:37): [True: 0, False: 0]
  ------------------
  386|      0|      fprintf(stderr, "non-binary twine child\n");
  387|      0|      return false;
  388|      0|    }
  389|       |
  390|    440|    return true;
  391|    440|  }
_ZNK6hermes2vm11TwineChar169isNullaryEv:
  349|    544|  inline bool isNullary() const {
  350|    544|    return isNull() || isEmpty();
  ------------------
  |  Branch (350:12): [True: 0, False: 544]
  |  Branch (350:24): [True: 0, False: 544]
  ------------------
  351|    544|  }
_ZNK6hermes2vm11TwineChar166isNullEv:
  339|    648|  inline bool isNull() const {
  340|    648|    return leftKind_ == NullKind;
  341|    648|  }
_ZNK6hermes2vm11TwineChar167isEmptyEv:
  344|    648|  inline bool isEmpty() const {
  345|    648|    return leftKind_ == EmptyKind;
  346|    648|  }
_ZNK6hermes2vm11TwineChar168isBinaryEv:
  359|     92|  inline bool isBinary() const {
  360|     92|    return leftKind_ != NullKind && rightKind_ != EmptyKind;
  ------------------
  |  Branch (360:12): [True: 92, False: 0]
  |  Branch (360:37): [True: 92, False: 0]
  ------------------
  361|     92|  }
_ZN6hermes2vmplERKNS0_11TwineChar16ES3_:
  436|     52|    const TwineChar16 &right) {
  437|     52|  return left.concat(right);
  438|     52|}
_ZNK6hermes2vm11TwineChar166concatERKS1_:
  394|     52|inline TwineChar16 TwineChar16::concat(const TwineChar16 &other) const {
  395|     52|  assert(isValid());
  396|      0|  assert(other.isValid());
  397|     52|  if (isNull() || other.isNull()) {
  ------------------
  |  Branch (397:7): [True: 0, False: 52]
  |  Branch (397:19): [True: 0, False: 52]
  ------------------
  398|      0|    return TwineChar16::createNull();
  399|      0|  }
  400|       |
  401|       |  // If one of the strings is empty, just return the other one.
  402|     52|  if (isEmpty()) {
  ------------------
  |  Branch (402:7): [True: 0, False: 52]
  ------------------
  403|      0|    return other;
  404|      0|  }
  405|     52|  if (other.isEmpty()) {
  ------------------
  |  Branch (405:7): [True: 0, False: 52]
  ------------------
  406|      0|    return *this;
  407|      0|  }
  408|       |
  409|       |  // Make a new twine, with two twine children.
  410|     52|  Node newLeft;
  411|     52|  newLeft.twine = this;
  412|     52|  NodeKind newLeftKind = TwineKind;
  413|     52|  size_t leftLen = size();
  414|       |
  415|     52|  Node newRight;
  416|     52|  newRight.twine = &other;
  417|     52|  NodeKind newRightKind = TwineKind;
  418|     52|  size_t rightLen = other.size();
  419|       |
  420|       |  // If either of the operands are unary, promote their left children.
  421|     52|  if (isUnary()) {
  ------------------
  |  Branch (421:7): [True: 24, False: 28]
  ------------------
  422|     24|    newLeft = leftChild_;
  423|     24|    newLeftKind = leftKind_;
  424|     24|  }
  425|     52|  if (other.isUnary()) {
  ------------------
  |  Branch (425:7): [True: 52, False: 0]
  ------------------
  426|     52|    newRight = other.leftChild_;
  427|     52|    newRightKind = other.leftKind_;
  428|     52|  }
  429|       |
  430|     52|  return TwineChar16(
  431|     52|      newLeft, newLeftKind, leftLen, newRight, newRightKind, rightLen);
  432|     52|}
_ZNK6hermes2vm11TwineChar164sizeEv:
  274|    156|  inline size_t size() const {
  275|    156|    assert(isValid());
  276|      0|    return leftSize_ + rightSize_;
  277|    156|  }
_ZNK6hermes2vm11TwineChar167isUnaryEv:
  354|    104|  inline bool isUnary() const {
  355|    104|    return !isNullary() && rightKind_ == EmptyKind;
  ------------------
  |  Branch (355:12): [True: 104, False: 0]
  |  Branch (355:28): [True: 76, False: 28]
  ------------------
  356|    104|  }
_ZN6hermes2vm11TwineChar16C2ENS1_4NodeENS1_8NodeKindEmS2_S3_m:
  331|     52|        rightSize_(rightLen) {
  332|     52|    assert(isValid());
  333|     52|  }
_ZN6hermes2vm11TwineChar16C2EN4llvh8ArrayRefIDsEE:
  154|      4|        rightSize_(0) {
  155|      4|    leftChild_.char16Str = str.begin();
  156|      4|    assert(isValid());
  157|      4|  }

_ZNK6hermes2vm11PropOpFlags16plusThrowOnErrorEv:
   60|  3.23k|  Self plus##name() const {         \
   61|  3.23k|    auto r(*this);                  \
   62|  3.23k|    r.f##name##_ = true;            \
   63|  3.23k|    return r;                       \
   64|  3.23k|  }                                 \
_ZNK6hermes2vm11PropOpFlags13plusMustExistEv:
   60|     20|  Self plus##name() const {         \
   61|     20|    auto r(*this);                  \
   62|     20|    r.f##name##_ = true;            \
   63|     20|    return r;                       \
   64|     20|  }                                 \
_ZNK6hermes2vm11PropOpFlags12getMustExistEv:
   75|   414k|  bool get##name() const {          \
   76|   414k|    return f##name##_;              \
   77|   414k|  }

_ZNK6hermes2vm6VTable7isValidEv:
  218|  39.3M|  bool isValid() const {
  219|  39.3M|    return magic_ == kMagic && isSizeHeapAligned(size) &&
  ------------------
  |  Branch (219:12): [True: 39.3M, False: 18.4E]
  |  Branch (219:32): [True: 39.3M, False: 18.4E]
  ------------------
  220|  39.3M|        kindInRange(
  ------------------
  |  Branch (220:9): [True: 39.3M, False: 1.57k]
  ------------------
  221|  39.3M|               kind, CellKind::AllCellsKind_first, CellKind::AllCellsKind_last);
  222|  39.3M|  }
_ZN6hermes2vm6VTable9getVTableENS0_8CellKindE:
  142|  11.0M|  static const VTable *getVTable(CellKind c) {
  143|  11.0M|    return vtableArray[static_cast<size_t>(c)];
  144|  11.0M|  }
_ZNK6hermes2vm6VTable16finalizeIfExistsEPNS0_6GCCellERNS0_7HadesGCE:
  178|   616k|  void finalizeIfExists(GCCell *cell, GC &gc) const {
  179|   616k|    assert(isValid());
  180|   616k|    if (finalize_) {
  ------------------
  |  Branch (180:9): [True: 57.1k, False: 559k]
  ------------------
  181|  57.1k|      finalize_(cell, gc);
  182|  57.1k|    }
  183|   616k|  }
_ZNK6hermes2vm6VTable8finalizeEPNS0_6GCCellERNS0_7HadesGCE:
  185|    606|  void finalize(GCCell *cell, GC &gc) const {
  186|    606|    assert(isValid());
  187|      0|    assert(
  188|    606|        finalize_ &&
  189|    606|        "Cannot unconditionally finalize if it doesn't have a finalize pointer");
  190|      0|    finalize_(cell, gc);
  191|    606|  }
_ZNK6hermes2vm6VTable19getMarkWeakCallbackEv:
  193|  6.45M|  MarkWeakCallback *getMarkWeakCallback() const {
  194|  6.45M|    assert(isValid());
  195|      0|    return markWeak_;
  196|  6.45M|  }
_ZNK6hermes2vm6VTable14getTrimmedSizeEPNS0_6GCCellEm:
  205|   329k|  gcheapsize_t getTrimmedSize(GCCell *cell, size_t origSize) const {
  206|   329k|    const size_t trimmedSize =
  207|   329k|        trimSize_ ? heapAlignSize(trimSize_(cell)) : origSize;
  ------------------
  |  Branch (207:9): [True: 69.7k, False: 259k]
  ------------------
  208|   329k|    assert(
  209|   329k|        isValid() && trimmedSize <= origSize &&
  210|   329k|        "Growing objects is not supported.");
  211|      0|    return trimmedSize;
  212|   329k|  }

_ZN6hermes2vm11WeakRefBaseC2EPNS0_11WeakRefSlotE:
   28|   115k|  WeakRefBase(WeakRefSlot *slot) : slot_(slot) {}
_ZNK6hermes2vm11WeakRefBase7isValidEv:
   32|   180k|  bool isValid() const {
   33|   180k|    return isSlotValid(slot_);
   34|   180k|  }
_ZN6hermes2vm11WeakRefBase11isSlotValidEPKNS0_11WeakRefSlotE:
   37|   180k|  static bool isSlotValid(const WeakRefSlot *slot) {
   38|   180k|    assert(slot && "slot must not be null");
   39|      0|    return slot->hasValue();
   40|   180k|  }
_ZN6hermes2vm11WeakRefBase13unsafeGetSlotEv:
   44|   503k|  WeakRefSlot *unsafeGetSlot() {
   45|   503k|    return slot_;
   46|   503k|  }
_ZNK6hermes2vm7WeakRefINS0_11HiddenClassEE3getERNS0_7RuntimeE:
   91|   113k|  T *get(Runtime &runtime) const {
   92|   113k|    if (!isValid()) {
  ------------------
  |  Branch (92:9): [True: 0, False: 113k]
  ------------------
   93|      0|      return nullptr;
   94|      0|    }
   95|   113k|    GCCell *value = slot_->get(runtime, runtime.getHeap());
   96|   113k|    return static_cast<T *>(value);
   97|   113k|  }
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2ERNS0_7RuntimeENS0_6HandleIS2_EE:
   62|  58.1k|      : WeakRef(runtime, runtime.getHeap(), *handle) {}
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2ERNS0_11PointerBaseERNS0_7HadesGCEPS2_:
   65|  58.1k|      : WeakRefBase(gc.allocWeakSlot(CompressedPointer::encode(ptr, base))) {}
_ZN6hermes2vm7WeakRefINS0_11HiddenClassEEC2EPNS0_11WeakRefSlotE:
   72|  56.9k|  explicit WeakRef(WeakRefSlot *slot) : WeakRefBase(slot) {}

_ZNK6hermes2vm11WeakRefSlot3getERNS0_11PointerBaseERNS0_7HadesGCE:
   17|   113k|GCCell *WeakRefSlot::get(PointerBase &base, GC &gc) const {
   18|       |  // Cannot check state() here because it can race with marking code.
   19|   113k|  assert(hasValue() && "tried to access collected referent");
   20|      0|  return value_.root.getNonNull(base, gc);
   21|   113k|}

_ZN6hermes2vm11WeakRefSlotC2ENS0_17CompressedPointerE:
   35|  58.1k|  WeakRefSlot(CompressedPointer ptr) {
   36|  58.1k|    reset(ptr);
   37|  58.1k|  }
_ZNK6hermes2vm11WeakRefSlot8hasValueEv:
   40|  1.14M|  bool hasValue() const {
   41|       |    // This assert should be predicated on kConcurrentGC being false, because it
   42|       |    // is not safe to access the state in a concurrent GC
   43|  1.14M|    assert(
   44|  1.14M|        (kConcurrentGC || (state_ != Free)) &&
   45|  1.14M|        "Should never query a free WeakRef");
   46|      0|    return value_.root != CompressedPointer(nullptr);
   47|  1.14M|  }
_ZNK6hermes2vm11WeakRefSlot18getNoBarrierUnsafeERNS0_11PointerBaseE:
   53|   422k|  GCCell *getNoBarrierUnsafe(PointerBase &base) const {
   54|       |    // Cannot check state() here because it can race with marking code.
   55|   422k|    assert(hasValue() && "tried to access collected referent");
   56|      0|    return value_.root.getNonNullNoBarrierUnsafe(base);
   57|   422k|  }
_ZN6hermes2vm11WeakRefSlot13markWeakRootsERNS0_16WeakRootAcceptorE:
   64|   692k|  void markWeakRoots(WeakRootAcceptor &acceptor) {
   65|   692k|    if (state_ != State::Free) {
  ------------------
  |  Branch (65:9): [True: 676k, False: 15.8k]
  ------------------
   66|   676k|      acceptor.acceptWeak(value_.root);
   67|   676k|    }
   68|   692k|  }
_ZNK6hermes2vm11WeakRefSlot5stateEv:
   85|   747k|  State state() const {
   86|   747k|    return state_;
   87|   747k|  }
_ZN6hermes2vm11WeakRefSlot4markEv:
   89|  80.6k|  void mark() {
   90|  80.6k|    assert(state() != Free && "Cannot mark a free slot.");
   91|      0|    state_ = Marked;
   92|  80.6k|  }
_ZN6hermes2vm11WeakRefSlot6unmarkEv:
   94|  80.2k|  void unmark() {
   95|  80.2k|    assert(state() == Marked && "not yet marked");
   96|      0|    state_ = Unmarked;
   97|  80.2k|  }
_ZN6hermes2vm11WeakRefSlot4freeEPS1_:
   99|     60|  void free(WeakRefSlot *nextFree) {
  100|     60|    assert(state() == Unmarked && "cannot free a reachable slot");
  101|      0|    state_ = Free;
  102|     60|    value_.nextFree = nextFree;
  103|     60|    assert(state() == Free);
  104|     60|  }
_ZNK6hermes2vm11WeakRefSlot8nextFreeEv:
  106|     20|  WeakRefSlot *nextFree() const {
  107|       |    // nextFree is only called during a STW pause, so it's fine to access both
  108|       |    // state and value here.
  109|     20|    assert(state() == Free);
  110|      0|    return value_.nextFree;
  111|     20|  }
_ZN6hermes2vm11WeakRefSlot5resetENS0_17CompressedPointerE:
  114|  58.1k|  void reset(CompressedPointer ptr) {
  115|  58.1k|    state_ = Marked;
  116|  58.1k|    value_.root = ptr;
  117|  58.1k|  }
_ZN6hermes2vm11WeakRefSlot15WeakRootOrIndexC2Ev:
  126|  58.1k|    WeakRootOrIndex() {}

_ZNK6hermes2vm12WeakRootBase3getERNS0_11PointerBaseERNS0_7HadesGCE:
   17|  6.06k|GCCell *WeakRootBase::get(PointerBase &base, GC &gc) const {
   18|  6.06k|  if (!*this)
  ------------------
  |  Branch (18:7): [True: 218, False: 5.84k]
  ------------------
   19|    218|    return nullptr;
   20|  5.84k|  return getNonNull(base, gc);
   21|  6.06k|}
_ZNK6hermes2vm12WeakRootBase10getNonNullERNS0_11PointerBaseERNS0_7HadesGCE:
   23|   119k|GCCell *WeakRootBase::getNonNull(PointerBase &base, GC &gc) const {
   24|   119k|  GCCell *ptr = CompressedPointer::getNonNull(base);
   25|   119k|  gc.weakRefReadBarrier(ptr);
   26|   119k|  return ptr;
   27|   119k|}
_ZNK6hermes2vm8WeakRootINS0_6GCCellEE10getNonNullERNS0_11PointerBaseERNS0_7HadesGCE:
   30|   113k|T *WeakRoot<T>::getNonNull(PointerBase &base, GC &gc) const {
   31|   113k|  return static_cast<T *>(WeakRootBase::getNonNull(base, gc));
   32|   113k|}
_ZNK6hermes2vm8WeakRootINS0_6DomainEE3getERNS0_11PointerBaseERNS0_7HadesGCE:
   35|  5.19k|T *WeakRoot<T>::get(PointerBase &base, GC &gc) const {
   36|  5.19k|  return static_cast<T *>(WeakRootBase::get(base, gc));
   37|  5.19k|}
_ZNK6hermes2vm8WeakRootINS0_11HiddenClassEE3getERNS0_11PointerBaseERNS0_7HadesGCE:
   35|    863|T *WeakRoot<T>::get(PointerBase &base, GC &gc) const {
   36|    863|  return static_cast<T *>(WeakRootBase::get(base, gc));
   37|    863|}

_ZN6hermes2vm12WeakRootBaseC2EPNS0_6GCCellERNS0_11PointerBaseE:
   26|    928|      : CompressedPointer(CompressedPointer::encode(ptr, base)) {}
_ZN6hermes2vm12WeakRootBaseC2Ev:
   23|    232|  explicit WeakRootBase() : CompressedPointer(nullptr) {}
_ZN6hermes2vm12WeakRootBaseC2EDn:
   24|  4.79k|  explicit WeakRootBase(std::nullptr_t) : CompressedPointer(nullptr) {}
_ZNK6hermes2vm12WeakRootBase18getNoBarrierUnsafeERNS0_11PointerBaseE:
   39|   711k|  GCCell *getNoBarrierUnsafe(PointerBase &base) const {
   40|   711k|    return CompressedPointer::get(base);
   41|   711k|  }
_ZNK6hermes2vm12WeakRootBase25getNonNullNoBarrierUnsafeERNS0_11PointerBaseE:
   42|   422k|  GCCell *getNonNullNoBarrierUnsafe(PointerBase &base) const {
   43|   422k|    return CompressedPointer::getNonNull(base);
   44|   422k|  }
_ZN6hermes2vm12WeakRootBaseaSENS0_17CompressedPointerE:
   50|   512k|  WeakRootBase &operator=(CompressedPointer ptr) {
   51|       |    // No need for a write barrier on weak roots currently.
   52|   512k|    setNoBarrier(ptr);
   53|   512k|    return *this;
   54|   512k|  }
_ZN6hermes2vm12WeakRootBaseaSEDn:
   56|     21|  WeakRootBase &operator=(std::nullptr_t) {
   57|       |    // No need for a write barrier on weak roots currently.
   58|     21|    setNoBarrier(CompressedPointer{nullptr});
   59|     21|    return *this;
   60|     21|  }
_ZNK6hermes2vm8WeakRootINS0_6GCCellEE25getNonNullNoBarrierUnsafeERNS0_11PointerBaseE:
   82|   422k|  T *getNonNullNoBarrierUnsafe(PointerBase &base) const {
   83|   422k|    return static_cast<T *>(WeakRootBase::getNonNullNoBarrierUnsafe(base));
   84|   422k|  }
_ZN6hermes2vm8WeakRootINS0_6GCCellEEaSENS0_17CompressedPointerE:
   90|  58.1k|  WeakRoot &operator=(CompressedPointer ptr) {
   91|  58.1k|    WeakRootBase::operator=(ptr);
   92|  58.1k|    return *this;
   93|  58.1k|  }
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEEC2EDn:
   69|  4.79k|  explicit WeakRoot(std::nullptr_t) : WeakRootBase(nullptr) {}
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEEaSENS0_17CompressedPointerE:
   90|  2.29k|  WeakRoot &operator=(CompressedPointer ptr) {
   91|  2.29k|    WeakRootBase::operator=(ptr);
   92|  2.29k|    return *this;
   93|  2.29k|  }
_ZN6hermes2vm8WeakRootINS0_6DomainEEC2EPS2_RNS0_11PointerBaseE:
   70|    928|  explicit WeakRoot(T *ptr, PointerBase &base) : WeakRootBase(ptr, base) {}
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEEC2Ev:
   68|    232|  explicit WeakRoot() : WeakRootBase() {}
_ZN6hermes2vm8WeakRootINS0_11HiddenClassEE3setERNS0_11PointerBaseEPS2_:
   86|    232|  void set(PointerBase &base, T *ptr) {
   87|    232|    WeakRootBase::operator=(CompressedPointer::encode(ptr, base));
   88|    232|  }

_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE11containsKeyERKS3_:
   62|    898|  bool containsKey(const KeyT &key) {
   63|    898|    return internalFind(key) != map_.end();
   64|    898|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE12internalFindERKS3_:
  130|  66.7k|  InternalIterator internalFind(const KeyT &key) {
  131|  66.7k|    auto it = map_.find(key);
  132|       |    // Not found?
  133|  66.7k|    if (it == map_.end())
  ------------------
  |  Branch (133:9): [True: 4.72k, False: 62.0k]
  ------------------
  134|  4.72k|      return it;
  135|       |
  136|       |    // The value was garbage collected, so pretend that we didn't find it.
  137|  62.0k|    if (!it->second.isValid()) {
  ------------------
  |  Branch (137:9): [True: 0, False: 62.0k]
  ------------------
  138|      0|      return map_.end();
  139|      0|    }
  140|       |
  141|  62.0k|    return it;
  142|  62.0k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE6lookupERNS0_7RuntimeERKS3_:
   67|  65.8k|  ValueT *lookup(Runtime &runtime, const KeyT &key) {
   68|  65.8k|    auto it = internalFind(key);
   69|  65.8k|    if (it == map_.end())
  ------------------
  |  Branch (69:9): [True: 4.32k, False: 61.5k]
  ------------------
   70|  4.32k|      return nullptr;
   71|  61.5k|    return it->second.get(runtime);
   72|  65.8k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE15insertNewLockedERNS0_7RuntimeERKS3_NS0_6HandleIS4_EE:
   93|  6.96k|  insertNewLocked(Runtime &runtime, const KeyT &key, Handle<ValueT> value) {
   94|  6.96k|    auto itAndInserted = map_.try_emplace(key, WeakRef<ValueT>(runtime, value));
   95|  6.96k|    if (!itAndInserted.second) {
  ------------------
  |  Branch (95:9): [True: 0, False: 6.96k]
  ------------------
   96|       |      // The key already exists and the value is valid, this isn't a new entry.
   97|      0|      if (itAndInserted.first->second.isValid()) {
  ------------------
  |  Branch (97:11): [True: 0, False: 0]
  ------------------
   98|      0|        return false;
   99|      0|      }
  100|      0|      itAndInserted.first->second = WeakRef<ValueT>(runtime, value);
  101|      0|    }
  102|  6.96k|    pruneInvalid(runtime.getHeap());
  103|  6.96k|    return true;
  104|  6.96k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE12pruneInvalidERNS0_7HadesGCE:
  146|  6.96k|  void pruneInvalid(GC &gc) {
  147|  6.96k|    assert(
  148|  6.96k|        gc.weakRefMutex() &&
  149|  6.96k|        "Weak ref mutex must be held before calling this function");
  150|  6.96k|    if (map_.size() <= pruneLimit_)
  ------------------
  |  Branch (150:9): [True: 6.52k, False: 434]
  ------------------
  151|  6.52k|      return;
  152|       |
  153|  4.08k|    for (auto it = map_.begin(), e = map_.end(); it != e; ++it) {
  ------------------
  |  Branch (153:50): [True: 3.65k, False: 434]
  ------------------
  154|  3.65k|      if (!it->second.isValid()) {
  ------------------
  |  Branch (154:11): [True: 0, False: 3.65k]
  ------------------
  155|       |        // NOTE: DenseMap's erase() operation doesn't invalidate any
  156|       |        // iterators, (and has a void return type), so this is safe to do. If
  157|       |        // we were using a std::map<>, we would have to do
  158|       |        // "it = map_.erase(it)".
  159|      0|        map_.erase(it);
  160|      0|      }
  161|  3.65k|    }
  162|       |
  163|    434|    recalcPruneLimit();
  164|    434|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE16recalcPruneLimitEv:
  167|    434|  void recalcPruneLimit() {
  168|    434|    pruneLimit_ = std::max(map_.size() * 2 + 1, toRValue(kMinPruneLimit));
  169|    434|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEE12markWeakRefsERNS0_15WeakRefAcceptorE:
  108|  12.4k|  void markWeakRefs(WeakRefAcceptor &acceptor) {
  109|  73.6k|    for (auto it = map_.begin(), e = map_.end(); it != e; ++it) {
  ------------------
  |  Branch (109:50): [True: 61.2k, False: 12.4k]
  ------------------
  110|  61.2k|      acceptor.accept(it->second);
  111|  61.2k|    }
  112|  12.4k|  }
_ZN6hermes2vm12WeakValueMapINS0_6detail10TransitionENS0_11HiddenClassEEC2Ev:
   39|  1.32k|  WeakValueMap() : map_() {}

_ZNK6hermes2vm6detail19IdentifierHashTable10shouldGrowEv:
   56|   128k|  bool shouldGrow() const {
   57|   128k|    auto cap = capacity();
   58|   128k|    assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   59|       |    // This is essentially cap * 0.75 < size.
   60|      0|    return cap - (cap >> 2) < nonEmptyEntryCount_;
   61|   128k|  }
_ZN6hermes2vm6detail19IdentifierHashTableC2Ej:
   96|     99|      : table_(capacity) {}
_ZN6hermes2vm6detail19IdentifierHashTable18setIdentifierTableEPNS0_15IdentifierTableE:
   99|     99|  void setIdentifierTable(IdentifierTable *table) {
  100|     99|    identifierTable_ = table;
  101|     99|  }
_ZNK6hermes2vm6detail19IdentifierHashTable8capacityEv:
  109|   511k|  uint32_t capacity() const {
  110|   511k|    return table_.size();
  111|   511k|  }
_ZN6hermes2vm6detail19IdentifierHashTable7reserveEj:
  122|    353|  void reserve(uint32_t count) {
  123|    353|    auto cap = capacity();
  124|    353|    assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
  125|    353|    if ((cap >> 1) < count) {
  ------------------
  |  Branch (125:9): [True: 99, False: 254]
  ------------------
  126|       |      // Calculate new capacity needed to contain all identifiers.
  127|       |      // Always align it with power of 2.
  128|     99|      uint32_t newCapacity = llvh::NextPowerOf2(count * 2);
  129|     99|      growAndRehash(newCapacity);
  130|     99|    }
  131|    353|  }
_ZNK6hermes2vm6detail19IdentifierHashTable7isValidEj:
  167|   266k|  bool isValid(uint32_t index) const {
  168|   266k|    return table_.isValid(index);
  169|   266k|  }
_ZNK6hermes2vm6detail19IdentifierHashTable3getEj:
  172|   138k|  uint32_t get(uint32_t index) const {
  173|   138k|    return table_.get(index);
  174|   138k|  }
_ZN6hermes2vm6detail19IdentifierHashTable6removeEj:
  181|    273|  void remove(uint32_t idx) {
  182|    273|    table_.markAsDeleted(idx);
  183|    273|    size_--;
  184|    273|  }
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIcEEjN4llvh8ArrayRefIT_EEb:
  139|    266|  uint32_t lookupString(llvh::ArrayRef<T> str, bool mustBeNew = false) const {
  140|    266|    return lookupString(str, hermes::hashString(str), mustBeNew);
  141|    266|  }
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIDsEEjN4llvh8ArrayRefIT_EEb:
  139|      7|  uint32_t lookupString(llvh::ArrayRef<T> str, bool mustBeNew = false) const {
  140|      7|    return lookupString(str, hermes::hashString(str), mustBeNew);
  141|      7|  }
_ZN6hermes2vm6detail19IdentifierHashTable6removeIcEEvN4llvh8ArrayRefIT_EE:
  189|    266|  void remove(llvh::ArrayRef<T> ref) {
  190|    266|    remove(lookupString(ref));
  191|    266|  }
_ZN6hermes2vm6detail19IdentifierHashTable6removeIDsEEvN4llvh8ArrayRefIT_EE:
  189|      7|  void remove(llvh::ArrayRef<T> ref) {
  190|      7|    remove(lookupString(ref));
  191|      7|  }

_ZN6hermes12CompactArray7scaleUpEv:
   12|     99|void CompactArray::scaleUp() {
   13|     99|  assert(scale_ < UINT32 && "cannot go above 32 bits");
   14|      0|  CompactArray newTable(size_, (Scale)(scale_ + 1));
   15|   202k|  for (uint32_t idx = 0; idx < size_; ++idx) {
  ------------------
  |  Branch (15:26): [True: 202k, False: 99]
  ------------------
   16|   202k|    bool success = newTable.trySet(idx, get(idx));
   17|   202k|    assert(success && "value no longer fits");
   18|      0|    (void)success;
   19|   202k|  }
   20|     99|  swap(newTable);
   21|     99|}

_ZN6hermes6ESTree9getParamsEPNS0_16FunctionLikeNodeE:
   18|   229k|NodeList &getParams(FunctionLikeNode *node) {
   19|   229k|  switch (node->getKind()) {
   20|    112|    default:
  ------------------
  |  Branch (20:5): [True: 112, False: 228k]
  ------------------
   21|    112|      assert(
   22|    112|          node->getKind() == NodeKind::Program && "invalid FunctionLikeNode");
   23|      0|      return cast<ProgramNode>(node)->dummyParamList;
   24|      0|    case NodeKind::FunctionExpression:
  ------------------
  |  Branch (24:5): [True: 0, False: 229k]
  ------------------
   25|      0|      return cast<FunctionExpressionNode>(node)->_params;
   26|   228k|    case NodeKind::ArrowFunctionExpression:
  ------------------
  |  Branch (26:5): [True: 228k, False: 974]
  ------------------
   27|   228k|      return cast<ArrowFunctionExpressionNode>(node)->_params;
   28|    862|    case NodeKind::FunctionDeclaration:
  ------------------
  |  Branch (28:5): [True: 862, False: 228k]
  ------------------
   29|    862|      return cast<FunctionDeclarationNode>(node)->_params;
   30|   229k|  }
   31|   229k|}
_ZN6hermes6ESTree17getBlockStatementEPNS0_16FunctionLikeNodeE:
   33|    768|BlockStatementNode *getBlockStatement(FunctionLikeNode *node) {
   34|    768|  switch (node->getKind()) {
   35|      0|    default:
  ------------------
  |  Branch (35:5): [True: 0, False: 768]
  ------------------
   36|      0|      assert(
   37|      0|          node->getKind() == NodeKind::Program && "invalid FunctionLikeNode");
   38|      0|      return nullptr;
   39|      0|    case NodeKind::FunctionExpression:
  ------------------
  |  Branch (39:5): [True: 0, False: 768]
  ------------------
   40|      0|      return cast<BlockStatementNode>(
   41|      0|          cast<FunctionExpressionNode>(node)->_body);
   42|    768|    case NodeKind::FunctionDeclaration:
  ------------------
  |  Branch (42:5): [True: 768, False: 0]
  ------------------
   43|    768|      return cast<BlockStatementNode>(
   44|    768|          cast<FunctionDeclarationNode>(node)->_body);
   45|      0|    case NodeKind::ArrowFunctionExpression: {
  ------------------
  |  Branch (45:5): [True: 0, False: 768]
  ------------------
   46|      0|      return dyn_cast<BlockStatementNode>(
   47|      0|          cast<FunctionDeclarationNode>(node)->_body);
   48|      0|    }
   49|    768|  }
   50|    768|}
_ZN6hermes6ESTree11getPropertyEPNS0_24MemberExpressionLikeNodeE:
   64|     46|Node *getProperty(MemberExpressionLikeNode *node) {
   65|     46|  switch (node->getKind()) {
   66|     46|    case NodeKind::MemberExpression:
  ------------------
  |  Branch (66:5): [True: 46, False: 0]
  ------------------
   67|     46|      return cast<MemberExpressionNode>(node)->_property;
   68|      0|    case NodeKind::OptionalMemberExpression:
  ------------------
  |  Branch (68:5): [True: 0, False: 46]
  ------------------
   69|      0|      return cast<OptionalMemberExpressionNode>(node)->_property;
   70|      0|    default:
  ------------------
  |  Branch (70:5): [True: 0, False: 46]
  ------------------
   71|      0|      break;
   72|     46|  }
   73|      0|  llvm_unreachable("invalid MemberExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   74|     46|}
_ZN6hermes6ESTree11getComputedEPNS0_24MemberExpressionLikeNodeE:
   76|     24|NodeBoolean getComputed(MemberExpressionLikeNode *node) {
   77|     24|  switch (node->getKind()) {
   78|     24|    case NodeKind::MemberExpression:
  ------------------
  |  Branch (78:5): [True: 24, False: 0]
  ------------------
   79|     24|      return cast<MemberExpressionNode>(node)->_computed;
   80|      0|    case NodeKind::OptionalMemberExpression:
  ------------------
  |  Branch (80:5): [True: 0, False: 24]
  ------------------
   81|      0|      return cast<OptionalMemberExpressionNode>(node)->_computed;
   82|      0|    default:
  ------------------
  |  Branch (82:5): [True: 0, False: 24]
  ------------------
   83|      0|      break;
   84|     24|  }
   85|      0|  llvm_unreachable("invalid MemberExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   86|     24|}
_ZN6hermes6ESTree12getArgumentsEPNS0_22CallExpressionLikeNodeE:
  100|     16|NodeList &getArguments(CallExpressionLikeNode *node) {
  101|     16|  switch (node->getKind()) {
  102|     16|    case NodeKind::CallExpression:
  ------------------
  |  Branch (102:5): [True: 16, False: 0]
  ------------------
  103|     16|      return cast<CallExpressionNode>(node)->_arguments;
  104|      0|    case NodeKind::OptionalCallExpression:
  ------------------
  |  Branch (104:5): [True: 0, False: 16]
  ------------------
  105|      0|      return cast<OptionalCallExpressionNode>(node)->_arguments;
  106|      0|    default:
  ------------------
  |  Branch (106:5): [True: 0, False: 16]
  ------------------
  107|      0|      break;
  108|     16|  }
  109|      0|  llvm_unreachable("invalid CallExpressionLikeNode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  110|     16|}

_ZN6hermes3sem11validateASTERNS_7ContextERNS0_10SemContextEPNS_6ESTree4NodeE:
   17|     65|bool validateAST(Context &astContext, SemContext &semCtx, Node *root) {
   18|     65|  PerfSection validation("Validating JavaScript function AST");
   19|       |  // Validate the entire AST.
   20|     65|  SemanticValidator validator{astContext, semCtx, true};
   21|     65|  return validator.doIt(root);
   22|     65|}

_ZN6hermes3sem8KeywordsC2ERNS_7ContextE:
   46|     65|      identAssign(astContext.getIdentifier("=").getUnderlyingPointer()) {}
_ZN6hermes3sem17SemanticValidatorC2ERNS_7ContextERNS0_10SemContextEb:
   61|     65|      compile_(compile) {}
_ZN6hermes3sem17SemanticValidator4doItEPNS_6ESTree4NodeE:
   63|     65|bool SemanticValidator::doIt(Node *rootNode) {
   64|     65|  visitESTreeNode(*this, rootNode);
   65|     65|  return sm_.getErrorCount() == initialErrorCount_;
   66|     65|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree11ProgramNodeE:
   77|     65|void SemanticValidator::visit(ProgramNode *node) {
   78|     65|  FunctionContext newFuncCtx{this, astContext_.isStrictMode(), node};
   79|       |
   80|     65|  scanDirectivePrologue(node->_body);
   81|     65|  setDirectiveDerivedInfo(node);
   82|       |
   83|     65|  visitESTreeChildren(*this, node);
   84|     65|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree22VariableDeclaratorNodeEPNS2_4NodeE:
   86|      7|void SemanticValidator::visit(VariableDeclaratorNode *varDecl, Node *parent) {
   87|      7|  auto *declaration = cast<VariableDeclarationNode>(parent);
   88|       |
   89|      7|  FunctionInfo::VarDecl::Kind declKind;
   90|      7|  if (declaration->_kind == kw_.identLet)
  ------------------
  |  Branch (90:7): [True: 0, False: 7]
  ------------------
   91|      0|    declKind = FunctionInfo::VarDecl::Kind::Let;
   92|      7|  else if (declaration->_kind == kw_.identConst)
  ------------------
  |  Branch (92:12): [True: 0, False: 7]
  ------------------
   93|      0|    declKind = FunctionInfo::VarDecl::Kind::Const;
   94|      7|  else {
   95|      7|    assert(declaration->_kind == kw_.identVar);
   96|      0|    declKind = FunctionInfo::VarDecl::Kind::Var;
   97|      7|  }
   98|       |
   99|      0|  validateDeclarationNames(
  100|      7|      declKind, varDecl->_id, &curFunction()->semInfo->varDecls);
  101|      7|  visitESTreeChildren(*this, varDecl);
  102|      7|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree14IdentifierNodeE:
  135|   327k|void SemanticValidator::visit(IdentifierNode *identifier) {
  136|   327k|  if (identifier->_name == kw_.identEval && !astContext_.getEnableEval())
  ------------------
  |  Branch (136:7): [True: 0, False: 327k]
  |  Branch (136:45): [True: 0, False: 0]
  ------------------
  137|      0|    sm_.error(identifier->getSourceRange(), "'eval' is disabled");
  138|       |
  139|   327k|  if (identifier->_name == kw_.identArguments)
  ------------------
  |  Branch (139:7): [True: 2, False: 327k]
  ------------------
  140|      2|    curFunction()->semInfo->usesArguments = true;
  141|   327k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree23FunctionDeclarationNodeE:
  144|    768|void SemanticValidator::visit(FunctionDeclarationNode *funcDecl) {
  145|    768|  curFunction()->semInfo->closures.push_back(funcDecl);
  146|    768|  visitFunction(funcDecl, funcDecl->_id, funcDecl->_params, funcDecl->_body);
  147|    768|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree27ArrowFunctionExpressionNodeE:
  154|   114k|void SemanticValidator::visit(ArrowFunctionExpressionNode *arrowFunc) {
  155|       |  // Convert expression functions to a full-body to simplify IRGen.
  156|   114k|  if (compile_ && arrowFunc->_expression) {
  ------------------
  |  Branch (156:7): [True: 114k, False: 0]
  |  Branch (156:19): [True: 114k, False: 0]
  ------------------
  157|   114k|    auto *retStmt = new (astContext_) ReturnStatementNode(arrowFunc->_body);
  158|   114k|    retStmt->copyLocationFrom(arrowFunc->_body);
  159|       |
  160|   114k|    ESTree::NodeList stmtList;
  161|   114k|    stmtList.push_back(*retStmt);
  162|       |
  163|   114k|    auto *blockStmt = new (astContext_) BlockStatementNode(std::move(stmtList));
  164|   114k|    blockStmt->copyLocationFrom(arrowFunc->_body);
  165|       |
  166|   114k|    arrowFunc->_body = blockStmt;
  167|   114k|    arrowFunc->_expression = false;
  168|   114k|  }
  169|       |
  170|   114k|  visitFunction(arrowFunc, nullptr, arrowFunc->_params, arrowFunc->_body);
  171|       |
  172|   114k|  curFunction()->semInfo->containsArrowFunctions = true;
  173|   114k|  curFunction()->semInfo->containsArrowFunctionsUsingArguments =
  174|   114k|      curFunction()->semInfo->containsArrowFunctionsUsingArguments ||
  ------------------
  |  Branch (174:7): [True: 0, False: 114k]
  ------------------
  175|   114k|      arrowFunc->getSemInfo()->containsArrowFunctionsUsingArguments ||
  ------------------
  |  Branch (175:7): [True: 0, False: 114k]
  ------------------
  176|   114k|      arrowFunc->getSemInfo()->usesArguments;
  ------------------
  |  Branch (176:7): [True: 0, False: 114k]
  ------------------
  177|   114k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20BinaryExpressionNodeE:
  226|  25.8k|void SemanticValidator::visit(BinaryExpressionNode *bin) {
  227|       |  // Handle nested +/- non-recursively.
  228|  25.8k|  if (bin->_operator == kw_.identPlus || bin->_operator == kw_.identMinus) {
  ------------------
  |  Branch (228:7): [True: 244, False: 25.6k]
  |  Branch (228:42): [True: 33, False: 25.6k]
  ------------------
  229|    277|    auto list = linearizeLeft(bin, {"+", "-"});
  230|    277|    if (list.size() > MAX_NESTED_BINARY) {
  ------------------
  |  Branch (230:9): [True: 5, False: 272]
  ------------------
  231|      5|      recursionDepthExceeded(bin);
  232|      5|      return;
  233|      5|    }
  234|       |
  235|    272|    visitESTreeNode(*this, list[0]->_left, list[0]);
  236|  64.9k|    for (auto *e : list) {
  ------------------
  |  Branch (236:18): [True: 64.9k, False: 272]
  ------------------
  237|  64.9k|      visitESTreeNode(*this, e->_right, e);
  238|  64.9k|    }
  239|    272|    return;
  240|    277|  }
  241|       |
  242|  25.6k|  visitESTreeChildren(*this, bin);
  243|  25.6k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree24AssignmentExpressionNodeE:
  246|  4.14k|void SemanticValidator::visit(AssignmentExpressionNode *assignment) {
  247|       |  // Handle nested "=" non-recursively.
  248|  4.14k|  if (assignment->_operator == kw_.identAssign) {
  ------------------
  |  Branch (248:7): [True: 3.99k, False: 153]
  ------------------
  249|  3.99k|    auto list = linearizeRight(assignment, {"="});
  250|  3.99k|    if (list.size() > MAX_NESTED_ASSIGNMENTS) {
  ------------------
  |  Branch (250:9): [True: 0, False: 3.99k]
  ------------------
  251|      0|      recursionDepthExceeded(assignment);
  252|      0|      return;
  253|      0|    }
  254|       |
  255|  4.03k|    for (auto *e : list) {
  ------------------
  |  Branch (255:18): [True: 4.03k, False: 3.99k]
  ------------------
  256|  4.03k|      validateAssignmentTarget(e->_left);
  257|  4.03k|      visitESTreeNode(*this, e->_left, e);
  258|  4.03k|    }
  259|  3.99k|    visitESTreeNode(*this, list.back()->_right, list.back());
  260|  3.99k|    return;
  261|  3.99k|  }
  262|       |
  263|    153|  validateAssignmentTarget(assignment->_left);
  264|    153|  visitESTreeChildren(*this, assignment);
  265|    153|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20UpdateExpressionNodeE:
  268|     28|void SemanticValidator::visit(UpdateExpressionNode *update) {
  269|       |  // Check if the left-hand side is valid.
  270|     28|  if (!isLValue(update->_argument)) {
  ------------------
  |  Branch (270:7): [True: 0, False: 28]
  ------------------
  271|      0|    sm_.error(
  272|      0|        update->_argument->getSourceRange(),
  273|      0|        "invalid operand in update operation");
  274|      0|  }
  275|     28|  visitESTreeChildren(*this, update);
  276|     28|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20LabeledStatementNodeE:
  279|  42.8k|void SemanticValidator::visit(LabeledStatementNode *labelStmt) {
  280|  42.8k|  auto id = cast<IdentifierNode>(labelStmt->_label);
  281|       |
  282|  42.8k|  labelStmt->setLabelIndex(curFunction()->allocateLabel());
  283|       |
  284|       |  // Determine the target statement. We need to check if it directly encloses
  285|       |  // a loop or another label enclosing a loop.
  286|  42.8k|  StatementNode *targetStmt = labelStmt;
  287|  42.8k|  {
  288|  42.8k|    LabeledStatementNode *curStmt = labelStmt;
  289|  43.4k|    do {
  290|  43.4k|      if (auto *LS = dyn_cast<LoopStatementNode>(curStmt->_body)) {
  ------------------
  |  Branch (290:17): [True: 0, False: 43.4k]
  ------------------
  291|      0|        targetStmt = LS;
  292|      0|        break;
  293|      0|      }
  294|  43.4k|    } while ((curStmt = dyn_cast<LabeledStatementNode>(curStmt->_body)));
  ------------------
  |  Branch (294:14): [True: 580, False: 42.8k]
  ------------------
  295|  42.8k|  }
  296|       |
  297|       |  // Define the new label, checking for a previous definition.
  298|      0|  auto insertRes =
  299|  42.8k|      curFunction()->labelMap.insert({id->_name, {id, targetStmt}});
  300|  42.8k|  if (!insertRes.second) {
  ------------------
  |  Branch (300:7): [True: 0, False: 42.8k]
  ------------------
  301|      0|    sm_.error(
  302|      0|        id->getSourceRange(),
  303|      0|        llvh::Twine("label '") + id->_name->str() + "' is already defined");
  304|      0|    sm_.note(
  305|      0|        insertRes.first->second.declarationNode->getSourceRange(),
  306|      0|        "previous definition");
  307|      0|  }
  308|       |  // Auto-erase the label on exit, if we inserted it.
  309|  42.8k|  const auto &deleter = llvh::make_scope_exit([=]() {
  310|  42.8k|    if (insertRes.second)
  311|  42.8k|      curFunction()->labelMap.erase(id->_name);
  312|  42.8k|  });
  313|  42.8k|  (void)deleter;
  314|       |
  315|  42.8k|  visitESTreeChildren(*this, labelStmt);
  316|  42.8k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree17RegExpLiteralNodeE:
  319|  11.4k|void SemanticValidator::visit(RegExpLiteralNode *regexp) {
  320|  11.4k|  llvh::StringRef regexpError;
  321|  11.4k|  if (compile_) {
  ------------------
  |  Branch (321:7): [True: 11.4k, False: 0]
  ------------------
  322|  11.4k|    if (auto compiled = CompiledRegExp::tryCompile(
  ------------------
  |  Branch (322:14): [True: 11.4k, False: 0]
  ------------------
  323|  11.4k|            regexp->_pattern->str(), regexp->_flags->str(), &regexpError)) {
  324|  11.4k|      astContext_.addCompiledRegExp(
  325|  11.4k|          regexp->_pattern, regexp->_flags, std::move(*compiled));
  326|  11.4k|    } else {
  327|      0|      sm_.error(
  328|      0|          regexp->getSourceRange(),
  329|      0|          "Invalid regular expression: " + Twine(regexpError));
  330|      0|    }
  331|  11.4k|  }
  332|  11.4k|  visitESTreeChildren(*this, regexp);
  333|  11.4k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree18WhileStatementNodeE:
  395|      1|void SemanticValidator::visit(WhileStatementNode *loop) {
  396|      1|  loop->setLabelIndex(curFunction()->allocateLabel());
  397|       |
  398|      1|  SaveAndRestore<LoopStatementNode *> saveLoop(curFunction()->activeLoop, loop);
  399|      1|  SaveAndRestore<StatementNode *> saveSwitch(
  400|      1|      curFunction()->activeSwitchOrLoop, loop);
  401|       |
  402|      1|  visitESTreeChildren(*this, loop);
  403|      1|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree21ContinueStatementNodeE:
  443|      3|void SemanticValidator::visit(ContinueStatementNode *continueStmt) {
  444|      3|  if (auto id = cast_or_null<IdentifierNode>(continueStmt->_label)) {
  ------------------
  |  Branch (444:12): [True: 0, False: 3]
  ------------------
  445|       |    // A labeled continue.
  446|       |    // Find the label in the label map.
  447|      0|    auto labelIt = curFunction()->labelMap.find(id->_name);
  448|      0|    if (labelIt != curFunction()->labelMap.end()) {
  ------------------
  |  Branch (448:9): [True: 0, False: 0]
  ------------------
  449|      0|      if (isa<LoopStatementNode>(labelIt->second.targetStatement)) {
  ------------------
  |  Branch (449:11): [True: 0, False: 0]
  ------------------
  450|      0|        auto labelIndex =
  451|      0|            getLabelDecorationBase(labelIt->second.targetStatement)
  452|      0|                ->getLabelIndex();
  453|      0|        continueStmt->setLabelIndex(labelIndex);
  454|      0|      } else {
  455|      0|        sm_.error(
  456|      0|            id->getSourceRange(),
  457|      0|            llvh::Twine("continue label '") + id->_name->str() +
  458|      0|                "' is not a loop label");
  459|      0|        sm_.note(
  460|      0|            labelIt->second.declarationNode->getSourceRange(),
  461|      0|            "label defined here");
  462|      0|      }
  463|      0|    } else {
  464|      0|      sm_.error(
  465|      0|          id->getSourceRange(),
  466|      0|          Twine("label '") + id->_name->str() + "' is not defined");
  467|      0|    }
  468|      3|  } else {
  469|       |    // Anonymous continue.
  470|      3|    if (curFunction()->activeLoop) {
  ------------------
  |  Branch (470:9): [True: 0, False: 3]
  ------------------
  471|      0|      auto labelIndex = curFunction()->activeLoop->getLabelIndex();
  472|      0|      continueStmt->setLabelIndex(labelIndex);
  473|      3|    } else {
  474|      3|      sm_.error(continueStmt->getSourceRange(), "'continue' not within a loop");
  475|      3|    }
  476|      3|  }
  477|      3|  visitESTreeChildren(*this, continueStmt);
  478|      3|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree19ReturnStatementNodeE:
  480|   114k|void SemanticValidator::visit(ReturnStatementNode *returnStmt) {
  481|   114k|  if (curFunction()->isGlobalScope() &&
  ------------------
  |  Branch (481:7): [True: 0, False: 114k]
  ------------------
  482|   114k|      !astContext_.allowReturnOutsideFunction())
  ------------------
  |  Branch (482:7): [True: 0, False: 0]
  ------------------
  483|      0|    sm_.error(returnStmt->getSourceRange(), "'return' not in a function");
  484|   114k|  visitESTreeChildren(*this, returnStmt);
  485|   114k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree19UnaryExpressionNodeE:
  513|  4.09k|void SemanticValidator::visit(UnaryExpressionNode *unaryExpr) {
  514|       |  // Check for unqualified delete in strict mode.
  515|  4.09k|  if (unaryExpr->_operator == kw_.identDelete) {
  ------------------
  |  Branch (515:7): [True: 0, False: 4.09k]
  ------------------
  516|      0|    if (curFunction()->strictMode &&
  ------------------
  |  Branch (516:9): [True: 0, False: 0]
  ------------------
  517|      0|        isa<IdentifierNode>(unaryExpr->_argument)) {
  ------------------
  |  Branch (517:9): [True: 0, False: 0]
  ------------------
  518|      0|      sm_.error(
  519|      0|          unaryExpr->getSourceRange(),
  520|      0|          "'delete' of a variable is not allowed in strict mode");
  521|      0|    }
  522|      0|  }
  523|  4.09k|  visitESTreeChildren(*this, unaryExpr);
  524|  4.09k|}
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree16ArrayPatternNodeE:
  526|     96|void SemanticValidator::visit(ArrayPatternNode *AP) {
  527|     96|  visitESTreeChildren(*this, AP);
  528|     96|}
_ZN6hermes3sem17SemanticValidator13visitFunctionEPNS_6ESTree16FunctionLikeNodeEPNS2_4NodeERN4llvh12simple_ilistIS5_JEEES6_:
  683|   114k|    Node *body) {
  684|   114k|  FunctionContext newFuncCtx{
  685|   114k|      this,
  686|   114k|      haveActiveContext() && curFunction()->strictMode,
  ------------------
  |  Branch (686:7): [True: 114k, False: 0]
  |  Branch (686:30): [True: 0, False: 114k]
  ------------------
  687|   114k|      node,
  688|   114k|      haveActiveContext() ? curFunction()->sourceVisibility
  ------------------
  |  Branch (688:7): [True: 114k, False: 0]
  ------------------
  689|   114k|                          : SourceVisibility::Default};
  690|       |
  691|       |  // It is a Syntax Error if UniqueFormalParameters Contains YieldExpression
  692|       |  // is true.
  693|       |  // NOTE: isFormalParams_ is reset to false on encountering a new function,
  694|       |  // because the semantics for "x Contains y" always return `false` when "x" is
  695|       |  // a function definition.
  696|   114k|  llvh::SaveAndRestore<bool> oldIsFormalParamsFn{isFormalParams_, false};
  697|       |
  698|   114k|  Node *useStrictNode = nullptr;
  699|       |
  700|       |  // Note that body might me empty (for lazy functions) or an expression (for
  701|       |  // arrow functions).
  702|   114k|  if (auto *bodyNode = dyn_cast<ESTree::BlockStatementNode>(body)) {
  ------------------
  |  Branch (702:13): [True: 114k, False: 0]
  ------------------
  703|   114k|    if (bodyNode->isLazyFunctionBody) {
  ------------------
  |  Branch (703:9): [True: 674, False: 114k]
  ------------------
  704|       |      // If it is a lazy function body, then the directive nodes in the body are
  705|       |      // fabricated without location, so don't set useStrictNode.
  706|    674|      scanDirectivePrologue(bodyNode->_body);
  707|   114k|    } else {
  708|   114k|      useStrictNode = scanDirectivePrologue(bodyNode->_body);
  709|   114k|    }
  710|   114k|    setDirectiveDerivedInfo(node);
  711|   114k|  }
  712|       |
  713|   114k|  if (id)
  ------------------
  |  Branch (713:7): [True: 768, False: 114k]
  ------------------
  714|    768|    validateDeclarationNames(FunctionInfo::VarDecl::Kind::Var, id, nullptr);
  715|       |
  716|   114k|#if HERMES_PARSE_FLOW
  717|   114k|  if (astContext_.getParseFlow() && !params.empty()) {
  ------------------
  |  Branch (717:7): [True: 0, False: 114k]
  |  Branch (717:37): [True: 0, False: 0]
  ------------------
  718|       |    // Skip 'this' parameter annotation, and error if it's an arrow parameter,
  719|       |    // because arrow functions inherit 'this'.
  720|      0|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(&params.front())) {
  ------------------
  |  Branch (720:15): [True: 0, False: 0]
  ------------------
  721|      0|      if (ident->_name == kw_.identThis) {
  ------------------
  |  Branch (721:11): [True: 0, False: 0]
  ------------------
  722|      0|        if (isa<ArrowFunctionExpressionNode>(node)) {
  ------------------
  |  Branch (722:13): [True: 0, False: 0]
  ------------------
  723|      0|          sm_.error(
  724|      0|              ident->getSourceRange(), "'this' not allowed as parameter name");
  725|      0|        }
  726|      0|        if (compile_) {
  ------------------
  |  Branch (726:13): [True: 0, False: 0]
  ------------------
  727|       |          // Delete the node because it cannot be compiled.
  728|      0|          params.erase(params.begin());
  729|      0|        }
  730|      0|      }
  731|      0|    }
  732|      0|  }
  733|   114k|#endif
  734|       |
  735|       |  // Set to false if the parameter list contains binding patterns.
  736|   114k|  bool simpleParameterList = true;
  737|   114k|  for (auto &param : params) {
  ------------------
  |  Branch (737:20): [True: 114k, False: 114k]
  ------------------
  738|   114k|    simpleParameterList &= !isa<PatternNode>(param);
  739|   114k|    validateDeclarationNames(
  740|   114k|        FunctionInfo::VarDecl::Kind::Var,
  741|   114k|        &param,
  742|   114k|        &newFuncCtx.semInfo->paramNames);
  743|   114k|  }
  744|       |
  745|   114k|  if (!simpleParameterList && useStrictNode) {
  ------------------
  |  Branch (745:7): [True: 0, False: 114k]
  |  Branch (745:31): [True: 0, False: 0]
  ------------------
  746|      0|    sm_.error(
  747|      0|        useStrictNode->getSourceRange(),
  748|      0|        "'use strict' not allowed inside function with non-simple parameter list");
  749|      0|  }
  750|       |
  751|       |  // Check if we have seen this parameter name before.
  752|   114k|  if (!simpleParameterList || curFunction()->strictMode ||
  ------------------
  |  Branch (752:7): [True: 0, False: 114k]
  |  Branch (752:31): [True: 0, False: 114k]
  ------------------
  753|   114k|      isa<ArrowFunctionExpressionNode>(node)) {
  ------------------
  |  Branch (753:7): [True: 114k, False: 768]
  ------------------
  754|   114k|    llvh::SmallSet<NodeLabel, 8> paramNameSet;
  755|   114k|    for (const auto &curIdNode : newFuncCtx.semInfo->paramNames) {
  ------------------
  |  Branch (755:32): [True: 114k, False: 114k]
  ------------------
  756|   114k|      auto insert_result = paramNameSet.insert(curIdNode.identifier->_name);
  757|   114k|      if (insert_result.second == false) {
  ------------------
  |  Branch (757:11): [True: 0, False: 114k]
  ------------------
  758|      0|        sm_.error(
  759|      0|            curIdNode.identifier->getSourceRange(),
  760|      0|            "cannot declare two parameters with the same name '" +
  761|      0|                curIdNode.identifier->_name->str() + "'");
  762|      0|      }
  763|   114k|    }
  764|   114k|  }
  765|       |
  766|   114k|  visitParamsAndBody(node);
  767|   114k|}
_ZN6hermes3sem17SemanticValidator18visitParamsAndBodyEPNS_6ESTree16FunctionLikeNodeE:
  769|   114k|void SemanticValidator::visitParamsAndBody(FunctionLikeNode *node) {
  770|   114k|  switch (node->getKind()) {
  771|      0|    case NodeKind::FunctionExpression: {
  ------------------
  |  Branch (771:5): [True: 0, False: 114k]
  ------------------
  772|      0|      auto *fe = cast<ESTree::FunctionExpressionNode>(node);
  773|      0|      visitESTreeNode(*this, fe->_id, fe);
  774|      0|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (774:24): [True: 0, False: 0]
  ------------------
  775|      0|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  776|      0|        visitESTreeNode(*this, &param, fe);
  777|      0|      }
  778|      0|      visitESTreeNode(*this, fe->_body, fe);
  779|      0|      break;
  780|      0|    }
  781|   114k|    case NodeKind::ArrowFunctionExpression: {
  ------------------
  |  Branch (781:5): [True: 114k, False: 768]
  ------------------
  782|   114k|      auto *fe = cast<ESTree::ArrowFunctionExpressionNode>(node);
  783|   114k|      visitESTreeNode(*this, fe->_id, fe);
  784|   114k|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (784:24): [True: 114k, False: 114k]
  ------------------
  785|   114k|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  786|   114k|        visitESTreeNode(*this, &param, fe);
  787|   114k|      }
  788|   114k|      visitESTreeNode(*this, fe->_body, fe);
  789|   114k|      break;
  790|      0|    }
  791|    768|    case NodeKind::FunctionDeclaration: {
  ------------------
  |  Branch (791:5): [True: 768, False: 114k]
  ------------------
  792|    768|      auto *fe = cast<ESTree::FunctionDeclarationNode>(node);
  793|    768|      visitESTreeNode(*this, fe->_id, fe);
  794|    768|      for (auto &param : fe->_params) {
  ------------------
  |  Branch (794:24): [True: 768, False: 768]
  ------------------
  795|    768|        llvh::SaveAndRestore<bool> oldIsFormalParams{isFormalParams_, true};
  796|    768|        visitESTreeNode(*this, &param, fe);
  797|    768|      }
  798|    768|      visitESTreeNode(*this, fe->_body, fe);
  799|    768|      visitESTreeNode(*this, fe->_returnType, fe);
  800|    768|      break;
  801|      0|    }
  802|      0|    default:
  ------------------
  |  Branch (802:5): [True: 0, False: 114k]
  ------------------
  803|      0|      visitESTreeChildren(*this, node);
  804|   114k|  }
  805|   114k|}
_ZN6hermes3sem17SemanticValidator21scanDirectivePrologueERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  814|   114k|Node *SemanticValidator::scanDirectivePrologue(NodeList &body) {
  815|   114k|  Node *result = nullptr;
  816|   114k|  for (auto &nodeRef : body) {
  ------------------
  |  Branch (816:22): [True: 114k, False: 674]
  ------------------
  817|   114k|    auto *exprSt = dyn_cast<ESTree::ExpressionStatementNode>(&nodeRef);
  818|   114k|    if (!exprSt || !exprSt->_directive)
  ------------------
  |  Branch (818:9): [True: 114k, False: 152]
  |  Branch (818:20): [True: 152, False: 0]
  ------------------
  819|   114k|      break;
  820|       |
  821|      0|    auto *directive = exprSt->_directive;
  822|       |
  823|      0|    if (directive == kw_.identUseStrict) {
  ------------------
  |  Branch (823:9): [True: 0, False: 0]
  ------------------
  824|      0|      curFunction()->strictMode = true;
  825|      0|      if (!result)
  ------------------
  |  Branch (825:11): [True: 0, False: 0]
  ------------------
  826|      0|        result = &nodeRef;
  827|      0|    }
  828|      0|    if (directive == kw_.identShowSource) {
  ------------------
  |  Branch (828:9): [True: 0, False: 0]
  ------------------
  829|      0|      tryOverrideSourceVisibility(SourceVisibility::ShowSource);
  830|      0|    }
  831|      0|    if (directive == kw_.identHideSource) {
  ------------------
  |  Branch (831:9): [True: 0, False: 0]
  ------------------
  832|      0|      tryOverrideSourceVisibility(SourceVisibility::HideSource);
  833|      0|    }
  834|      0|    if (directive == kw_.identSensitive) {
  ------------------
  |  Branch (834:9): [True: 0, False: 0]
  ------------------
  835|      0|      tryOverrideSourceVisibility(SourceVisibility::Sensitive);
  836|      0|    }
  837|      0|  }
  838|       |
  839|   114k|  return result;
  840|   114k|}
_ZNK6hermes3sem17SemanticValidator8isLValueEPKNS_6ESTree4NodeE:
  842|  4.29k|bool SemanticValidator::isLValue(const Node *node) const {
  843|  4.29k|  if (isa<MemberExpressionNode>(node))
  ------------------
  |  Branch (843:7): [True: 60, False: 4.23k]
  ------------------
  844|     60|    return true;
  845|  4.23k|  if (!isa<IdentifierNode>(node))
  ------------------
  |  Branch (845:7): [True: 97, False: 4.13k]
  ------------------
  846|     97|    return false;
  847|       |
  848|  4.13k|  auto *idNode = cast<IdentifierNode>(node);
  849|       |
  850|       |  /// 'arguments' cannot be modified in strict mode, but we also don't
  851|       |  /// support modifying it in non-strict mode yet.
  852|  4.13k|  if (idNode->_name == kw_.identArguments)
  ------------------
  |  Branch (852:7): [True: 0, False: 4.13k]
  ------------------
  853|      0|    return false;
  854|       |
  855|       |  // 'eval' cannot be used as a variable in strict mode. If it is disabled we
  856|       |  // we don't report an error because it will be reported separately.
  857|  4.13k|  if (idNode->_name == kw_.identEval && curFunction()->strictMode &&
  ------------------
  |  Branch (857:7): [True: 0, False: 4.13k]
  |  Branch (857:41): [True: 0, False: 0]
  ------------------
  858|  4.13k|      astContext_.getEnableEval())
  ------------------
  |  Branch (858:7): [True: 0, False: 0]
  ------------------
  859|      0|    return false;
  860|       |
  861|  4.13k|  return true;
  862|  4.13k|}
_ZNK6hermes3sem17SemanticValidator22isValidDeclarationNameEPKNS_6ESTree14IdentifierNodeE:
  865|   115k|    const IdentifierNode *idNode) const {
  866|       |  // 'arguments' cannot be redeclared in strict mode.
  867|   115k|  if (idNode->_name == kw_.identArguments && curFunction()->strictMode)
  ------------------
  |  Branch (867:7): [True: 0, False: 115k]
  |  Branch (867:46): [True: 0, False: 0]
  ------------------
  868|      0|    return false;
  869|       |
  870|       |  // 'eval' cannot be redeclared in strict mode. If it is disabled we
  871|       |  // we don't report an error because it will be reported separately.
  872|   115k|  if (idNode->_name == kw_.identEval && curFunction()->strictMode &&
  ------------------
  |  Branch (872:7): [True: 0, False: 115k]
  |  Branch (872:41): [True: 0, False: 0]
  ------------------
  873|   115k|      astContext_.getEnableEval())
  ------------------
  |  Branch (873:7): [True: 0, False: 0]
  ------------------
  874|      0|    return false;
  875|       |
  876|   115k|  return true;
  877|   115k|}
_ZN6hermes3sem17SemanticValidator24validateDeclarationNamesENS_18JavaScriptDeclKindEPNS_6ESTree4NodeEPN4llvh15SmallVectorImplINS0_12FunctionInfo7VarDeclEEE:
  882|   115k|    llvh::SmallVectorImpl<FunctionInfo::VarDecl> *idents) {
  883|       |  // The identifier is sometimes optional, in which case it is valid.
  884|   115k|  if (!node)
  ------------------
  |  Branch (884:7): [True: 0, False: 115k]
  ------------------
  885|      0|    return;
  886|       |
  887|   115k|  if (auto *idNode = dyn_cast<IdentifierNode>(node)) {
  ------------------
  |  Branch (887:13): [True: 115k, False: 0]
  ------------------
  888|   115k|    if (idents)
  ------------------
  |  Branch (888:9): [True: 114k, False: 768]
  ------------------
  889|   114k|      idents->push_back({declKind, idNode});
  890|   115k|    if (!isValidDeclarationName(idNode)) {
  ------------------
  |  Branch (890:9): [True: 0, False: 115k]
  ------------------
  891|      0|      sm_.error(
  892|      0|          node->getSourceRange(),
  893|      0|          "cannot declare '" + cast<IdentifierNode>(node)->_name->str() + "'");
  894|      0|    }
  895|       |
  896|   115k|    if (declKind != FunctionInfo::VarDecl::Kind::Var &&
  ------------------
  |  Branch (896:9): [True: 0, False: 115k]
  ------------------
  897|   115k|        idNode->_name == kw_.identLet) {
  ------------------
  |  Branch (897:9): [True: 0, False: 0]
  ------------------
  898|       |      // ES9.0 13.3.1.1
  899|       |      // LexicalDeclaration : LetOrConst BindingList
  900|       |      // It is a Syntax Error if the BoundNames of BindingList
  901|       |      // contains "let".
  902|      0|      sm_.error(
  903|      0|          node->getSourceRange(),
  904|      0|          "'let' is disallowed as a lexically bound name");
  905|      0|    }
  906|       |
  907|   115k|    return;
  908|   115k|  }
  909|       |
  910|      0|  if (isa<EmptyNode>(node))
  ------------------
  |  Branch (910:7): [True: 0, False: 0]
  ------------------
  911|      0|    return;
  912|       |
  913|      0|  if (auto *assign = dyn_cast<AssignmentPatternNode>(node))
  ------------------
  |  Branch (913:13): [True: 0, False: 0]
  ------------------
  914|      0|    return validateDeclarationNames(declKind, assign->_left, idents);
  915|       |
  916|      0|  if (auto *array = dyn_cast<ArrayPatternNode>(node)) {
  ------------------
  |  Branch (916:13): [True: 0, False: 0]
  ------------------
  917|      0|    for (auto &elem : array->_elements) {
  ------------------
  |  Branch (917:21): [True: 0, False: 0]
  ------------------
  918|      0|      validateDeclarationNames(declKind, &elem, idents);
  919|      0|    }
  920|      0|    return;
  921|      0|  }
  922|       |
  923|      0|  if (auto *restElem = dyn_cast<RestElementNode>(node)) {
  ------------------
  |  Branch (923:13): [True: 0, False: 0]
  ------------------
  924|      0|    return validateDeclarationNames(declKind, restElem->_argument, idents);
  925|      0|  }
  926|       |
  927|      0|  if (auto *obj = dyn_cast<ObjectPatternNode>(node)) {
  ------------------
  |  Branch (927:13): [True: 0, False: 0]
  ------------------
  928|      0|    for (auto &propNode : obj->_properties) {
  ------------------
  |  Branch (928:25): [True: 0, False: 0]
  ------------------
  929|      0|      if (auto *prop = dyn_cast<PropertyNode>(&propNode)) {
  ------------------
  |  Branch (929:17): [True: 0, False: 0]
  ------------------
  930|      0|        validateDeclarationNames(declKind, prop->_value, idents);
  931|      0|      } else {
  932|      0|        auto *rest = cast<RestElementNode>(&propNode);
  933|      0|        validateDeclarationNames(declKind, rest->_argument, idents);
  934|      0|      }
  935|      0|    }
  936|      0|    return;
  937|      0|  }
  938|       |
  939|      0|  sm_.error(node->getSourceRange(), "invalid destructuring target");
  940|      0|}
_ZN6hermes3sem17SemanticValidator24validateAssignmentTargetEPKNS_6ESTree4NodeE:
  942|  4.26k|void SemanticValidator::validateAssignmentTarget(const Node *node) {
  943|  4.26k|  if (isa<EmptyNode>(node) || isLValue(node)) {
  ------------------
  |  Branch (943:7): [True: 0, False: 4.26k]
  |  Branch (943:31): [True: 4.16k, False: 97]
  ------------------
  944|  4.16k|    return;
  945|  4.16k|  }
  946|       |
  947|     97|  if (auto *assign = dyn_cast<AssignmentPatternNode>(node)) {
  ------------------
  |  Branch (947:13): [True: 0, False: 97]
  ------------------
  948|      0|    return validateAssignmentTarget(assign->_left);
  949|      0|  }
  950|       |
  951|     97|  if (auto *APN = dyn_cast<ArrayPatternNode>(node)) {
  ------------------
  |  Branch (951:13): [True: 96, False: 1]
  ------------------
  952|     96|    for (auto &elem : APN->_elements) {
  ------------------
  |  Branch (952:21): [True: 73, False: 96]
  ------------------
  953|     73|      validateAssignmentTarget(&elem);
  954|     73|    }
  955|     96|    return;
  956|     96|  }
  957|       |
  958|      1|  if (auto *RP = dyn_cast<RestElementNode>(node)) {
  ------------------
  |  Branch (958:13): [True: 0, False: 1]
  ------------------
  959|      0|    return validateAssignmentTarget(RP->_argument);
  960|      0|  }
  961|       |
  962|      1|  if (auto *obj = dyn_cast<ObjectPatternNode>(node)) {
  ------------------
  |  Branch (962:13): [True: 0, False: 1]
  ------------------
  963|      0|    for (auto &propNode : obj->_properties) {
  ------------------
  |  Branch (963:25): [True: 0, False: 0]
  ------------------
  964|      0|      if (auto *prop = dyn_cast<PropertyNode>(&propNode)) {
  ------------------
  |  Branch (964:17): [True: 0, False: 0]
  ------------------
  965|      0|        assert(
  966|      0|            prop->_kind->str() == "init" &&
  967|      0|            "getters and setters must have been reported by the parser");
  968|      0|        validateAssignmentTarget(prop->_value);
  969|      0|      } else {
  970|      0|        auto *rest = cast<RestElementNode>(&propNode);
  971|      0|        validateAssignmentTarget(rest->_argument);
  972|      0|      }
  973|      0|    }
  974|      0|    return;
  975|      0|  }
  976|       |
  977|      1|  sm_.error(node->getSourceRange(), "invalid assignment left-hand side");
  978|      1|}
_ZN6hermes3sem17SemanticValidator23setDirectiveDerivedInfoEPNS_6ESTree16FunctionLikeNodeE:
  980|   114k|void SemanticValidator::setDirectiveDerivedInfo(FunctionLikeNode *node) {
  981|   114k|  node->strictness = ESTree::makeStrictness(curFunction()->strictMode);
  982|   114k|  node->sourceVisibility = curFunction()->sourceVisibility;
  983|   114k|}
_ZN6hermes3sem17SemanticValidator22recursionDepthExceededEPNS_6ESTree4NodeE:
 1001|      9|void SemanticValidator::recursionDepthExceeded(Node *n) {
 1002|      9|  sm_.error(
 1003|      9|      n->getEndLoc(), "Too many nested expressions/statements/declarations");
 1004|      9|}
_ZN6hermes3sem15FunctionContextC2EPNS0_17SemanticValidatorEbPNS_6ESTree16FunctionLikeNodeENS_16SourceVisibilityE:
 1019|   114k|      sourceVisibility(sourceVisibility) {
 1020|   114k|  validator->funcCtx_ = this;
 1021|       |
 1022|   114k|  if (node)
  ------------------
  |  Branch (1022:7): [True: 114k, False: 0]
  ------------------
 1023|   114k|    node->setSemInfo(semInfo);
 1024|   114k|}
_ZN6hermes3sem15FunctionContextD2Ev:
 1026|   114k|FunctionContext::~FunctionContext() {
 1027|   114k|  validator_->funcCtx_ = oldContextValue_;
 1028|   114k|}
SemanticValidator.cpp:_ZZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree20LabeledStatementNodeEENK3$_0clEv:
  309|  42.8k|  const auto &deleter = llvh::make_scope_exit([=]() {
  310|  42.8k|    if (insertRes.second)
  ------------------
  |  Branch (310:9): [True: 42.8k, False: 0]
  ------------------
  311|  42.8k|      curFunction()->labelMap.erase(id->_name);
  312|  42.8k|  });

_ZN6hermes3sem17SemanticValidator17incRecursionDepthEPNS_6ESTree4NodeE:
  130|  2.03M|  bool incRecursionDepth(Node *n) {
  131|  2.03M|    if (LLVM_UNLIKELY(recursionDepth_ == 0))
  ------------------
  |  |  189|  2.03M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4.08k, False: 2.03M]
  |  |  ------------------
  ------------------
  132|  4.08k|      return false;
  133|  2.03M|    --recursionDepth_;
  134|  2.03M|    if (LLVM_UNLIKELY(recursionDepth_ == 0)) {
  ------------------
  |  |  189|  2.03M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 2.03M]
  |  |  ------------------
  ------------------
  135|      4|      recursionDepthExceeded(n);
  136|      4|      return false;
  137|      4|    }
  138|  2.03M|    return true;
  139|  2.03M|  }
_ZN6hermes3sem17SemanticValidator17decRecursionDepthEv:
  144|  2.03M|  void decRecursionDepth() {
  145|  2.03M|    assert(
  146|  2.03M|        recursionDepth_ < MAX_RECURSION_DEPTH &&
  147|  2.03M|        "recursionDepth_ cannot go negative");
  148|  2.03M|    if (LLVM_LIKELY(recursionDepth_ != 0))
  ------------------
  |  |  188|  2.03M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.02M, False: 4.09k]
  |  |  ------------------
  ------------------
  149|  2.02M|      ++recursionDepth_;
  150|  2.03M|  }
_ZN6hermes3sem17SemanticValidator5visitEPNS_6ESTree4NodeE:
  154|  1.38M|  void visit(Node *node) {
  155|  1.38M|    visitESTreeChildren(*this, node);
  156|  1.38M|  }
_ZNK6hermes3sem17SemanticValidator17haveActiveContextEv:
  223|   229k|  inline bool haveActiveContext() const {
  224|   229k|    return funcCtx_ != nullptr;
  225|   229k|  }
_ZN6hermes3sem17SemanticValidator11curFunctionEv:
  227|  1.15M|  inline FunctionContext *curFunction() {
  228|  1.15M|    assert(funcCtx_ && "No active function context");
  229|      0|    return funcCtx_;
  230|  1.15M|  }
_ZNK6hermes3sem15FunctionContext13isGlobalScopeEv:
  343|   114k|  bool isGlobalScope() const {
  344|   114k|    return !oldContextValue_;
  345|   114k|  }
_ZN6hermes3sem15FunctionContext13allocateLabelEv:
  348|  42.8k|  unsigned allocateLabel() {
  349|  42.8k|    return semInfo->allocateLabel();
  350|  42.8k|  }

_ZN6hermes17constructCatchMapEPNS_8FunctionERN4llvh8DenseMapIPNS_9CatchInstENS_17CatchCoverageInfoENS2_12DenseMapInfoIS5_EENS2_6detail12DenseMapPairIS5_S6_EEEERNS2_15SmallVectorImplIS5_EERNS2_15SmallPtrSetImplIPNS_10BasicBlockEEESJ_j:
   27|     14|    uint32_t maxRecursionDepth) {
   28|     14|  assert(
   29|     14|      !llvh::isa<CatchInst>(startBlock->front()) &&
   30|     14|      "Functions and try bodies should never start with a catch instruction.");
   31|     14|  if (maxRecursionDepth == 0) {
  ------------------
  |  Branch (31:7): [True: 0, False: 14]
  ------------------
   32|      0|    F->getContext().getSourceErrorManager().error(
   33|      0|        F->getSourceRange(), "Too deeply nested try/catch");
   34|      0|    return llvh::None;
   35|      0|  }
   36|       |
   37|       |  // Stack to DFS through the CFG.
   38|     14|  llvh::SmallVector<BasicBlock *, 4> stack;
   39|       |  // Track each of the basic blocks that start with a TryEndInst corresponding
   40|       |  // to the current try.
   41|     14|  llvh::SmallPtrSet<BasicBlock *, 4> tryEndBlocks;
   42|       |
   43|     14|  visited.insert(startBlock);
   44|     14|  stack.push_back(startBlock);
   45|  39.3k|  while (!stack.empty()) {
  ------------------
  |  Branch (45:10): [True: 39.3k, False: 14]
  ------------------
   46|  39.3k|    BasicBlock *currentBlock = stack.pop_back_val();
   47|  39.3k|    assert(
   48|  39.3k|        visited.count(currentBlock) &&
   49|  39.3k|        "All blocks on the stack must be marked as visited.");
   50|       |
   51|       |    // For every nested try that's alive, we add the basic block into it.
   52|      0|    for (const auto &aliveCatch : aliveCatches)
  ------------------
  |  Branch (52:33): [True: 24, False: 39.3k]
  ------------------
   53|     24|      catchInfoMap[aliveCatch].coveredBlockList.push_back(currentBlock);
   54|       |
   55|  39.3k|    auto *tryStartInst =
   56|  39.3k|        llvh::dyn_cast<TryStartInst>(currentBlock->getTerminator());
   57|       |
   58|  39.3k|    if (!tryStartInst) {
  ------------------
  |  Branch (58:9): [True: 39.3k, False: 12]
  ------------------
   59|       |      // Common case: no TryStartInst, we add successors to the stack.
   60|  39.3k|      for (BasicBlock *successor : successors(currentBlock)) {
  ------------------
  |  Branch (60:34): [True: 39.3k, False: 39.3k]
  ------------------
   61|       |        // If this block marks the end of the try, then add it to tryEndBlocks,
   62|       |        // but not to the stack. It will be visited by the caller.
   63|       |        // Otherwise, add unvisited blocks to the stack.
   64|  39.3k|        if (llvh::isa<TryEndInst>(&successor->front()))
  ------------------
  |  Branch (64:13): [True: 12, False: 39.3k]
  ------------------
   65|     12|          tryEndBlocks.insert(successor);
   66|  39.3k|        else if (visited.insert(successor).second)
  ------------------
  |  Branch (66:18): [True: 39.2k, False: 64]
  ------------------
   67|  39.2k|          stack.push_back(successor);
   68|  39.3k|      }
   69|  39.3k|      continue;
   70|  39.3k|    }
   71|       |
   72|       |    // Hit a TryStartInst, marking the start of a new try region.
   73|       |    // The first instruction of the catch target block must be CatchInst.
   74|     12|    auto catchInst = cast<CatchInst>(&tryStartInst->getCatchTarget()->front());
   75|     12|    catchInfoMap[catchInst].depth = aliveCatches.size();
   76|       |
   77|       |    // Pushing the CatchInst to the try stack, and continue scan the try body.
   78|     12|    aliveCatches.push_back(catchInst);
   79|     12|    auto endBlocks = constructCatchMap(
   80|     12|        F,
   81|     12|        catchInfoMap,
   82|     12|        aliveCatches,
   83|     12|        visited,
   84|     12|        tryStartInst->getTryBody(),
   85|     12|        maxRecursionDepth - 1);
   86|     12|    if (!endBlocks)
  ------------------
  |  Branch (86:9): [True: 0, False: 12]
  ------------------
   87|      0|      return llvh::None;
   88|     12|    aliveCatches.pop_back();
   89|       |
   90|     12|    for (BasicBlock *endBlock : *endBlocks) {
  ------------------
  |  Branch (90:31): [True: 12, False: 12]
  ------------------
   91|     12|      assert(
   92|     12|          visited.count(endBlock) == 0 &&
   93|     12|          "End blocks must be dominated by the try start.");
   94|      0|      assert(
   95|     12|          llvh::isa<TryEndInst>(&endBlock->front()) &&
   96|     12|          "End blocks must start with TryEndInst.");
   97|      0|      visited.insert(endBlock);
   98|     12|      stack.push_back(endBlock);
   99|     12|    }
  100|       |
  101|       |    // We also want to continue scan into the catch blocks.
  102|     12|    BasicBlock *catchTarget = tryStartInst->getCatchTarget();
  103|     12|    assert(
  104|     12|        visited.count(catchTarget) == 0 &&
  105|     12|        "Catch block must be dominated by the try start.");
  106|      0|    visited.insert(catchTarget);
  107|     12|    stack.push_back(catchTarget);
  108|     12|  }
  109|     14|  assert(
  110|     14|      (aliveCatches.size() || !tryEndBlocks.size()) &&
  111|     14|      "Block without live catches cannot have TryEndInst.");
  112|      0|  return tryEndBlocks;
  113|     14|}
_ZN6hermes25generateExceptionHandlersERN4llvh8DenseMapIPNS_9CatchInstENS_17CatchCoverageInfoENS0_12DenseMapInfoIS3_EENS0_6detail12DenseMapPairIS3_S4_EEEERNS1_IPNS_10BasicBlockENSt3__14pairIjjEENS5_ISD_EENS8_ISD_SG_EEEEPNS_8FunctionE:
  118|      2|    Function *F) {
  119|       |  // Construct the list of blocks and depth covered by each CatchInst.
  120|      2|  llvh::SmallVector<CatchInst *, 4> aliveCatches{};
  121|      2|  llvh::SmallPtrSet<BasicBlock *, 32> visited{};
  122|      2|  static constexpr uint32_t MAX_RECURSION_DEPTH = 1024;
  123|      2|  if (!constructCatchMap(
  ------------------
  |  Branch (123:7): [True: 0, False: 2]
  ------------------
  124|      2|          F,
  125|      2|          catchInfoMap,
  126|      2|          aliveCatches,
  127|      2|          visited,
  128|      2|          &F->front(),
  129|      2|          MAX_RECURSION_DEPTH))
  130|      0|    return {};
  131|       |
  132|      2|  ExceptionEntryList exception_entries;
  133|     12|  for (auto I : catchInfoMap) {
  ------------------
  |  Branch (133:15): [True: 12, False: 2]
  ------------------
  134|     12|    auto &catchInfo = I.second;
  135|       |    // The basic blocks covered by a catch instruction may not be continuous.
  136|       |    // For each basic block, we walk through the current list of ranges,
  137|       |    // and try to merge them into a minimum number of ranges.
  138|     12|    llvh::SmallVector<std::pair<uint32_t, uint32_t>, 4> catch_ranges;
  139|     24|    for (auto BB : catchInfo.coveredBlockList) {
  ------------------
  |  Branch (139:18): [True: 24, False: 12]
  ------------------
  140|     24|      auto it = bbMap.find(BB);
  141|     24|      assert(it != bbMap.end() && "Basic Block missing.");
  142|       |
  143|      0|      auto resolved_loc = it->second;
  144|     24|      if (resolved_loc.first == resolved_loc.second) {
  ------------------
  |  Branch (144:11): [True: 12, False: 12]
  ------------------
  145|       |        // Empty basic block, skip.
  146|     12|        continue;
  147|     12|      }
  148|     12|      catch_ranges.push_back(resolved_loc);
  149|     12|    }
  150|     12|    std::sort(catch_ranges.begin(), catch_ranges.end());
  151|       |    // After ranges are sorted, a range could only be merged with it's
  152|       |    // previous range, if they are adjacent.
  153|       |    // Note: no range can overlap, as basic blocks do not overlap.
  154|     12|    int nextIndex = 0;
  155|     12|    for (auto resolved_loc : catch_ranges) {
  ------------------
  |  Branch (155:28): [True: 12, False: 12]
  ------------------
  156|       |      // If we are looking at the first range, or the range cannot
  157|       |      // be merged with the previous range, we store this range.
  158|     12|      if (nextIndex == 0 ||
  ------------------
  |  Branch (158:11): [True: 6, False: 6]
  ------------------
  159|     12|          catch_ranges[nextIndex - 1].second != resolved_loc.first) {
  ------------------
  |  Branch (159:11): [True: 0, False: 6]
  ------------------
  160|      6|        catch_ranges[nextIndex++] = resolved_loc;
  161|      6|        continue;
  162|      6|      }
  163|       |      // Otherwise we merge with the previous range.
  164|      6|      catch_ranges[nextIndex - 1].second = resolved_loc.second;
  165|      6|    }
  166|       |    // The merging happened in-place. Hence we need to throw away the rest.
  167|     12|    catch_ranges.resize(nextIndex);
  168|       |    // For each range, we register it as an exception handler entry.
  169|     12|    for (auto range : catch_ranges) {
  ------------------
  |  Branch (169:21): [True: 6, False: 12]
  ------------------
  170|      6|      exception_entries.push_back(
  171|      6|          {(uint32_t)range.first,
  172|      6|           (uint32_t)range.second,
  173|      6|           (uint32_t)catchInfo.catchLocation,
  174|      6|           catchInfo.depth});
  175|      6|    }
  176|     12|  }
  177|       |  // Sort ranges by depth. In hermes, depth increase when you nest try inside
  178|       |  // try/catch/finally.
  179|      2|  std::sort(exception_entries.begin(), exception_entries.end());
  180|      2|  return exception_entries;
  181|      2|}

_ZN6hermes3hbc14BackendContextC2Ev:
   13|     56|BackendContext::BackendContext() = default;
_ZN6hermes3hbc14BackendContextD2Ev:
   14|     56|BackendContext::~BackendContext() = default;
_ZN6hermes3hbc14BackendContext3getERNS_7ContextE:
   16|   114k|BackendContext &BackendContext::get(Context &ctx) {
   17|   114k|  if (!ctx.getHBCBackendContext())
  ------------------
  |  Branch (17:7): [True: 56, False: 114k]
  ------------------
   18|     56|    ctx.setHBCBackendContext(
   19|     56|        std::shared_ptr<BackendContext>{new BackendContext()});
   20|   114k|  return *ctx.getHBCBackendContext();
   21|   114k|};

_ZN6hermes3hbc14BytecodeModule11setFunctionEjNSt3__110unique_ptrINS0_16BytecodeFunctionENS2_14default_deleteIS4_EEEE:
   18|   114k|    std::unique_ptr<BytecodeFunction> F) {
   19|   114k|  assert(index < getNumFunctions() && "Function ID out of bound");
   20|      0|  functions_[index] = std::move(F);
   21|   114k|}
_ZN6hermes3hbc14BytecodeModule11getFunctionEj:
   23|  1.88k|BytecodeFunction &BytecodeModule::getFunction(unsigned index) {
   24|  1.88k|  assert(index < getNumFunctions() && "Function ID out of bound");
   25|      0|  assert(functions_[index] && "Invalid function");
   26|      0|  return *functions_[index];
   27|  1.88k|}

_ZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormE:
  204|    198|    BytecodeForm form) {
  205|    198|  if (!sanityCheck(buffer, form, outError)) {
  ------------------
  |  Branch (205:7): [True: 0, False: 198]
  ------------------
  206|      0|    return false;
  207|      0|  }
  208|       |
  209|       |  // Helper type which populates a BytecodeFileFields. This is nested inside the
  210|       |  // function so we can leverage BytecodeFileFields template types.
  211|    198|  struct BytecodeFileFieldsPopulator {
  212|       |    /// The fields being populated.
  213|    198|    BytecodeFileFields &f;
  214|       |
  215|       |    /// Current buffer position.
  216|    198|    Pointer<uint8_t> buf;
  217|       |
  218|       |    /// A pointer to the bytecode file header.
  219|    198|    const BytecodeFileHeader *h;
  220|       |
  221|       |    /// End of buffer.
  222|    198|    const uint8_t *end;
  223|       |
  224|    198|    BytecodeFileFieldsPopulator(
  225|    198|        BytecodeFileFields &fields,
  226|    198|        Pointer<uint8_t> buffer,
  227|    198|        const uint8_t *bufEnd)
  228|    198|        : f(fields), buf(buffer), end(bufEnd) {
  229|    198|      f.header = castData<BytecodeFileHeader>(buf);
  230|    198|      h = f.header;
  231|    198|    }
  232|       |
  233|    198|    void visitFunctionHeaders() {
  234|    198|      align(buf);
  235|    198|      f.functionHeaders =
  236|    198|          castArrayRef<SmallFuncHeader>(buf, h->functionCount, end);
  237|    198|    }
  238|       |
  239|    198|    void visitStringKinds() {
  240|    198|      align(buf);
  241|    198|      f.stringKinds =
  242|    198|          castArrayRef<StringKind::Entry>(buf, h->stringKindCount, end);
  243|    198|    }
  244|       |
  245|    198|    void visitIdentifierHashes() {
  246|    198|      align(buf);
  247|    198|      f.identifierHashes = castArrayRef<uint32_t>(buf, h->identifierCount, end);
  248|    198|    }
  249|       |
  250|    198|    void visitSmallStringTable() {
  251|    198|      align(buf);
  252|    198|      f.stringTableEntries =
  253|    198|          castArrayRef<SmallStringTableEntry>(buf, h->stringCount, end);
  254|    198|    }
  255|       |
  256|    198|    void visitOverflowStringTable() {
  257|    198|      align(buf);
  258|    198|      f.stringTableOverflowEntries = castArrayRef<OverflowStringTableEntry>(
  259|    198|          buf, h->overflowStringCount, end);
  260|    198|    }
  261|       |
  262|    198|    void visitStringStorage() {
  263|    198|      align(buf);
  264|    198|      f.stringStorage =
  265|    198|          castArrayRef<unsigned char>(buf, h->stringStorageSize, end);
  266|    198|    }
  267|    198|    void visitArrayBuffer() {
  268|    198|      align(buf);
  269|    198|      f.arrayBuffer = castArrayRef<unsigned char>(buf, h->arrayBufferSize, end);
  270|    198|    }
  271|    198|    void visitObjectKeyBuffer() {
  272|    198|      align(buf);
  273|    198|      f.objKeyBuffer =
  274|    198|          castArrayRef<unsigned char>(buf, h->objKeyBufferSize, end);
  275|    198|    }
  276|    198|    void visitObjectValueBuffer() {
  277|    198|      align(buf);
  278|    198|      f.objValueBuffer =
  279|    198|          castArrayRef<unsigned char>(buf, h->objValueBufferSize, end);
  280|    198|    }
  281|    198|    void visitBigIntTable() {
  282|    198|      align(buf);
  283|    198|      f.bigIntTable =
  284|    198|          castArrayRef<bigint::BigIntTableEntry>(buf, h->bigIntCount, end);
  285|    198|    }
  286|    198|    void visitBigIntStorage() {
  287|    198|      align(buf);
  288|    198|      f.bigIntStorage =
  289|    198|          castArrayRef<unsigned char>(buf, h->bigIntStorageSize, end);
  290|    198|    }
  291|    198|    void visitRegExpTable() {
  292|    198|      align(buf);
  293|    198|      f.regExpTable = castArrayRef<RegExpTableEntry>(buf, h->regExpCount, end);
  294|    198|    }
  295|    198|    void visitRegExpStorage() {
  296|    198|      align(buf);
  297|    198|      f.regExpStorage =
  298|    198|          castArrayRef<unsigned char>(buf, h->regExpStorageSize, end);
  299|    198|    }
  300|    198|    void visitCJSModuleTable() {
  301|    198|      align(buf);
  302|    198|      if (h->options.cjsModulesStaticallyResolved) {
  303|       |        // Modules have been statically resolved.
  304|    198|        f.cjsModuleTableStatic = castArrayRef<std::pair<uint32_t, uint32_t>>(
  305|    198|            buf, h->cjsModuleCount, end);
  306|    198|      } else {
  307|       |        // Modules are not resolved, use the filename -> function ID mapping.
  308|    198|        f.cjsModuleTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  309|    198|            buf, h->cjsModuleCount, end);
  310|    198|      }
  311|    198|    }
  312|    198|    void visitFunctionSourceTable() {
  313|    198|      align(buf);
  314|    198|      f.functionSourceTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  315|    198|          buf, h->functionSourceCount, end);
  316|    198|    }
  317|    198|  };
  318|       |
  319|    198|  BytecodeFileFieldsPopulator populator{*this, buffer.data(), buffer.end()};
  320|    198|  visitBytecodeSegmentsInOrder(populator);
  321|    198|  return true;
  322|    198|}
_ZNK6hermes3hbc14BCProviderBase21findCatchTargetOffsetEjj:
  330|     24|    uint32_t exceptionOffset) const {
  331|     24|  auto exceptions = getExceptionTable(functionID);
  332|     30|  for (unsigned i = 0, e = exceptions.size(); i < e; ++i) {
  ------------------
  |  Branch (332:47): [True: 6, False: 24]
  ------------------
  333|      6|    if (exceptions[i].start <= exceptionOffset &&
  ------------------
  |  Branch (333:9): [True: 0, False: 6]
  ------------------
  334|      6|        exceptionOffset < exceptions[i].end) {
  ------------------
  |  Branch (334:9): [True: 0, False: 0]
  ------------------
  335|      0|      return exceptions[i].target;
  336|      0|    }
  337|      6|  }
  338|       |  // No handler is found.
  339|     24|  return -1;
  340|     24|}
_ZN6hermes3hbc20BCProviderFromBuffer10stopWarmupEv:
  393|    198|void BCProviderFromBuffer::stopWarmup() {
  394|    198|  if (warmupThread_) {
  ------------------
  |  Branch (394:7): [True: 0, False: 198]
  ------------------
  395|      0|    warmupAbortFlag_.store(true, std::memory_order_release);
  396|      0|    warmupThread_->join();
  397|      0|    warmupThread_.reset();
  398|      0|  }
  399|    198|}
_ZN6hermes3hbc20BCProviderFromBufferC2ENSt3__110unique_ptrIKNS_6BufferENS2_14default_deleteIS5_EEEENS0_12BytecodeFormE:
  557|    198|      end_(bufferPtr_ + buffer_->size()) {
  558|    198|  ConstBytecodeFileFields fields;
  559|    198|  if (!fields.populateFromBuffer(
  ------------------
  |  Branch (559:7): [True: 0, False: 198]
  ------------------
  560|    198|          {bufferPtr_, buffer_->size()}, &errstr_, form)) {
  561|      0|    return;
  562|      0|  }
  563|    198|  const auto *fileHeader = fields.header;
  564|    198|  options_ = fileHeader->options;
  565|    198|  functionCount_ = fileHeader->functionCount;
  566|    198|  globalFunctionIndex_ = fileHeader->globalCodeIndex;
  567|    198|  debugInfoOffset_ = fileHeader->debugInfoOffset;
  568|    198|  functionHeaders_ = fields.functionHeaders.data();
  569|    198|  stringKinds_ = fields.stringKinds;
  570|    198|  identifierHashes_ = fields.identifierHashes;
  571|    198|  stringCount_ = fileHeader->stringCount;
  572|    198|  stringTableEntries_ = fields.stringTableEntries.data();
  573|    198|  overflowStringTableEntries_ = fields.stringTableOverflowEntries;
  574|    198|  stringStorage_ = fields.stringStorage;
  575|    198|  arrayBuffer_ = fields.arrayBuffer;
  576|    198|  objKeyBuffer_ = fields.objKeyBuffer;
  577|    198|  objValueBuffer_ = fields.objValueBuffer;
  578|    198|  bigIntTable_ = fields.bigIntTable;
  579|    198|  bigIntStorage_ = fields.bigIntStorage;
  580|    198|  regExpTable_ = fields.regExpTable;
  581|    198|  regExpStorage_ = fields.regExpStorage;
  582|    198|  segmentID_ = fileHeader->segmentID;
  583|    198|  cjsModuleTable_ = fields.cjsModuleTable;
  584|    198|  cjsModuleTableStatic_ = fields.cjsModuleTableStatic;
  585|    198|  functionSourceTable_ = fields.functionSourceTable;
  586|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulatorC2ERS2_PKhSI_:
  228|    198|        : f(fields), buf(buffer), end(bufEnd) {
  229|    198|      f.header = castData<BytecodeFileHeader>(buf);
  230|    198|      h = f.header;
  231|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_111sanityCheckEN4llvh8ArrayRefIhEENS0_12BytecodeFormEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEE:
   56|    198|    std::string *errorMessage) {
   57|    198|  if (aref.size() < sizeof(hbc::BytecodeFileHeader)) {
  ------------------
  |  Branch (57:7): [True: 0, False: 198]
  ------------------
   58|      0|    if (errorMessage) {
  ------------------
  |  Branch (58:9): [True: 0, False: 0]
  ------------------
   59|      0|      llvh::raw_string_ostream errs(*errorMessage);
   60|      0|      errs << "Buffer smaller than a bytecode file header. Expected at least "
   61|      0|           << sizeof(hbc::BytecodeFileHeader) << " bytes but got "
   62|      0|           << aref.size() << " bytes";
   63|      0|    }
   64|      0|    return false;
   65|      0|  }
   66|       |
   67|       |  // Ensure the data is aligned to be able to read an int from the start.
   68|    198|  if (llvh::alignAddr(aref.data(), BYTECODE_ALIGNMENT) !=
  ------------------
  |  Branch (68:7): [True: 0, False: 198]
  ------------------
   69|    198|      (uintptr_t)aref.data()) {
   70|      0|    if (errorMessage) {
  ------------------
  |  Branch (70:9): [True: 0, False: 0]
  ------------------
   71|      0|      *errorMessage = "Buffer misaligned.";
   72|      0|    }
   73|      0|    return false;
   74|      0|  }
   75|       |
   76|    198|  const auto *header =
   77|    198|      reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
   78|       |
   79|    198|  auto magic = (form == BytecodeForm::Delta ? DELTA_MAGIC : MAGIC);
  ------------------
  |  Branch (79:17): [True: 0, False: 198]
  ------------------
   80|    198|  if (header->magic != magic) {
  ------------------
  |  Branch (80:7): [True: 0, False: 198]
  ------------------
   81|      0|    if (errorMessage) {
  ------------------
  |  Branch (81:9): [True: 0, False: 0]
  ------------------
   82|      0|      *errorMessage = "Incorrect magic number";
   83|      0|    }
   84|      0|    return false;
   85|      0|  }
   86|    198|  if (header->version != hbc::BYTECODE_VERSION) {
  ------------------
  |  Branch (86:7): [True: 0, False: 198]
  ------------------
   87|      0|    if (errorMessage) {
  ------------------
  |  Branch (87:9): [True: 0, False: 0]
  ------------------
   88|      0|      llvh::raw_string_ostream errs(*errorMessage);
   89|      0|      errs << "Wrong bytecode version. Expected " << hbc::BYTECODE_VERSION
   90|      0|           << " but got " << header->version;
   91|      0|    }
   92|      0|    return false;
   93|      0|  }
   94|    198|  if (header->functionCount == 0) {
  ------------------
  |  Branch (94:7): [True: 0, False: 198]
  ------------------
   95|      0|    if (errorMessage) {
  ------------------
  |  Branch (95:9): [True: 0, False: 0]
  ------------------
   96|      0|      *errorMessage = "Bytecode does not contain any functions";
   97|      0|    }
   98|      0|    return false;
   99|      0|  }
  100|    198|  if (aref.size() < header->fileLength) {
  ------------------
  |  Branch (100:7): [True: 0, False: 198]
  ------------------
  101|      0|    if (errorMessage) {
  ------------------
  |  Branch (101:9): [True: 0, False: 0]
  ------------------
  102|      0|      llvh::raw_string_ostream errs(*errorMessage);
  103|      0|      errs
  104|      0|          << "Buffer is smaller than the size stated in the file header. Expected at least "
  105|      0|          << header->fileLength << " bytes but got " << aref.size() << " bytes";
  106|      0|    }
  107|      0|    return false;
  108|      0|  }
  109|    198|#ifdef HERMES_SLOW_DEBUG
  110|    198|  if (!hashIsValid(aref)) {
  ------------------
  |  Branch (110:7): [True: 0, False: 198]
  ------------------
  111|      0|    if (errorMessage) {
  ------------------
  |  Branch (111:9): [True: 0, False: 0]
  ------------------
  112|      0|      *errorMessage = "Bytecode hash mismatch";
  113|      0|    }
  114|      0|    return false;
  115|      0|  }
  116|    198|#endif
  117|    198|  return true;
  118|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_18castDataINS0_18BytecodeFileHeaderEEEPKT_RPKh:
  149|    198|const T *castData(const uint8_t *&buf) {
  150|    198|  auto ret = alignCheckCast<T>(buf);
  151|    198|  buf += sizeof(T);
  152|    198|  return ret;
  153|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_18BytecodeFileHeaderEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefIhEEN4llvh8ArrayRefIT_EERPKhmS8_:
  168|  1.18k|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|  1.18k|  auto ptr = alignCheckCast<T>(buf);
  170|  1.18k|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|  2.37k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.18k]
  |  |  |  Branch (189:53): [True: 0, False: 1.18k]
  |  |  |  Branch (189:53): [True: 0, False: 1.18k]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|  1.18k|  buf += size * sizeof(T);
  173|  1.18k|  return {ptr, size};
  174|  1.18k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastIhEEPKT_PKh:
  123|  1.18k|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|  1.18k|  static_assert(
  128|  1.18k|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|  1.18k|  assert(
  130|  1.18k|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|  1.18k|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|  1.18k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_15alignERPKhj:
  189|  2.97k|void align(const uint8_t *&buf, uint32_t alignment = BYTECODE_ALIGNMENT) {
  190|  2.97k|  buf = (const uint8_t *)llvh::alignAddr(buf, alignment);
  191|  2.97k|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_111hashIsValidEN4llvh8ArrayRefIhEE:
   23|    198|static bool hashIsValid(llvh::ArrayRef<uint8_t> aref) {
   24|    198|  const auto *header =
   25|    198|      reinterpret_cast<const hbc::BytecodeFileHeader *>(aref.data());
   26|    198|  assert(
   27|    198|      header->version == hbc::BYTECODE_VERSION &&
   28|    198|      "must perform basic checks first");
   29|       |  // Use fileLength rather than aref.end() since there may be an epilogue.
   30|      0|  const auto *footer = reinterpret_cast<const hbc::BytecodeFileFooter *>(
   31|    198|      aref.data() + header->fileLength - sizeof(BytecodeFileFooter));
   32|    198|  SHA1 actual = llvh::SHA1::hash(llvh::ArrayRef<uint8_t>(
   33|    198|      aref.begin(), reinterpret_cast<const uint8_t *>(footer)));
   34|    198|  return std::equal(actual.begin(), actual.end(), footer->fileHash);
   35|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator20visitFunctionHeadersEv:
  233|    198|    void visitFunctionHeaders() {
  234|    198|      align(buf);
  235|    198|      f.functionHeaders =
  236|    198|          castArrayRef<SmallFuncHeader>(buf, h->functionCount, end);
  237|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_15SmallFuncHeaderEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_15SmallFuncHeaderEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitStringKindsEv:
  239|    198|    void visitStringKinds() {
  240|    198|      align(buf);
  241|    198|      f.stringKinds =
  242|    198|          castArrayRef<StringKind::Entry>(buf, h->stringKindCount, end);
  243|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_10StringKind5EntryEEEN4llvh8ArrayRefIT_EERPKhmSA_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_10StringKind5EntryEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator21visitIdentifierHashesEv:
  245|    198|    void visitIdentifierHashes() {
  246|    198|      align(buf);
  247|    198|      f.identifierHashes = castArrayRef<uint32_t>(buf, h->identifierCount, end);
  248|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefIjEEN4llvh8ArrayRefIT_EERPKhmS8_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastIjEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator21visitSmallStringTableEv:
  250|    198|    void visitSmallStringTable() {
  251|    198|      align(buf);
  252|    198|      f.stringTableEntries =
  253|    198|          castArrayRef<SmallStringTableEntry>(buf, h->stringCount, end);
  254|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_21SmallStringTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_21SmallStringTableEntryEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator24visitOverflowStringTableEv:
  256|    198|    void visitOverflowStringTable() {
  257|    198|      align(buf);
  258|    198|      f.stringTableOverflowEntries = castArrayRef<OverflowStringTableEntry>(
  259|    198|          buf, h->overflowStringCount, end);
  260|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS0_24OverflowStringTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS0_24OverflowStringTableEntryEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitStringStorageEv:
  262|    198|    void visitStringStorage() {
  263|    198|      align(buf);
  264|    198|      f.stringStorage =
  265|    198|          castArrayRef<unsigned char>(buf, h->stringStorageSize, end);
  266|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitArrayBufferEv:
  267|    198|    void visitArrayBuffer() {
  268|    198|      align(buf);
  269|    198|      f.arrayBuffer = castArrayRef<unsigned char>(buf, h->arrayBufferSize, end);
  270|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator20visitObjectKeyBufferEv:
  271|    198|    void visitObjectKeyBuffer() {
  272|    198|      align(buf);
  273|    198|      f.objKeyBuffer =
  274|    198|          castArrayRef<unsigned char>(buf, h->objKeyBufferSize, end);
  275|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator22visitObjectValueBufferEv:
  276|    198|    void visitObjectValueBuffer() {
  277|    198|      align(buf);
  278|    198|      f.objValueBuffer =
  279|    198|          castArrayRef<unsigned char>(buf, h->objValueBufferSize, end);
  280|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitBigIntTableEv:
  281|    198|    void visitBigIntTable() {
  282|    198|      align(buf);
  283|    198|      f.bigIntTable =
  284|    198|          castArrayRef<bigint::BigIntTableEntry>(buf, h->bigIntCount, end);
  285|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_6bigint16BigIntTableEntryEEEN4llvh8ArrayRefIT_EERPKhmSA_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_6bigint16BigIntTableEntryEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitBigIntStorageEv:
  286|    198|    void visitBigIntStorage() {
  287|    198|      align(buf);
  288|    198|      f.bigIntStorage =
  289|    198|          castArrayRef<unsigned char>(buf, h->bigIntStorageSize, end);
  290|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator16visitRegExpTableEv:
  291|    198|    void visitRegExpTable() {
  292|    198|      align(buf);
  293|    198|      f.regExpTable = castArrayRef<RegExpTableEntry>(buf, h->regExpCount, end);
  294|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINS_16RegExpTableEntryEEEN4llvh8ArrayRefIT_EERPKhmS9_:
  168|    198|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    198|  auto ptr = alignCheckCast<T>(buf);
  170|    198|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    396|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  |  Branch (189:53): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    198|  buf += size * sizeof(T);
  173|    198|  return {ptr, size};
  174|    198|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINS_16RegExpTableEntryEEEPKT_PKh:
  123|    198|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    198|  static_assert(
  128|    198|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    198|  assert(
  130|    198|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    198|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    198|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator18visitRegExpStorageEv:
  295|    198|    void visitRegExpStorage() {
  296|    198|      align(buf);
  297|    198|      f.regExpStorage =
  298|    198|          castArrayRef<unsigned char>(buf, h->regExpStorageSize, end);
  299|    198|    }
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator19visitCJSModuleTableEv:
  300|    198|    void visitCJSModuleTable() {
  301|    198|      align(buf);
  302|    198|      if (h->options.cjsModulesStaticallyResolved) {
  ------------------
  |  Branch (302:11): [True: 0, False: 198]
  ------------------
  303|       |        // Modules have been statically resolved.
  304|      0|        f.cjsModuleTableStatic = castArrayRef<std::pair<uint32_t, uint32_t>>(
  305|      0|            buf, h->cjsModuleCount, end);
  306|    198|      } else {
  307|       |        // Modules are not resolved, use the filename -> function ID mapping.
  308|    198|        f.cjsModuleTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  309|    198|            buf, h->cjsModuleCount, end);
  310|    198|      }
  311|    198|    }
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_112castArrayRefINSt3__14pairIjjEEEEN4llvh8ArrayRefIT_EERPKhmSB_:
  168|    396|castArrayRef(const uint8_t *&buf, size_t size, const uint8_t *end) {
  169|    396|  auto ptr = alignCheckCast<T>(buf);
  170|    396|  if (LLVM_UNLIKELY(buf > end || size > (end - buf) / sizeof(T)))
  ------------------
  |  |  189|    792|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 396]
  |  |  |  Branch (189:53): [True: 0, False: 396]
  |  |  |  Branch (189:53): [True: 0, False: 396]
  |  |  ------------------
  ------------------
  171|      0|    hermes_fatal("overflow past end of bytecode");
  172|    396|  buf += size * sizeof(T);
  173|    396|  return {ptr, size};
  174|    396|}
BytecodeDataProvider.cpp:_ZN6hermes3hbc12_GLOBAL__N_114alignCheckCastINSt3__14pairIjjEEEEPKT_PKh:
  123|    396|const T *alignCheckCast(const uint8_t *buf) {
  124|       |  // We pad the offset of each data structure by BYTECODE_ALIGNMENT bytes, hence
  125|       |  // we cannot support casting to any data structure that requires more than 4
  126|       |  // bytes alignment, which may lead to undefined behavior.
  127|    396|  static_assert(
  128|    396|      alignof(T) <= BYTECODE_ALIGNMENT, "Cannot handle the alignment");
  129|    396|  assert(
  130|    396|      (llvh::alignAddr(buf, alignof(T)) == (uintptr_t)buf) &&
  131|    396|      "buf is not properly aligned");
  132|      0|  return reinterpret_cast<const T *>(buf);
  133|    396|}
_ZZN6hermes3hbc18BytecodeFileFieldsILb0EE18populateFromBufferEN4llvh8ArrayRefIhEEPNSt3__112basic_stringIcNS6_11char_traitsIcEENS6_9allocatorIcEEEENS0_12BytecodeFormEEN27BytecodeFileFieldsPopulator24visitFunctionSourceTableEv:
  312|    198|    void visitFunctionSourceTable() {
  313|    198|      align(buf);
  314|    198|      f.functionSourceTable = castArrayRef<std::pair<uint32_t, uint32_t>>(
  315|    198|          buf, h->functionSourceCount, end);
  316|    198|    }

_ZNK6hermes3hbc25BytecodeFunctionGenerator11getStringIDEPNS_13LiteralStringE:
   20|  23.1k|unsigned BytecodeFunctionGenerator::getStringID(LiteralString *value) const {
   21|  23.1k|  return BMGen_.getStringID(value->getValue().str());
   22|  23.1k|}
_ZNK6hermes3hbc25BytecodeFunctionGenerator15getIdentifierIDEPNS_13LiteralStringE:
   25|   139k|    LiteralString *value) const {
   26|   139k|  return BMGen_.getIdentifierID(value->getValue().str());
   27|   139k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator9addRegExpEPNS_14CompiledRegExpE:
   36|  11.4k|uint32_t BytecodeFunctionGenerator::addRegExp(CompiledRegExp *regexp) {
   37|  11.4k|  assert(
   38|  11.4k|      !complete_ &&
   39|  11.4k|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   40|      0|  return BMGen_.addRegExp(regexp);
   41|  11.4k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator11addFilenameEN4llvh9StringRefE:
   43|     56|uint32_t BytecodeFunctionGenerator::addFilename(llvh::StringRef filename) {
   44|     56|  assert(
   45|     56|      !complete_ &&
   46|     56|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   47|      0|  return BMGen_.addFilename(filename);
   48|     56|}
_ZN6hermes3hbc25BytecodeFunctionGenerator19addExceptionHandlerENS0_23HBCExceptionHandlerInfoE:
   51|      6|    HBCExceptionHandlerInfo info) {
   52|      6|  assert(
   53|      6|      !complete_ &&
   54|      6|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   55|      0|  exceptionHandlers_.push_back(info);
   56|      6|}
_ZN6hermes3hbc25BytecodeFunctionGenerator22addDebugSourceLocationERKNS0_19DebugSourceLocationE:
   59|   887k|    const DebugSourceLocation &info) {
   60|   887k|  assert(
   61|   887k|      !complete_ &&
   62|   887k|      "Cannot modify BytecodeFunction after call to bytecodeGenerationComplete.");
   63|       |  // If an address is repeated, it means no actual bytecode was emitted for the
   64|       |  // previous source location.
   65|   887k|  if (!debugLocations_.empty() &&
  ------------------
  |  Branch (65:7): [True: 773k, False: 114k]
  ------------------
   66|   887k|      debugLocations_.back().address == info.address) {
  ------------------
  |  Branch (66:7): [True: 39.3k, False: 733k]
  ------------------
   67|  39.3k|    debugLocations_.back() = info;
   68|   848k|  } else {
   69|   848k|    debugLocations_.push_back(info);
   70|   848k|  }
   71|   887k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator24generateBytecodeFunctionENS_8Function14DefinitionKindENS_9ValueKindEbjjj:
   90|   114k|    uint32_t nameID) {
   91|   114k|  if (!complete_) {
  ------------------
  |  Branch (91:7): [True: 674, False: 114k]
  ------------------
   92|    674|    bytecodeGenerationComplete();
   93|    674|  }
   94|       |
   95|   114k|  FunctionHeader header{
   96|   114k|      bytecodeSize_,
   97|   114k|      paramCount,
   98|   114k|      frameSize_,
   99|   114k|      environmentSize,
  100|   114k|      nameID,
  101|   114k|      highestReadCacheIndex_,
  102|   114k|      highestWriteCacheIndex_};
  103|       |
  104|   114k|  switch (definitionKind) {
  105|   114k|    case Function::DefinitionKind::ES6Arrow:
  ------------------
  |  Branch (105:5): [True: 114k, False: 824]
  ------------------
  106|   114k|    case Function::DefinitionKind::ES6Method:
  ------------------
  |  Branch (106:5): [True: 0, False: 114k]
  ------------------
  107|   114k|      header.flags.prohibitInvoke = FunctionHeaderFlag::ProhibitConstruct;
  108|   114k|      break;
  109|      0|    case Function::DefinitionKind::ES6Constructor:
  ------------------
  |  Branch (109:5): [True: 0, False: 114k]
  ------------------
  110|      0|      header.flags.prohibitInvoke = FunctionHeaderFlag::ProhibitCall;
  111|      0|      break;
  112|    824|    default:
  ------------------
  |  Branch (112:5): [True: 824, False: 114k]
  ------------------
  113|       |      // ES9.0 9.2.3 step 4 states that generator functions and async
  114|       |      // functions cannot be constructed.
  115|       |      // We place this check outside the `DefinitionKind` because generator
  116|       |      // functions may also be ES6 methods, for example, and are not included
  117|       |      // in the DefinitionKind enum.
  118|       |      // Note that we only have to check for GeneratorFunctionKind in this
  119|       |      // case, because ES6 methods are already checked above, and ES6
  120|       |      // constructors are prohibited from being generator functions.
  121|       |      // As such, this is the only case in which we must change the
  122|       |      // prohibitInvoke flag based on valueKind.
  123|    824|      header.flags.prohibitInvoke =
  124|    824|          (valueKind == ValueKind::GeneratorFunctionKind ||
  ------------------
  |  Branch (124:12): [True: 0, False: 824]
  ------------------
  125|    824|           valueKind == ValueKind::AsyncFunctionKind)
  ------------------
  |  Branch (125:12): [True: 0, False: 824]
  ------------------
  126|    824|          ? FunctionHeaderFlag::ProhibitConstruct
  127|    824|          : FunctionHeaderFlag::ProhibitNone;
  128|    824|      break;
  129|   114k|  }
  130|       |
  131|   114k|  header.flags.strictMode = strictMode;
  132|   114k|  header.flags.hasExceptionHandler = exceptionHandlers_.size();
  133|       |
  134|   114k|  return std::make_unique<BytecodeFunction>(
  135|   114k|      std::move(opcodes_), std::move(header), std::move(exceptionHandlers_));
  136|   114k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator13getFunctionIDEPNS_8FunctionE:
  138|   228k|unsigned BytecodeFunctionGenerator::getFunctionID(Function *F) {
  139|   228k|  return BMGen_.addFunction(F);
  140|   228k|}
_ZN6hermes3hbc25BytecodeFunctionGenerator10shrinkJumpEj:
  142|    108|void BytecodeFunctionGenerator::shrinkJump(offset_t loc) {
  143|       |  // We are shrinking a long jump into a short jump.
  144|       |  // The size of operand reduces from 4 bytes to 1 byte, a delta of 3.
  145|    108|  opcodes_.erase(opcodes_.begin() + loc, opcodes_.begin() + loc + 3);
  146|       |
  147|       |  // Change this instruction from long jump to short jump.
  148|    108|  longToShortJump(loc - 1);
  149|    108|}
_ZN6hermes3hbc25BytecodeFunctionGenerator16updateJumpTargetEjii:
  154|    320|    int bytes) {
  155|       |  // The jump target is encoded in little-endian. Update it correctly
  156|       |  // regardless of host byte order.
  157|    712|  for (; bytes; --bytes, ++loc) {
  ------------------
  |  Branch (157:10): [True: 392, False: 320]
  ------------------
  158|    392|    opcodes_[loc] = (opcode_atom_t)(newVal);
  159|    392|    newVal >>= 8;
  160|    392|  }
  161|    320|}
_ZN6hermes3hbc25BytecodeFunctionGenerator26bytecodeGenerationCompleteEv:
  177|   114k|void BytecodeFunctionGenerator::bytecodeGenerationComplete() {
  178|   114k|  assert(!complete_ && "Can only call bytecodeGenerationComplete once");
  179|      0|  complete_ = true;
  180|   114k|  bytecodeSize_ = opcodes_.size();
  181|       |
  182|       |  // Add the jump tables inline with the opcodes, as a 4-byte aligned section at
  183|       |  // the end of the opcode array.
  184|   114k|  if (!jumpTable_.empty()) {
  ------------------
  |  Branch (184:7): [True: 0, False: 114k]
  ------------------
  185|      0|    uint32_t alignedOpcodes = llvh::alignTo<sizeof(uint32_t)>(bytecodeSize_);
  186|      0|    uint32_t jumpTableBytes = jumpTable_.size() * sizeof(uint32_t);
  187|      0|    opcodes_.reserve(alignedOpcodes + jumpTableBytes);
  188|      0|    opcodes_.resize(alignedOpcodes, 0);
  189|      0|    const opcode_atom_t *jumpTableStart =
  190|      0|        reinterpret_cast<opcode_atom_t *>(jumpTable_.data());
  191|      0|    opcodes_.insert(
  192|      0|        opcodes_.end(), jumpTableStart, jumpTableStart + jumpTableBytes);
  193|      0|  }
  194|   114k|}
_ZN6hermes3hbc23BytecodeModuleGenerator11addFunctionEPNS_8FunctionE:
  196|   343k|unsigned BytecodeModuleGenerator::addFunction(Function *F) {
  197|   343k|  lazyFunctions_ |= F->isLazy();
  198|   343k|  asyncFunctions_ |= llvh::isa<AsyncFunction>(F);
  199|   343k|  return functionIDMap_.allocate(F);
  200|   343k|}
_ZN6hermes3hbc23BytecodeModuleGenerator20setFunctionGeneratorEPNS_8FunctionENSt3__110unique_ptrINS0_25BytecodeFunctionGeneratorENS4_14default_deleteIS6_EEEE:
  204|   114k|    unique_ptr<BytecodeFunctionGenerator> BFG) {
  205|   114k|  assert(
  206|   114k|      functionGenerators_.find(F) == functionGenerators_.end() &&
  207|   114k|      "Adding same function twice.");
  208|      0|  assert(
  209|   114k|      !BFG->hasEncodingError() && "Error should have been reported already.");
  210|      0|  functionGenerators_[F] = std::move(BFG);
  211|   114k|}
_ZNK6hermes3hbc23BytecodeModuleGenerator11getStringIDEN4llvh9StringRefE:
  213|   137k|unsigned BytecodeModuleGenerator::getStringID(llvh::StringRef str) const {
  214|   137k|  return stringTable_.getStringID(str);
  215|   137k|}
_ZNK6hermes3hbc23BytecodeModuleGenerator15getIdentifierIDEN4llvh9StringRefE:
  217|   143k|unsigned BytecodeModuleGenerator::getIdentifierID(llvh::StringRef str) const {
  218|   143k|  return stringTable_.getIdentifierID(str);
  219|   143k|}
_ZN6hermes3hbc23BytecodeModuleGenerator21initializeStringTableENS0_18StringLiteralTableE:
  222|     56|    StringLiteralTable stringTable) {
  223|     56|  assert(stringTable_.empty() && "String table must be empty");
  224|      0|  stringTable_ = std::move(stringTable);
  225|     56|}
_ZN6hermes3hbc23BytecodeModuleGenerator28initializeSerializedLiteralsEONSt3__16vectorIhNS2_9allocatorIhEEEES7_S7_ON4llvh8DenseMapIPKNS_11InstructionENS2_4pairIjjEENS8_12DenseMapInfoISC_EENS8_6detail12DenseMapPairISC_SE_EEEE:
  235|     56|    hermes::hbc::BytecodeModuleGenerator::LiteralOffsetMapTy &&offsetMap) {
  236|     56|  assert(
  237|     56|      arrayBuffer_.empty() && objKeyBuffer_.empty() && objValBuffer_.empty() &&
  238|     56|      literalOffsetMap_.empty() && "serialized literals already initialized");
  239|      0|  arrayBuffer_ = std::move(arrayBuffer);
  240|     56|  objKeyBuffer_ = std::move(keyBuffer);
  241|     56|  objValBuffer_ = std::move(valBuffer);
  242|     56|  literalOffsetMap_ = std::move(offsetMap);
  243|     56|}
_ZN6hermes3hbc23BytecodeModuleGenerator9addRegExpEPNS_14CompiledRegExpE:
  245|  11.4k|uint32_t BytecodeModuleGenerator::addRegExp(CompiledRegExp *regexp) {
  246|  11.4k|  return regExpTable_.addRegExp(regexp);
  247|  11.4k|}
_ZN6hermes3hbc23BytecodeModuleGenerator11addFilenameEN4llvh9StringRefE:
  249|     56|uint32_t BytecodeModuleGenerator::addFilename(llvh::StringRef filename) {
  250|     56|  return filenameTable_.addFilename(filename);
  251|     56|}
_ZN6hermes3hbc23BytecodeModuleGenerator8generateEv:
  275|     56|std::unique_ptr<BytecodeModule> BytecodeModuleGenerator::generate() {
  276|     56|  assert(
  277|     56|      valid_ &&
  278|     56|      "BytecodeModuleGenerator::generate() cannot be called more than once");
  279|      0|  valid_ = false;
  280|       |
  281|     56|  assert(
  282|     56|      functionIDMap_.getElements().size() == functionGenerators_.size() &&
  283|     56|      "Missing functions.");
  284|       |
  285|      0|  auto kinds = stringTable_.getStringKinds();
  286|     56|  auto hashes = stringTable_.getIdentifierHashes();
  287|       |
  288|     56|  BytecodeOptions bytecodeOptions;
  289|     56|  bytecodeOptions.hasAsync = asyncFunctions_;
  290|     56|  bytecodeOptions.staticBuiltins = options_.staticBuiltinsEnabled;
  291|     56|  bytecodeOptions.cjsModulesStaticallyResolved = !cjsModulesStatic_.empty();
  292|     56|  std::unique_ptr<BytecodeModule> BM{new BytecodeModule(
  293|     56|      functionGenerators_.size(),
  294|     56|      std::move(kinds),
  295|     56|      std::move(hashes),
  296|     56|      stringTable_.acquireStringTable(),
  297|     56|      stringTable_.acquireStringStorage(),
  298|     56|      bigIntTable_.getEntryList(),
  299|     56|      bigIntTable_.getDigitsBuffer(),
  300|     56|      regExpTable_.getEntryList(),
  301|     56|      regExpTable_.getBytecodeBuffer(),
  302|     56|      entryPointIndex_,
  303|     56|      std::move(arrayBuffer_),
  304|     56|      std::move(objKeyBuffer_),
  305|     56|      std::move(objValBuffer_),
  306|     56|      segmentID_,
  307|     56|      std::move(cjsModules_),
  308|     56|      std::move(cjsModulesStatic_),
  309|     56|      std::move(functionSourceTable_),
  310|     56|      bytecodeOptions)};
  311|       |
  312|     56|  DebugInfoGenerator debugInfoGen{std::move(filenameTable_)};
  313|       |
  314|     56|  const uint32_t strippedFunctionNameId =
  315|     56|      options_.stripFunctionNames ? getStringID(kStrippedFunctionName) : 0;
  ------------------
  |  Branch (315:7): [True: 0, False: 56]
  ------------------
  316|     56|  auto functions = functionIDMap_.getElements();
  317|   114k|  for (unsigned i = 0, e = functions.size(); i < e; ++i) {
  ------------------
  |  Branch (317:46): [True: 114k, False: 56]
  ------------------
  318|   114k|    auto *F = functions[i];
  319|   114k|    auto &BFG = *functionGenerators_[F];
  320|       |
  321|   114k|    uint32_t functionNameId = options_.stripFunctionNames
  ------------------
  |  Branch (321:31): [True: 0, False: 114k]
  ------------------
  322|   114k|        ? strippedFunctionNameId
  323|   114k|        : getStringID(functions[i]->getOriginalOrInferredName().str());
  324|       |
  325|   114k|    std::unique_ptr<BytecodeFunction> func = BFG.generateBytecodeFunction(
  326|   114k|        F->getDefinitionKind(),
  327|   114k|        F->getKind(),
  328|   114k|        F->isStrictMode(),
  329|   114k|        F->getExpectedParamCountIncludingThis(),
  330|   114k|        F->getFunctionScopeDesc()->getVariables().size(),
  331|   114k|        functionNameId);
  332|       |
  333|   114k|    if (F->isLazy()) {
  ------------------
  |  Branch (333:9): [True: 674, False: 114k]
  ------------------
  334|    674|      auto lazyData = std::make_unique<LazyCompilationData>();
  335|    674|      lazyData->context = F->getParent()->shareContext();
  336|    674|      lazyData->parentScope = F->getLazyScope();
  337|    674|      lazyData->span = F->getLazySource().functionRange;
  338|    674|      lazyData->nodeKind = F->getLazySource().nodeKind;
  339|    674|      lazyData->paramYield = F->getLazySource().paramYield;
  340|    674|      lazyData->paramAwait = F->getLazySource().paramAwait;
  341|    674|      lazyData->bufferId = F->getLazySource().bufferId;
  342|    674|      lazyData->originalName = F->getOriginalOrInferredName();
  343|    674|      lazyData->closureAlias = F->getLazyClosureAlias()
  ------------------
  |  Branch (343:32): [True: 0, False: 674]
  ------------------
  344|    674|          ? F->getLazyClosureAlias()->getName()
  345|    674|          : Identifier();
  346|    674|      lazyData->strictMode = F->isStrictMode();
  347|    674|      func->setLazyCompilationData(std::move(lazyData));
  348|    674|    }
  349|       |
  350|   114k|    if (BFG.hasDebugInfo()) {
  ------------------
  |  Branch (350:9): [True: 114k, False: 674]
  ------------------
  351|   114k|      uint32_t sourceLocOffset = debugInfoGen.appendSourceLocations(
  352|   114k|          BFG.getSourceLocation(), i, BFG.getDebugLocations());
  353|   114k|      uint32_t lexicalDataOffset = debugInfoGen.appendLexicalData(
  354|   114k|          BFG.getLexicalParentID(), BFG.getDebugVariableNamesUTF8());
  355|   114k|      uint32_t textifiedCalleesOffset =
  356|   114k|          debugInfoGen.appendTextifiedCalleeData(BFG.getTextifiedCallees());
  357|   114k|      func->setDebugOffsets(
  358|   114k|          {sourceLocOffset, lexicalDataOffset, textifiedCalleesOffset});
  359|   114k|    }
  360|   114k|    BM->setFunction(i, std::move(func));
  361|   114k|  }
  362|       |
  363|     56|  BM->setDebugInfo(debugInfoGen.serializeWithMove());
  364|     56|  return BM;
  365|     56|}

_ZN6hermes3hbc17BCProviderFromSrcC2ENSt3__110unique_ptrINS0_14BytecodeModuleENS2_14default_deleteIS4_EEEE:
   45|     56|    : module_(std::move(module)) {
   46|     56|  options_ = module_->getBytecodeOptions();
   47|       |
   48|     56|  functionCount_ = module_->getNumFunctions();
   49|       |
   50|     56|  globalFunctionIndex_ = module_->getGlobalFunctionIndex();
   51|       |
   52|     56|  stringKinds_ = module_->getStringKinds();
   53|     56|  identifierHashes_ = module_->getIdentifierHashes();
   54|     56|  stringCount_ = module_->getStringTable().size();
   55|     56|  stringStorage_ = module_->getStringStorage();
   56|       |
   57|     56|  bigIntStorage_ = module_->getBigIntStorage();
   58|     56|  bigIntTable_ = module_->getBigIntTable();
   59|       |
   60|     56|  regExpStorage_ = module_->getRegExpStorage();
   61|     56|  regExpTable_ = module_->getRegExpTable();
   62|       |
   63|     56|  arrayBuffer_ = module_->getArrayBuffer();
   64|     56|  objKeyBuffer_ = module_->getObjectBuffer().first;
   65|     56|  objValueBuffer_ = module_->getObjectBuffer().second;
   66|       |
   67|     56|  segmentID_ = module_->getSegmentID();
   68|     56|  cjsModuleTable_ = module_->getCJSModuleTable();
   69|     56|  cjsModuleTableStatic_ = module_->getCJSModuleTableStatic();
   70|       |
   71|     56|  functionSourceTable_ = module_->getFunctionSourceTable();
   72|       |
   73|     56|  debugInfo_ = &module_->getDebugInfo();
   74|     56|}
_ZN6hermes3hbc17BCProviderFromSrc23createBCProviderFromSrcENSt3__110unique_ptrINS_6BufferENS2_14default_deleteIS4_EEEEN4llvh9StringRefENS3_INS_9SourceMapENS5_ISA_EEEERKNS0_12CompileFlagsE:
   90|     99|    const CompileFlags &compileFlags) {
   91|     99|  return createBCProviderFromSrc(
   92|     99|      std::move(buffer), sourceURL, std::move(sourceMap), compileFlags, {}, {});
   93|     99|}
_ZN6hermes3hbc17BCProviderFromSrc23createBCProviderFromSrcENSt3__110unique_ptrINS_6BufferENS2_14default_deleteIS4_EEEEN4llvh9StringRefENS3_INS_9SourceMapENS5_ISA_EEEERKNS0_12CompileFlagsERKNS_10ScopeChainEPFvRKNS8_12SMDiagnosticEPvESM_RKNS2_8functionIFvRNS_6ModuleEEEE:
  104|     99|    const std::function<void(Module &)> &runOptimizationPasses) {
  105|     99|  return createBCProviderFromSrcImpl(
  106|     99|      std::move(buffer),
  107|     99|      sourceURL,
  108|     99|      std::move(sourceMap),
  109|     99|      compileFlags,
  110|     99|      scopeChain,
  111|     99|      diagHandler,
  112|     99|      diagContext,
  113|     99|      runOptimizationPasses);
  114|     99|}
_ZN6hermes3hbc17BCProviderFromSrc27createBCProviderFromSrcImplENSt3__110unique_ptrINS_6BufferENS2_14default_deleteIS4_EEEEN4llvh9StringRefENS3_INS_9SourceMapENS5_ISA_EEEERKNS0_12CompileFlagsERKNS_10ScopeChainEPFvRKNS8_12SMDiagnosticEPvESM_RKNS2_8functionIFvRNS_6ModuleEEEE:
  125|     99|    const std::function<void(Module &)> &runOptimizationPasses) {
  126|     99|  assert(
  127|     99|      buffer->data()[buffer->size()] == 0 &&
  128|     99|      "The input buffer must be null terminated");
  129|       |
  130|      0|  CodeGenerationSettings codeGenOpts{};
  131|     99|  codeGenOpts.unlimitedRegisters = false;
  132|     99|  codeGenOpts.instrumentIR = compileFlags.instrumentIR;
  133|       |
  134|     99|  OptimizationSettings optSettings;
  135|       |  // If the optional value is not set, the parser will automatically detect
  136|       |  // the 'use static builtin' directive and we will set it correctly.
  137|     99|  optSettings.staticBuiltins = compileFlags.staticBuiltins.hasValue()
  ------------------
  |  Branch (137:32): [True: 0, False: 99]
  ------------------
  138|     99|      ? compileFlags.staticBuiltins.getValue()
  139|     99|      : false;
  140|       |
  141|     99|  auto context = std::make_shared<Context>(codeGenOpts, optSettings);
  142|     99|  std::unique_ptr<SimpleDiagHandlerRAII> outputManager;
  143|     99|  if (diagHandler) {
  ------------------
  |  Branch (143:7): [True: 0, False: 99]
  ------------------
  144|      0|    context->getSourceErrorManager().setDiagHandler(diagHandler, diagContext);
  145|     99|  } else {
  146|     99|    outputManager.reset(
  147|     99|        new SimpleDiagHandlerRAII(context->getSourceErrorManager()));
  148|     99|  }
  149|       |  // If a custom diagHandler was provided, it will receive the details and we
  150|       |  // just return the string "error" on failure.
  151|     99|  auto getErrorString = [&outputManager]() {
  152|     99|    return outputManager ? outputManager->getErrorString()
  153|     99|                         : std::string("error");
  154|     99|  };
  155|       |
  156|       |  // To avoid frequent source buffer rescans, avoid emitting warnings about
  157|       |  // undefined variables.
  158|     99|  context->getSourceErrorManager().setWarningStatus(
  159|     99|      Warning::UndefinedVariable, false);
  160|       |
  161|     99|  context->setStrictMode(compileFlags.strict);
  162|     99|  context->setEnableEval(true);
  163|     99|  context->setPreemptiveFunctionCompilationThreshold(
  164|     99|      compileFlags.preemptiveFunctionCompilationThreshold);
  165|     99|  context->setPreemptiveFileCompilationThreshold(
  166|     99|      compileFlags.preemptiveFileCompilationThreshold);
  167|       |
  168|     99|  if (compileFlags.lazy && !runOptimizationPasses) {
  ------------------
  |  Branch (168:7): [True: 99, False: 0]
  |  Branch (168:28): [True: 99, False: 0]
  ------------------
  169|     99|    context->setLazyCompilation(true);
  170|     99|  }
  171|       |
  172|     99|  context->setGeneratorEnabled(compileFlags.enableGenerator);
  173|     99|  context->setDebugInfoSetting(
  174|     99|      compileFlags.debug ? DebugInfoSetting::ALL : DebugInfoSetting::THROWING);
  ------------------
  |  Branch (174:7): [True: 99, False: 0]
  ------------------
  175|     99|  context->setEmitAsyncBreakCheck(compileFlags.emitAsyncBreakCheck);
  176|       |
  177|       |  // Populate the declFileList.
  178|     99|  DeclarationFileListTy declFileList;
  179|     99|  if (compileFlags.includeLibHermes) {
  ------------------
  |  Branch (179:7): [True: 99, False: 0]
  ------------------
  180|     99|    auto libBuffer = llvh::MemoryBuffer::getMemBuffer(libhermes);
  181|     99|    parser::JSParser libParser(*context, std::move(libBuffer));
  182|     99|    auto libParsed = libParser.parse();
  183|     99|    assert(libParsed && "Libhermes failed to parse");
  184|      0|    declFileList.push_back(libParsed.getValue());
  185|     99|  }
  186|       |
  187|      0|  bool isLargeFile =
  188|     99|      buffer->size() >= context->getPreemptiveFileCompilationThreshold();
  189|     99|  int fileBufId = context->getSourceErrorManager().addNewSourceBuffer(
  190|     99|      std::make_unique<HermesLLVMMemoryBuffer>(std::move(buffer), sourceURL));
  191|     99|  if (sourceMap != nullptr) {
  ------------------
  |  Branch (191:7): [True: 0, False: 99]
  ------------------
  192|      0|    auto sourceMapTranslator =
  193|      0|        std::make_shared<SourceMapTranslator>(context->getSourceErrorManager());
  194|      0|    context->getSourceErrorManager().setTranslator(sourceMapTranslator);
  195|      0|    sourceMapTranslator->addSourceMap(fileBufId, std::move(sourceMap));
  196|      0|  }
  197|       |
  198|     99|  auto parserMode = parser::FullParse;
  199|     99|  bool useStaticBuiltinDetected = false;
  200|     99|  if (context->isLazyCompilation() && isLargeFile) {
  ------------------
  |  Branch (200:7): [True: 99, False: 0]
  |  Branch (200:39): [True: 99, False: 0]
  ------------------
  201|     99|    if (!parser::JSParser::preParseBuffer(
  ------------------
  |  Branch (201:9): [True: 34, False: 65]
  ------------------
  202|     99|            *context, fileBufId, useStaticBuiltinDetected)) {
  203|     34|      return {nullptr, getErrorString()};
  204|     34|    }
  205|     65|    parserMode = parser::LazyParse;
  206|     65|  }
  207|       |
  208|     65|  sem::SemContext semCtx{};
  209|     65|  parser::JSParser parser(*context, fileBufId, parserMode);
  210|     65|  auto parsed = parser.parse();
  211|     65|  if (!parsed || !hermes::sem::validateAST(*context, semCtx, *parsed)) {
  ------------------
  |  Branch (211:7): [True: 0, False: 65]
  |  Branch (211:18): [True: 9, False: 56]
  ------------------
  212|      9|    return {nullptr, getErrorString()};
  213|      9|  }
  214|       |  // If we are using lazy parse mode, we should have already detected the 'use
  215|       |  // static builtin' directive in the pre-parsing stage.
  216|     56|  if (parserMode != parser::LazyParse) {
  ------------------
  |  Branch (216:7): [True: 0, False: 56]
  ------------------
  217|      0|    useStaticBuiltinDetected = parser.getUseStaticBuiltin();
  218|      0|  }
  219|       |  // The compiler flag is not set, automatically detect 'use static builtin'
  220|       |  // from the source.
  221|     56|  if (!compileFlags.staticBuiltins) {
  ------------------
  |  Branch (221:7): [True: 56, False: 0]
  ------------------
  222|     56|    context->setStaticBuiltinOptimization(useStaticBuiltinDetected);
  223|     56|  }
  224|       |
  225|     56|  Module M(context);
  226|     56|  hermes::generateIRFromESTree(parsed.getValue(), &M, declFileList, scopeChain);
  227|     56|  if (context->getSourceErrorManager().getErrorCount() > 0) {
  ------------------
  |  Branch (227:7): [True: 0, False: 56]
  ------------------
  228|      0|    return {nullptr, getErrorString()};
  229|      0|  }
  230|       |
  231|     56|  if (runOptimizationPasses)
  ------------------
  |  Branch (231:7): [True: 0, False: 56]
  ------------------
  232|      0|    runOptimizationPasses(M);
  233|       |
  234|     56|  BytecodeGenerationOptions opts{compileFlags.format};
  235|     56|  opts.optimizationEnabled = !!runOptimizationPasses;
  236|     56|  opts.staticBuiltinsEnabled =
  237|     56|      context->getOptimizationSettings().staticBuiltins;
  238|     56|  opts.verifyIR = compileFlags.verifyIR;
  239|     56|  auto BM = hbc::generateBytecodeModule(&M, M.getTopLevelFunction(), opts);
  240|     56|  if (context->getSourceErrorManager().getErrorCount() > 0) {
  ------------------
  |  Branch (240:7): [True: 0, False: 56]
  ------------------
  241|      0|    return {nullptr, getErrorString()};
  242|      0|  }
  243|     56|  auto bytecode = createBCProviderFromSrc(std::move(BM));
  244|     56|  bytecode->singleFunction_ = isSingleFunctionExpression(parsed.getValue());
  245|     56|  return {std::move(bytecode), std::string{}};
  246|     56|}
_ZN6hermes3hbc14BCProviderLazyC2EPNS0_16BytecodeFunctionE:
  249|    674|    : bytecodeFunction_(bytecodeFunction) {
  250|       |  // Lazy module should always contain one function to begin with.
  251|    674|  functionCount_ = 1;
  252|    674|}
BytecodeProviderFromSrc.cpp:_ZZN6hermes3hbc17BCProviderFromSrc27createBCProviderFromSrcImplENSt3__110unique_ptrINS_6BufferENS2_14default_deleteIS4_EEEEN4llvh9StringRefENS3_INS_9SourceMapENS5_ISA_EEEERKNS0_12CompileFlagsERKNS_10ScopeChainEPFvRKNS8_12SMDiagnosticEPvESM_RKNS2_8functionIFvRNS_6ModuleEEEEENK3$_0clEv:
  151|     43|  auto getErrorString = [&outputManager]() {
  152|     43|    return outputManager ? outputManager->getErrorString()
  ------------------
  |  Branch (152:12): [True: 43, False: 0]
  ------------------
  153|     43|                         : std::string("error");
  154|     43|  };
BytecodeProviderFromSrc.cpp:_ZN6hermes3hbc12_GLOBAL__N_126isSingleFunctionExpressionEPNS_6ESTree4NodeE:
   22|     56|bool isSingleFunctionExpression(ESTree::NodePtr ast) {
   23|     56|  auto *prog = llvh::dyn_cast<ESTree::ProgramNode>(ast);
   24|     56|  if (!prog) {
  ------------------
  |  Branch (24:7): [True: 0, False: 56]
  ------------------
   25|      0|    return false;
   26|      0|  }
   27|     56|  ESTree::NodeList &body = prog->_body;
   28|     56|  if (body.size() != 1) {
  ------------------
  |  Branch (28:7): [True: 15, False: 41]
  ------------------
   29|     15|    return false;
   30|     15|  }
   31|     41|  auto *exprStatement =
   32|     41|      llvh::dyn_cast<ESTree::ExpressionStatementNode>(&body.front());
   33|     41|  if (!exprStatement) {
  ------------------
  |  Branch (33:7): [True: 5, False: 36]
  ------------------
   34|      5|    return false;
   35|      5|  }
   36|     36|  return llvh::isa<ESTree::FunctionExpressionNode>(
  ------------------
  |  Branch (36:10): [True: 0, False: 36]
  ------------------
   37|     36|             exprStatement->_expression) ||
   38|     36|      llvh::isa<ESTree::ArrowFunctionExpressionNode>(
  ------------------
  |  Branch (38:7): [True: 0, False: 36]
  ------------------
   39|     36|             exprStatement->_expression);
   40|     41|}

_ZN6hermes3hbc24ConsecutiveStringStorageC2INSt3__116__deque_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPSA_RSA_PSB_lLl170EEENS3_17integral_constantIbLb0EEEEET_SH_T0_b:
  721|     56|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|     56|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|     56|  std::vector<unsigned char> asciiStorage;
  726|     56|  std::vector<char16_t> u16Storage;
  727|     56|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|     56|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|     56|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|     56|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|     56|  size_t unpackedSize = builder.unpackedSize();
  738|     56|  StringTableSize += unpackedSize;
  739|     56|  StringTableSavings += unpackedSize - storage_.size();
  740|     56|}
_ZN6hermes3hbc24ConsecutiveStringStorageC2IPKN4llvh9StringRefENSt3__117integral_constantIbLb0EEEEET_SA_T0_b:
  721|     56|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|     56|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|     56|  std::vector<unsigned char> asciiStorage;
  726|     56|  std::vector<char16_t> u16Storage;
  727|     56|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|     56|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|     56|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|     56|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|     56|  size_t unpackedSize = builder.unpackedSize();
  738|     56|  StringTableSize += unpackedSize;
  739|     56|  StringTableSavings += unpackedSize - storage_.size();
  740|     56|}
_ZN6hermes3hbc24ConsecutiveStringStorageC2INSt3__116__deque_iteratorINS3_12basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPKSA_RSB_PKSC_lLl170EEENS3_17integral_constantIbLb1EEEEET_SJ_T0_b:
  721|    168|    bool optimize) {
  722|       |  // Prepare to build our string table.
  723|       |  // Generate storage for our ASCII and u16 strings.
  724|    168|  StringTableBuilder builder(begin, end, Force8Bit{});
  725|    168|  std::vector<unsigned char> asciiStorage;
  726|    168|  std::vector<char16_t> u16Storage;
  727|    168|  builder.packIntoStorage(&asciiStorage, &u16Storage, optimize);
  728|       |
  729|       |  // Append the u16 storage to the ASCII storage, to form our combined storage.
  730|    168|  storage_.insert(storage_.end(), asciiStorage.begin(), asciiStorage.end());
  731|    168|  auto u16Offset = StringTableBuilder::appendU16Storage(u16Storage, &storage_);
  732|       |
  733|       |  // Build our table over the storage.
  734|    168|  strTable_ = builder.generateStringTable(storage_, u16Offset);
  735|       |
  736|       |  // Record some stats.
  737|    168|  size_t unpackedSize = builder.unpackedSize();
  738|    168|  StringTableSize += unpackedSize;
  739|    168|  StringTableSavings += unpackedSize - storage_.size();
  740|    168|}
_ZNK6hermes3hbc24ConsecutiveStringStorage12getEntryHashEm:
  766|    618|uint32_t ConsecutiveStringStorage::getEntryHash(size_t i) const {
  767|    618|  ensureTableValid();
  768|    618|  ensureStorageValid();
  769|       |
  770|    618|  auto &entry = strTable_[i];
  771|    618|  uint32_t length = entry.getLength();
  772|    618|  assert(
  773|    618|      entry.getOffset() + (entry.isUTF16() ? length * 2 : length) <=
  774|    618|          storage_.size() &&
  775|    618|      "entry past end");
  776|      0|  const unsigned char *data = storage_.data() + entry.getOffset();
  777|    618|  if (entry.isUTF16()) {
  ------------------
  |  Branch (777:7): [True: 227, False: 391]
  ------------------
  778|    227|    const char16_t *u16data = reinterpret_cast<const char16_t *>(data);
  779|    227|    return hermes::hashString(ArrayRef<char16_t>{u16data, length});
  780|    391|  } else {
  781|    391|    return hermes::hashString(ArrayRef<char>{(const char *)data, length});
  782|    391|  }
  783|    618|}
_ZN6hermes3hbc24ConsecutiveStringStorage13appendStorageEOS1_:
  785|     56|void ConsecutiveStringStorage::appendStorage(ConsecutiveStringStorage &&rhs) {
  786|     56|  ensureTableValid();
  787|     56|  ensureStorageValid();
  788|       |  // If we have not yet been written, just acquire the rhs.
  789|     56|  if (strTable_.empty()) {
  ------------------
  |  Branch (789:7): [True: 56, False: 0]
  ------------------
  790|     56|    *this = std::move(rhs);
  791|     56|    return;
  792|     56|  }
  793|       |  // Offset incoming string entries by the size of our storage, and append the
  794|       |  // incoming storage. Don't bother to offset if the string is empty; this
  795|       |  // ensures that the empty string doesn't get pushed to strange places.
  796|      0|  uint32_t storageDelta = storage_.size();
  797|      0|  strTable_.reserve(strTable_.size() + rhs.strTable_.size());
  798|      0|  for (const StringTableEntry &entry : rhs.strTable_) {
  ------------------
  |  Branch (798:38): [True: 0, False: 0]
  ------------------
  799|      0|    uint32_t length = entry.getLength();
  800|      0|    uint32_t offset = entry.getOffset() + (length ? storageDelta : 0);
  ------------------
  |  Branch (800:44): [True: 0, False: 0]
  ------------------
  801|      0|    strTable_.emplace_back(offset, length, entry.isUTF16());
  802|      0|  }
  803|      0|  storage_.insert(storage_.end(), rhs.storage_.begin(), rhs.storage_.end());
  804|      0|}
_ZNK6hermes3hbc24ConsecutiveStringStorage16getStringAtIndexEjRNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
  808|    924|    std::string &utf8ConversionStorage) const {
  809|    924|  ensureTableValid();
  810|    924|  ensureStorageValid();
  811|    924|  assert(idx < strTable_.size() && "getStringAtIndex: invalid index");
  812|      0|  return getStringFromEntry(strTable_[idx], storage_, utf8ConversionStorage);
  813|    924|}
_ZN6hermes3hbc18getStringFromEntryERKNS_16StringTableEntryEN4llvh8ArrayRefIhEERNSt3__112basic_stringIcNS7_11char_traitsIcEENS7_9allocatorIcEEEE:
  818|    948|    std::string &utf8ConversionStorage) {
  819|    948|  uint32_t offset = entry.getOffset();
  820|    948|  uint32_t length = entry.getLength();
  821|    948|  assert(
  822|    948|      offset + length <= storage.size() && offset + length >= offset &&
  823|    948|      "Invalid entry");
  824|    948|  if (!entry.isUTF16()) {
  ------------------
  |  Branch (824:7): [True: 675, False: 273]
  ------------------
  825|    675|    return llvh::StringRef{(const char *)storage.data() + offset, length};
  826|    675|  } else {
  827|    273|    const char16_t *s =
  828|    273|        reinterpret_cast<const char16_t *>(storage.data() + offset);
  829|    273|    llvh::ArrayRef<char16_t> u16String(s, length);
  830|    273|    convertUTF16ToUTF8WithSingleSurrogates(utf8ConversionStorage, u16String);
  831|    273|    return utf8ConversionStorage;
  832|    273|  }
  833|    948|}
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder15packIntoStorageEPNSt3__16vectorIhNS1_9allocatorIhEEEEPNS2_IDsNS3_IDsEEEEb:
  624|    280|      bool optimize) {
  625|    280|    NamedRegionTimer timer(
  626|    280|        "",
  627|    280|        optimize ? "optimizingPackStrings" : "fastPackStrings",
  ------------------
  |  Branch (627:9): [True: 0, False: 280]
  ------------------
  628|    280|        "",
  629|    280|        StringTableTimersName,
  630|    280|        AreStatisticsEnabled());
  631|       |    // Note these assignments use efficient move-assignment, not copying.
  632|    280|    if (optimize) {
  ------------------
  |  Branch (632:9): [True: 0, False: 280]
  ------------------
  633|      0|      *asciiStorage =
  634|      0|          StringPacker<unsigned char>::optimizingPackStrings(asciiStrings_);
  635|      0|      *u16Storage = StringPacker<char16_t>::optimizingPackStrings(u16Strings_);
  636|    280|    } else {
  637|    280|      *asciiStorage =
  638|    280|          StringPacker<unsigned char>::fastPackStrings(asciiStrings_);
  639|    280|      *u16Storage = StringPacker<char16_t>::fastPackStrings(u16Strings_);
  640|    280|    }
  641|       |
  642|    280|#ifndef NDEBUG
  643|       |    // Ensure that our packing was correct.
  644|    280|    StringPacker<unsigned char>::validateStringPacking(
  645|    280|        asciiStrings_, *asciiStorage);
  646|    280|    StringPacker<char16_t>::validateStringPacking(u16Strings_, *u16Storage);
  647|    280|#endif
  648|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE15fastPackStringsEN4llvh15MutableArrayRefINS1_11StringEntryEEE:
  519|    280|      MutableArrayRef<StringEntry> strings) {
  520|    280|    std::vector<CharT> result;
  521|  1.04k|    for (StringEntry &str : strings) {
  ------------------
  |  Branch (521:27): [True: 1.04k, False: 280]
  ------------------
  522|  1.04k|      str.offsetInStorage_ = result.size();
  523|  1.04k|      result.insert(result.end(), str.chars_.begin(), str.chars_.end());
  524|  1.04k|    }
  525|       |    // Note efficient move-semantics on return.
  526|    280|    return result;
  527|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE15fastPackStringsEN4llvh15MutableArrayRefINS1_11StringEntryEEE:
  519|    280|      MutableArrayRef<StringEntry> strings) {
  520|    280|    std::vector<CharT> result;
  521|    280|    for (StringEntry &str : strings) {
  ------------------
  |  Branch (521:27): [True: 273, False: 280]
  ------------------
  522|    273|      str.offsetInStorage_ = result.size();
  523|    273|      result.insert(result.end(), str.chars_.begin(), str.chars_.end());
  524|    273|    }
  525|       |    // Note efficient move-semantics on return.
  526|    280|    return result;
  527|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE21validateStringPackingEN4llvh8ArrayRefINS1_11StringEntryEEENS3_IhEE:
  534|    280|      ArrayRef<CharT> storage) {
  535|  1.04k|    for (const auto &entry : strings) {
  ------------------
  |  Branch (535:28): [True: 1.04k, False: 280]
  ------------------
  536|  1.04k|      auto offset = entry.offsetInStorage_;
  537|  1.04k|      auto size = entry.chars_.size();
  538|  1.04k|      assert(
  539|  1.04k|          offset + size >= offset && offset + size <= storage.size() &&
  540|  1.04k|          "Invalid offset or size for string entry");
  541|      0|      assert(
  542|  1.04k|          entry.chars_ == storage.slice(offset, size) &&
  543|  1.04k|          "String does not appear at claimed offset in storage");
  544|  1.04k|    }
  545|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE21validateStringPackingEN4llvh8ArrayRefINS1_11StringEntryEEENS3_IDsEE:
  534|    280|      ArrayRef<CharT> storage) {
  535|    280|    for (const auto &entry : strings) {
  ------------------
  |  Branch (535:28): [True: 273, False: 280]
  ------------------
  536|    273|      auto offset = entry.offsetInStorage_;
  537|    273|      auto size = entry.chars_.size();
  538|    273|      assert(
  539|    273|          offset + size >= offset && offset + size <= storage.size() &&
  540|    273|          "Invalid offset or size for string entry");
  541|      0|      assert(
  542|    273|          entry.chars_ == storage.slice(offset, size) &&
  543|    273|          "String does not appear at claimed offset in storage");
  544|    273|    }
  545|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder16appendU16StorageEN4llvh8ArrayRefIDsEEPNSt3__16vectorIhNS4_9allocatorIhEEEE:
  686|    280|      std::vector<unsigned char> *output) {
  687|    280|    using namespace llvh::support;
  688|    280|    static_assert(sizeof(char16_t) == 2, "sizeof char16_t unexpectedly not 2");
  689|    280|    if (u16Storage.empty()) {
  ------------------
  |  Branch (689:9): [True: 257, False: 23]
  ------------------
  690|       |      // Nothing to do, don't even bother aligning.
  691|    257|      return 0;
  692|    257|    }
  693|       |
  694|       |    // Ensure 2-byte alignment.
  695|     23|    if (output->size() % sizeof(char16_t)) {
  ------------------
  |  Branch (695:9): [True: 17, False: 6]
  ------------------
  696|     17|      output->push_back('\0');
  697|     17|    }
  698|       |
  699|       |    // Make space, and write as little endian.
  700|     23|    size_t offset = output->size();
  701|     23|    output->resize(output->size() + sizeof(char16_t) * u16Storage.size());
  702|     23|    unsigned char *cursor = &output->at(offset);
  703|  2.04M|    for (char16_t s : u16Storage) {
  ------------------
  |  Branch (703:21): [True: 2.04M, False: 23]
  ------------------
  704|  2.04M|      endian::write<char16_t, little, 0>(cursor, s);
  705|  2.04M|      cursor += sizeof(s);
  706|  2.04M|    }
  707|     23|    return offset;
  708|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilder19generateStringTableEN4llvh8ArrayRefIhEEm:
  659|    280|      size_t u16OffsetAdjust) {
  660|       |    // Each of our StringEntries remembers its original index in the initial
  661|       |    // array. Create a table large enough, and set the corresponding index in
  662|       |    // the table.
  663|    280|    std::vector<StringTableEntry> table;
  664|    280|    table.resize(asciiStrings_.size() + u16Strings_.size());
  665|       |
  666|  1.04k|    for (const auto &asciiStr : asciiStrings_) {
  ------------------
  |  Branch (666:31): [True: 1.04k, False: 280]
  ------------------
  667|  1.04k|      table.at(asciiStr.stringID_) = {
  668|  1.04k|          static_cast<uint32_t>(asciiStr.offsetInStorage_),
  669|  1.04k|          static_cast<uint32_t>(asciiStr.chars_.size()),
  670|  1.04k|          false /* isUTF16 */};
  671|  1.04k|    }
  672|    280|    for (const auto &u16Str : u16Strings_) {
  ------------------
  |  Branch (672:29): [True: 273, False: 280]
  ------------------
  673|    273|      table.at(u16Str.stringID_) = {
  674|    273|          static_cast<uint32_t>(
  675|    273|              u16Str.offsetInStorage_ * sizeof(char16_t) + u16OffsetAdjust),
  676|    273|          static_cast<uint32_t>(u16Str.chars_.size()),
  677|    273|          true /* isUTF16 */};
  678|    273|    }
  679|    280|    return table;
  680|    280|  }
ConsecutiveStringStorage.cpp:_ZNK12_GLOBAL__N_118StringTableBuilder12unpackedSizeEv:
  604|    280|  size_t unpackedSize() const {
  605|    280|    size_t result = 0;
  606|  1.04k|    for (const auto &entry : asciiStrings_) {
  ------------------
  |  Branch (606:28): [True: 1.04k, False: 280]
  ------------------
  607|  1.04k|      result += sizeof(char) * entry.chars_.size();
  608|  1.04k|    }
  609|    280|    for (const auto &entry : u16Strings_) {
  ------------------
  |  Branch (609:28): [True: 273, False: 280]
  ------------------
  610|    273|      result += sizeof(char16_t) * entry.chars_.size();
  611|    273|    }
  612|    280|    return result;
  613|    280|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIhE11StringEntryC2EjN4llvh8ArrayRefIhEE:
   85|  1.04k|        : stringID_(stringID), chars_(chars) {}
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_112StringPackerIDsE11StringEntryC2EjN4llvh8ArrayRefIDsEE:
   85|    273|        : stringID_(stringID), chars_(chars) {}
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilderC2INSt3__116__deque_iteratorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPS9_RS9_PSA_lLl170EEENS2_17integral_constantIbLb0EEEEET_SG_T0_:
  575|     56|  StringTableBuilder(I begin, I end, Force8Bit) {
  576|       |    // Generate and store a StringEntry for each string.
  577|       |    // Remember the index of each string in our StringEntry, so that we can
  578|       |    // later output the table in the correct order.
  579|       |    // Place the entry in our ASCII entries if possible; otherwise we have to
  580|       |    // convert to u16.
  581|       |    // In delta optimizing mode, the ids of new strings in the string table
  582|       |    // are adjusted to reflect that they appear after the old strings.
  583|     56|    uint32_t index = 0;
  584|    112|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 56, False: 56]
  ------------------
  585|     56|      auto &str = *it;
  586|     56|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|     56|      const unsigned char *begin = (const unsigned char *)str.data();
  588|     56|      const unsigned char *end = begin + str.size();
  589|     56|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 56, False: 0]
  ------------------
  590|     56|        ArrayRef<unsigned char> astr(begin, end);
  591|     56|        asciiStrings_.emplace_back(index, astr);
  592|     56|      } else {
  593|      0|        u16StringStorage_.emplace_back();
  594|      0|        std::vector<char16_t> &ustr = u16StringStorage_.back();
  595|      0|        convertUTF8WithSurrogatesToUTF16(
  596|      0|            std::back_inserter(ustr), (const char *)begin, (const char *)end);
  597|      0|        u16Strings_.emplace_back(index, ustr);
  598|      0|      }
  599|     56|      index++;
  600|     56|    }
  601|     56|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilderC2IPKN4llvh9StringRefENSt3__117integral_constantIbLb0EEEEET_S9_T0_:
  575|     56|  StringTableBuilder(I begin, I end, Force8Bit) {
  576|       |    // Generate and store a StringEntry for each string.
  577|       |    // Remember the index of each string in our StringEntry, so that we can
  578|       |    // later output the table in the correct order.
  579|       |    // Place the entry in our ASCII entries if possible; otherwise we have to
  580|       |    // convert to u16.
  581|       |    // In delta optimizing mode, the ids of new strings in the string table
  582|       |    // are adjusted to reflect that they appear after the old strings.
  583|     56|    uint32_t index = 0;
  584|    980|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 924, False: 56]
  ------------------
  585|    924|      auto &str = *it;
  586|    924|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|    924|      const unsigned char *begin = (const unsigned char *)str.data();
  588|    924|      const unsigned char *end = begin + str.size();
  589|    924|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 651, False: 273]
  ------------------
  590|    651|        ArrayRef<unsigned char> astr(begin, end);
  591|    651|        asciiStrings_.emplace_back(index, astr);
  592|    651|      } else {
  593|    273|        u16StringStorage_.emplace_back();
  594|    273|        std::vector<char16_t> &ustr = u16StringStorage_.back();
  595|    273|        convertUTF8WithSurrogatesToUTF16(
  596|    273|            std::back_inserter(ustr), (const char *)begin, (const char *)end);
  597|    273|        u16Strings_.emplace_back(index, ustr);
  598|    273|      }
  599|    924|      index++;
  600|    924|    }
  601|     56|  }
ConsecutiveStringStorage.cpp:_ZN12_GLOBAL__N_118StringTableBuilderC2INSt3__116__deque_iteratorINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEPKS9_RSA_PKSB_lLl170EEENS2_17integral_constantIbLb1EEEEET_SI_T0_:
  575|    168|  StringTableBuilder(I begin, I end, Force8Bit) {
  576|       |    // Generate and store a StringEntry for each string.
  577|       |    // Remember the index of each string in our StringEntry, so that we can
  578|       |    // later output the table in the correct order.
  579|       |    // Place the entry in our ASCII entries if possible; otherwise we have to
  580|       |    // convert to u16.
  581|       |    // In delta optimizing mode, the ids of new strings in the string table
  582|       |    // are adjusted to reflect that they appear after the old strings.
  583|    168|    uint32_t index = 0;
  584|    505|    for (auto it = begin; it != end; ++it) {
  ------------------
  |  Branch (584:27): [True: 337, False: 168]
  ------------------
  585|    337|      auto &str = *it;
  586|    337|      static_assert(sizeof(str.data()[0]) == 1, "strings must be UTF8");
  587|    337|      const unsigned char *begin = (const unsigned char *)str.data();
  588|    337|      const unsigned char *end = begin + str.size();
  589|    337|      if (Force8Bit::value || isAllASCII(begin, end)) {
  ------------------
  |  Branch (589:11): [Folded - Ignored]
  |  Branch (589:31): [True: 0, False: 0]
  ------------------
  590|    337|        ArrayRef<unsigned char> astr(begin, end);
  591|    337|        asciiStrings_.emplace_back(index, astr);
  592|    337|      } else {
  593|      0|        u16StringStorage_.emplace_back();
  594|      0|        std::vector<char16_t> &ustr = u16StringStorage_.back();
  595|      0|        convertUTF8WithSurrogatesToUTF16(
  596|      0|            std::back_inserter(ustr), (const char *)begin, (const char *)end);
  597|      0|        u16Strings_.emplace_back(index, ustr);
  598|      0|      }
  599|    337|      index++;
  600|    337|    }
  601|    168|  }

_ZN6hermes3hbc18DebugInfoGenerator12appendStringERNSt3__16vectorIhNS2_9allocatorIhEEEENS_10IdentifierE:
  108|   114k|    Identifier str) {
  109|   114k|  auto res = stringTableIndex_.try_emplace(
  110|   114k|      str.getUnderlyingPointer(), stringTable_.size());
  111|       |
  112|   114k|  if (res.second) {
  ------------------
  |  Branch (112:7): [True: 62, False: 114k]
  ------------------
  113|     62|#ifndef NDEBUG
  114|       |    // Check that the given string is a valid UTF8 string.
  115|     62|    const char *it = str.str().begin();
  116|    878|    while (it < str.str().end()) {
  ------------------
  |  Branch (116:12): [True: 816, False: 62]
  ------------------
  117|    816|      constexpr bool allowSurrogates = false;
  118|       |      // keep the current position alive so it can be inspected in the debugger
  119|       |      // if the assert fails.
  120|    816|      const char *pos = it;
  121|    816|      (void)pos;
  122|    816|      decodeUTF8<allowSurrogates>(it, [](const llvh::Twine &) {
  123|    816|        assert(false && "invalid utf8 char");
  124|    816|      });
  125|    816|    }
  126|     62|    assert(
  127|     62|        it == str.str().end() && "Invalid utf8 string -- read past end of str");
  128|      0|#endif // NDEBUG
  129|      0|    appendSignedLEB128(stringTable_, int64_t(str.str().size()));
  130|     62|    stringTable_.insert(stringTable_.end(), str.str().begin(), str.str().end());
  131|     62|  }
  132|       |
  133|      0|  appendSignedLEB128(data, res.first->second);
  134|   114k|}
_ZNK6hermes3hbc9DebugInfo12decodeStringEPjN4llvh8ArrayRefIhEE:
  138|      8|    llvh::ArrayRef<uint8_t> data) const {
  139|      8|  int64_t strOffset;
  140|      8|  *inoutOffset += readSignedLEB128(data, *inoutOffset, &strOffset);
  141|      8|  uint32_t strOffsetU = strOffset;
  142|      8|  return getString(&strOffsetU, stringTableData());
  143|      8|}
_ZNK6hermes3hbc9DebugInfo21getFilenameForAddressEj:
  146|     24|    uint32_t debugOffset) const {
  147|     24|  OptValue<uint32_t> value = llvh::None;
  148|       |  // This is sorted list of (address, filename) pairs so we could use
  149|       |  // binary search. However, we expect the number of entries to be
  150|       |  // between zero and one.
  151|     48|  for (int i = 0, e = files_.size(); i < e; i++) {
  ------------------
  |  Branch (151:38): [True: 24, False: 24]
  ------------------
  152|     24|    if (files_[i].fromAddress <= debugOffset) {
  ------------------
  |  Branch (152:9): [True: 24, False: 0]
  ------------------
  153|     24|      value = files_[i].filenameId;
  154|     24|    } else
  155|      0|      break;
  156|     24|  }
  157|     24|  return value;
  158|     24|}
_ZNK6hermes3hbc9DebugInfo21getLocationForAddressEjj:
  162|     24|    uint32_t offsetInFunction) const {
  163|     24|  assert(debugOffset < data_.size() && "Debug offset out of range");
  164|      0|  FunctionDebugInfoDeserializer fdid(data_.getData(), debugOffset);
  165|     24|  DebugSourceLocation lastLocation = fdid.getCurrent();
  166|     24|  uint32_t lastLocationOffset = debugOffset;
  167|     24|  uint32_t nextLocationOffset = fdid.getOffset();
  168|  32.8k|  while (auto loc = fdid.next()) {
  ------------------
  |  Branch (168:15): [True: 32.8k, False: 0]
  ------------------
  169|  32.8k|    if (loc->address > offsetInFunction)
  ------------------
  |  Branch (169:9): [True: 24, False: 32.7k]
  ------------------
  170|     24|      break;
  171|  32.7k|    lastLocation = *loc;
  172|  32.7k|    lastLocationOffset = nextLocationOffset;
  173|  32.7k|    nextLocationOffset = fdid.getOffset();
  174|  32.7k|  }
  175|     24|  if (auto file = getFilenameForAddress(lastLocationOffset)) {
  ------------------
  |  Branch (175:12): [True: 24, False: 0]
  ------------------
  176|     24|    lastLocation.address = offsetInFunction;
  177|     24|    lastLocation.filenameId = *file;
  178|     24|    return lastLocation;
  179|     24|  }
  180|      0|  return llvh::None;
  181|     24|}
_ZNK6hermes3hbc9DebugInfo22getTextifiedCalleeUTF8Ejj:
  251|      4|    uint32_t offsetInFunction) const {
  252|      4|  llvh::ArrayRef<uint8_t> data = textifiedCalleeData();
  253|      4|  int64_t entries;
  254|      4|  debugOffset += readSignedLEB128(data, debugOffset, &entries);
  255|      8|  while (entries--) {
  ------------------
  |  Branch (255:10): [True: 8, False: 0]
  ------------------
  256|      8|    int64_t location;
  257|      8|    debugOffset += readSignedLEB128(data, debugOffset, &location);
  258|      8|    llvh::StringRef name = decodeString(&debugOffset, data);
  259|      8|    if (location == offsetInFunction) {
  ------------------
  |  Branch (259:9): [True: 4, False: 4]
  ------------------
  260|      4|      return name;
  261|      4|    }
  262|      4|    if (location > offsetInFunction) {
  ------------------
  |  Branch (262:9): [True: 0, False: 4]
  ------------------
  263|      0|      break;
  264|      0|    }
  265|      4|  }
  266|       |
  267|      0|  return llvh::None;
  268|      4|}
_ZN6hermes3hbc18DebugInfoGenerator21appendSourceLocationsERKNS0_19DebugSourceLocationEjN4llvh8ArrayRefIS2_EE:
  469|   114k|    llvh::ArrayRef<DebugSourceLocation> offsets) {
  470|   114k|  assert(validData && "DebugInfoGenerator not valid");
  471|       |
  472|       |  // The start of the function isn't part of a statement,
  473|       |  // so require that statement = 0 for the start debug value.
  474|      0|  assert(start.statement == 0 && "function must start at statement 0");
  475|       |
  476|   114k|  if (offsets.empty()) {
  ------------------
  |  Branch (476:7): [True: 0, False: 114k]
  ------------------
  477|      0|    return DebugOffsets::NO_OFFSET;
  478|      0|  }
  479|   114k|  const uint32_t startOffset = sourcesData_.size();
  480|       |
  481|   114k|  if (files_.empty() || files_.back().filenameId != start.filenameId) {
  ------------------
  |  Branch (481:7): [True: 56, False: 114k]
  |  Branch (481:25): [True: 0, False: 114k]
  ------------------
  482|     56|    files_.push_back(DebugFileRegion{
  483|     56|        startOffset, start.filenameId, start.sourceMappingUrlId});
  484|     56|  }
  485|       |
  486|   114k|  appendSignedLEB128(sourcesData_, functionIndex);
  487|   114k|  appendSignedLEB128(sourcesData_, start.line);
  488|   114k|  appendSignedLEB128(sourcesData_, start.column);
  489|   114k|  const DebugSourceLocation *previous = &start;
  490|       |
  491|   848k|  for (auto &next : offsets) {
  ------------------
  |  Branch (491:19): [True: 848k, False: 114k]
  ------------------
  492|   848k|    if (next.filenameId != previous->filenameId) {
  ------------------
  |  Branch (492:9): [True: 0, False: 848k]
  ------------------
  493|      0|      files_.push_back(DebugFileRegion{
  494|      0|          (unsigned)sourcesData_.size(),
  495|      0|          next.filenameId,
  496|      0|          start.sourceMappingUrlId});
  497|      0|    }
  498|       |
  499|   848k|    int32_t adelta = delta(next.address, previous->address);
  500|       |    // ldelta needs 64 bits because we will use it to encode an extra bit.
  501|   848k|    int64_t ldelta = delta(next.line, previous->line);
  502|   848k|    int32_t cdelta = delta(next.column, previous->column);
  503|   848k|    int32_t sdelta = delta(next.statement, previous->statement);
  504|       |
  505|       |    // Encode the presence of statementNo as a bit in the line delta, which is
  506|       |    // usually very small.
  507|       |    // ldelta encoding: bits 1..32 contain the line delta. Bit 0 indicates the
  508|       |    // presence of statementNo.
  509|   848k|    ldelta = (ldelta * 2) + (sdelta != 0);
  510|       |
  511|   848k|    appendSignedLEB128(sourcesData_, adelta);
  512|   848k|    appendSignedLEB128(sourcesData_, ldelta);
  513|   848k|    appendSignedLEB128(sourcesData_, cdelta);
  514|   848k|    if (sdelta)
  ------------------
  |  Branch (514:9): [True: 244k, False: 603k]
  ------------------
  515|   244k|      appendSignedLEB128(sourcesData_, sdelta);
  516|   848k|    previous = &next;
  517|   848k|  }
  518|   114k|  appendSignedLEB128(sourcesData_, -1);
  519|       |
  520|   114k|  return startOffset;
  521|   114k|}
_ZN6hermes3hbc18DebugInfoGeneratorC2EONS0_21UniquingFilenameTableE:
  525|     56|          UniquingFilenameTable::toStorage(std::move(filenameTable))) {
  526|       |  // Initialize the empty data entry in debug lexical table.
  527|     56|  assert(
  528|     56|      lexicalData_.size() == kMostCommonEntryOffset &&
  529|     56|      "Lexical data should initially be kMostCommonEntryOffset");
  530|      0|  assert(
  531|     56|      textifiedCallees_.size() == kMostCommonEntryOffset &&
  532|     56|      "Textified callee should initially be kMostCommonEntryOffset");
  533|       |
  534|       |  // Lexical data table.
  535|      0|  appendSignedLEB128(lexicalData_, -1); // parent function
  536|     56|  appendSignedLEB128(lexicalData_, 0); // name count
  537|       |
  538|       |  // Textified callee table.
  539|     56|  appendSignedLEB128(textifiedCallees_, 0);
  540|     56|}
_ZN6hermes3hbc18DebugInfoGenerator17appendLexicalDataENS_8OptValueIjEEN4llvh8ArrayRefINS_10IdentifierEEE:
  544|   114k|    llvh::ArrayRef<Identifier> namesUTF8) {
  545|   114k|  assert(validData && "DebugInfoGenerator not valid");
  546|   114k|  if (!parentFunc.hasValue() && namesUTF8.empty()) {
  ------------------
  |  Branch (546:7): [True: 56, False: 114k]
  |  Branch (546:33): [True: 51, False: 5]
  ------------------
  547|     51|    return kMostCommonEntryOffset;
  548|     51|  }
  549|   114k|  const uint32_t startOffset = lexicalData_.size();
  550|   114k|  appendSignedLEB128(lexicalData_, parentFunc ? *parentFunc : int64_t(-1));
  ------------------
  |  Branch (550:36): [True: 114k, False: 5]
  ------------------
  551|   114k|  appendSignedLEB128(lexicalData_, namesUTF8.size());
  552|   114k|  for (Identifier name : namesUTF8)
  ------------------
  |  Branch (552:24): [True: 114k, False: 114k]
  ------------------
  553|   114k|    appendString(lexicalData_, name);
  554|   114k|  return startOffset;
  555|   114k|}
_ZN6hermes3hbc18DebugInfoGenerator25appendTextifiedCalleeDataEN4llvh8ArrayRefINS0_20DebugTextifiedCalleeEEE:
  558|   114k|    llvh::ArrayRef<DebugTextifiedCallee> textifiedCallees) {
  559|   114k|  if (textifiedCallees.empty()) {
  ------------------
  |  Branch (559:7): [True: 114k, False: 4]
  ------------------
  560|   114k|    return kMostCommonEntryOffset;
  561|   114k|  }
  562|      4|  const uint32_t startOffset = textifiedCallees_.size();
  563|      4|  appendSignedLEB128(textifiedCallees_, textifiedCallees.size());
  564|      8|  for (const DebugTextifiedCallee &callee : textifiedCallees) {
  ------------------
  |  Branch (564:43): [True: 8, False: 4]
  ------------------
  565|      8|    appendSignedLEB128(textifiedCallees_, callee.address);
  566|      8|    appendString(textifiedCallees_, callee.textifiedCallee);
  567|      8|  }
  568|      4|  return startOffset;
  569|   114k|}
_ZN6hermes3hbc18DebugInfoGenerator17serializeWithMoveEv:
  571|     56|DebugInfo DebugInfoGenerator::serializeWithMove() {
  572|     56|  assert(validData);
  573|      0|  validData = false;
  574|       |
  575|     56|  auto combinedData = std::move(sourcesData_);
  576|       |
  577|     56|  combinedData.reserve(
  578|     56|      combinedData.size() + lexicalData_.size() + textifiedCallees_.size() +
  579|     56|      stringTable_.size());
  580|       |
  581|     56|  uint32_t lexicalStart = combinedData.size();
  582|     56|  combinedData.insert(
  583|     56|      combinedData.end(), lexicalData_.begin(), lexicalData_.end());
  584|       |
  585|     56|  uint32_t textifiedCalleeStart = combinedData.size();
  586|     56|  combinedData.insert(
  587|     56|      combinedData.end(), textifiedCallees_.begin(), textifiedCallees_.end());
  588|       |
  589|       |  // Append the string table data.
  590|     56|  uint32_t stringTableStart = combinedData.size();
  591|     56|  combinedData.insert(
  592|     56|      combinedData.end(), stringTable_.begin(), stringTable_.end());
  593|       |
  594|     56|  return DebugInfo(
  595|     56|      std::move(filenameStrings_),
  596|     56|      std::move(files_),
  597|     56|      lexicalStart,
  598|     56|      textifiedCalleeStart,
  599|     56|      stringTableStart,
  600|     56|      StreamVector<uint8_t>(std::move(combinedData)));
  601|     56|}
DebugInfo.cpp:_ZL9getStringPjN4llvh8ArrayRefIhEE:
   88|      8|    llvh::ArrayRef<uint8_t> data) {
   89|       |  // The string is represented as its LEB-encoded length, followed by
   90|       |  // the bytes. This format matches DebugInfoGenerator::appendString().
   91|      8|  uint32_t offset = *inoutOffset;
   92|      8|  int64_t strSize;
   93|      8|  offset += readSignedLEB128(data, offset, &strSize);
   94|      8|  assert(
   95|      8|      strSize >= 0 && // can't be negative
   96|      8|      strSize <= UINT_MAX && // can't overflow uint32
   97|      8|      uint32_t(strSize) + offset >= offset && // sum can't overflow
   98|      8|      uint32_t(strSize) + offset <= data.size() && // validate range
   99|      8|      "Invalid string size");
  100|      0|  const unsigned char *ptr = data.data() + offset;
  101|      8|  offset += strSize;
  102|      8|  *inoutOffset = offset;
  103|      8|  return llvh::StringRef(reinterpret_cast<const char *>(ptr), size_t(strSize));
  104|      8|}
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializerC2EN4llvh8ArrayRefIhEEj:
   26|     24|      : data_(data), offset_(offset) {
   27|     24|    functionIndex_ = decode1Int();
   28|     24|    current_.line = decode1Int();
   29|     24|    current_.column = decode1Int();
   30|     24|  }
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializer10decode1IntEv:
   70|  98.6k|  int64_t decode1Int() {
   71|  98.6k|    int64_t result;
   72|  98.6k|    offset_ += readSignedLEB128(data_, offset_, &result);
   73|  98.6k|    return result;
   74|  98.6k|  }
DebugInfo.cpp:_ZNK12_GLOBAL__N_129FunctionDebugInfoDeserializer10getCurrentEv:
   64|     24|  const DebugSourceLocation &getCurrent() const {
   65|     24|    return current_;
   66|     24|  }
DebugInfo.cpp:_ZNK12_GLOBAL__N_129FunctionDebugInfoDeserializer9getOffsetEv:
   54|  32.8k|  uint32_t getOffset() const {
   55|  32.8k|    return offset_;
   56|  32.8k|  }
DebugInfo.cpp:_ZN12_GLOBAL__N_129FunctionDebugInfoDeserializer4nextEv:
   34|  32.8k|  OptValue<DebugSourceLocation> next() {
   35|  32.8k|    auto addressDelta = decode1Int();
   36|  32.8k|    if (addressDelta == -1)
  ------------------
  |  Branch (36:9): [True: 0, False: 32.8k]
  ------------------
   37|      0|      return llvh::None;
   38|       |    // Presence of the statement delta is LSB of line delta.
   39|  32.8k|    int64_t lineDelta = decode1Int();
   40|  32.8k|    int64_t columnDelta = decode1Int();
   41|  32.8k|    int64_t statementDelta = 0;
   42|  32.8k|    if (lineDelta & 1)
  ------------------
  |  Branch (42:9): [True: 129, False: 32.6k]
  ------------------
   43|    129|      statementDelta = decode1Int();
   44|  32.8k|    lineDelta >>= 1;
   45|       |
   46|  32.8k|    current_.address += addressDelta;
   47|  32.8k|    current_.line += lineDelta;
   48|  32.8k|    current_.column += columnDelta;
   49|  32.8k|    current_.statement += statementDelta;
   50|  32.8k|    return current_;
   51|  32.8k|  }

_ZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionERKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEE:
  386|     56|    std::unique_ptr<BCProviderBase> baseBCProvider) {
  387|     56|  return generateBytecodeModule(
  388|     56|      M,
  389|     56|      entryPoint,
  390|     56|      entryPoint,
  391|     56|      options,
  392|     56|      segment,
  393|     56|      sourceMapGen,
  394|     56|      std::move(baseBCProvider));
  395|     56|}
_ZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEE:
  404|     56|    std::unique_ptr<BCProviderBase> baseBCProvider) {
  405|     56|  PerfSection perf("Bytecode Generation");
  406|     56|  lowerIR(M, options);
  407|       |
  408|     56|  if (options.format == DumpLIR)
  ------------------
  |  Branch (408:7): [True: 0, False: 56]
  ------------------
  409|      0|    M->dump();
  410|       |
  411|     56|  BytecodeModuleGenerator BMGen(options);
  412|       |
  413|     56|  if (segment) {
  ------------------
  |  Branch (413:7): [True: 0, False: 56]
  ------------------
  414|      0|    BMGen.setSegmentID(*segment);
  415|      0|  }
  416|       |  // Empty if all functions should be generated (i.e. bundle splitting was not
  417|       |  // requested).
  418|     56|  llvh::DenseSet<Function *> functionsToGenerate = segment
  ------------------
  |  Branch (418:52): [True: 0, False: 56]
  ------------------
  419|     56|      ? M->getFunctionsInSegment(*segment)
  420|     56|      : llvh::DenseSet<Function *>{};
  421|       |
  422|       |  /// \return true if we should generate function \p f.
  423|     56|  std::function<bool(const Function *)> shouldGenerate;
  424|     56|  if (segment) {
  ------------------
  |  Branch (424:7): [True: 0, False: 56]
  ------------------
  425|      0|    shouldGenerate = [entryPoint, &functionsToGenerate](const Function *f) {
  426|      0|      return f == entryPoint || functionsToGenerate.count(f) > 0;
  427|      0|    };
  428|     56|  } else {
  429|     56|    shouldGenerate = [](const Function *) { return true; };
  430|     56|  }
  431|       |
  432|     56|  { // Collect all the strings in the bytecode module into a storage.
  433|       |    // If we are in delta optimizing mode, start with the string storage from
  434|       |    // our base bytecode provider.
  435|     56|    auto strings = baseBCProvider
  ------------------
  |  Branch (435:20): [True: 0, False: 56]
  ------------------
  436|     56|        ? stringAccumulatorFromBCProvider(*baseBCProvider)
  437|     56|        : UniquingStringLiteralAccumulator{};
  438|       |
  439|     56|    auto addStringOrIdent = [&strings](llvh::StringRef str, bool isIdentifier) {
  440|     56|      strings.addString(str, isIdentifier);
  441|     56|    };
  442|       |
  443|     56|    auto addString = [&strings](llvh::StringRef str) {
  444|     56|      strings.addString(str, /* isIdentifier */ false);
  445|     56|    };
  446|       |
  447|     56|    traverseLiteralStrings(M, shouldGenerate, addStringOrIdent);
  448|       |
  449|     56|    if (options.stripFunctionNames) {
  ------------------
  |  Branch (449:9): [True: 0, False: 56]
  ------------------
  450|      0|      addString(kStrippedFunctionName);
  451|      0|    }
  452|     56|    traverseFunctions(M, shouldGenerate, addString, options.stripFunctionNames);
  453|       |
  454|     56|    if (!M->getCJSModulesResolved()) {
  ------------------
  |  Branch (454:9): [True: 56, False: 0]
  ------------------
  455|     56|      traverseCJSModuleNames(M, shouldGenerate, addString);
  456|     56|    }
  457|       |
  458|     56|    BMGen.initializeStringTable(UniquingStringLiteralAccumulator::toTable(
  459|     56|        std::move(strings), options.optimizationEnabled));
  460|     56|  }
  461|       |
  462|       |  // Generate the serialized literal buffers.
  463|     56|  {
  464|     56|    LiteralBufferBuilder litBuilder{
  465|     56|        M, shouldGenerate, BMGen, options.optimizationEnabled};
  466|     56|    litBuilder.generate();
  467|     56|  }
  468|       |
  469|       |  // Add each function to BMGen so that each function has a unique ID.
  470|   114k|  for (auto &F : *M) {
  ------------------
  |  Branch (470:16): [True: 114k, False: 56]
  ------------------
  471|   114k|    if (!shouldGenerate(&F)) {
  ------------------
  |  Branch (471:9): [True: 0, False: 114k]
  ------------------
  472|      0|      continue;
  473|      0|    }
  474|       |
  475|   114k|    unsigned index = BMGen.addFunction(&F);
  476|   114k|    if (&F == entryPoint) {
  ------------------
  |  Branch (476:9): [True: 56, False: 114k]
  ------------------
  477|     56|      BMGen.setEntryPointIndex(index);
  478|     56|    }
  479|       |
  480|   114k|    auto *cjsModule = M->findCJSModule(&F);
  481|   114k|    if (cjsModule) {
  ------------------
  |  Branch (481:9): [True: 0, False: 114k]
  ------------------
  482|      0|      if (M->getCJSModulesResolved()) {
  ------------------
  |  Branch (482:11): [True: 0, False: 0]
  ------------------
  483|      0|        BMGen.addCJSModuleStatic(cjsModule->id, index);
  484|      0|      } else {
  485|      0|        BMGen.addCJSModule(index, BMGen.getStringID(cjsModule->filename.str()));
  486|      0|      }
  487|      0|    }
  488|       |
  489|       |    // Add entries to function source table for non-default source.
  490|   114k|    if (!F.isGlobalScope()) {
  ------------------
  |  Branch (490:9): [True: 114k, False: 56]
  ------------------
  491|   114k|      if (auto source = F.getSourceRepresentationStr()) {
  ------------------
  |  Branch (491:16): [True: 0, False: 114k]
  ------------------
  492|      0|        BMGen.addFunctionSource(index, BMGen.getStringID(*source));
  493|      0|      }
  494|   114k|    }
  495|   114k|  }
  496|     56|  assert(BMGen.getEntryPointIndex() != -1 && "Entry point not added");
  497|       |
  498|       |  // Construct the relative function scope depth map.
  499|      0|  FunctionScopeAnalysis scopeAnalysis{lexicalTopLevel};
  500|       |
  501|       |  // Allow reusing the debug cache between functions
  502|     56|  HBCISelDebugCache debugCache;
  503|       |
  504|       |  // Bytecode generation for each function.
  505|   114k|  for (auto &F : *M) {
  ------------------
  |  Branch (505:16): [True: 114k, False: 56]
  ------------------
  506|   114k|    if (!shouldGenerate(&F)) {
  ------------------
  |  Branch (506:9): [True: 0, False: 114k]
  ------------------
  507|      0|      continue;
  508|      0|    }
  509|       |
  510|   114k|    std::unique_ptr<BytecodeFunctionGenerator> funcGen;
  511|       |
  512|   114k|    if (F.isLazy()) {
  ------------------
  |  Branch (512:9): [True: 674, False: 114k]
  ------------------
  513|    674|      funcGen = BytecodeFunctionGenerator::create(BMGen, 0);
  514|   114k|    } else {
  515|   114k|      HVMRegisterAllocator RA(&F);
  516|   114k|      ScopeRegisterAnalysis SRA(&F, RA);
  517|   114k|      if (!options.optimizationEnabled) {
  ------------------
  |  Branch (517:11): [True: 114k, False: 0]
  ------------------
  518|   114k|        RA.setFastPassThreshold(kFastRegisterAllocationThreshold);
  519|   114k|        RA.setMemoryLimit(kRegisterAllocationMemoryLimit);
  520|   114k|      }
  521|   114k|      PostOrderAnalysis PO(&F);
  522|       |      /// The order of the blocks is reverse-post-order, which is a simply
  523|       |      /// topological sort.
  524|   114k|      llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
  525|   114k|      RA.allocate(order);
  526|       |
  527|   114k|      if (options.format == DumpRA) {
  ------------------
  |  Branch (527:11): [True: 0, False: 114k]
  ------------------
  528|      0|        RA.dump();
  529|      0|      }
  530|       |
  531|   114k|      PassManager PM{M->getContext().getCodeGenerationSettings()};
  532|   114k|      PM.addPass<LowerStoreInstrs>(RA);
  533|   114k|      PM.addPass<LowerCalls>(RA);
  534|   114k|      if (options.optimizationEnabled) {
  ------------------
  |  Branch (534:11): [True: 0, False: 114k]
  ------------------
  535|      0|        PM.addPass<MovElimination>(RA);
  536|      0|        PM.addPass<RecreateCheapValues>(RA);
  537|      0|        PM.addPass<LoadConstantValueNumbering>(RA);
  538|      0|      }
  539|   114k|      PM.addPass<SpillRegisters>(RA);
  540|   114k|      if (options.basicBlockProfiling) {
  ------------------
  |  Branch (540:11): [True: 0, False: 114k]
  ------------------
  541|       |        // Insert after all other passes so that it sees final basic block
  542|       |        // list.
  543|      0|        PM.addPass<InsertProfilePoint>();
  544|      0|      }
  545|   114k|      PM.run(&F);
  546|       |
  547|   114k|      if (options.format == DumpLRA)
  ------------------
  |  Branch (547:11): [True: 0, False: 114k]
  ------------------
  548|      0|        RA.dump();
  549|       |
  550|   114k|      if (options.format == DumpPostRA)
  ------------------
  |  Branch (550:11): [True: 0, False: 114k]
  ------------------
  551|      0|        F.dump();
  552|       |
  553|   114k|      funcGen =
  554|   114k|          BytecodeFunctionGenerator::create(BMGen, RA.getMaxRegisterUsage());
  555|   114k|      HBCISel hbciSel(&F, funcGen.get(), RA, scopeAnalysis, SRA, options);
  556|   114k|      hbciSel.populateDebugCache(debugCache);
  557|   114k|      hbciSel.generate(sourceMapGen);
  558|   114k|      debugCache = hbciSel.getDebugCache();
  559|   114k|    }
  560|       |
  561|   114k|    if (funcGen->hasEncodingError()) {
  ------------------
  |  Branch (561:9): [True: 0, False: 114k]
  ------------------
  562|      0|      M->getContext().getSourceErrorManager().error(
  563|      0|          F.getSourceRange().Start, "Error encoding bytecode");
  564|      0|      return nullptr;
  565|      0|    }
  566|   114k|    BMGen.setFunctionGenerator(&F, std::move(funcGen));
  567|   114k|  }
  568|       |
  569|     56|  return BMGen.generate();
  570|     56|}
HBC.cpp:_ZN12_GLOBAL__N_17lowerIREPN6hermes6ModuleERKNS0_25BytecodeGenerationOptionsE:
   50|     56|void lowerIR(Module *M, const BytecodeGenerationOptions &options) {
   51|     56|  if (M->isLowered())
  ------------------
  |  Branch (51:7): [True: 0, False: 56]
  ------------------
   52|      0|    return;
   53|       |
   54|     56|  PassManager PM{M->getContext().getCodeGenerationSettings()};
   55|     56|  PM.addPass<LowerLoadStoreFrameInst>();
   56|     56|  if (options.optimizationEnabled) {
  ------------------
  |  Branch (56:7): [True: 0, False: 56]
  ------------------
   57|       |    // OptEnvironmentInit needs to run before LowerConstants.
   58|      0|    PM.addPass<OptEnvironmentInit>();
   59|      0|  }
   60|       |  // LowerExponentiationOperator needs to run before LowerBuiltinCalls because
   61|       |  // it introduces calls to HermesInternal.
   62|     56|  PM.addPass<LowerExponentiationOperator>();
   63|       |  // LowerBuiltinCalls needs to run before the rest of the lowering.
   64|     56|  PM.addPass<LowerBuiltinCalls>();
   65|       |  // It is important to run LowerNumericProperties before LoadConstants
   66|       |  // as LowerNumericProperties could generate new constants.
   67|     56|  PM.addPass<LowerNumericProperties>();
   68|       |  // Lower AllocObjectLiteral into a mixture of HBCAllocObjectFromBufferInst,
   69|       |  // AllocObjectInst, StoreNewOwnPropertyInst and StorePropertyInst.
   70|     56|  PM.addPass<LowerAllocObjectLiteral>();
   71|     56|  PM.addPass<LowerConstruction>();
   72|     56|  PM.addPass<LowerArgumentsArray>();
   73|     56|  PM.addPass<LimitAllocArray>(UINT16_MAX);
   74|     56|  PM.addPass<DedupReifyArguments>();
   75|     56|  PM.addPass<LowerSwitchIntoJumpTables>();
   76|     56|  PM.addPass<SwitchLowering>();
   77|     56|  PM.addPass<LoadConstants>(options.optimizationEnabled);
   78|     56|  PM.addPass<LoadParameters>();
   79|     56|  if (options.optimizationEnabled) {
  ------------------
  |  Branch (79:7): [True: 0, False: 56]
  ------------------
   80|       |    // Lowers AllocObjects and its sequential literal properties into a single
   81|       |    // HBCAllocObjectFromBufferInst
   82|      0|    PM.addPass<LowerAllocObject>();
   83|       |    // Reduce comparison and conditional jump to single comparison jump
   84|      0|    PM.addPass<LowerCondBranch>();
   85|       |    // Turn Calls into CallNs.
   86|      0|    PM.addPass<FuncCallNOpts>();
   87|       |    // Move loads to child blocks if possible.
   88|      0|    PM.addCodeMotion();
   89|       |    // Eliminate common HBCLoadConstInsts.
   90|      0|    PM.addCSE();
   91|       |    // Drop unused HBCLoadParamInsts.
   92|      0|    PM.addDCE();
   93|      0|  }
   94|       |
   95|       |  // Move StartGenerator instructions to the start of functions.
   96|     56|  PM.addHoistStartGenerator();
   97|       |
   98|     56|  PM.run(M);
   99|     56|  M->setLowered(true);
  100|       |
  101|     56|  if (options.verifyIR &&
  ------------------
  |  Branch (101:7): [True: 0, False: 56]
  ------------------
  102|     56|      verifyModule(*M, &llvh::errs(), VerificationMode::IR_VALID)) {
  ------------------
  |  Branch (102:7): [True: 0, False: 0]
  ------------------
  103|      0|    M->dump();
  104|      0|    llvm_unreachable("IR verification failed");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  105|      0|  }
  106|     56|}
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_3clEN4llvh9StringRefE:
  443|   114k|    auto addString = [&strings](llvh::StringRef str) {
  444|   114k|      strings.addString(str, /* isIdentifier */ false);
  445|   114k|    };
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilderC2EPN6hermes6ModuleERKNSt3__18functionIFbPKNS1_8FunctionEEEERNS1_3hbc23BytecodeModuleGeneratorEb:
  210|     56|        literalGenerator_(bmGen) {}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder8generateEv:
  272|     56|void LiteralBufferBuilder::generate() {
  273|     56|  traverse();
  274|       |
  275|       |  // Construct the serialized storage, optionally optimizing it.
  276|     56|  ConsecutiveStringStorage arrayStorage{
  277|     56|      arrays_.beginSet(), arrays_.endSet(), std::true_type{}, optimize_};
  278|     56|  ConsecutiveStringStorage keyStorage{
  279|     56|      objKeys_.beginSet(), objKeys_.endSet(), std::true_type{}, optimize_};
  280|     56|  ConsecutiveStringStorage valStorage{
  281|     56|      objVals_.beginSet(), objVals_.endSet(), std::true_type{}, optimize_};
  282|       |
  283|       |  // Populate the offset map.
  284|     56|  BytecodeModuleGenerator::LiteralOffsetMapTy literalOffsetMap{};
  285|       |
  286|       |  // Visit all array literals.
  287|     56|  auto arrayView = const_cast<const ConsecutiveStringStorage &>(arrayStorage)
  288|     56|                       .getStringTableView();
  289|  33.5k|  for (size_t i = 0, e = arraysInst_.size(); i != e; ++i) {
  ------------------
  |  Branch (289:46): [True: 33.4k, False: 56]
  ------------------
  290|  33.4k|    assert(
  291|  33.4k|        literalOffsetMap.count(arraysInst_[i]) == 0 &&
  292|  33.4k|        "instruction literal can't be serialized twice");
  293|      0|    uint32_t arrayIndexInSet = arrays_.indexInSet(i);
  294|  33.4k|    literalOffsetMap[arraysInst_[i]] = BytecodeModuleGenerator::LiteralOffset{
  295|  33.4k|        arrayView[arrayIndexInSet].getOffset(), UINT32_MAX};
  296|  33.4k|  }
  297|       |
  298|       |  // Visit all object literals - they are split in two buffers.
  299|     56|  auto keyView = const_cast<const ConsecutiveStringStorage &>(keyStorage)
  300|     56|                     .getStringTableView();
  301|     56|  auto valView = const_cast<const ConsecutiveStringStorage &>(valStorage)
  302|     56|                     .getStringTableView();
  303|    936|  for (size_t i = 0, e = objInst_.size(); i != e; ++i) {
  ------------------
  |  Branch (303:43): [True: 880, False: 56]
  ------------------
  304|    880|    assert(
  305|    880|        literalOffsetMap.count(objInst_[i]) == 0 &&
  306|    880|        "instruction literal can't be serialized twice");
  307|      0|    uint32_t keyIndexInSet = objKeys_.indexInSet(i);
  308|    880|    uint32_t valIndexInSet = objVals_.indexInSet(i);
  309|    880|    literalOffsetMap[objInst_[i]] = BytecodeModuleGenerator::LiteralOffset{
  310|    880|        keyView[keyIndexInSet].getOffset(), valView[valIndexInSet].getOffset()};
  311|    880|  }
  312|       |
  313|     56|  bmGen_.initializeSerializedLiterals(
  314|     56|      arrayStorage.acquireStringStorage(),
  315|     56|      keyStorage.acquireStringStorage(),
  316|     56|      valStorage.acquireStringStorage(),
  317|     56|      std::move(literalOffsetMap));
  318|     56|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder8traverseEv:
  320|     56|void LiteralBufferBuilder::traverse() {
  321|   114k|  for (auto &F : *M_) {
  ------------------
  |  Branch (321:16): [True: 114k, False: 56]
  ------------------
  322|   114k|    if (!shouldVisitFunction_(&F))
  ------------------
  |  Branch (322:9): [True: 0, False: 114k]
  ------------------
  323|      0|      continue;
  324|       |
  325|   267k|    for (auto &BB : F) {
  ------------------
  |  Branch (325:19): [True: 267k, False: 114k]
  ------------------
  326|  1.53M|      for (auto &I : BB) {
  ------------------
  |  Branch (326:20): [True: 1.53M, False: 267k]
  ------------------
  327|  1.53M|        if (auto *AAI = dyn_cast<AllocArrayInst>(&I)) {
  ------------------
  |  Branch (327:19): [True: 33.4k, False: 1.49M]
  ------------------
  328|  33.4k|          serializeLiteralFor(AAI);
  329|  1.49M|        } else if (auto *AOFB = dyn_cast<HBCAllocObjectFromBufferInst>(&I)) {
  ------------------
  |  Branch (329:26): [True: 880, False: 1.49M]
  ------------------
  330|    880|          serializeLiteralFor(AOFB);
  331|    880|        }
  332|  1.53M|      }
  333|   267k|    }
  334|   114k|  }
  335|     56|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder19serializeLiteralForEPN6hermes14AllocArrayInstE:
  347|  33.4k|void LiteralBufferBuilder::serializeLiteralFor(AllocArrayInst *AAI) {
  348|  33.4k|  SmallVector<Literal *, 8> elements;
  349|   508k|  for (unsigned i = 0, e = AAI->getElementCount(); i < e; ++i) {
  ------------------
  |  Branch (349:52): [True: 474k, False: 33.4k]
  ------------------
  350|   474k|    elements.push_back(cast<Literal>(AAI->getArrayElement(i)));
  351|   474k|  }
  352|       |
  353|  33.4k|  serializeInto(arrays_, elements, false);
  354|  33.4k|  arraysInst_.push_back(AAI);
  355|  33.4k|}
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder13serializeIntoERNS_19UniquedStringVectorEN4llvh8ArrayRefIPN6hermes7LiteralEEEb:
  340|  35.2k|    bool isKeyBuffer) {
  341|  35.2k|  tempBuffer_.clear();
  342|  35.2k|  literalGenerator_.serializeBuffer(elements, tempBuffer_, isKeyBuffer);
  343|  35.2k|  dest.push_back(
  344|  35.2k|      llvh::StringRef((const char *)tempBuffer_.data(), tempBuffer_.size()));
  345|  35.2k|}
HBC.cpp:_ZN12_GLOBAL__N_119UniquedStringVector9push_backEN4llvh9StringRefE:
  154|  35.2k|  void push_back(llvh::StringRef str) {
  155|  35.2k|    indexInSet_.push_back(set_.insert(str));
  156|  35.2k|  }
HBC.cpp:_ZN12_GLOBAL__N_120LiteralBufferBuilder19serializeLiteralForEPN6hermes28HBCAllocObjectFromBufferInstE:
  358|    880|    HBCAllocObjectFromBufferInst *AOFB) {
  359|    880|  unsigned e = AOFB->getKeyValuePairCount();
  360|    880|  if (!e)
  ------------------
  |  Branch (360:7): [True: 0, False: 880]
  ------------------
  361|      0|    return;
  362|       |
  363|    880|  SmallVector<Literal *, 8> objKeys;
  364|    880|  SmallVector<Literal *, 8> objVals;
  365|  2.69k|  for (unsigned ind = 0; ind != e; ++ind) {
  ------------------
  |  Branch (365:26): [True: 1.81k, False: 880]
  ------------------
  366|  1.81k|    auto keyValuePair = AOFB->getKeyValuePair(ind);
  367|  1.81k|    objKeys.push_back(cast<Literal>(keyValuePair.first));
  368|  1.81k|    objVals.push_back(cast<Literal>(keyValuePair.second));
  369|  1.81k|  }
  370|       |
  371|    880|  serializeInto(objKeys_, objKeys, true);
  372|    880|  serializeInto(objVals_, objVals, false);
  373|    880|  assert(
  374|    880|      objKeys_.size() == objVals_.size() &&
  375|    880|      "objKeys_ and objVals_ must be the same size");
  376|      0|  objInst_.push_back(AOFB);
  377|    880|}
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector4sizeEv:
  160|  1.76k|  size_t size() const {
  161|  1.76k|    return indexInSet_.size();
  162|  1.76k|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector8beginSetEv:
  166|    168|  StringSetVector::const_iterator beginSet() const {
  167|    168|    return set_.begin();
  168|    168|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector6endSetEv:
  171|    168|  StringSetVector::const_iterator endSet() const {
  172|    168|    return set_.end();
  173|    168|  }
HBC.cpp:_ZNK12_GLOBAL__N_119UniquedStringVector10indexInSetEm:
  177|  35.2k|  uint32_t indexInSet(size_t insertionIndex) const {
  178|  35.2k|    return indexInSet_[insertionIndex];
  179|  35.2k|  }
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_1clEPKS3_:
  429|   689k|    shouldGenerate = [](const Function *) { return true; };
HBC.cpp:_ZZN6hermes3hbc22generateBytecodeModuleEPNS_6ModuleEPNS_8FunctionES4_RKNS_25BytecodeGenerationOptionsENS_8OptValueIjEEPNS_18SourceMapGeneratorENSt3__110unique_ptrINS0_14BCProviderBaseENSC_14default_deleteISE_EEEEENK3$_2clEN4llvh9StringRefEb:
  439|   164k|    auto addStringOrIdent = [&strings](llvh::StringRef str, bool isIdentifier) {
  440|   164k|      strings.addString(str, isIdentifier);
  441|   164k|    };

_ZN6hermes3hbc20HVMRegisterAllocator17handleInstructionEPNS_11InstructionE:
   59|  1.41M|void HVMRegisterAllocator::handleInstruction(Instruction *I) {
   60|  1.41M|  if (auto *CI = llvh::dyn_cast<CallInst>(I)) {
  ------------------
  |  Branch (60:13): [True: 574, False: 1.41M]
  ------------------
   61|    574|    return allocateCallInst(CI);
   62|    574|  }
   63|  1.41M|}
_ZN6hermes3hbc20HVMRegisterAllocator16allocateCallInstEPNS_8CallInstE:
   69|    574|void HVMRegisterAllocator::allocateCallInst(CallInst *I) {
   70|    574|  allocateParameterCount(I->getNumArguments() + CALL_EXTRA_REGISTERS);
   71|    574|}
_ZN6hermes3hbc7HBCISel11encodeValueEPNS_5ValueE:
   73|  2.67M|unsigned HBCISel::encodeValue(Value *value) {
   74|  2.67M|  if (llvh::isa<Instruction>(value)) {
  ------------------
  |  Branch (74:7): [True: 2.55M, False: 125k]
  ------------------
   75|  2.55M|    return RA_.getRegister(value).getIndex();
   76|  2.55M|  } else if (auto *var = llvh::dyn_cast<Variable>(value)) {
  ------------------
  |  Branch (76:20): [True: 125k, False: 0]
  ------------------
   77|   125k|    return var->getIndexInVariableList();
   78|   125k|  } else {
   79|      0|    llvm_unreachable("Do not support other value types");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   80|      0|  }
   81|  2.67M|}
_ZN6hermes3hbc7HBCISel16registerLongJumpEjPNS_10BasicBlockE:
   83|    111|void HBCISel::registerLongJump(offset_t loc, BasicBlock *target) {
   84|    111|  relocations_.push_back(
   85|    111|      {loc, Relocation::RelocationType::LongJumpType, target});
   86|    111|}
_ZN6hermes3hbc7HBCISel18resolveRelocationsEv:
   93|   114k|void HBCISel::resolveRelocations() {
   94|   114k|  bool changed;
   95|   114k|  do {
   96|   114k|    int totalShift = 0;
   97|   114k|    changed = false;
   98|  1.31M|    for (auto &relocation : relocations_) {
  ------------------
  |  Branch (98:27): [True: 1.31M, False: 114k]
  ------------------
   99|  1.31M|      auto loc = relocation.loc;
  100|  1.31M|      auto *pointer = relocation.pointer;
  101|  1.31M|      auto type = relocation.type;
  102|  1.31M|      loc -= totalShift;
  103|  1.31M|      relocation.loc = loc;
  104|  1.31M|      switch (type) {
  ------------------
  |  Branch (104:15): [True: 0, False: 1.31M]
  ------------------
  105|    132|        case Relocation::LongJumpType: {
  ------------------
  |  Branch (105:9): [True: 132, False: 1.31M]
  ------------------
  106|    132|          int targetLoc = basicBlockMap_[cast<BasicBlock>(pointer)].first;
  107|    132|          int jumpOffset = targetLoc - loc;
  108|    132|          if (-128 <= jumpOffset && jumpOffset < 128) {
  ------------------
  |  Branch (108:15): [True: 132, False: 0]
  |  Branch (108:37): [True: 108, False: 24]
  ------------------
  109|       |            // The jump offset can fit into one byte.
  110|    108|            totalShift += 3;
  111|    108|            BCFGen_->shrinkJump(loc + 1);
  112|    108|            BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 1);
  113|    108|            relocation.type = Relocation::JumpType;
  114|    108|            changed = true;
  115|    108|          } else {
  116|     24|            BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 4);
  117|     24|          }
  118|    132|          break;
  119|      0|        }
  120|   232k|        case Relocation::BasicBlockType:
  ------------------
  |  Branch (120:9): [True: 232k, False: 1.07M]
  ------------------
  121|   232k|          basicBlockMap_[cast<BasicBlock>(pointer)].first = loc;
  122|   232k|          break;
  123|    188|        case Relocation::JumpType: {
  ------------------
  |  Branch (123:9): [True: 188, False: 1.31M]
  ------------------
  124|    188|          int targetLoc = basicBlockMap_[cast<BasicBlock>(pointer)].first;
  125|    188|          int jumpOffset = targetLoc - loc;
  126|    188|          BCFGen_->updateJumpTarget(loc + 1, jumpOffset, 1);
  127|    188|          break;
  128|      0|        }
  129|     36|        case Relocation::CatchType:
  ------------------
  |  Branch (129:9): [True: 36, False: 1.31M]
  ------------------
  130|     36|          catchInfoMap_[cast<CatchInst>(pointer)].catchLocation = loc;
  131|     36|          break;
  132|  1.07M|        case Relocation::DebugInfo:
  ------------------
  |  Branch (132:9): [True: 1.07M, False: 232k]
  ------------------
  133|       |          // Nothing, just keep track of the location.
  134|  1.07M|          break;
  135|      8|        case Relocation::TextifiedCallee:
  ------------------
  |  Branch (135:9): [True: 8, False: 1.31M]
  ------------------
  136|       |          // Nothing to update.
  137|      8|          break;
  138|      0|        case Relocation::JumpTableDispatch:
  ------------------
  |  Branch (138:9): [True: 0, False: 1.31M]
  ------------------
  139|      0|          auto &switchImmInfo = switchImmInfo_[cast<SwitchImmInst>(pointer)];
  140|       |          // update default target jmp
  141|      0|          BasicBlock *defaultBlock = switchImmInfo.defaultTarget;
  142|      0|          int defaultOffset = basicBlockMap_[defaultBlock].first - loc;
  143|      0|          BCFGen_->updateJumpTarget(loc + 1 + 1 + 4, defaultOffset, 4);
  144|      0|          switchImmInfo_[cast<SwitchImmInst>(pointer)].offset = loc;
  145|      0|          break;
  146|  1.31M|      }
  147|       |
  148|  1.31M|      NumJumpPass++;
  149|  1.31M|    }
  150|   114k|  } while (changed);
  ------------------
  |  Branch (150:12): [True: 10, False: 114k]
  ------------------
  151|   114k|}
_ZN6hermes3hbc7HBCISel24resolveExceptionHandlersEv:
  153|   114k|void HBCISel::resolveExceptionHandlers() {
  154|   114k|  if (catchInfoMap_.empty()) {
  ------------------
  |  Branch (154:7): [True: 114k, False: 2]
  ------------------
  155|       |    // No exception handling, no need to do anything.
  156|   114k|    return;
  157|   114k|  }
  158|       |
  159|      2|  BasicBlockInfoMap bbMap;
  160|  39.3k|  for (auto it : basicBlockMap_) {
  ------------------
  |  Branch (160:16): [True: 39.3k, False: 2]
  ------------------
  161|  39.3k|    bbMap[it.first] =
  162|  39.3k|        std::make_pair(it.second.first, basicBlockMap_[it.second.second].first);
  163|  39.3k|  }
  164|      2|  auto exceptionEntries = generateExceptionHandlers(catchInfoMap_, bbMap, F_);
  165|      6|  for (auto entry : exceptionEntries) {
  ------------------
  |  Branch (165:19): [True: 6, False: 2]
  ------------------
  166|      6|    BCFGen_->addExceptionHandler(
  167|      6|        HBCExceptionHandlerInfo{entry.start, entry.end, entry.target});
  168|      6|  }
  169|      2|}
_ZN6hermes3hbc7HBCISel17generateJumpTableEv:
  171|   114k|void HBCISel::generateJumpTable() {
  172|   114k|  using SwitchInfoEntry =
  173|   114k|      llvh::DenseMap<SwitchImmInst *, SwitchImmInfo>::iterator::value_type;
  174|       |
  175|   114k|  if (switchImmInfo_.empty())
  ------------------
  |  Branch (175:7): [True: 114k, False: 0]
  ------------------
  176|   114k|    return;
  177|       |
  178|      0|  std::vector<uint32_t> res{};
  179|       |
  180|       |  // Sort the jump table entries so iteration order is deterministic.
  181|      0|  llvh::SmallVector<SwitchInfoEntry, 1> infoVector{
  182|      0|      switchImmInfo_.begin(), switchImmInfo_.end()};
  183|      0|  std::sort(
  184|      0|      infoVector.begin(),
  185|      0|      infoVector.end(),
  186|      0|      [](SwitchInfoEntry &a, SwitchInfoEntry &b) {
  187|      0|        return a.second.offset < b.second.offset;
  188|      0|      });
  189|       |
  190|       |  // Fix up all SwitchImm instructions with correct offset.
  191|      0|  for (auto &tuple : infoVector) {
  ------------------
  |  Branch (191:20): [True: 0, False: 0]
  ------------------
  192|      0|    auto entry = tuple.second;
  193|      0|    uint32_t startOfTable = res.size();
  194|      0|    for (uint32_t jmpIdx = 0; jmpIdx < entry.table.size(); jmpIdx++) {
  ------------------
  |  Branch (194:31): [True: 0, False: 0]
  ------------------
  195|      0|      res.push_back(basicBlockMap_[entry.table[jmpIdx]].first - entry.offset);
  196|      0|    }
  197|       |
  198|      0|    BCFGen_->updateJumpTableOffset(
  199|       |        // Offset is located two bytes from begining of instruction.
  200|      0|        entry.offset + 1 + 1,
  201|      0|        startOfTable,
  202|      0|        entry.offset);
  203|      0|  }
  204|       |
  205|      0|  BCFGen_->setJumpTable(std::move(res));
  206|      0|}
_ZN6hermes3hbc7HBCISel22getDebugSourceLocationERNS_18SourceErrorManagerEN4llvh5SMLocEPNS0_19DebugSourceLocationE:
  211|  1.00M|    DebugSourceLocation *out) {
  212|  1.00M|  SourceErrorManager::SourceCoords coords{};
  213|  1.00M|  if (!manager.findBufferLineAndLoc(loc, coords, /*translate*/ true)) {
  ------------------
  |  Branch (213:7): [True: 0, False: 1.00M]
  ------------------
  214|      0|    return false;
  215|      0|  }
  216|       |
  217|  1.00M|  if (debugIdCache_.currentBufId != coords.bufId) {
  ------------------
  |  Branch (217:7): [True: 56, False: 1.00M]
  ------------------
  218|     56|    llvh::StringRef filename = manager.getSourceUrl(coords.bufId);
  219|     56|    debugIdCache_.currentFilenameId = BCFGen_->addFilename(filename);
  220|       |
  221|     56|    auto sourceMappingUrl = manager.getSourceMappingUrl(coords.bufId);
  222|       |
  223|       |    // Lazily compiled functions ask to strip the source mapping URL because it
  224|       |    // was already encoded in the top level module, and it could be a 1MB+ data
  225|       |    // url that we don't want to duplicate once per function.
  226|     56|    if (sourceMappingUrl.empty() ||
  ------------------
  |  Branch (226:9): [True: 56, False: 0]
  ------------------
  227|     56|        bytecodeGenerationOptions_.stripSourceMappingURL) {
  ------------------
  |  Branch (227:9): [True: 0, False: 0]
  ------------------
  228|     56|      debugIdCache_.currentSourceMappingUrlId =
  229|     56|          facebook::hermes::debugger::kInvalidBreakpoint;
  230|     56|    } else {
  231|      0|      debugIdCache_.currentSourceMappingUrlId = BCFGen_->addFilename(
  232|      0|          F_->getParent()->getContext().getIdentifier(sourceMappingUrl).str());
  233|      0|    }
  234|       |
  235|     56|    debugIdCache_.currentBufId = coords.bufId;
  236|     56|  }
  237|       |
  238|  1.00M|  out->line = coords.line;
  239|  1.00M|  out->column = coords.col;
  240|  1.00M|  out->filenameId = debugIdCache_.currentFilenameId;
  241|  1.00M|  out->sourceMappingUrlId = debugIdCache_.currentSourceMappingUrlId;
  242|       |
  243|  1.00M|  return true;
  244|  1.00M|}
_ZN6hermes3hbc7HBCISel26addDebugSourceLocationInfoEPNS_18SourceMapGeneratorE:
  246|   114k|void HBCISel::addDebugSourceLocationInfo(SourceMapGenerator *outSourceMap) {
  247|   114k|  bool needDebugStatementNo =
  248|   114k|      F_->getContext().getDebugInfoSetting() == DebugInfoSetting::ALL ||
  ------------------
  |  Branch (248:7): [True: 114k, False: 0]
  ------------------
  249|   114k|      F_->getContext().getDebugInfoSetting() == DebugInfoSetting::SOURCE_MAP;
  ------------------
  |  Branch (249:7): [True: 0, False: 0]
  ------------------
  250|   114k|  auto &manager = F_->getContext().getSourceErrorManager();
  251|   114k|  IRBuilder builder(F_);
  252|       |
  253|   114k|  DebugSourceLocation info{};
  254|       |
  255|   114k|  bool hasDebugInfo = false;
  256|  1.04M|  for (auto &reloc : relocations_) {
  ------------------
  |  Branch (256:20): [True: 1.04M, False: 114k]
  ------------------
  257|  1.04M|    if (reloc.type != Relocation::DebugInfo)
  ------------------
  |  Branch (257:9): [True: 153k, False: 887k]
  ------------------
  258|   153k|      continue;
  259|   887k|    hasDebugInfo = true;
  260|   887k|    auto *inst = cast<Instruction>(reloc.pointer);
  261|       |
  262|   887k|    assert(inst->hasLocation() && "Missing location");
  263|      0|    auto location = inst->getLocation();
  264|       |
  265|   887k|    if (!getDebugSourceLocation(manager, location, &info)) {
  ------------------
  |  Branch (265:9): [True: 0, False: 887k]
  ------------------
  266|      0|      llvm_unreachable("Unable to get source location");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  267|      0|    }
  268|   887k|    info.address = reloc.loc;
  269|   887k|    info.statement = needDebugStatementNo ? inst->getStatementIndex() : 0;
  ------------------
  |  Branch (269:22): [True: 887k, False: 0]
  ------------------
  270|   887k|    BCFGen_->addDebugSourceLocation(info);
  271|   887k|  }
  272|       |
  273|       |  // If there's no debug info, don't set the function location.
  274|       |  // This avoids polluting the string table with source file names.
  275|   114k|  if (hasDebugInfo) {
  ------------------
  |  Branch (275:7): [True: 114k, False: 0]
  ------------------
  276|   114k|    getDebugSourceLocation(manager, F_->getSourceRange().Start, &info);
  277|   114k|    info.address = 0;
  278|   114k|    info.statement = 0;
  279|   114k|    BCFGen_->setSourceLocation(info);
  280|   114k|  }
  281|   114k|}
_ZN6hermes3hbc7HBCISel27addDebugTextifiedCalleeInfoEv:
  283|   114k|void HBCISel::addDebugTextifiedCalleeInfo() {
  284|  1.04M|  for (auto &reloc : relocations_) {
  ------------------
  |  Branch (284:20): [True: 1.04M, False: 114k]
  ------------------
  285|  1.04M|    if (reloc.type != Relocation::TextifiedCallee)
  ------------------
  |  Branch (285:9): [True: 1.04M, False: 8]
  ------------------
  286|  1.04M|      continue;
  287|      8|    BCFGen_->addDebugTextfiedCallee(
  288|      8|        {reloc.loc, llvh::cast<LiteralString>(reloc.pointer)->getValue()});
  289|      8|  }
  290|   114k|}
_ZN6hermes3hbc7HBCISel19addDebugLexicalInfoEv:
  323|   114k|void HBCISel::addDebugLexicalInfo() {
  324|       |  // Only emit if debug info is enabled.
  325|   114k|  if (F_->getContext().getDebugInfoSetting() != DebugInfoSetting::ALL)
  ------------------
  |  Branch (325:7): [True: 0, False: 114k]
  ------------------
  326|      0|    return;
  327|       |
  328|       |  // Set the lexical parent.
  329|   114k|  Function *parent = scopeAnalysis_.getLexicalParent(F_);
  330|   114k|  if (parent)
  ------------------
  |  Branch (330:7): [True: 114k, False: 56]
  ------------------
  331|   114k|    BCFGen_->setLexicalParentID(BCFGen_->getFunctionID(parent));
  332|       |
  333|       |  // Add variable names to the lexical info table. All strings in the debug
  334|       |  // table mutex be valid UTF8, so the names may have to be converted to valid
  335|       |  // UTF8 strings.
  336|   114k|  std::vector<Identifier> names;
  337|   114k|  std::string nameUTF8Buffer;
  338|   114k|  for (const Variable *var : F_->getFunctionScopeDesc()->getVariables()) {
  ------------------
  |  Branch (338:28): [True: 114k, False: 114k]
  ------------------
  339|   114k|    names.push_back(ensureUTF8Identifer(
  340|   114k|        F_->getContext().getStringTable(), var->getName(), nameUTF8Buffer));
  341|   114k|  }
  342|   114k|  BCFGen_->setDebugVariableNamesUTF8(std::move(names));
  343|   114k|}
_ZN6hermes3hbc7HBCISel27populatePropertyCachingInfoEv:
  345|   114k|void HBCISel::populatePropertyCachingInfo() {
  346|   114k|  BCFGen_->setHighestReadCacheIndex(lastPropertyReadCacheIndex_);
  347|   114k|  BCFGen_->setHighestWriteCacheIndex(lastPropertyWriteCacheIndex_);
  348|   114k|}
_ZN6hermes3hbc7HBCISel20generateAsNumberInstEPNS_12AsNumberInstEPNS_10BasicBlockE:
  376|      4|void HBCISel::generateAsNumberInst(AsNumberInst *Inst, BasicBlock *next) {
  377|      4|  auto dst = encodeValue(Inst);
  378|      4|  auto src = encodeValue(Inst->getSingleOperand());
  379|      4|  BCFGen_->emitToNumber(dst, src);
  380|      4|}
_ZN6hermes3hbc7HBCISel21generateAsNumericInstEPNS_13AsNumericInstEPNS_10BasicBlockE:
  382|      2|void HBCISel::generateAsNumericInst(AsNumericInst *Inst, BasicBlock *next) {
  383|      2|  auto dst = encodeValue(Inst);
  384|      2|  auto src = encodeValue(Inst->getSingleOperand());
  385|      2|  BCFGen_->emitToNumeric(dst, src);
  386|      2|}
_ZN6hermes3hbc7HBCISel15emitMovIfNeededEll:
  394|   267k|void HBCISel::emitMovIfNeeded(param_t dest, param_t src) {
  395|   267k|  if (dest == src)
  ------------------
  |  Branch (395:7): [True: 43, False: 267k]
  ------------------
  396|     43|    return;
  397|   267k|  if (dest <= UINT8_MAX && src <= UINT8_MAX) {
  ------------------
  |  Branch (397:7): [True: 130k, False: 137k]
  |  Branch (397:28): [True: 130k, False: 33]
  ------------------
  398|   130k|    BCFGen_->emitMov(dest, src);
  399|   137k|  } else {
  400|   137k|    BCFGen_->emitMovLong(dest, src);
  401|   137k|  }
  402|   267k|}
_ZN6hermes3hbc7HBCISel10verifyCallEPNS_8CallInstE:
  410|    574|void HBCISel::verifyCall(CallInst *Inst) {
  411|    574|#ifndef NDEBUG
  412|    574|  const auto lastArgReg = RA_.getLastRegister().getIndex() -
  413|    574|      HVMRegisterAllocator::CALL_EXTRA_REGISTERS;
  414|       |
  415|    574|  const bool isBuiltin = llvh::isa<CallBuiltinInst>(Inst);
  416|    574|  const bool isCallN = llvh::isa<HBCCallNInst>(Inst);
  417|       |
  418|   136k|  for (unsigned i = 0, max = Inst->getNumArguments(); i < max; i++) {
  ------------------
  |  Branch (418:55): [True: 135k, False: 574]
  ------------------
  419|   135k|    Value *argument = Inst->getArgument(i);
  420|       |    // The first argument (thisArg) of CallBuiltin LiteralUndefined.
  421|   135k|    if (isBuiltin && i == 0) {
  ------------------
  |  Branch (421:9): [True: 68.2k, False: 67.6k]
  |  Branch (421:22): [True: 283, False: 67.9k]
  ------------------
  422|    283|      assert(
  423|    283|          llvh::isa<LiteralUndefined>(argument) && !RA_.isAllocated(argument) &&
  424|    283|          "Register for 'this' argument is misallocated");
  425|   135k|    } else if (isCallN) {
  ------------------
  |  Branch (425:16): [True: 0, False: 135k]
  ------------------
  426|       |      // CallN may take arguments from anywhere except for the last N registers
  427|       |      // of the frame, because the bytecode instruction overwrites those
  428|       |      // registers. Note that <= is correct because lastArgReg is the index of
  429|       |      // the last register, not the count of registers.
  430|      0|      assert(
  431|      0|          llvh::isa<Instruction>(argument) &&
  432|      0|          RA_.getRegister(argument).getIndex() <= lastArgReg - max);
  433|   135k|    } else {
  434|       |      // Calls require that the arguments be at the end of the frame, in reverse
  435|       |      // order.
  436|   135k|      assert(
  437|   135k|          llvh::isa<Instruction>(argument) &&
  438|   135k|          RA_.getRegister(argument).getIndex() == lastArgReg - i &&
  439|   135k|          "Register is misallocated");
  440|   135k|    }
  441|   135k|  }
  442|    574|#endif
  443|    574|}
_ZN6hermes3hbc7HBCISel21generateLoadStackInstEPNS_13LoadStackInstEPNS_10BasicBlockE:
  445|    105|void HBCISel::generateLoadStackInst(LoadStackInst *Inst, BasicBlock *next) {
  446|    105|  auto dst = encodeValue(Inst);
  447|    105|  auto src = encodeValue(Inst->getSingleOperand());
  448|    105|  emitMovIfNeeded(dst, src);
  449|    105|}
_ZN6hermes3hbc7HBCISel15generateMovInstEPNS_7MovInstEPNS_10BasicBlockE:
  450|   264k|void HBCISel::generateMovInst(MovInst *Inst, BasicBlock *next) {
  451|   264k|  auto dst = encodeValue(Inst);
  452|   264k|  auto src = encodeValue(Inst->getSingleOperand());
  453|   264k|  emitMovIfNeeded(dst, src);
  454|   264k|}
_ZN6hermes3hbc7HBCISel23generateImplicitMovInstEPNS_15ImplicitMovInstEPNS_10BasicBlockE:
  456|    283|void HBCISel::generateImplicitMovInst(ImplicitMovInst *Inst, BasicBlock *next) {
  457|       |  // ImplicitMovs produce no bytecode, they only express that a subsequent
  458|       |  // instruction will perform the equivalent of a 'Mov'.
  459|    283|}
_ZN6hermes3hbc7HBCISel25generateUnaryOperatorInstEPNS_17UnaryOperatorInstEPNS_10BasicBlockE:
  463|  4.00k|    BasicBlock *next) {
  464|  4.00k|  auto opReg = encodeValue(Inst->getSingleOperand());
  465|  4.00k|  auto resReg = encodeValue(Inst);
  466|       |
  467|  4.00k|  using OpKind = UnaryOperatorInst::OpKind;
  468|       |
  469|  4.00k|  switch (Inst->getOperatorKind()) {
  470|      0|    case OpKind::TypeofKind: { // typeof
  ------------------
  |  Branch (470:5): [True: 0, False: 4.00k]
  ------------------
  471|      0|      BCFGen_->emitTypeOf(resReg, opReg);
  472|      0|      break;
  473|      0|    }
  474|  3.98k|    case OpKind::MinusKind: { // -
  ------------------
  |  Branch (474:5): [True: 3.98k, False: 13]
  ------------------
  475|  3.98k|      BCFGen_->emitNegate(resReg, opReg);
  476|  3.98k|      break;
  477|      0|    }
  478|      4|    case OpKind::TildeKind: { // ~
  ------------------
  |  Branch (478:5): [True: 4, False: 3.99k]
  ------------------
  479|      4|      BCFGen_->emitBitNot(resReg, opReg);
  480|      4|      break;
  481|      0|    }
  482|      7|    case OpKind::BangKind: { // !
  ------------------
  |  Branch (482:5): [True: 7, False: 3.99k]
  ------------------
  483|      7|      BCFGen_->emitNot(resReg, opReg);
  484|      7|      break;
  485|      0|    }
  486|      0|    case OpKind::VoidKind: { // Void operator.
  ------------------
  |  Branch (486:5): [True: 0, False: 4.00k]
  ------------------
  487|      0|      BCFGen_->emitLoadConstUndefined(resReg);
  488|      0|      break;
  489|      0|    }
  490|      2|    case OpKind::IncKind: { // ++
  ------------------
  |  Branch (490:5): [True: 2, False: 4.00k]
  ------------------
  491|      2|      BCFGen_->emitInc(resReg, opReg);
  492|      2|      break;
  493|      0|    }
  494|      0|    case OpKind::DecKind: { // --
  ------------------
  |  Branch (494:5): [True: 0, False: 4.00k]
  ------------------
  495|      0|      BCFGen_->emitDec(resReg, opReg);
  496|      0|      break;
  497|      0|    }
  498|      0|    default:
  ------------------
  |  Branch (498:5): [True: 0, False: 4.00k]
  ------------------
  499|      0|      llvm_unreachable("Can't handle this operation");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  500|      0|      break;
  501|  4.00k|  }
  502|  4.00k|}
_ZN6hermes3hbc7HBCISel15generatePhiInstEPNS_7PhiInstEPNS_10BasicBlockE:
  506|     34|void HBCISel::generatePhiInst(PhiInst *Inst, BasicBlock *next) {
  507|       |  // PhiInst has been translated into a sequence of MOVs in RegAlloc
  508|       |  // Nothing to do here.
  509|     34|}
_ZN6hermes3hbc7HBCISel26generateBinaryOperatorInstEPNS_18BinaryOperatorInstEPNS_10BasicBlockE:
  512|  65.0k|    BasicBlock *next) {
  513|  65.0k|  auto left = encodeValue(Inst->getLeftHandSide());
  514|  65.0k|  auto right = encodeValue(Inst->getRightHandSide());
  515|  65.0k|  auto res = encodeValue(Inst);
  516|       |
  517|  65.0k|  bool isBothNumber = Inst->getLeftHandSide()->getType().isNumberType() &&
  ------------------
  |  Branch (517:23): [True: 12, False: 65.0k]
  ------------------
  518|  65.0k|      Inst->getRightHandSide()->getType().isNumberType();
  ------------------
  |  Branch (518:7): [True: 8, False: 4]
  ------------------
  519|       |
  520|  65.0k|  using OpKind = BinaryOperatorInst::OpKind;
  521|       |
  522|  65.0k|  switch (Inst->getOperatorKind()) {
  523|      1|    case OpKind::EqualKind: // ==
  ------------------
  |  Branch (523:5): [True: 1, False: 65.0k]
  ------------------
  524|       |      // TODO: optimize the case for null check.
  525|      1|      BCFGen_->emitEq(res, left, right);
  526|      1|      break;
  527|      0|    case OpKind::NotEqualKind: // !=
  ------------------
  |  Branch (527:5): [True: 0, False: 65.0k]
  ------------------
  528|       |      // TODO: optimize the case for null check.
  529|      0|      BCFGen_->emitNeq(res, left, right);
  530|      0|      break;
  531|      6|    case OpKind::StrictlyEqualKind: // ===
  ------------------
  |  Branch (531:5): [True: 6, False: 65.0k]
  ------------------
  532|      6|      BCFGen_->emitStrictEq(res, left, right);
  533|      6|      break;
  534|      0|    case OpKind::StrictlyNotEqualKind: // !===
  ------------------
  |  Branch (534:5): [True: 0, False: 65.0k]
  ------------------
  535|      0|      BCFGen_->emitStrictNeq(res, left, right);
  536|      0|      break;
  537|  3.73k|    case OpKind::LessThanKind: // <
  ------------------
  |  Branch (537:5): [True: 3.73k, False: 61.3k]
  ------------------
  538|  3.73k|      BCFGen_->emitLess(res, left, right);
  539|  3.73k|      break;
  540|      0|    case OpKind::LessThanOrEqualKind: // <=
  ------------------
  |  Branch (540:5): [True: 0, False: 65.0k]
  ------------------
  541|      0|      BCFGen_->emitLessEq(res, left, right);
  542|      0|      break;
  543|  5.08k|    case OpKind::GreaterThanKind: // >
  ------------------
  |  Branch (543:5): [True: 5.08k, False: 59.9k]
  ------------------
  544|  5.08k|      BCFGen_->emitGreater(res, left, right);
  545|  5.08k|      break;
  546|      0|    case OpKind::GreaterThanOrEqualKind: // >=
  ------------------
  |  Branch (546:5): [True: 0, False: 65.0k]
  ------------------
  547|      0|      BCFGen_->emitGreaterEq(res, left, right);
  548|      0|      break;
  549|      0|    case OpKind::LeftShiftKind: // <<  (<<=)
  ------------------
  |  Branch (549:5): [True: 0, False: 65.0k]
  ------------------
  550|      0|      BCFGen_->emitLShift(res, left, right);
  551|      0|      break;
  552|      1|    case OpKind::RightShiftKind: // >>  (>>=)
  ------------------
  |  Branch (552:5): [True: 1, False: 65.0k]
  ------------------
  553|      1|      BCFGen_->emitRShift(res, left, right);
  554|      1|      break;
  555|      0|    case OpKind::UnsignedRightShiftKind: // >>> (>>>=)
  ------------------
  |  Branch (555:5): [True: 0, False: 65.0k]
  ------------------
  556|      0|      BCFGen_->emitURshift(res, left, right);
  557|      0|      break;
  558|  41.1k|    case OpKind::AddKind: // +   (+=)
  ------------------
  |  Branch (558:5): [True: 41.1k, False: 23.8k]
  ------------------
  559|  41.1k|      if (isBothNumber) {
  ------------------
  |  Branch (559:11): [True: 0, False: 41.1k]
  ------------------
  560|      0|        BCFGen_->emitAddN(res, left, right);
  561|  41.1k|      } else {
  562|  41.1k|        BCFGen_->emitAdd(res, left, right);
  563|  41.1k|      }
  564|  41.1k|      break;
  565|      2|    case OpKind::SubtractKind: // -   (-=)
  ------------------
  |  Branch (565:5): [True: 2, False: 65.0k]
  ------------------
  566|      2|      if (isBothNumber) {
  ------------------
  |  Branch (566:11): [True: 0, False: 2]
  ------------------
  567|      0|        BCFGen_->emitSubN(res, left, right);
  568|      2|      } else {
  569|      2|        BCFGen_->emitSub(res, left, right);
  570|      2|      }
  571|      2|      break;
  572|    190|    case OpKind::MultiplyKind: // *   (*=)
  ------------------
  |  Branch (572:5): [True: 190, False: 64.8k]
  ------------------
  573|    190|      if (isBothNumber) {
  ------------------
  |  Branch (573:11): [True: 0, False: 190]
  ------------------
  574|      0|        BCFGen_->emitMulN(res, left, right);
  575|    190|      } else {
  576|    190|        BCFGen_->emitMul(res, left, right);
  577|    190|      }
  578|    190|      break;
  579|  7.58k|    case OpKind::DivideKind: // /   (/=)
  ------------------
  |  Branch (579:5): [True: 7.58k, False: 57.4k]
  ------------------
  580|  7.58k|      if (isBothNumber) {
  ------------------
  |  Branch (580:11): [True: 8, False: 7.57k]
  ------------------
  581|      8|        BCFGen_->emitDivN(res, left, right);
  582|  7.57k|      } else {
  583|  7.57k|        BCFGen_->emitDiv(res, left, right);
  584|  7.57k|      }
  585|  7.58k|      break;
  586|      0|    case OpKind::ExponentiationKind: // ** (**=)
  ------------------
  |  Branch (586:5): [True: 0, False: 65.0k]
  ------------------
  587|      0|      llvm_unreachable("ExponentiationKind emits a HermesInternal call");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  588|      0|      break;
  589|  7.03k|    case OpKind::ModuloKind: // %   (%=)
  ------------------
  |  Branch (589:5): [True: 7.03k, False: 58.0k]
  ------------------
  590|  7.03k|      BCFGen_->emitMod(res, left, right);
  591|  7.03k|      break;
  592|    222|    case OpKind::OrKind: // |   (|=)
  ------------------
  |  Branch (592:5): [True: 222, False: 64.8k]
  ------------------
  593|    222|      BCFGen_->emitBitOr(res, left, right);
  594|    222|      break;
  595|      0|    case OpKind::XorKind: // ^   (^=)
  ------------------
  |  Branch (595:5): [True: 0, False: 65.0k]
  ------------------
  596|      0|      BCFGen_->emitBitXor(res, left, right);
  597|      0|      break;
  598|      6|    case OpKind::AndKind: // &   (^=)
  ------------------
  |  Branch (598:5): [True: 6, False: 65.0k]
  ------------------
  599|      6|      BCFGen_->emitBitAnd(res, left, right);
  600|      6|      break;
  601|      0|    case OpKind::InKind: // "in"
  ------------------
  |  Branch (601:5): [True: 0, False: 65.0k]
  ------------------
  602|      0|      BCFGen_->emitIsIn(res, left, right);
  603|      0|      break;
  604|      0|    case OpKind::InstanceOfKind: // instanceof
  ------------------
  |  Branch (604:5): [True: 0, False: 65.0k]
  ------------------
  605|      0|      BCFGen_->emitInstanceOf(res, left, right);
  606|      0|      break;
  607|       |
  608|      0|    default:
  ------------------
  |  Branch (608:5): [True: 0, False: 65.0k]
  ------------------
  609|      0|      break;
  610|  65.0k|  }
  611|  65.0k|}
_ZN6hermes3hbc7HBCISel25generateStorePropertyInstEPNS_17StorePropertyInstEPNS_10BasicBlockE:
  614|  3.78k|    BasicBlock *next) {
  615|  3.78k|  auto valueReg = encodeValue(Inst->getStoredValue());
  616|  3.78k|  auto objReg = encodeValue(Inst->getObject());
  617|  3.78k|  auto prop = Inst->getProperty();
  618|       |
  619|  3.78k|  if (auto *Lit = llvh::dyn_cast<LiteralString>(prop)) {
  ------------------
  |  Branch (619:13): [True: 3.78k, False: 0]
  ------------------
  620|       |    // Property is a string
  621|  3.78k|    auto id = BCFGen_->getIdentifierID(Lit);
  622|  3.78k|    if (id <= UINT16_MAX)
  ------------------
  |  Branch (622:9): [True: 3.78k, False: 0]
  ------------------
  623|  3.78k|      BCFGen_->emitPutById(
  624|  3.78k|          objReg, valueReg, acquirePropertyWriteCacheIndex(id), id);
  625|      0|    else
  626|      0|      BCFGen_->emitPutByIdLong(
  627|      0|          objReg, valueReg, acquirePropertyWriteCacheIndex(id), id);
  628|  3.78k|    return;
  629|  3.78k|  }
  630|       |
  631|      0|  auto propReg = encodeValue(prop);
  632|      0|  BCFGen_->emitPutByVal(objReg, propReg, valueReg);
  633|      0|}
_ZN6hermes3hbc7HBCISel28generateStoreOwnPropertyInstEPNS_20StoreOwnPropertyInstEPNS_10BasicBlockE:
  656|   230k|    BasicBlock *next) {
  657|   230k|  auto valueReg = encodeValue(Inst->getStoredValue());
  658|   230k|  auto objReg = encodeValue(Inst->getObject());
  659|   230k|  Value *prop = Inst->getProperty();
  660|   230k|  bool isEnumerable = Inst->getIsEnumerable();
  661|       |
  662|       |  // If the property is a LiteralNumber, the property is enumerable, and it is a
  663|       |  // valid array index, it is coming from an array initialization and we will
  664|       |  // emit it as PutByIndex.
  665|   230k|  auto *numProp = llvh::dyn_cast<LiteralNumber>(prop);
  666|   230k|  if (numProp && isEnumerable) {
  ------------------
  |  Branch (666:7): [True: 230k, False: 0]
  |  Branch (666:18): [True: 230k, False: 0]
  ------------------
  667|   230k|    if (auto arrayIndex = numProp->convertToArrayIndex()) {
  ------------------
  |  Branch (667:14): [True: 230k, False: 0]
  ------------------
  668|   230k|      uint32_t index = arrayIndex.getValue();
  669|   230k|      if (index <= UINT8_MAX) {
  ------------------
  |  Branch (669:11): [True: 3.75k, False: 226k]
  ------------------
  670|  3.75k|        BCFGen_->emitPutOwnByIndex(objReg, valueReg, index);
  671|   226k|      } else {
  672|   226k|        BCFGen_->emitPutOwnByIndexL(objReg, valueReg, index);
  673|   226k|      }
  674|       |
  675|   230k|      return;
  676|   230k|    }
  677|   230k|  }
  678|       |
  679|       |  // It is a register operand.
  680|      0|  auto propReg = encodeValue(Inst->getProperty());
  681|      0|  BCFGen_->emitPutOwnByVal(objReg, valueReg, propReg, Inst->getIsEnumerable());
  682|      0|}
_ZN6hermes3hbc7HBCISel31generateStoreNewOwnPropertyInstEPNS_23StoreNewOwnPropertyInstEPNS_10BasicBlockE:
  686|  4.16k|    BasicBlock *next) {
  687|  4.16k|  auto valueReg = encodeValue(Inst->getStoredValue());
  688|  4.16k|  auto objReg = encodeValue(Inst->getObject());
  689|  4.16k|  auto prop = Inst->getProperty();
  690|  4.16k|  bool isEnumerable = Inst->getIsEnumerable();
  691|       |
  692|  4.16k|  if (auto *numProp = llvh::dyn_cast<LiteralNumber>(prop)) {
  ------------------
  |  Branch (692:13): [True: 0, False: 4.16k]
  ------------------
  693|      0|    assert(
  694|      0|        isEnumerable &&
  695|      0|        "No way to generate non-enumerable indexed StoreNewOwnPropertyInst.");
  696|      0|    uint32_t index = *numProp->convertToArrayIndex();
  697|      0|    if (index <= UINT8_MAX) {
  ------------------
  |  Branch (697:9): [True: 0, False: 0]
  ------------------
  698|      0|      BCFGen_->emitPutOwnByIndex(objReg, valueReg, index);
  699|      0|    } else {
  700|      0|      BCFGen_->emitPutOwnByIndexL(objReg, valueReg, index);
  701|      0|    }
  702|      0|    return;
  703|      0|  }
  704|       |
  705|  4.16k|  auto strProp = cast<LiteralString>(prop);
  706|  4.16k|  auto id = BCFGen_->getIdentifierID(strProp);
  707|       |
  708|  4.16k|  if (isEnumerable) {
  ------------------
  |  Branch (708:7): [True: 4.16k, False: 0]
  ------------------
  709|  4.16k|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (709:9): [True: 0, False: 4.16k]
  ------------------
  710|      0|      BCFGen_->emitPutNewOwnByIdLong(objReg, valueReg, id);
  711|  4.16k|    } else if (id > UINT8_MAX) {
  ------------------
  |  Branch (711:16): [True: 0, False: 4.16k]
  ------------------
  712|      0|      BCFGen_->emitPutNewOwnById(objReg, valueReg, id);
  713|  4.16k|    } else {
  714|  4.16k|      BCFGen_->emitPutNewOwnByIdShort(objReg, valueReg, id);
  715|  4.16k|    }
  716|  4.16k|  } else {
  717|      0|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (717:9): [True: 0, False: 0]
  ------------------
  718|      0|      BCFGen_->emitPutNewOwnNEByIdLong(objReg, valueReg, id);
  719|      0|    } else {
  720|      0|      BCFGen_->emitPutNewOwnNEById(objReg, valueReg, id);
  721|      0|    }
  722|      0|  }
  723|  4.16k|}
_ZN6hermes3hbc7HBCISel24generateLoadPropertyInstEPNS_16LoadPropertyInstEPNS_10BasicBlockE:
  758|     22|    BasicBlock *next) {
  759|     22|  auto resultReg = encodeValue(Inst);
  760|     22|  auto objReg = encodeValue(Inst->getObject());
  761|     22|  auto prop = Inst->getProperty();
  762|       |
  763|     22|  if (auto *Lit = llvh::dyn_cast<LiteralString>(prop)) {
  ------------------
  |  Branch (763:13): [True: 20, False: 2]
  ------------------
  764|     20|    auto id = BCFGen_->getIdentifierID(Lit);
  765|     20|    if (id > UINT16_MAX) {
  ------------------
  |  Branch (765:9): [True: 0, False: 20]
  ------------------
  766|      0|      BCFGen_->emitGetByIdLong(
  767|      0|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  768|     20|    } else if (id > UINT8_MAX) {
  ------------------
  |  Branch (768:16): [True: 0, False: 20]
  ------------------
  769|      0|      BCFGen_->emitGetById(
  770|      0|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  771|     20|    } else {
  772|     20|      BCFGen_->emitGetByIdShort(
  773|     20|          resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  774|     20|    }
  775|     20|    return;
  776|     20|  }
  777|       |
  778|      2|  auto propReg = encodeValue(prop);
  779|      2|  BCFGen_->emitGetByVal(resultReg, objReg, propReg);
  780|      2|}
_ZN6hermes3hbc7HBCISel33generateTryLoadGlobalPropertyInstEPNS_25TryLoadGlobalPropertyInstEPNS_10BasicBlockE:
  784|   131k|    BasicBlock *next) {
  785|   131k|  auto resultReg = encodeValue(Inst);
  786|   131k|  auto objReg = encodeValue(Inst->getObject());
  787|   131k|  auto prop = Inst->getProperty();
  788|       |
  789|   131k|  auto *Lit = cast<LiteralString>(prop);
  790|       |
  791|   131k|  auto id = BCFGen_->getIdentifierID(Lit);
  792|   131k|  if (id > UINT16_MAX) {
  ------------------
  |  Branch (792:7): [True: 0, False: 131k]
  ------------------
  793|      0|    BCFGen_->emitTryGetByIdLong(
  794|      0|        resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  795|   131k|  } else {
  796|   131k|    BCFGen_->emitTryGetById(
  797|   131k|        resultReg, objReg, acquirePropertyReadCacheIndex(id), id);
  798|   131k|  }
  799|   131k|}
_ZN6hermes3hbc7HBCISel22generateAllocStackInstEPNS_14AllocStackInstEPNS_10BasicBlockE:
  807|    123|void HBCISel::generateAllocStackInst(AllocStackInst *Inst, BasicBlock *next) {
  808|       |  // This is a no-op.
  809|    123|}
_ZN6hermes3hbc7HBCISel23generateAllocObjectInstEPNS_15AllocObjectInstEPNS_10BasicBlockE:
  810|  4.16k|void HBCISel::generateAllocObjectInst(AllocObjectInst *Inst, BasicBlock *next) {
  811|  4.16k|  auto result = encodeValue(Inst);
  812|       |  // TODO: Utilize sizeHint.
  813|  4.16k|  if (llvh::isa<EmptySentinel>(Inst->getParentObject())) {
  ------------------
  |  Branch (813:7): [True: 4.16k, False: 0]
  ------------------
  814|  4.16k|    BCFGen_->emitNewObject(result);
  815|  4.16k|  } else {
  816|      0|    auto parentReg = encodeValue(Inst->getParentObject());
  817|      0|    BCFGen_->emitNewObjectWithParent(result, parentReg);
  818|      0|  }
  819|  4.16k|}
_ZN6hermes3hbc7HBCISel22generateAllocArrayInstEPNS_14AllocArrayInstEPNS_10BasicBlockE:
  826|  33.4k|void HBCISel::generateAllocArrayInst(AllocArrayInst *Inst, BasicBlock *next) {
  827|  33.4k|  auto dstReg = encodeValue(Inst);
  828|  33.4k|  auto elementCount = Inst->getElementCount();
  829|  33.4k|  uint32_t sizeHint =
  830|  33.4k|      std::min((uint32_t)UINT16_MAX, Inst->getSizeHint()->asUInt32());
  831|       |
  832|  33.4k|  if (elementCount == 0) {
  ------------------
  |  Branch (832:7): [True: 13.2k, False: 20.1k]
  ------------------
  833|  13.2k|    BCFGen_->emitNewArray(dstReg, sizeHint);
  834|  20.1k|  } else {
  835|  20.1k|    auto bufIndex = BCFGen_->BMGen_.serializedLiteralOffsetFor(Inst);
  836|  20.1k|    if (bufIndex.first <= UINT16_MAX) {
  ------------------
  |  Branch (836:9): [True: 20.1k, False: 0]
  ------------------
  837|  20.1k|      BCFGen_->emitNewArrayWithBuffer(
  838|  20.1k|          encodeValue(Inst), sizeHint, elementCount, bufIndex.first);
  839|  20.1k|    } else {
  840|      0|      BCFGen_->emitNewArrayWithBufferLong(
  841|      0|          encodeValue(Inst), sizeHint, elementCount, bufIndex.first);
  842|      0|    }
  843|  20.1k|  }
  844|  33.4k|}
_ZN6hermes3hbc7HBCISel29generateHBCCreateFunctionInstEPNS_21HBCCreateFunctionInstEPNS_10BasicBlockE:
  860|   114k|    BasicBlock *) {
  861|   114k|  auto env = encodeValue(Inst->getEnvironment());
  862|   114k|  auto output = encodeValue(Inst);
  863|   114k|  auto code = BCFGen_->getFunctionID(Inst->getFunctionCode());
  864|   114k|  bool isGen = llvh::isa<GeneratorFunction>(Inst->getFunctionCode());
  865|   114k|  bool isAsync = llvh::isa<AsyncFunction>(Inst->getFunctionCode());
  866|   114k|  if (LLVM_LIKELY(code <= UINT16_MAX)) {
  ------------------
  |  |  188|   114k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 0]
  |  |  ------------------
  ------------------
  867|       |    // Most of the cases, function index will be less than 2^16.
  868|   114k|    if (isAsync) {
  ------------------
  |  Branch (868:9): [True: 0, False: 114k]
  ------------------
  869|      0|      BCFGen_->emitCreateAsyncClosure(output, env, code);
  870|   114k|    } else if (isGen) {
  ------------------
  |  Branch (870:16): [True: 0, False: 114k]
  ------------------
  871|      0|      BCFGen_->emitCreateGeneratorClosure(output, env, code);
  872|   114k|    } else {
  873|   114k|      BCFGen_->emitCreateClosure(output, env, code);
  874|   114k|    }
  875|   114k|  } else {
  876|      0|    if (isAsync) {
  ------------------
  |  Branch (876:9): [True: 0, False: 0]
  ------------------
  877|      0|      BCFGen_->emitCreateAsyncClosureLongIndex(output, env, code);
  878|      0|    } else if (isGen) {
  ------------------
  |  Branch (878:16): [True: 0, False: 0]
  ------------------
  879|      0|      BCFGen_->emitCreateGeneratorClosureLongIndex(output, env, code);
  880|      0|    } else {
  881|      0|      BCFGen_->emitCreateClosureLongIndex(output, env, code);
  882|      0|    }
  883|      0|  }
  884|   114k|}
_ZN6hermes3hbc7HBCISel36generateHBCAllocObjectFromBufferInstEPNS_28HBCAllocObjectFromBufferInstEPNS_10BasicBlockE:
  888|    880|    BasicBlock *next) {
  889|    880|  auto result = encodeValue(Inst);
  890|    880|  unsigned e = Inst->getKeyValuePairCount();
  891|       |
  892|       |  // size hint operand of NewObjectWithBuffer opcode is 16-bit.
  893|    880|  uint32_t sizeHint =
  894|    880|      std::min((uint32_t)UINT16_MAX, Inst->getSizeHint()->asUInt32());
  895|       |
  896|    880|  auto buffIdxs = BCFGen_->BMGen_.serializedLiteralOffsetFor(Inst);
  897|    880|  if (buffIdxs.first <= UINT16_MAX && buffIdxs.second <= UINT16_MAX) {
  ------------------
  |  Branch (897:7): [True: 880, False: 0]
  |  Branch (897:39): [True: 880, False: 0]
  ------------------
  898|    880|    BCFGen_->emitNewObjectWithBuffer(
  899|    880|        result, sizeHint, e, buffIdxs.first, buffIdxs.second);
  900|    880|  } else {
  901|      0|    BCFGen_->emitNewObjectWithBufferLong(
  902|      0|        result, sizeHint, e, buffIdxs.first, buffIdxs.second);
  903|      0|  }
  904|    880|}
_ZN6hermes3hbc7HBCISel17generateCatchInstEPNS_9CatchInstEPNS_10BasicBlockE:
  906|     12|void HBCISel::generateCatchInst(CatchInst *Inst, BasicBlock *next) {
  907|     12|  auto loc = BCFGen_->emitCatch(encodeValue(Inst));
  908|     12|  relocations_.push_back({loc, Relocation::CatchType, Inst});
  909|     12|  catchInfoMap_[Inst] = CatchCoverageInfo(loc);
  910|     12|}
_ZN6hermes3hbc7HBCISel24generateCreateRegExpInstEPNS_16CreateRegExpInstEPNS_10BasicBlockE:
  916|  11.4k|    BasicBlock *next) {
  917|  11.4k|  const auto &pattern = Inst->getPattern()->getValue();
  918|  11.4k|  const auto &flags = Inst->getFlags()->getValue();
  919|  11.4k|  auto &ctx = F_->getParent()->getContext();
  920|  11.4k|  auto &regexp = ctx.getCompiledRegExp(
  921|  11.4k|      pattern.getUnderlyingPointer(), flags.getUnderlyingPointer());
  922|  11.4k|  uint32_t reBytecodeID = BCFGen_->addRegExp(&regexp);
  923|  11.4k|  auto patternStrID = BCFGen_->getStringID(Inst->getPattern());
  924|  11.4k|  auto flagsStrID = BCFGen_->getStringID(Inst->getFlags());
  925|  11.4k|  BCFGen_->emitCreateRegExp(
  926|  11.4k|      encodeValue(Inst), patternStrID, flagsStrID, reBytecodeID);
  927|  11.4k|}
_ZN6hermes3hbc7HBCISel18generateTryEndInstEPNS_10TryEndInstEPNS_10BasicBlockE:
  928|     12|void HBCISel::generateTryEndInst(TryEndInst *Inst, BasicBlock *next) {
  929|       |  // This is a no-op.
  930|       |  // TryEndInst is used to mark the end of a try region to construct
  931|       |  // the list of basic blocks covered by a catch.
  932|       |  // The range of try regions are stored in exception handlers,
  933|       |  // and are therefore not encoded in the instruction stream.
  934|     12|}
_ZN6hermes3hbc7HBCISel18generateBranchInstEPNS_10BranchInstEPNS_10BasicBlockE:
  938|  39.4k|void HBCISel::generateBranchInst(BranchInst *Inst, BasicBlock *next) {
  939|  39.4k|  auto *dst = Inst->getBranchDest();
  940|  39.4k|  if (dst == next)
  ------------------
  |  Branch (940:7): [True: 39.3k, False: 40]
  ------------------
  941|  39.3k|    return;
  942|       |
  943|     40|  auto loc = BCFGen_->emitJmpLong(0);
  944|     40|  registerLongJump(loc, dst);
  945|     40|}
_ZN6hermes3hbc7HBCISel18generateReturnInstEPNS_10ReturnInstEPNS_10BasicBlockE:
  946|   114k|void HBCISel::generateReturnInst(ReturnInst *Inst, BasicBlock *next) {
  947|   114k|  auto value = encodeValue(Inst->getValue());
  948|   114k|  Function *F = Inst->getParent()->getParent();
  949|   114k|  if (llvh::isa<GeneratorInnerFunction>(F)) {
  ------------------
  |  Branch (949:7): [True: 0, False: 114k]
  ------------------
  950|       |    // Generator inner functions must complete before `return`,
  951|       |    // unlike when they yield.
  952|      0|    BCFGen_->emitCompleteGenerator();
  953|      0|  }
  954|   114k|  BCFGen_->emitRet(value);
  955|   114k|}
_ZN6hermes3hbc7HBCISel17generateThrowInstEPNS_9ThrowInstEPNS_10BasicBlockE:
  956|      6|void HBCISel::generateThrowInst(ThrowInst *Inst, BasicBlock *next) {
  957|      6|  BCFGen_->emitThrow(encodeValue(Inst->getThrownValue()));
  958|      6|}
_ZN6hermes3hbc7HBCISel22generateCondBranchInstEPNS_14CondBranchInstEPNS_10BasicBlockE:
 1007|     71|void HBCISel::generateCondBranchInst(CondBranchInst *Inst, BasicBlock *next) {
 1008|     71|  auto condReg = encodeValue(Inst->getCondition());
 1009|       |
 1010|     71|  BasicBlock *trueBlock = Inst->getTrueDest();
 1011|     71|  BasicBlock *falseBlock = Inst->getFalseDest();
 1012|       |
 1013|       |  // Emit a conditional jump to the 'False' destination and a fall-through to
 1014|       |  // the 'True' side.
 1015|     71|  if (next == trueBlock) {
  ------------------
  |  Branch (1015:7): [True: 3, False: 68]
  ------------------
 1016|      3|    auto loc = BCFGen_->emitJmpFalseLong(0, condReg);
 1017|      3|    registerLongJump(loc, falseBlock);
 1018|      3|    return;
 1019|      3|  }
 1020|       |
 1021|       |  // Emit a conditional jump to the 'True' destination and a fall-through to the
 1022|       |  // 'False' side.
 1023|     68|  auto loc = BCFGen_->emitJmpTrueLong(0, condReg);
 1024|     68|  registerLongJump(loc, trueBlock);
 1025|       |
 1026|       |  // Try to eliminate the branch by using a fall-through. If the destination
 1027|       |  // is also the basic block we'll generate next then no need to emit the
 1028|       |  // jmp.
 1029|     68|  if (next == falseBlock) {
  ------------------
  |  Branch (1029:7): [True: 68, False: 0]
  ------------------
 1030|     68|    return;
 1031|     68|  }
 1032|       |
 1033|      0|  loc = BCFGen_->emitJmpLong(0);
 1034|      0|  registerLongJump(loc, falseBlock);
 1035|      0|}
_ZN6hermes3hbc7HBCISel20generateTryStartInstEPNS_12TryStartInstEPNS_10BasicBlockE:
 1174|     12|void HBCISel::generateTryStartInst(TryStartInst *Inst, BasicBlock *next) {
 1175|       |  // TryStartInst is the same as BranchInst in bytecode gen.
 1176|     12|  BasicBlock *destination = Inst->getTryBody();
 1177|       |
 1178|     12|  assert(
 1179|     12|      Inst->getParent()->getTerminator() == Inst &&
 1180|     12|      "BI is not the terminator!");
 1181|       |
 1182|       |  // Try to eliminate the branch by using a fall-through. If the destination
 1183|       |  // is also the basic block we'll generate next then no need to emit the
 1184|       |  // jmp.
 1185|     12|  if (next == destination) {
  ------------------
  |  Branch (1185:7): [True: 12, False: 0]
  ------------------
 1186|     12|    return;
 1187|     12|  }
 1188|       |
 1189|       |  // Emit the jump and remember to update the relocation location.
 1190|      0|  auto loc = BCFGen_->emitJmpLong(0);
 1191|      0|  registerLongJump(loc, destination);
 1192|      0|}
_ZN6hermes3hbc7HBCISel16generateCallInstEPNS_8CallInstEPNS_10BasicBlockE:
 1193|    291|void HBCISel::generateCallInst(CallInst *Inst, BasicBlock *next) {
 1194|    291|  auto output = encodeValue(Inst);
 1195|    291|  auto function = encodeValue(Inst->getCallee());
 1196|    291|  verifyCall(Inst);
 1197|       |
 1198|    291|  if (Inst->getNumArguments() <= UINT8_MAX) {
  ------------------
  |  Branch (1198:7): [True: 286, False: 5]
  ------------------
 1199|    286|    BCFGen_->emitCall(output, function, Inst->getNumArguments());
 1200|    286|  } else {
 1201|      5|    BCFGen_->emitCallLong(output, function, Inst->getNumArguments());
 1202|      5|  }
 1203|    291|}
_ZN6hermes3hbc7HBCISel23generateCallBuiltinInstEPNS_15CallBuiltinInstEPNS_10BasicBlockE:
 1251|    283|void HBCISel::generateCallBuiltinInst(CallBuiltinInst *Inst, BasicBlock *next) {
 1252|    283|  auto output = encodeValue(Inst);
 1253|    283|  verifyCall(Inst);
 1254|       |
 1255|    283|  if (Inst->getNumArguments() <= UINT8_MAX) {
  ------------------
  |  Branch (1255:7): [True: 278, False: 5]
  ------------------
 1256|    278|    BCFGen_->emitCallBuiltin(
 1257|    278|        output, Inst->getBuiltinIndex(), Inst->getNumArguments());
 1258|    278|  } else {
 1259|      5|    BCFGen_->emitCallBuiltinLong(
 1260|      5|        output, Inst->getBuiltinIndex(), Inst->getNumArguments());
 1261|      5|  }
 1262|    283|}
_ZN6hermes3hbc7HBCISel33generateHBCStoreToEnvironmentInstEPNS_25HBCStoreToEnvironmentInstEPNS_10BasicBlockE:
 1387|   114k|    BasicBlock *next) {
 1388|   114k|  Variable *var = Inst->getResolvedName();
 1389|   114k|  auto valueReg = encodeValue(Inst->getStoredValue());
 1390|   114k|  auto envReg = encodeValue(Inst->getEnvironment());
 1391|   114k|  auto varIdx = encodeValue(var);
 1392|   114k|  if (Inst->getStoredValue()->getType().isNonPtr()) {
  ------------------
  |  Branch (1392:7): [True: 7, False: 114k]
  ------------------
 1393|      7|    if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1393:9): [True: 7, False: 0]
  ------------------
 1394|      7|      BCFGen_->emitStoreNPToEnvironment(envReg, varIdx, valueReg);
 1395|      7|    } else {
 1396|      0|      BCFGen_->emitStoreNPToEnvironmentL(envReg, varIdx, valueReg);
 1397|      0|    }
 1398|   114k|  } else {
 1399|   114k|    if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1399:9): [True: 114k, False: 0]
  ------------------
 1400|   114k|      BCFGen_->emitStoreToEnvironment(envReg, varIdx, valueReg);
 1401|   114k|    } else {
 1402|      0|      BCFGen_->emitStoreToEnvironmentL(envReg, varIdx, valueReg);
 1403|      0|    }
 1404|   114k|  }
 1405|   114k|}
_ZN6hermes3hbc7HBCISel34generateHBCLoadFromEnvironmentInstEPNS_26HBCLoadFromEnvironmentInstEPNS_10BasicBlockE:
 1408|  10.8k|    BasicBlock *next) {
 1409|  10.8k|  auto dstReg = encodeValue(Inst);
 1410|  10.8k|  Variable *var = Inst->getResolvedName();
 1411|  10.8k|  auto envReg = encodeValue(Inst->getEnvironment());
 1412|  10.8k|  auto varIdx = encodeValue(var);
 1413|  10.8k|  if (varIdx <= UINT8_MAX) {
  ------------------
  |  Branch (1413:7): [True: 10.8k, False: 0]
  ------------------
 1414|  10.8k|    BCFGen_->emitLoadFromEnvironment(dstReg, envReg, varIdx);
 1415|  10.8k|  } else {
 1416|      0|    BCFGen_->emitLoadFromEnvironmentL(dstReg, envReg, varIdx);
 1417|      0|  }
 1418|  10.8k|}
_ZN6hermes3hbc7HBCISel24generateHBCLoadConstInstEPNS_16HBCLoadConstInstEPNS_10BasicBlockE:
 1421|   114k|    hermes::BasicBlock *next) {
 1422|   114k|  auto output = encodeValue(Inst);
 1423|   114k|  Literal *literal = Inst->getConst();
 1424|   114k|  switch (literal->getKind()) {
 1425|      0|    case ValueKind::LiteralEmptyKind:
  ------------------
  |  Branch (1425:5): [True: 0, False: 114k]
  ------------------
 1426|      0|      BCFGen_->emitLoadConstEmpty(output);
 1427|      0|      break;
 1428|   114k|    case ValueKind::LiteralUndefinedKind:
  ------------------
  |  Branch (1428:5): [True: 114k, False: 727]
  ------------------
 1429|   114k|      BCFGen_->emitLoadConstUndefined(output);
 1430|   114k|      break;
 1431|      0|    case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (1431:5): [True: 0, False: 114k]
  ------------------
 1432|      0|      BCFGen_->emitLoadConstNull(output);
 1433|      0|      break;
 1434|     24|    case ValueKind::LiteralBoolKind: {
  ------------------
  |  Branch (1434:5): [True: 24, False: 114k]
  ------------------
 1435|     24|      auto *litBool = cast<LiteralBool>(literal);
 1436|     24|      if (litBool->getValue()) {
  ------------------
  |  Branch (1436:11): [True: 12, False: 12]
  ------------------
 1437|     12|        BCFGen_->emitLoadConstTrue(output);
 1438|     12|      } else {
 1439|     12|        BCFGen_->emitLoadConstFalse(output);
 1440|     12|      }
 1441|     24|      break;
 1442|      0|    }
 1443|    491|    case ValueKind::LiteralNumberKind: {
  ------------------
  |  Branch (1443:5): [True: 491, False: 114k]
  ------------------
 1444|    491|      auto *litNum = cast<LiteralNumber>(literal);
 1445|       |      // Check for +0.0.
 1446|    491|      if (litNum->isPositiveZero()) {
  ------------------
  |  Branch (1446:11): [True: 32, False: 459]
  ------------------
 1447|     32|        BCFGen_->emitLoadConstZero(output);
 1448|    459|      } else {
 1449|    459|        if (litNum->isUInt8Representible()) {
  ------------------
  |  Branch (1449:13): [True: 248, False: 211]
  ------------------
 1450|    248|          BCFGen_->emitLoadConstUInt8(output, litNum->asUInt8());
 1451|    248|        } else if (litNum->isInt32Representible()) {
  ------------------
  |  Branch (1451:20): [True: 131, False: 80]
  ------------------
 1452|    131|          BCFGen_->emitLoadConstInt(output, litNum->asInt32());
 1453|    131|        } else {
 1454|       |          // param_t is int64_t, we cannot directly convert a double into that.
 1455|       |          // Instead we are going to copy it as if it is binary.
 1456|     80|          BCFGen_->emitLoadConstDoubleDirect(output, litNum->getValue());
 1457|     80|        }
 1458|    459|      }
 1459|    491|      break;
 1460|      0|    }
 1461|      0|    case ValueKind::LiteralBigIntKind: {
  ------------------
  |  Branch (1461:5): [True: 0, False: 114k]
  ------------------
 1462|      0|      auto parsedBigInt = bigint::ParsedBigInt::parsedBigIntFromNumericValue(
 1463|      0|          cast<LiteralBigInt>(literal)->getValue()->str());
 1464|      0|      assert(parsedBigInt && "should be valid");
 1465|      0|      if (bigint::tooManyBytes(parsedBigInt->getBytes().size())) {
  ------------------
  |  Branch (1465:11): [True: 0, False: 0]
  ------------------
 1466|       |        // TODO: move this to the semantic analysis so we can get a proper
 1467|       |        // warning (i.e., with the correct location for the literal).
 1468|      0|        std::string sizeStr;
 1469|      0|        {
 1470|      0|          llvh::raw_string_ostream OS(sizeStr);
 1471|      0|          OS << parsedBigInt->getBytes().size();
 1472|      0|        }
 1473|      0|        F_->getContext().getSourceErrorManager().warning(
 1474|      0|            Inst->getLocation(),
 1475|      0|            Twine("BigInt literal has too many bytes (") + sizeStr +
 1476|      0|                ") and a RangeError will be raised at runtime time if it "
 1477|      0|                "is referenced.");
 1478|      0|      }
 1479|      0|      auto idx = BCFGen_->addBigInt(std::move(*parsedBigInt));
 1480|      0|      if (idx <= UINT16_MAX) {
  ------------------
  |  Branch (1480:11): [True: 0, False: 0]
  ------------------
 1481|      0|        BCFGen_->emitLoadConstBigInt(output, idx);
 1482|      0|      } else {
 1483|      0|        BCFGen_->emitLoadConstBigIntLongIndex(output, idx);
 1484|      0|      }
 1485|      0|      break;
 1486|      0|    }
 1487|    212|    case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (1487:5): [True: 212, False: 114k]
  ------------------
 1488|    212|      auto idx = BCFGen_->getStringID(cast<LiteralString>(literal));
 1489|    212|      if (idx <= UINT16_MAX) {
  ------------------
  |  Branch (1489:11): [True: 212, False: 0]
  ------------------
 1490|    212|        BCFGen_->emitLoadConstString(output, idx);
 1491|    212|      } else {
 1492|      0|        BCFGen_->emitLoadConstStringLongIndex(output, idx);
 1493|      0|      }
 1494|    212|      break;
 1495|      0|    }
 1496|      0|    default:
  ------------------
  |  Branch (1496:5): [True: 0, False: 114k]
  ------------------
 1497|      0|      llvm_unreachable("Invalid literal type");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1498|   114k|  }
 1499|   114k|}
_ZN6hermes3hbc7HBCISel24generateHBCLoadParamInstEPNS_16HBCLoadParamInstEPNS_10BasicBlockE:
 1502|   114k|    hermes::BasicBlock *next) {
 1503|   114k|  auto output = encodeValue(Inst);
 1504|   114k|  LiteralNumber *number = Inst->getIndex();
 1505|   114k|  auto value = number->asUInt32();
 1506|   114k|  if (value <= UINT8_MAX) {
  ------------------
  |  Branch (1506:7): [True: 114k, False: 0]
  ------------------
 1507|   114k|    BCFGen_->emitLoadParam(output, value);
 1508|   114k|  } else {
 1509|      0|    BCFGen_->emitLoadParamLong(output, value);
 1510|      0|  }
 1511|   114k|}
_ZN6hermes3hbc7HBCISel32generateHBCCreateEnvironmentInstEPNS_24HBCCreateEnvironmentInstEPNS_10BasicBlockE:
 1515|   114k|    hermes::BasicBlock *next) {
 1516|   114k|  auto dstReg = encodeValue(Inst);
 1517|   114k|  BCFGen_->emitCreateEnvironment(dstReg);
 1518|   114k|}
_ZN6hermes3hbc7HBCISel30generateHBCGetGlobalObjectInstEPNS_22HBCGetGlobalObjectInstEPNS_10BasicBlockE:
 1528|  62.5k|    hermes::BasicBlock *next) {
 1529|  62.5k|  auto dstReg = encodeValue(Inst);
 1530|  62.5k|  BCFGen_->emitGetGlobalObject(dstReg);
 1531|  62.5k|}
_ZN6hermes3hbc7HBCISel24generateGetNewTargetInstEPNS_16GetNewTargetInstEPNS_10BasicBlockE:
 1535|      5|    hermes::BasicBlock *next) {
 1536|      5|  auto dstReg = encodeValue(Inst);
 1537|      5|  BCFGen_->emitGetNewTarget(dstReg);
 1538|      5|}
_ZN6hermes3hbc7HBCISel24generateHBCGetThisNSInstEPNS_16HBCGetThisNSInstEPNS_10BasicBlockE:
 1542|      5|    hermes::BasicBlock *next) {
 1543|      5|  auto dstReg = encodeValue(Inst);
 1544|      5|  BCFGen_->emitLoadThisNS(dstReg);
 1545|      5|}
_ZN6hermes3hbc7HBCISel29generateHBCReifyArgumentsInstEPNS_21HBCReifyArgumentsInstEPNS_10BasicBlockE:
 1570|      2|    hermes::BasicBlock *next) {
 1571|      2|  auto reg = encodeValue(Inst->getLazyRegister());
 1572|      2|  BCFGen_->emitReifyArguments(reg);
 1573|      2|}
_ZN6hermes3hbc7HBCISel23generateHBCSpillMovInstEPNS_15HBCSpillMovInstEPNS_10BasicBlockE:
 1603|  2.87k|void HBCISel::generateHBCSpillMovInst(HBCSpillMovInst *Inst, BasicBlock *next) {
 1604|  2.87k|  auto dst = encodeValue(Inst);
 1605|  2.87k|  auto src = encodeValue(Inst->getValue());
 1606|  2.87k|  emitMovIfNeeded(dst, src);
 1607|  2.87k|}
_ZN6hermes3hbc7HBCISel25generateIteratorBeginInstEPNS_17IteratorBeginInstEPNS_10BasicBlockE:
 1616|     12|    hermes::BasicBlock *next) {
 1617|     12|  auto iter = encodeValue(Inst);
 1618|     12|  auto src = encodeValue(Inst->getSourceOrNext());
 1619|     12|  BCFGen_->emitIteratorBegin(iter, src);
 1620|     12|}
_ZN6hermes3hbc7HBCISel24generateIteratorNextInstEPNS_16IteratorNextInstEPNS_10BasicBlockE:
 1624|      6|    hermes::BasicBlock *next) {
 1625|      6|  auto dst = encodeValue(Inst);
 1626|      6|  auto iter = encodeValue(Inst->getIterator());
 1627|      6|  auto src = encodeValue(Inst->getSourceOrNext());
 1628|      6|  BCFGen_->emitIteratorNext(dst, iter, src);
 1629|      6|}
_ZN6hermes3hbc7HBCISel25generateIteratorCloseInstEPNS_17IteratorCloseInstEPNS_10BasicBlockE:
 1633|     18|    hermes::BasicBlock *next) {
 1634|     18|  auto iter = encodeValue(Inst->getIterator());
 1635|     18|  bool ignoreInnerException = Inst->getIgnoreInnerException();
 1636|     18|  BCFGen_->emitIteratorClose(iter, ignoreInnerException);
 1637|     18|}
_ZN6hermes3hbc7HBCISel10initializeEv:
 1670|   114k|void HBCISel::initialize() {
 1671|   114k|  IRBuilder builder(F_->getParent());
 1672|   114k|  if (F_->isGlobalScope()) {
  ------------------
  |  Branch (1672:7): [True: 56, False: 114k]
  ------------------
 1673|  3.40k|    for (auto *prop : F_->getParent()->getGlobalProperties()) {
  ------------------
  |  Branch (1673:21): [True: 3.40k, False: 56]
  ------------------
 1674|       |      // Declare every "declared" global variable.
 1675|  3.40k|      if (!prop->isDeclared())
  ------------------
  |  Branch (1675:11): [True: 3.40k, False: 2]
  ------------------
 1676|  3.40k|        continue;
 1677|      2|      auto id = BCFGen_->getIdentifierID(
 1678|      2|          builder.getLiteralString(prop->getName()->getValue()));
 1679|      2|      BCFGen_->emitDeclareGlobalVar(id);
 1680|      2|    }
 1681|     56|  }
 1682|   114k|}
_ZN6hermes3hbc7HBCISel8generateEPNS_10BasicBlockES3_:
 1684|   153k|void HBCISel::generate(BasicBlock *BB, BasicBlock *next) {
 1685|       |  // Register the address of the current basic block.
 1686|   153k|  auto begin_loc = BCFGen_->getCurrentLocation();
 1687|       |
 1688|       |  // It is important to register the basic block before processing it,
 1689|       |  // as we require the relocations to be sorted by their offset.
 1690|   153k|  relocations_.push_back(
 1691|   153k|      {begin_loc, Relocation::RelocationType::BasicBlockType, BB});
 1692|   153k|  basicBlockMap_[BB] = std::make_pair(begin_loc, next);
 1693|       |
 1694|   153k|  if (BB == &F_->front()) {
  ------------------
  |  Branch (1694:7): [True: 114k, False: 39.5k]
  ------------------
 1695|   114k|    initialize();
 1696|   114k|  }
 1697|       |
 1698|       |  // Emit an async break check before the terminator if necessary.
 1699|       |  // We do this at the end of the block so that we come after any
 1700|       |  // CreateEnvironment instruction.
 1701|   153k|  const Instruction *asyncBreakCheckLoc =
 1702|   153k|      asyncBreakChecks_.count(BB) ? BB->getTerminator() : nullptr;
  ------------------
  |  Branch (1702:7): [True: 114k, False: 39.5k]
  ------------------
 1703|  1.55M|  for (auto &I : *BB) {
  ------------------
  |  Branch (1703:16): [True: 1.55M, False: 153k]
  ------------------
 1704|  1.55M|    if (&I == asyncBreakCheckLoc) {
  ------------------
  |  Branch (1704:9): [True: 114k, False: 1.44M]
  ------------------
 1705|   114k|      BCFGen_->emitAsyncBreakCheck();
 1706|   114k|    }
 1707|  1.55M|    generate(&I, next);
 1708|  1.55M|  }
 1709|   153k|  auto end_loc = BCFGen_->getCurrentLocation();
 1710|   153k|  if (!next) {
  ------------------
  |  Branch (1710:7): [True: 114k, False: 39.5k]
  ------------------
 1711|       |    // When next is nullptr, we are hitting the last BB.
 1712|       |    // We should also register that null BB with it's location.
 1713|   114k|    assert(
 1714|   114k|        basicBlockMap_.find(nullptr) == basicBlockMap_.end() &&
 1715|   114k|        "Multiple nullptr BBs encountered");
 1716|      0|    basicBlockMap_[nullptr] = std::make_pair(end_loc, nullptr);
 1717|   114k|  }
 1718|       |
 1719|   153k|  LLVM_DEBUG(
  ------------------
  |  |  123|   153k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   153k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 153k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   153k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1720|   153k|      dbgs() << "Generated the block " << BB << " from " << begin_loc << " .. "
 1721|   153k|             << end_loc << "\n");
 1722|   153k|}
_ZN6hermes3hbc7HBCISel8generateEPNS_11InstructionEPNS_10BasicBlockE:
 1724|  1.55M|void HBCISel::generate(Instruction *ii, BasicBlock *next) {
 1725|  1.55M|  LLVM_DEBUG(dbgs() << "Generating the instruction " << ii->getName() << "\n");
  ------------------
  |  |  123|  1.55M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.55M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.55M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.55M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1726|       |
 1727|       |  // Generate the debug info.
 1728|  1.55M|  bool isDebugInfoLevelThrowing = false;
 1729|  1.55M|  switch (F_->getContext().getDebugInfoSetting()) {
  ------------------
  |  Branch (1729:11): [True: 0, False: 1.55M]
  ------------------
 1730|      0|    case DebugInfoSetting::THROWING:
  ------------------
  |  Branch (1730:5): [True: 0, False: 1.55M]
  ------------------
 1731|      0|      if (!ii->mayExecute()) {
  ------------------
  |  Branch (1731:11): [True: 0, False: 0]
  ------------------
 1732|      0|        break;
 1733|      0|      }
 1734|      0|      isDebugInfoLevelThrowing = true;
 1735|       |    // Falls through - if ii can execute.
 1736|      0|    case DebugInfoSetting::SOURCE_MAP:
  ------------------
  |  Branch (1736:5): [True: 0, False: 1.55M]
  ------------------
 1737|  1.55M|    case DebugInfoSetting::ALL:
  ------------------
  |  Branch (1737:5): [True: 1.55M, False: 0]
  ------------------
 1738|  1.55M|      if (ii->hasLocation()) {
  ------------------
  |  Branch (1738:11): [True: 887k, False: 670k]
  ------------------
 1739|   887k|        relocations_.push_back(
 1740|   887k|            {BCFGen_->getCurrentLocation(),
 1741|   887k|             Relocation::RelocationType::DebugInfo,
 1742|   887k|             ii});
 1743|   887k|      }
 1744|  1.55M|      if (!isDebugInfoLevelThrowing) {
  ------------------
  |  Branch (1744:11): [True: 1.55M, False: 0]
  ------------------
 1745|  1.55M|        if (auto *call = llvh::dyn_cast<CallInst>(ii)) {
  ------------------
  |  Branch (1745:19): [True: 574, False: 1.55M]
  ------------------
 1746|    574|          if (LiteralString *textifiedCallee = call->getTextifiedCallee()) {
  ------------------
  |  Branch (1746:30): [True: 8, False: 566]
  ------------------
 1747|      8|            relocations_.push_back(
 1748|      8|                {BCFGen_->getCurrentLocation(),
 1749|      8|                 Relocation::RelocationType::TextifiedCallee,
 1750|      8|                 textifiedCallee});
 1751|      8|          }
 1752|    574|        }
 1753|  1.55M|      }
 1754|  1.55M|      break;
 1755|  1.55M|  }
 1756|       |
 1757|  1.55M|  switch (ii->getKind()) {
 1758|      0|#define DEF_VALUE(CLASS, PARENT) \
 1759|      0|  case ValueKind::CLASS##Kind:   \
 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
 1761|      0|#include "hermes/IR/Instrs.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef DEF_VALUE
  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |   10|       |#endif
  |  |   11|      0|#ifndef MARK_FIRST
  |  |   12|      0|#define MARK_FIRST(NAME)
  |  |   13|      0|#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|       |
  |  |   18|       |#ifndef TERMINATOR
  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |   24|      0|#endif
  |  |   25|       |
  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   30|   114k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   32|      0|#endif
  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |   34|       |
  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   38|      4|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      4|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 4, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      4|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   39|      2|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      2|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 2, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      2|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   41|    105|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|    105|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 105, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    105|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   42|   264k|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|   264k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 264k, False: 1.29M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   264k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   43|    283|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|    283|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 283, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    283|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   45|  4.00k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|  4.00k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 4.00k, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  4.00k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   48|   114k|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   49|   114k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   51|      2|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|      2|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 2, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      2|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   52|  2.87k|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  | 1759|  2.87k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 2.87k, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  2.87k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   53|      0|#endif
  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |   55|       |
  |  |   56|     34|DEF_VALUE(PhiInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     34|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 34, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     34|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   57|  65.0k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  65.0k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 65.0k, False: 1.49M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  65.0k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |   59|  3.78k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  3.78k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 3.78k, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  3.78k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |   62|       |
  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |   64|   230k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|   230k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 230k, False: 1.32M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   230k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   65|  4.16k|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  ------------------
  |  |  |  | 1759|  4.16k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 4.16k, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  4.16k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |   67|       |
  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |   71|     22|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     22|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 22, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     22|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   72|   131k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  ------------------
  |  |  |  | 1759|   131k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 131k, False: 1.42M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   131k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   77|    123|DEF_VALUE(AllocStackInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|    123|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 123, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    123|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   78|  4.16k|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  4.16k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 4.16k, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  4.16k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   79|  33.4k|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  33.4k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 33.4k, False: 1.52M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  33.4k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   82|     12|DEF_VALUE(CatchInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     12|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 12, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     12|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   84|  11.4k|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  11.4k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 11.4k, False: 1.54M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  11.4k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   85|     12|DEF_VALUE(TryEndInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     12|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 12, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     12|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   86|      5|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      5|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 5, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      5|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   88|     12|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     12|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 12, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     12|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   89|      6|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      6|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 6, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      6|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   90|     18|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|     18|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 18, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|     18|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   92|   114k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   93|  10.8k|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  10.8k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 10.8k, False: 1.54M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  10.8k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   94|      0|#endif
  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   96|       |
  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  101|   114k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  ------------------
  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  ------------------
  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  103|      0|#endif
  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  107|       |#endif
  |  |  108|       |
  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  111|  39.4k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|  39.4k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|  39.4k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 39.4k, False: 1.51M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|  39.4k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|   114k|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|   114k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|   114k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 114k, False: 1.44M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|   114k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      6|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      6|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      6|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 6, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      6|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|     71|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|     71|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|     71|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 71, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|     71|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|     12|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|     12|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|     12|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 12, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|     12|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  124|       |
  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  126|    291|DEF_VALUE(CallInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|    291|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 291, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    291|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  128|    283|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  ------------------
  |  |  |  | 1759|    283|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 283, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    283|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  133|      0|#endif
  |  |  134|      0|MARK_LAST(CallInst)
  |  |  135|       |
  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  139|       |
  |  |  140|       |// These are target dependent instructions:
  |  |  141|       |
  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  143|  62.5k|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|  62.5k|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 62.5k, False: 1.49M]
  |  |  |  |  ------------------
  |  |  |  | 1760|  62.5k|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  144|      5|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      5|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 5, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      5|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  148|    880|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|    880|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 880, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|    880|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  ------------------
  |  |  |  | 1759|      0|  case ValueKind::CLASS##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1759:3): [True: 0, False: 1.55M]
  |  |  |  |  ------------------
  |  |  |  | 1760|      0|    return generate##CLASS(cast<CLASS>(ii), next);
  |  |  ------------------
  |  |  150|      0|#endif
  |  |  151|       |
  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  153|       |
  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  155|       |// these macros are still used after the #include.
  |  |  156|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  157|      0|#undef DEF_VALUE
  |  |  158|      0|#undef MARK_FIRST
  |  |  159|      0|#undef MARK_LAST
  |  |  160|      0|#undef TERMINATOR
  |  |  161|      0|#endif
  ------------------
 1762|       |
 1763|      0|    default:
  ------------------
  |  Branch (1763:5): [True: 0, False: 1.55M]
  ------------------
 1764|      0|      llvm_unreachable("Invalid kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1765|  1.55M|  }
 1766|  1.55M|}
_ZN6hermes3hbc7HBCISel8generateEPNS_18SourceMapGeneratorE:
 1768|   114k|void HBCISel::generate(SourceMapGenerator *outSourceMap) {
 1769|   114k|  PostOrderAnalysis PO(F_);
 1770|       |
 1771|       |  /// The order of the blocks is reverse-post-order, which is a simply
 1772|       |  /// topological sort.
 1773|   114k|  llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
 1774|       |
 1775|       |  // If we are compiling with debugger or otherwise need async break checks,
 1776|       |  // decide which blocks need runtime async break checks: blocks with backwards
 1777|       |  // jumps, and the first block if this is a function (i.e. not the
 1778|       |  // global scope).
 1779|   114k|  if (F_->getContext().getDebugInfoSetting() == DebugInfoSetting::ALL ||
  ------------------
  |  Branch (1779:7): [True: 114k, False: 0]
  ------------------
 1780|   114k|      F_->getContext().getEmitAsyncBreakCheck()) {
  ------------------
  |  Branch (1780:7): [True: 0, False: 0]
  ------------------
 1781|   114k|    asyncBreakChecks_ = basicBlocksWithBackwardSuccessors(order);
 1782|   114k|    asyncBreakChecks_.insert(order.front());
 1783|   114k|  }
 1784|       |
 1785|   267k|  for (int i = 0, e = order.size(); i < e; ++i) {
  ------------------
  |  Branch (1785:37): [True: 153k, False: 114k]
  ------------------
 1786|   153k|    BasicBlock *BB = order[i];
 1787|   153k|    BasicBlock *next = ((i + 1) == e) ? nullptr : order[i + 1];
  ------------------
  |  Branch (1787:24): [True: 114k, False: 39.5k]
  ------------------
 1788|   153k|    LLVM_DEBUG(dbgs() << "Generating bytecode for basic block " << BB << "\n");
  ------------------
  |  |  123|   153k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   153k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 153k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   153k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1789|   153k|    generate(BB, next);
 1790|   153k|  }
 1791|       |
 1792|   114k|  resolveRelocations();
 1793|   114k|  resolveExceptionHandlers();
 1794|   114k|  addDebugSourceLocationInfo(outSourceMap);
 1795|   114k|  addDebugTextifiedCalleeInfo();
 1796|   114k|  generateJumpTable();
 1797|   114k|  addDebugLexicalInfo();
 1798|   114k|  populatePropertyCachingInfo();
 1799|   114k|  BCFGen_->bytecodeGenerationComplete();
 1800|   114k|}
_ZN6hermes3hbc7HBCISel29acquirePropertyReadCacheIndexEj:
 1802|   131k|uint8_t HBCISel::acquirePropertyReadCacheIndex(unsigned id) {
 1803|   131k|  const bool reuse = F_->getContext().getOptimizationSettings().reusePropCache;
 1804|       |  // Zero is reserved for indicating no-cache, so cannot be a value in the map.
 1805|   131k|  uint8_t dummyZero = 0;
 1806|   131k|  auto &idx = reuse ? propertyReadCacheIndexForId_[id] : dummyZero;
  ------------------
  |  Branch (1806:15): [True: 131k, False: 0]
  ------------------
 1807|   131k|  if (idx) {
  ------------------
  |  Branch (1807:7): [True: 69.7k, False: 62.1k]
  ------------------
 1808|  69.7k|    ++NumCachedNodes;
 1809|  69.7k|    return idx;
 1810|  69.7k|  }
 1811|       |
 1812|  62.1k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  62.1k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 62.1k]
  |  |  ------------------
  ------------------
 1813|  62.1k|          lastPropertyReadCacheIndex_ == std::numeric_limits<uint8_t>::max())) {
 1814|      0|    ++NumUncachedNodes;
 1815|      0|    return PROPERTY_CACHING_DISABLED;
 1816|      0|  }
 1817|       |
 1818|  62.1k|  ++NumCachedNodes;
 1819|  62.1k|  ++NumCacheSlots;
 1820|  62.1k|  idx = ++lastPropertyReadCacheIndex_;
 1821|  62.1k|  return idx;
 1822|  62.1k|}
_ZN6hermes3hbc7HBCISel30acquirePropertyWriteCacheIndexEj:
 1824|  3.78k|uint8_t HBCISel::acquirePropertyWriteCacheIndex(unsigned id) {
 1825|  3.78k|  const bool reuse = F_->getContext().getOptimizationSettings().reusePropCache;
 1826|       |  // Zero is reserved for indicating no-cache, so cannot be a value in the map.
 1827|  3.78k|  uint8_t dummyZero = 0;
 1828|  3.78k|  auto &idx = reuse ? propertyWriteCacheIndexForId_[id] : dummyZero;
  ------------------
  |  Branch (1828:15): [True: 3.78k, False: 0]
  ------------------
 1829|  3.78k|  if (idx) {
  ------------------
  |  Branch (1829:7): [True: 2.86k, False: 913]
  ------------------
 1830|  2.86k|    ++NumCachedNodes;
 1831|  2.86k|    return idx;
 1832|  2.86k|  }
 1833|       |
 1834|    913|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    913|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 913]
  |  |  ------------------
  ------------------
 1835|    913|          lastPropertyWriteCacheIndex_ ==
 1836|    913|          std::numeric_limits<uint8_t>::max())) {
 1837|      0|    ++NumUncachedNodes;
 1838|      0|    return PROPERTY_CACHING_DISABLED;
 1839|      0|  }
 1840|       |
 1841|    913|  ++NumCachedNodes;
 1842|    913|  ++NumCacheSlots;
 1843|    913|  idx = ++lastPropertyWriteCacheIndex_;
 1844|    913|  return idx;
 1845|    913|}
ISel.cpp:_ZN12_GLOBAL__N_119ensureUTF8IdentiferERN6hermes11StringTableENS0_10IdentifierERNSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  298|   114k|    std::string &nameUTF8Buffer) {
  299|       |  // Check if name has any surrogates. If it doesn't, then it already is a valid
  300|       |  // UTF8 string, and as such can be written to the debug info.
  301|   114k|  bool hasSurrogate = false;
  302|   114k|  const char *it = name.str().begin();
  303|   114k|  const char *nameEnd = name.str().end();
  304|   289k|  while (it < nameEnd && !hasSurrogate) {
  ------------------
  |  Branch (304:10): [True: 175k, False: 114k]
  |  Branch (304:26): [True: 175k, False: 0]
  ------------------
  305|   175k|    constexpr bool allowSurrogates = false;
  306|   175k|    decodeUTF8<allowSurrogates>(
  307|   175k|        it, [&hasSurrogate](const llvh::Twine &) { hasSurrogate = true; });
  308|   175k|  }
  309|       |
  310|   114k|  if (hasSurrogate) {
  ------------------
  |  Branch (310:7): [True: 0, False: 114k]
  ------------------
  311|      0|    nameUTF8Buffer.clear();
  312|       |
  313|       |    // name has surrogates, meaning it is not a valid UTF8 string (these strings
  314|       |    // are still valid within Hermes itself).
  315|      0|    convertUTF8WithSurrogatesToUTF8WithReplacements(nameUTF8Buffer, name.str());
  316|      0|    name = st.getIdentifier(nameUTF8Buffer);
  317|      0|  }
  318|       |
  319|   114k|  return name;
  320|   114k|}
ISel.cpp:_ZL33basicBlocksWithBackwardSuccessorsN4llvh8ArrayRefIPN6hermes10BasicBlockEEE:
   45|   114k|    ArrayRef<BasicBlock *> blocks) {
   46|   114k|  llvh::SmallDenseSet<const BasicBlock *, 16> seen;
   47|   114k|  DenseSet<const BasicBlock *> result;
   48|   153k|  for (const BasicBlock *BB : blocks) {
  ------------------
  |  Branch (48:29): [True: 153k, False: 114k]
  ------------------
   49|   153k|    seen.insert(BB);
   50|       |    // Add all successors that are in our seen set.
   51|   153k|    for (const auto *successor : successors(BB)) {
  ------------------
  |  Branch (51:32): [True: 39.5k, False: 153k]
  ------------------
   52|  39.5k|      if (seen.count(successor))
  ------------------
  |  Branch (52:11): [True: 1, False: 39.5k]
  ------------------
   53|      1|        result.insert(successor);
   54|  39.5k|    }
   55|   153k|  }
   56|   114k|  return result;
   57|   114k|}

_ZN6hermes3hbc13LoadConstants20operandMustBeLiteralEPNS_11InstructionEj:
   90|  3.26M|bool LoadConstants::operandMustBeLiteral(Instruction *Inst, unsigned opIndex) {
   91|       |  // HBCLoadConstInst is meant to load a constant
   92|  3.26M|  if (llvh::isa<HBCLoadConstInst>(Inst))
  ------------------
  |  Branch (92:7): [True: 0, False: 3.26M]
  ------------------
   93|      0|    return true;
   94|       |
   95|       |  // The operand of HBCLoadParamInst is a literal index.
   96|  3.26M|  if (llvh::isa<HBCLoadParamInst>(Inst))
  ------------------
  |  Branch (96:7): [True: 0, False: 3.26M]
  ------------------
   97|      0|    return true;
   98|       |
   99|  3.26M|  if (llvh::isa<HBCAllocObjectFromBufferInst>(Inst))
  ------------------
  |  Branch (99:7): [True: 4.51k, False: 3.26M]
  ------------------
  100|  4.51k|    return true;
  101|       |
  102|       |  // All operands of AllocArrayInst are literals.
  103|  3.26M|  if (llvh::isa<AllocArrayInst>(Inst))
  ------------------
  |  Branch (103:7): [True: 508k, False: 2.75M]
  ------------------
  104|   508k|    return true;
  105|       |
  106|  2.75M|  if (llvh::isa<AllocObjectInst>(Inst)) {
  ------------------
  |  Branch (106:7): [True: 8.32k, False: 2.74M]
  ------------------
  107|       |    // The AllocObjectInst::SizeIdx is a literal.
  108|  8.32k|    if (opIndex == AllocObjectInst::SizeIdx)
  ------------------
  |  Branch (108:9): [True: 4.16k, False: 4.16k]
  ------------------
  109|  4.16k|      return true;
  110|       |    // AllocObjectInst::ParentObjectIdx is a literal if it is the EmptySentinel.
  111|  4.16k|    if (opIndex == AllocObjectInst::ParentObjectIdx &&
  ------------------
  |  Branch (111:9): [True: 4.16k, False: 0]
  |  Branch (111:9): [True: 4.16k, False: 0]
  ------------------
  112|  4.16k|        llvh::isa<EmptySentinel>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (112:9): [True: 4.16k, False: 0]
  ------------------
  113|  4.16k|      return true;
  114|       |
  115|      0|    return false;
  116|  4.16k|  }
  117|       |
  118|       |  // SwitchInst's rest of the operands are case values,
  119|       |  // hence they will stay as constant.
  120|  2.74M|  if (llvh::isa<SwitchInst>(Inst) && opIndex > 0)
  ------------------
  |  Branch (120:7): [True: 0, False: 2.74M]
  |  Branch (120:38): [True: 0, False: 0]
  ------------------
  121|      0|    return true;
  122|       |
  123|       |  // StoreOwnPropertyInst and StoreNewOwnPropertyInst.
  124|  2.74M|  if (auto *SOP = llvh::dyn_cast<StoreOwnPropertyInst>(Inst)) {
  ------------------
  |  Branch (124:13): [True: 938k, False: 1.80M]
  ------------------
  125|   938k|    if (opIndex == StoreOwnPropertyInst::PropertyIdx) {
  ------------------
  |  Branch (125:9): [True: 234k, False: 704k]
  ------------------
  126|   234k|      if (llvh::isa<StoreNewOwnPropertyInst>(Inst)) {
  ------------------
  |  Branch (126:11): [True: 4.16k, False: 230k]
  ------------------
  127|       |        // In StoreNewOwnPropertyInst the property name must be a literal.
  128|  4.16k|        return true;
  129|  4.16k|      }
  130|       |
  131|       |      // If the propery is a LiteralNumber, the property is enumerable, and it
  132|       |      // is a valid array index, it is coming from an array initialization and
  133|       |      // we will emit it as PutByIndex.
  134|   230k|      if (auto *LN = llvh::dyn_cast<LiteralNumber>(Inst->getOperand(opIndex))) {
  ------------------
  |  Branch (134:17): [True: 230k, False: 0]
  ------------------
  135|   230k|        if (SOP->getIsEnumerable() && LN->convertToArrayIndex().hasValue())
  ------------------
  |  Branch (135:13): [True: 230k, False: 0]
  |  Branch (135:13): [True: 230k, False: 0]
  |  Branch (135:39): [True: 230k, False: 0]
  ------------------
  136|   230k|          return true;
  137|   230k|      }
  138|   230k|    }
  139|       |
  140|       |    // StoreOwnPropertyInst's isEnumerable is a boolean constant.
  141|   704k|    if (opIndex == StoreOwnPropertyInst::IsEnumerableIdx)
  ------------------
  |  Branch (141:9): [True: 234k, False: 469k]
  ------------------
  142|   234k|      return true;
  143|       |
  144|   469k|    return false;
  145|   704k|  }
  146|       |
  147|       |  // If StorePropertyInst's property ID is a LiteralString, we will keep it
  148|       |  // untouched and emit try_put_by_id eventually.
  149|  1.80M|  if (llvh::isa<StorePropertyInst>(Inst) &&
  ------------------
  |  Branch (149:7): [True: 11.3k, False: 1.79M]
  |  Branch (149:7): [True: 3.78k, False: 1.80M]
  ------------------
  150|  1.80M|      opIndex == StorePropertyInst::PropertyIdx &&
  ------------------
  |  Branch (150:7): [True: 3.78k, False: 7.56k]
  ------------------
  151|  1.80M|      llvh::isa<LiteralString>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (151:7): [True: 3.78k, False: 0]
  ------------------
  152|  3.78k|    return true;
  153|       |
  154|       |  // If LoadPropertyInst's property ID is a LiteralString, we will keep it
  155|       |  // untouched and emit try_put_by_id eventually.
  156|  1.80M|  if (llvh::isa<LoadPropertyInst>(Inst) &&
  ------------------
  |  Branch (156:7): [True: 263k, False: 1.53M]
  |  Branch (156:7): [True: 131k, False: 1.66M]
  ------------------
  157|  1.80M|      opIndex == LoadPropertyInst::PropertyIdx &&
  ------------------
  |  Branch (157:7): [True: 131k, False: 131k]
  ------------------
  158|  1.80M|      llvh::isa<LiteralString>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (158:7): [True: 131k, False: 2]
  ------------------
  159|   131k|    return true;
  160|       |
  161|       |  // If DeletePropertyInst's property ID is a LiteralString, we will keep it
  162|       |  // untouched and emit try_put_by_id eventually.
  163|  1.66M|  if (llvh::isa<DeletePropertyInst>(Inst) &&
  ------------------
  |  Branch (163:7): [True: 0, False: 1.66M]
  |  Branch (163:7): [True: 0, False: 1.66M]
  ------------------
  164|  1.66M|      opIndex == DeletePropertyInst::PropertyIdx &&
  ------------------
  |  Branch (164:7): [True: 0, False: 0]
  ------------------
  165|  1.66M|      llvh::isa<LiteralString>(Inst->getOperand(opIndex)))
  ------------------
  |  Branch (165:7): [True: 0, False: 0]
  ------------------
  166|      0|    return true;
  167|       |
  168|       |  // StoreGetterSetterInst's isEnumerable is a boolean constant.
  169|  1.66M|  if (llvh::isa<StoreGetterSetterInst>(Inst) &&
  ------------------
  |  Branch (169:7): [True: 0, False: 1.66M]
  ------------------
  170|  1.66M|      opIndex == StoreGetterSetterInst::IsEnumerableIdx)
  ------------------
  |  Branch (170:7): [True: 0, False: 0]
  ------------------
  171|      0|    return true;
  172|       |
  173|       |  // Both pattern and flags operands of the CreateRegExpInst
  174|       |  // are literal strings.
  175|  1.66M|  if (llvh::isa<CreateRegExpInst>(Inst))
  ------------------
  |  Branch (175:7): [True: 22.8k, False: 1.64M]
  ------------------
  176|  22.8k|    return true;
  177|       |
  178|  1.64M|  if (llvh::isa<SwitchImmInst>(Inst) &&
  ------------------
  |  Branch (178:7): [True: 0, False: 1.64M]
  ------------------
  179|  1.64M|      (opIndex == SwitchImmInst::MinValueIdx ||
  ------------------
  |  Branch (179:8): [True: 0, False: 0]
  ------------------
  180|      0|       opIndex == SwitchImmInst::SizeIdx ||
  ------------------
  |  Branch (180:8): [True: 0, False: 0]
  ------------------
  181|      0|       opIndex >= SwitchImmInst::FirstCaseIdx))
  ------------------
  |  Branch (181:8): [True: 0, False: 0]
  ------------------
  182|      0|    return true;
  183|       |
  184|       |  /// CallBuiltin's callee and "this" should always be literals.
  185|  1.64M|  if (llvh::isa<CallBuiltinInst>(Inst) &&
  ------------------
  |  Branch (185:7): [True: 68.5k, False: 1.57M]
  ------------------
  186|  1.64M|      (opIndex == CallBuiltinInst::CalleeIdx ||
  ------------------
  |  Branch (186:8): [True: 283, False: 68.2k]
  ------------------
  187|  68.5k|       opIndex == CallBuiltinInst::ThisIdx))
  ------------------
  |  Branch (187:8): [True: 283, False: 67.9k]
  ------------------
  188|    566|    return true;
  189|       |
  190|       |  /// GetBuiltinClosureInst's builtin index is always literal.
  191|  1.64M|  if (llvh::isa<GetBuiltinClosureInst>(Inst) &&
  ------------------
  |  Branch (191:7): [True: 0, False: 1.64M]
  ------------------
  192|  1.64M|      opIndex == GetBuiltinClosureInst::BuiltinIndexIdx)
  ------------------
  |  Branch (192:7): [True: 0, False: 0]
  ------------------
  193|      0|    return true;
  194|       |
  195|       |#ifdef HERMES_RUN_WASM
  196|       |  /// CallIntrinsic's IntrinsicIndexIdx should always be literals.
  197|       |  if (llvh::isa<CallIntrinsicInst>(Inst) &&
  198|       |      (opIndex == CallIntrinsicInst::IntrinsicIndexIdx))
  199|       |    return true;
  200|       |#endif
  201|       |
  202|  1.64M|  if (llvh::isa<IteratorCloseInst>(Inst) &&
  ------------------
  |  Branch (202:7): [True: 36, False: 1.64M]
  ------------------
  203|  1.64M|      opIndex == IteratorCloseInst::IgnoreInnerExceptionIdx) {
  ------------------
  |  Branch (203:7): [True: 18, False: 18]
  ------------------
  204|     18|    return true;
  205|     18|  }
  206|       |
  207|  1.64M|  return false;
  208|  1.64M|}
_ZN6hermes3hbc13LoadConstants13runOnFunctionEPNS_8FunctionE:
  210|   114k|bool LoadConstants::runOnFunction(Function *F) {
  211|   114k|  IRBuilder builder(F);
  212|   114k|  bool changed = false;
  213|       |
  214|   114k|  llvh::SmallDenseMap<Literal *, Instruction *, 8> constMap{};
  215|       |
  216|       |  // This is a bit counter-intuitive because the logic appears reversed.
  217|       |  // We only want to unique the generated literals if optimization is disabled.
  218|       |  // That is the case when it causes too many registers to be generated (one
  219|       |  // per literal).
  220|       |  // If optimization is enabled, that is not necessary because of CSE and
  221|       |  // because doing this now interefers with code motion.
  222|   114k|  const bool uniqueLiterals = !optimizationEnabled_;
  223|       |
  224|   114k|  auto createLoadLiteral = [&builder](Literal *literal) -> Instruction * {
  225|   114k|    return llvh::isa<GlobalObject>(literal)
  226|   114k|        ? cast<Instruction>(builder.createHBCGetGlobalObjectInst())
  227|   114k|        : cast<Instruction>(builder.createHBCLoadConstInst(literal));
  228|   114k|  };
  229|       |
  230|   114k|  updateToEntryInsertionPoint(builder, F);
  231|       |
  232|   267k|  for (BasicBlock &bbit : F->getBasicBlockList()) {
  ------------------
  |  Branch (232:25): [True: 267k, False: 114k]
  ------------------
  233|  1.24M|    for (auto &it : bbit.getInstList()) {
  ------------------
  |  Branch (233:19): [True: 1.24M, False: 267k]
  ------------------
  234|  4.50M|      for (unsigned i = 0, n = it.getNumOperands(); i < n; i++) {
  ------------------
  |  Branch (234:53): [True: 3.26M, False: 1.24M]
  ------------------
  235|  3.26M|        if (operandMustBeLiteral(&it, i))
  ------------------
  |  Branch (235:13): [True: 1.14M, False: 2.11M]
  ------------------
  236|  1.14M|          continue;
  237|       |
  238|  2.11M|        auto *operand = llvh::dyn_cast<Literal>(it.getOperand(i));
  239|  2.11M|        if (!operand)
  ------------------
  |  Branch (239:13): [True: 1.49M, False: 622k]
  ------------------
  240|  1.49M|          continue;
  241|       |
  242|   622k|        Instruction *load = nullptr;
  243|   622k|        if (uniqueLiterals) {
  ------------------
  |  Branch (243:13): [True: 622k, False: 0]
  ------------------
  244|   622k|          auto &entry = constMap[operand];
  245|   622k|          if (!entry)
  ------------------
  |  Branch (245:15): [True: 177k, False: 445k]
  ------------------
  246|   177k|            entry = createLoadLiteral(operand);
  247|   622k|          load = entry;
  248|   622k|        } else {
  249|      0|          load = createLoadLiteral(operand);
  250|      0|        }
  251|       |
  252|   622k|        it.setOperand(load, i);
  253|   622k|        changed = true;
  254|   622k|      }
  255|  1.24M|    }
  256|   267k|  }
  257|   114k|  return changed;
  258|   114k|}
_ZN6hermes3hbc14LoadParameters13runOnFunctionEPNS_8FunctionE:
  260|   114k|bool LoadParameters::runOnFunction(Function *F) {
  261|   114k|  IRBuilder builder(F);
  262|   114k|  bool changed = false;
  263|       |
  264|   114k|  updateToEntryInsertionPoint(builder, F);
  265|       |
  266|       |  // Index of 0 is the "this" parameter.
  267|   114k|  unsigned index = 1;
  268|   114k|  for (Parameter *p : F->getParameters()) {
  ------------------
  |  Branch (268:21): [True: 114k, False: 114k]
  ------------------
  269|   114k|    auto *load =
  270|   114k|        builder.createHBCLoadParamInst(builder.getLiteralNumber(index));
  271|   114k|    p->replaceAllUsesWith(load);
  272|   114k|    index++;
  273|   114k|    changed = true;
  274|   114k|  }
  275|       |
  276|       |  // Lower accesses to "this".
  277|   114k|  auto *thisParam = F->getThisParameter();
  278|   114k|  if (thisParam && thisParam->hasUsers()) {
  ------------------
  |  Branch (278:7): [True: 114k, False: 0]
  |  Branch (278:20): [True: 5, False: 114k]
  ------------------
  279|       |    // In strict mode just use param 0 directly. In non-strict, we must coerce
  280|       |    // it to an object.
  281|      5|    Value *getThisInst = F->isStrictMode()
  ------------------
  |  Branch (281:26): [True: 0, False: 5]
  ------------------
  282|      5|        ? cast<Value>(
  283|      0|              builder.createHBCLoadParamInst(builder.getLiteralNumber(0)))
  284|      5|        : cast<Value>(builder.createHBCGetThisNSInst());
  285|      5|    thisParam->replaceAllUsesWith(getThisInst);
  286|      5|    changed = true;
  287|      5|  }
  288|   114k|  return changed;
  289|   114k|}
_ZN6hermes3hbc23LowerLoadStoreFrameInst8getScopeERNS_9IRBuilderEPNS_8VariableEPNS_17ScopeCreationInstE:
  294|   125k|    ScopeCreationInst *environment) {
  295|   125k|  if (var->getParent()->getFunction() != builder.getFunction()) {
  ------------------
  |  Branch (295:7): [True: 0, False: 125k]
  ------------------
  296|       |    // If the variable is neither from the current scope,
  297|       |    // we should get the proper scope for it.
  298|      0|    return builder.createHBCResolveEnvironment(
  299|      0|        environment->getCreatedScopeDesc(), var->getParent());
  300|   125k|  } else {
  301|       |    // Now we know that the variable belongs to the current scope.
  302|       |    // We are going to conservatively assume the variable might get
  303|       |    // captured. Hence we use the newly created scope.
  304|       |    // This will not cause performance issue as long as optimization
  305|       |    // is enabled, because every variable will be moved to stack
  306|       |    // if not being captured.
  307|   125k|    return environment;
  308|   125k|  }
  309|   125k|}
_ZN6hermes3hbc23LowerLoadStoreFrameInst13runOnFunctionEPNS_8FunctionE:
  311|   114k|bool LowerLoadStoreFrameInst::runOnFunction(Function *F) {
  312|   114k|  IRBuilder builder(F);
  313|   114k|  bool changed = false;
  314|       |
  315|   114k|  bool fnScopeCreated = false;
  316|   267k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (316:23): [True: 267k, False: 114k]
  ------------------
  317|  1.48M|    for (auto I = BB.begin(), E = BB.end(); I != E; /* nothing */) {
  ------------------
  |  Branch (317:45): [True: 1.21M, False: 267k]
  ------------------
  318|  1.21M|      Instruction *Inst = &*I;
  319|  1.21M|      ++I;
  320|  1.21M|      if (auto *csi = llvh::dyn_cast<CreateScopeInst>(Inst)) {
  ------------------
  |  Branch (320:17): [True: 114k, False: 1.10M]
  ------------------
  321|   114k|        fnScopeCreated |=
  322|   114k|            csi->getCreatedScopeDesc() == F->getFunctionScopeDesc();
  323|   114k|        builder.setInsertionPoint(csi);
  324|   114k|        Instruction *llInst =
  325|   114k|            builder.createHBCCreateEnvironmentInst(csi->getCreatedScopeDesc());
  326|   114k|        Inst->replaceAllUsesWith(llInst);
  327|   114k|        Inst->eraseFromParent();
  328|   114k|        changed = true;
  329|   114k|      }
  330|  1.21M|    }
  331|   267k|  }
  332|       |
  333|       |  // At this point all scopes used in F should be materialized. However, not
  334|       |  // materializing F's scope potentially breaks lazy compilation as the compiler
  335|       |  // always assumes all "external" scopes (i.e., those that have already been
  336|       |  // compiled) have been materialized. Therefore, materialize the function scope
  337|       |  // now. This instruction will be optimized out if unused in optimized builds.
  338|   114k|  assert(fnScopeCreated && "Function body scope not materialized.");
  339|      0|  (void)fnScopeCreated;
  340|       |
  341|   267k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (341:23): [True: 267k, False: 114k]
  ------------------
  342|  1.48M|    for (auto I = BB.begin(), E = BB.end(); I != E; /* nothing */) {
  ------------------
  |  Branch (342:45): [True: 1.21M, False: 267k]
  ------------------
  343|       |      // Keep the reference and increment iterator first.
  344|  1.21M|      Instruction *Inst = &*I;
  345|  1.21M|      ++I;
  346|       |
  347|  1.21M|      builder.setLocation(Inst->getLocation());
  348|  1.21M|      builder.setCurrentSourceLevelScope(Inst->getSourceLevelScope());
  349|       |
  350|  1.21M|      switch (Inst->getKind()) {
  351|  10.8k|        case ValueKind::LoadFrameInstKind: {
  ------------------
  |  Branch (351:9): [True: 10.8k, False: 1.20M]
  ------------------
  352|  10.8k|          auto *LFI = cast<LoadFrameInst>(Inst);
  353|  10.8k|          auto *var = LFI->getLoadVariable();
  354|  10.8k|          auto *environment = LFI->getEnvironment();
  355|       |
  356|  10.8k|          builder.setInsertionPoint(Inst);
  357|  10.8k|          assert(
  358|  10.8k|              llvh::isa<HBCCreateEnvironmentInst>(environment) &&
  359|  10.8k|              environment->getCreatedScopeDesc() == F->getFunctionScopeDesc() &&
  360|  10.8k|              "materializing the wrong scope");
  361|      0|          ScopeCreationInst *scope = getScope(builder, var, environment);
  362|  10.8k|          Instruction *newInst =
  363|  10.8k|              builder.createHBCLoadFromEnvironmentInst(scope, var);
  364|       |
  365|  10.8k|          Inst->replaceAllUsesWith(newInst);
  366|  10.8k|          Inst->eraseFromParent();
  367|  10.8k|          changed = true;
  368|  10.8k|          break;
  369|      0|        }
  370|   114k|        case ValueKind::StoreFrameInstKind: {
  ------------------
  |  Branch (370:9): [True: 114k, False: 1.10M]
  ------------------
  371|   114k|          auto *SFI = cast<StoreFrameInst>(Inst);
  372|   114k|          auto *var = SFI->getVariable();
  373|   114k|          auto *val = SFI->getValue();
  374|   114k|          auto *environment = SFI->getEnvironment();
  375|       |
  376|   114k|          builder.setInsertionPoint(Inst);
  377|   114k|          assert(
  378|   114k|              llvh::isa<HBCCreateEnvironmentInst>(environment) &&
  379|   114k|              environment->getCreatedScopeDesc() == F->getFunctionScopeDesc() &&
  380|   114k|              "materializing the wrong scope");
  381|      0|          ScopeCreationInst *scope = getScope(builder, var, environment);
  382|   114k|          builder.createHBCStoreToEnvironmentInst(scope, val, var);
  383|       |
  384|   114k|          Inst->eraseFromParent();
  385|   114k|          changed = true;
  386|   114k|          break;
  387|      0|        }
  388|   114k|        case ValueKind::CreateFunctionInstKind: {
  ------------------
  |  Branch (388:9): [True: 114k, False: 1.10M]
  ------------------
  389|   114k|          auto *CFI = cast<CreateFunctionInst>(Inst);
  390|   114k|          auto *environment = CFI->getEnvironment();
  391|       |
  392|   114k|          builder.setInsertionPoint(Inst);
  393|   114k|          assert(
  394|   114k|              llvh::cast<HBCCreateEnvironmentInst>(environment)
  395|   114k|                      ->getCreatedScopeDesc() == F->getFunctionScopeDesc() &&
  396|   114k|              "materializing the wrong scope");
  397|      0|          auto *newInst = builder.createHBCCreateFunctionInst(
  398|   114k|              CFI->getFunctionCode(), environment);
  399|       |
  400|   114k|          Inst->replaceAllUsesWith(newInst);
  401|   114k|          Inst->eraseFromParent();
  402|   114k|          changed = true;
  403|   114k|          break;
  404|      0|        }
  405|      0|        case ValueKind::CreateGeneratorInstKind: {
  ------------------
  |  Branch (405:9): [True: 0, False: 1.21M]
  ------------------
  406|      0|          auto *CFI = cast<CreateGeneratorInst>(Inst);
  407|      0|          auto *environment = CFI->getEnvironment();
  408|       |
  409|      0|          builder.setInsertionPoint(Inst);
  410|      0|          assert(
  411|      0|              llvh::cast<HBCCreateEnvironmentInst>(environment)
  412|      0|                      ->getCreatedScopeDesc() == F->getFunctionScopeDesc() &&
  413|      0|              "materializing the wrong scope");
  414|      0|          auto *newInst = builder.createHBCCreateGeneratorInst(
  415|      0|              CFI->getFunctionCode(), environment);
  416|       |
  417|      0|          Inst->replaceAllUsesWith(newInst);
  418|      0|          Inst->eraseFromParent();
  419|      0|          changed = true;
  420|      0|          break;
  421|      0|        }
  422|   977k|        default:
  ------------------
  |  Branch (422:9): [True: 977k, False: 240k]
  ------------------
  423|   977k|          break;
  424|  1.21M|      }
  425|  1.21M|    }
  426|   267k|  }
  427|   114k|  return changed;
  428|   114k|}
_ZN6hermes3hbc19LowerArgumentsArray22getCreateArgumentsInstEPNS_8FunctionE:
  430|   114k|CreateArgumentsInst *LowerArgumentsArray::getCreateArgumentsInst(Function *F) {
  431|       |  // CreateArgumentsInst is always in the first block in normal functions,
  432|       |  // but is in the second block in GeneratorInnerFunctions.
  433|   114k|  if (llvh::isa<GeneratorInnerFunction>(F)) {
  ------------------
  |  Branch (433:7): [True: 0, False: 114k]
  ------------------
  434|      0|    for (BasicBlock *succ : F->front().getTerminator()->successors()) {
  ------------------
  |  Branch (434:27): [True: 0, False: 0]
  ------------------
  435|      0|      for (auto &inst : *succ) {
  ------------------
  |  Branch (435:23): [True: 0, False: 0]
  ------------------
  436|      0|        if (auto *target = llvh::dyn_cast<CreateArgumentsInst>(&inst)) {
  ------------------
  |  Branch (436:19): [True: 0, False: 0]
  ------------------
  437|      0|          return target;
  438|      0|        }
  439|      0|      }
  440|      0|    }
  441|   114k|  } else {
  442|   947k|    for (auto &inst : F->front()) {
  ------------------
  |  Branch (442:21): [True: 947k, False: 114k]
  ------------------
  443|   947k|      if (auto *target = llvh::dyn_cast<CreateArgumentsInst>(&inst)) {
  ------------------
  |  Branch (443:17): [True: 2, False: 947k]
  ------------------
  444|      2|        return target;
  445|      2|      }
  446|   947k|    }
  447|   114k|  }
  448|   114k|  return nullptr;
  449|   114k|}
_ZN6hermes3hbc19LowerArgumentsArray13runOnFunctionEPNS_8FunctionE:
  451|   114k|bool LowerArgumentsArray::runOnFunction(Function *F) {
  452|   114k|  IRBuilder builder(F);
  453|   114k|  updateToEntryInsertionPoint(builder, F);
  454|       |
  455|   114k|  CreateArgumentsInst *createArguments = getCreateArgumentsInst(F);
  456|   114k|  if (!createArguments) {
  ------------------
  |  Branch (456:7): [True: 114k, False: 2]
  ------------------
  457|   114k|    return false;
  458|   114k|  }
  459|       |
  460|      2|  builder.setInsertionPoint(createArguments);
  461|      2|  AllocStackInst *lazyReg = builder.createAllocStackInst("arguments");
  462|      2|  builder.createStoreStackInst(builder.getLiteralUndefined(), lazyReg);
  463|       |
  464|       |  // Process all LoadPropertyInst's first because they may add another user
  465|       |  // to the list of users of createArguments.
  466|       |  // Specifically the case when `arguments[arguments]` is accessed.
  467|       |  // Note that in such a case, a single LoadPropertyInst will appear twice in
  468|       |  // the use list. Use a set so we only remove it once.
  469|      2|  llvh::SmallSetVector<Instruction *, 16> uniqueUsers;
  470|      2|  uniqueUsers.insert(
  471|      2|      createArguments->getUsers().begin(), createArguments->getUsers().end());
  472|      2|  for (Value *user : uniqueUsers) {
  ------------------
  |  Branch (472:20): [True: 2, False: 2]
  ------------------
  473|      2|    auto *load = llvh::dyn_cast<LoadPropertyInst>(user);
  474|      2|    if (load && load->getObject() == createArguments) {
  ------------------
  |  Branch (474:9): [True: 0, False: 2]
  |  Branch (474:17): [True: 0, False: 0]
  ------------------
  475|      0|      builder.setInsertionPoint(load);
  476|      0|      builder.setLocation(load->getLocation());
  477|      0|      builder.setCurrentSourceLevelScope(load->getSourceLevelScope());
  478|      0|      auto *propertyString = llvh::dyn_cast<LiteralString>(load->getProperty());
  479|      0|      if (propertyString && propertyString->getValue().str() == "length") {
  ------------------
  |  Branch (479:11): [True: 0, False: 0]
  |  Branch (479:11): [True: 0, False: 0]
  |  Branch (479:29): [True: 0, False: 0]
  ------------------
  480|       |        // For `arguments.length`, get the length.
  481|      0|        auto *length = builder.createHBCGetArgumentsLengthInst(lazyReg);
  482|      0|        load->replaceAllUsesWith(length);
  483|      0|        load->eraseFromParent();
  484|      0|      } else {
  485|       |        // For all other property loads, get by index.
  486|      0|        auto *get = builder.createHBCGetArgumentsPropByValInst(
  487|      0|            load->getProperty(), lazyReg);
  488|      0|        load->replaceAllUsesWith(get);
  489|      0|        load->eraseFromParent();
  490|      0|      }
  491|      0|    }
  492|      2|  }
  493|       |
  494|      2|  uniqueUsers.clear();
  495|      2|  uniqueUsers.insert(
  496|      2|      createArguments->getUsers().begin(), createArguments->getUsers().end());
  497|      2|  for (Value *user : uniqueUsers) {
  ------------------
  |  Branch (497:20): [True: 2, False: 2]
  ------------------
  498|      2|    if (auto *phi = llvh::dyn_cast<PhiInst>(user)) {
  ------------------
  |  Branch (498:15): [True: 0, False: 2]
  ------------------
  499|       |      // We have to insert another branch where we can reify the value.
  500|      0|      for (int i = 0, n = phi->getNumEntries(); i < n; i++) {
  ------------------
  |  Branch (500:49): [True: 0, False: 0]
  ------------------
  501|      0|        auto entry = phi->getEntry(i);
  502|      0|        if (entry.first != createArguments)
  ------------------
  |  Branch (502:13): [True: 0, False: 0]
  ------------------
  503|      0|          continue;
  504|       |
  505|      0|        auto *previousBlock = cast<BasicBlock>(entry.second);
  506|      0|        auto *thisBlock = phi->getParent();
  507|       |
  508|      0|        auto *newBlock = builder.createBasicBlock(F);
  509|      0|        builder.setInsertionBlock(newBlock);
  510|      0|        builder.createHBCReifyArgumentsInst(lazyReg);
  511|      0|        auto *reifiedValue = builder.createLoadStackInst(lazyReg);
  512|      0|        builder.createBranchInst(thisBlock);
  513|       |
  514|      0|        phi->updateEntry(i, reifiedValue, newBlock);
  515|       |        // Update all other PHI nodes in thisBlock that currently reference
  516|       |        // previousBlock so they instead reference newBlock.
  517|      0|        updateIncomingPhiValues(thisBlock, previousBlock, newBlock);
  518|       |
  519|      0|        auto *branch = previousBlock->getTerminator();
  520|      0|        for (int j = 0, m = branch->getNumOperands(); j < m; j++)
  ------------------
  |  Branch (520:55): [True: 0, False: 0]
  ------------------
  521|      0|          if (branch->getOperand(j) == thisBlock)
  ------------------
  |  Branch (521:15): [True: 0, False: 0]
  ------------------
  522|      0|            branch->setOperand(newBlock, j);
  523|      0|      }
  524|      2|    } else if (auto *inst = llvh::dyn_cast<Instruction>(user)) {
  ------------------
  |  Branch (524:22): [True: 2, False: 0]
  ------------------
  525|       |      // For other users, insert a reification so we can replace
  526|       |      // the usage with this array.
  527|      2|      builder.setInsertionPoint(inst);
  528|      2|      builder.setLocation(inst->getLocation());
  529|      2|      builder.setCurrentSourceLevelScope(inst->getSourceLevelScope());
  530|      2|      builder.createHBCReifyArgumentsInst(lazyReg);
  531|      2|      auto *array = builder.createLoadStackInst(lazyReg);
  532|      6|      for (int i = 0, n = inst->getNumOperands(); i < n; i++) {
  ------------------
  |  Branch (532:51): [True: 4, False: 2]
  ------------------
  533|      4|        if (inst->getOperand(i) == createArguments) {
  ------------------
  |  Branch (533:13): [True: 2, False: 2]
  ------------------
  534|      2|          inst->setOperand(array, i);
  535|      2|        }
  536|      4|      }
  537|      2|    } else {
  538|      0|      llvm_unreachable("CreateArguments used for a non-Instruction.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  539|      0|    }
  540|      2|  }
  541|       |
  542|      2|  createArguments->eraseFromParent();
  543|      2|  return true;
  544|      2|}
_ZN6hermes3hbc19DedupReifyArguments13runOnFunctionEPNS_8FunctionE:
  546|   114k|bool DedupReifyArguments::runOnFunction(Function *F) {
  547|   114k|  bool changed = false;
  548|       |
  549|       |  // Check if there are any HBCReifyArgumentsInst in the function before
  550|       |  // calculating dominator tree and reverse post order to save compile time.
  551|   114k|  bool hasRAI = false;
  552|   267k|  for (auto &BB : *F) {
  ------------------
  |  Branch (552:17): [True: 267k, False: 114k]
  ------------------
  553|  1.23M|    for (auto &inst : BB.getInstList()) {
  ------------------
  |  Branch (553:21): [True: 1.23M, False: 267k]
  ------------------
  554|  1.23M|      if (llvh::isa<HBCReifyArgumentsInst>(&inst)) {
  ------------------
  |  Branch (554:11): [True: 2, False: 1.23M]
  ------------------
  555|      2|        hasRAI = true;
  556|      2|        break;
  557|      2|      }
  558|  1.23M|    }
  559|   267k|    if (hasRAI)
  ------------------
  |  Branch (559:9): [True: 2, False: 267k]
  ------------------
  560|      2|      break;
  561|   267k|  }
  562|       |
  563|   114k|  if (!hasRAI)
  ------------------
  |  Branch (563:7): [True: 114k, False: 2]
  ------------------
  564|   114k|    return false;
  565|       |
  566|      2|  DominanceInfo domInfo{F};
  567|      2|  PostOrderAnalysis PO(F);
  568|      2|  IRBuilder::InstructionDestroyer destroyer;
  569|       |
  570|      2|  llvh::SmallVector<BasicBlock *, 16> reversePO(PO.rbegin(), PO.rend());
  571|      2|  llvh::SmallVector<HBCReifyArgumentsInst *, 4> reifications;
  572|       |
  573|    160|  for (auto *BB : reversePO) {
  ------------------
  |  Branch (573:17): [True: 160, False: 2]
  ------------------
  574|  4.01k|    for (auto &inst : BB->getInstList()) {
  ------------------
  |  Branch (574:21): [True: 4.01k, False: 160]
  ------------------
  575|  4.01k|      if (auto *reify = llvh::dyn_cast<HBCReifyArgumentsInst>(&inst)) {
  ------------------
  |  Branch (575:17): [True: 2, False: 4.01k]
  ------------------
  576|      2|        HBCReifyArgumentsInst *dominator = nullptr;
  577|      2|        for (auto *possibleParent : reifications) {
  ------------------
  |  Branch (577:35): [True: 0, False: 2]
  ------------------
  578|      0|          if (domInfo.properlyDominates(possibleParent, reify)) {
  ------------------
  |  Branch (578:15): [True: 0, False: 0]
  ------------------
  579|      0|            dominator = possibleParent;
  580|      0|            break;
  581|      0|          }
  582|      0|        }
  583|       |
  584|      2|        if (dominator) {
  ------------------
  |  Branch (584:13): [True: 0, False: 2]
  ------------------
  585|      0|          destroyer.add(reify);
  586|      0|          changed = true;
  587|      2|        } else {
  588|      2|          reifications.push_back(reify);
  589|      2|        }
  590|      2|      }
  591|  4.01k|    }
  592|    160|  }
  593|      2|  return changed;
  594|   114k|}
_ZN6hermes3hbc17LowerConstruction13runOnFunctionEPNS_8FunctionE:
  596|   114k|bool LowerConstruction::runOnFunction(Function *F) {
  597|   114k|  IRBuilder builder(F);
  598|   114k|  auto *prototypeString = builder.getLiteralString("prototype");
  599|       |
  600|   267k|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (600:23): [True: 267k, False: 114k]
  ------------------
  601|   267k|    IRBuilder::InstructionDestroyer destroyer;
  602|  1.22M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (602:25): [True: 1.22M, False: 267k]
  ------------------
  603|  1.22M|      if (auto *constructor = llvh::dyn_cast<ConstructInst>(&I)) {
  ------------------
  |  Branch (603:17): [True: 0, False: 1.22M]
  ------------------
  604|      0|        builder.setInsertionPoint(constructor);
  605|      0|        builder.setLocation(constructor->getLocation());
  606|      0|        builder.setCurrentSourceLevelScope(constructor->getSourceLevelScope());
  607|      0|        auto closure = constructor->getCallee();
  608|      0|        auto prototype =
  609|      0|            builder.createLoadPropertyInst(closure, prototypeString);
  610|      0|        auto thisObject = builder.createHBCCreateThisInst(prototype, closure);
  611|       |
  612|      0|        llvh::SmallVector<Value *, 8> args;
  613|      0|        for (int i = 1, n = constructor->getNumArguments(); i < n; i++) {
  ------------------
  |  Branch (613:61): [True: 0, False: 0]
  ------------------
  614|      0|          args.push_back(constructor->getArgument(i));
  615|      0|        }
  616|      0|        auto newConstructor =
  617|      0|            builder.createHBCConstructInst(closure, thisObject, args);
  618|      0|        auto finalValue = builder.createHBCGetConstructedObjectInst(
  619|      0|            thisObject, newConstructor);
  620|      0|        constructor->replaceAllUsesWith(finalValue);
  621|      0|        destroyer.add(constructor);
  622|      0|      }
  623|  1.22M|    }
  624|   267k|  }
  625|   114k|  return true;
  626|   114k|}
_ZN6hermes3hbc10LowerCalls13runOnFunctionEPNS_8FunctionE:
  628|   114k|bool LowerCalls::runOnFunction(Function *F) {
  629|   114k|  IRBuilder builder(F);
  630|   114k|  bool changed = false;
  631|       |
  632|   267k|  for (auto &BB : *F) {
  ------------------
  |  Branch (632:17): [True: 267k, False: 114k]
  ------------------
  633|  1.53M|    for (auto &I : BB) {
  ------------------
  |  Branch (633:18): [True: 1.53M, False: 267k]
  ------------------
  634|  1.53M|      auto *call = llvh::dyn_cast<CallInst>(&I);
  635|       |      // This also matches constructors.
  636|  1.53M|      if (!call)
  ------------------
  |  Branch (636:11): [True: 1.53M, False: 574]
  ------------------
  637|  1.53M|        continue;
  638|    574|      builder.setInsertionPoint(call);
  639|    574|      changed = true;
  640|       |
  641|    574|      auto reg = RA_.getLastRegister().getIndex() -
  642|    574|          HVMRegisterAllocator::CALL_EXTRA_REGISTERS;
  643|       |
  644|   136k|      for (int i = 0, e = call->getNumArguments(); i < e; i++, --reg) {
  ------------------
  |  Branch (644:52): [True: 135k, False: 574]
  ------------------
  645|       |        // If this is a Call instruction, emit explicit Movs to the argument
  646|       |        // registers. If this is a CallN instruction, emit ImplicitMovs
  647|       |        // instead, to express that these registers get written to by the CallN,
  648|       |        // even though they are not the destination.
  649|       |        // Lastly, if this is argument 0 of CallBuiltinInst emit ImplicitMov to
  650|       |        // encode that the "this" register is implicitly set to undefined.
  651|   135k|        Value *arg = call->getArgument(i);
  652|   135k|        if (llvh::isa<HBCCallNInst>(call) ||
  ------------------
  |  Branch (652:13): [True: 0, False: 135k]
  ------------------
  653|   135k|            (i == 0 && llvh::isa<CallBuiltinInst>(call))) {
  ------------------
  |  Branch (653:14): [True: 574, False: 135k]
  |  Branch (653:24): [True: 283, False: 291]
  ------------------
  654|    283|          auto *imov = builder.createImplicitMovInst(arg);
  655|    283|          RA_.updateRegister(imov, Register(reg));
  656|   135k|        } else {
  657|   135k|          auto *mov = builder.createMovInst(arg);
  658|   135k|          RA_.updateRegister(mov, Register(reg));
  659|   135k|          call->setArgument(mov, i);
  660|   135k|        }
  661|   135k|      }
  662|    574|    }
  663|   267k|  }
  664|   114k|  return changed;
  665|   114k|}
_ZN6hermes3hbc14SpillRegisters19requiresShortOutputEPNS_11InstructionE:
  773|   141k|bool SpillRegisters::requiresShortOutput(Instruction *I) {
  774|   141k|  if (llvh::isa<TerminatorInst>(I)) {
  ------------------
  |  Branch (774:7): [True: 5, False: 141k]
  ------------------
  775|       |    // None of our terminators produce results at all
  776|       |    // (though GetNextPNameInst modifies operands).
  777|      5|    return false;
  778|      5|  }
  779|       |
  780|       |  // Instructions that produce no output, don't use the register, even when
  781|       |  // allocated.
  782|   141k|  if (I->getType().isNoType())
  ------------------
  |  Branch (782:7): [True: 0, False: 141k]
  ------------------
  783|      0|    return false;
  784|       |
  785|   141k|  switch (I->getKind()) {
  786|       |    // Some instructions become Movs or other opcodes with long variants:
  787|  2.85k|    case ValueKind::HBCSpillMovInstKind:
  ------------------
  |  Branch (787:5): [True: 2.85k, False: 138k]
  ------------------
  788|  2.85k|    case ValueKind::LoadStackInstKind:
  ------------------
  |  Branch (788:5): [True: 5, False: 141k]
  ------------------
  789|   137k|    case ValueKind::MovInstKind:
  ------------------
  |  Branch (789:5): [True: 134k, False: 7.11k]
  ------------------
  790|   137k|    case ValueKind::PhiInstKind:
  ------------------
  |  Branch (790:5): [True: 0, False: 141k]
  ------------------
  791|       |    // Some instructions aren't actually encoded at all:
  792|   137k|    case ValueKind::AllocStackInstKind:
  ------------------
  |  Branch (792:5): [True: 5, False: 141k]
  ------------------
  793|   137k|    case ValueKind::TryEndInstKind:
  ------------------
  |  Branch (793:5): [True: 0, False: 141k]
  ------------------
  794|   137k|    case ValueKind::TryStartInstKind:
  ------------------
  |  Branch (794:5): [True: 0, False: 141k]
  ------------------
  795|   137k|      return false;
  796|  4.25k|    default:
  ------------------
  |  Branch (796:5): [True: 4.25k, False: 137k]
  ------------------
  797|  4.25k|      return true;
  798|   141k|  }
  799|   141k|}
_ZN6hermes3hbc14SpillRegisters20requiresShortOperandEPNS_11InstructionEi:
  801|   275k|bool SpillRegisters::requiresShortOperand(Instruction *I, int op) {
  802|   275k|  switch (I->getKind()) {
  803|      0|    case ValueKind::PhiInstKind:
  ------------------
  |  Branch (803:5): [True: 0, False: 275k]
  ------------------
  804|   134k|    case ValueKind::MovInstKind:
  ------------------
  |  Branch (804:5): [True: 134k, False: 141k]
  ------------------
  805|   137k|    case ValueKind::HBCSpillMovInstKind:
  ------------------
  |  Branch (805:5): [True: 2.85k, False: 272k]
  ------------------
  806|   137k|    case ValueKind::LoadStackInstKind:
  ------------------
  |  Branch (806:5): [True: 5, False: 275k]
  ------------------
  807|   137k|    case ValueKind::StoreStackInstKind:
  ------------------
  |  Branch (807:5): [True: 0, False: 275k]
  ------------------
  808|   137k|      return false;
  809|  67.1k|    case ValueKind::CallInstKind:
  ------------------
  |  Branch (809:5): [True: 67.1k, False: 208k]
  ------------------
  810|  67.1k|    case ValueKind::ConstructInstKind:
  ------------------
  |  Branch (810:5): [True: 0, False: 275k]
  ------------------
  811|   134k|    case ValueKind::CallBuiltinInstKind:
  ------------------
  |  Branch (811:5): [True: 67.1k, False: 208k]
  ------------------
  812|   134k|    case ValueKind::HBCConstructInstKind:
  ------------------
  |  Branch (812:5): [True: 0, False: 275k]
  ------------------
  813|   134k|    case ValueKind::HBCCallDirectInstKind:
  ------------------
  |  Branch (813:5): [True: 0, False: 275k]
  ------------------
  814|   134k|      return op == CallInst::CalleeIdx;
  815|  4.01k|    default:
  ------------------
  |  Branch (815:5): [True: 4.01k, False: 271k]
  ------------------
  816|  4.01k|      return true;
  817|   275k|  }
  818|   275k|}
_ZN6hermes3hbc14SpillRegisters23modifiesOperandRegisterEPNS_11InstructionEi:
  820|     28|bool SpillRegisters::modifiesOperandRegister(Instruction *I, int op) {
  821|     28|  return I->getChangedOperands().at((unsigned)op);
  822|     28|}
_ZN6hermes3hbc14SpillRegisters13runOnFunctionEPNS_8FunctionE:
  824|   114k|bool SpillRegisters::runOnFunction(Function *F) {
  825|   114k|  if (RA_.getMaxRegisterUsage() < boundary_) {
  ------------------
  |  Branch (825:7): [True: 114k, False: 5]
  ------------------
  826|   114k|    return false;
  827|   114k|  }
  828|      5|  reserveLowRegisters(F);
  829|       |
  830|      5|  IRBuilder builder(F);
  831|      5|  llvh::SmallVector<std::pair<Instruction *, Register>, 2> toSpill;
  832|       |
  833|      5|  for (BasicBlock &BB : F->getBasicBlockList()) {
  ------------------
  |  Branch (833:23): [True: 5, False: 5]
  ------------------
  834|   141k|    for (Instruction &inst : BB) {
  ------------------
  |  Branch (834:28): [True: 141k, False: 5]
  ------------------
  835|   141k|      if (!RA_.isAllocated(&inst)) {
  ------------------
  |  Branch (835:11): [True: 0, False: 141k]
  ------------------
  836|       |        // This instruction is dead. Don't bother spilling.
  837|      0|        continue;
  838|      0|      }
  839|       |
  840|   141k|      int tempReg = 0;
  841|   141k|      toSpill.clear();
  842|   141k|      bool replaceWithFirstSpill = false;
  843|   141k|      builder.setLocation(inst.getLocation());
  844|   141k|      builder.setCurrentSourceLevelScope(inst.getSourceLevelScope());
  845|       |
  846|   141k|      auto myRegister = RA_.getRegister(&inst);
  847|   141k|      if (requiresShortOutput(&inst) && !isShort(myRegister)) {
  ------------------
  |  Branch (847:11): [True: 4.25k, False: 137k]
  |  Branch (847:41): [True: 2.85k, False: 1.39k]
  ------------------
  848|  2.85k|        auto temp = getReserved(tempReg++);
  849|  2.85k|        RA_.updateRegister(&inst, temp);
  850|  2.85k|        toSpill.push_back(
  851|  2.85k|            std::pair<Instruction *, Register>(&inst, myRegister));
  852|  2.85k|        replaceWithFirstSpill = true;
  853|  2.85k|      }
  854|       |
  855|   416k|      for (int i = 0, e = inst.getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (855:50): [True: 275k, False: 141k]
  ------------------
  856|   275k|        auto *op = llvh::dyn_cast<Instruction>(inst.getOperand(i));
  857|   275k|        if (!op || !RA_.isAllocated(op)) {
  ------------------
  |  Branch (857:13): [True: 258, False: 275k]
  |  Branch (857:20): [True: 0, False: 275k]
  ------------------
  858|       |          // This is either not an instruction, or a dead instruction.
  859|       |          // Either way, we don't have to do anything.
  860|    258|          continue;
  861|    258|        }
  862|   275k|        auto opRegister = RA_.getRegister(op);
  863|       |
  864|   275k|        if (requiresShortOperand(&inst, i) && !isShort(opRegister)) {
  ------------------
  |  Branch (864:13): [True: 4.01k, False: 271k]
  |  Branch (864:47): [True: 28, False: 3.98k]
  ------------------
  865|     28|          auto temp = getReserved(tempReg++);
  866|       |
  867|     28|          builder.setInsertionPoint(&inst);
  868|     28|          auto *load = builder.createHBCSpillMovInst(op);
  869|     28|          RA_.updateRegister(load, temp);
  870|     28|          inst.setOperand(load, i);
  871|       |
  872|     28|          if (modifiesOperandRegister(&inst, i)) {
  ------------------
  |  Branch (872:15): [True: 0, False: 28]
  ------------------
  873|      0|            toSpill.push_back(
  874|      0|                std::pair<Instruction *, Register>(load, opRegister));
  875|      0|          }
  876|     28|        }
  877|   275k|      }
  878|       |
  879|   141k|      if (toSpill.size()) {
  ------------------
  |  Branch (879:11): [True: 2.85k, False: 138k]
  ------------------
  880|  2.85k|        auto spillPoints = getInsertionPointsAfter(builder, &inst);
  881|       |
  882|  2.85k|        assert(
  883|  2.85k|            (!replaceWithFirstSpill || spillPoints.size() <= 1) &&
  884|  2.85k|            "Asked to spill the value of a TerminatorInst. Our terminators "
  885|  2.85k|            "shouldn't produce values. It wouldn't have mattered, but it "
  886|  2.85k|            "also has multiple branches so users might need PhiInsts.");
  887|       |
  888|  2.85k|        for (auto *point : spillPoints) {
  ------------------
  |  Branch (888:26): [True: 2.85k, False: 2.85k]
  ------------------
  889|  2.85k|          builder.setInsertionPoint(point);
  890|  2.85k|          for (auto store : toSpill) {
  ------------------
  |  Branch (890:27): [True: 2.85k, False: 2.85k]
  ------------------
  891|  2.85k|            auto *storeInst = builder.createHBCSpillMovInst(store.first);
  892|  2.85k|            RA_.updateRegister(storeInst, store.second);
  893|       |
  894|  2.85k|            if (!replaceWithFirstSpill)
  ------------------
  |  Branch (894:17): [True: 0, False: 2.85k]
  ------------------
  895|      0|              continue;
  896|       |            // Replace all uses of the inst with the spilling inst
  897|  2.85k|            inst.replaceAllUsesWith(storeInst);
  898|       |            // Except for the actual spill of course
  899|  2.85k|            storeInst->setOperand(&inst, 0);
  900|       |            // Disable now that the job is done.
  901|  2.85k|            replaceWithFirstSpill = false;
  902|  2.85k|          }
  903|  2.85k|        }
  904|  2.85k|      }
  905|   141k|    }
  906|      5|  }
  907|      5|  return true;
  908|   114k|}
_ZN6hermes3hbc25LowerSwitchIntoJumpTables13runOnFunctionEPNS_8FunctionE:
  910|   114k|bool LowerSwitchIntoJumpTables::runOnFunction(Function *F) {
  911|   114k|  bool changed = false;
  912|   114k|  llvh::SmallVector<SwitchInst *, 4> switches;
  913|       |  // Collect all switch instructions.
  914|   114k|  for (BasicBlock &BB : *F)
  ------------------
  |  Branch (914:23): [True: 267k, False: 114k]
  ------------------
  915|  1.24M|    for (auto &it : BB) {
  ------------------
  |  Branch (915:19): [True: 1.24M, False: 267k]
  ------------------
  916|  1.24M|      if (auto *S = llvh::dyn_cast<SwitchInst>(&it))
  ------------------
  |  Branch (916:17): [True: 0, False: 1.24M]
  ------------------
  917|      0|        switches.push_back(S);
  918|  1.24M|    }
  919|       |
  920|   114k|  for (auto *S : switches) {
  ------------------
  |  Branch (920:16): [True: 0, False: 114k]
  ------------------
  921|      0|    if (lowerIntoJumpTable(S))
  ------------------
  |  Branch (921:9): [True: 0, False: 0]
  ------------------
  922|      0|      changed = true;
  923|      0|  }
  924|       |
  925|   114k|  return changed;
  926|   114k|}
Passes.cpp:_ZN6hermes3hbc12_GLOBAL__N_127updateToEntryInsertionPointERNS_9IRBuilderEPNS_8FunctionE:
   77|   342k|void updateToEntryInsertionPoint(IRBuilder &builder, Function *F) {
   78|   342k|  auto &BB = F->front();
   79|   342k|  auto it = BB.begin();
   80|   342k|  auto end = BB.end();
   81|       |  // Skip all HBCCreateEnvironmentInst.
   82|   685k|  while (it != end && llvh::isa<HBCCreateEnvironmentInst>(*it))
  ------------------
  |  Branch (82:10): [True: 685k, False: 0]
  |  Branch (82:23): [True: 342k, False: 342k]
  ------------------
   83|   342k|    ++it;
   84|       |
   85|   342k|  builder.setInsertionPoint(&*it);
   86|   342k|}
Passes.cpp:_ZZN6hermes3hbc13LoadConstants13runOnFunctionEPNS_8FunctionEENK3$_0clEPNS_7LiteralE:
  224|   177k|  auto createLoadLiteral = [&builder](Literal *literal) -> Instruction * {
  225|   177k|    return llvh::isa<GlobalObject>(literal)
  ------------------
  |  Branch (225:12): [True: 62.5k, False: 114k]
  ------------------
  226|   177k|        ? cast<Instruction>(builder.createHBCGetGlobalObjectInst())
  227|   177k|        : cast<Instruction>(builder.createHBCLoadConstInst(literal));
  228|   177k|  };
Passes.cpp:_ZN6hermes3hbc12_GLOBAL__N_123getInsertionPointsAfterERNS_9IRBuilderEPNS_11InstructionE:
   48|  2.85k|    Instruction *inst) {
   49|  2.85k|  llvh::SmallVector<Instruction *, 4> points;
   50|       |
   51|  2.85k|  if (!llvh::isa<TerminatorInst>(inst)) {
  ------------------
  |  Branch (51:7): [True: 2.85k, False: 0]
  ------------------
   52|       |    // Easy case for non-terminators. Just return the next inst.
   53|  2.85k|    auto pos = inst->getIterator();
   54|  2.85k|    pos++;
   55|  2.85k|    points.push_back(&*pos);
   56|  2.85k|    return points;
   57|  2.85k|  }
   58|       |
   59|      0|  for (int i = 0, e = inst->getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (59:47): [True: 0, False: 0]
  ------------------
   60|      0|    BasicBlock *target = llvh::dyn_cast<BasicBlock>(inst->getOperand(i));
   61|      0|    if (!target)
  ------------------
  |  Branch (61:9): [True: 0, False: 0]
  ------------------
   62|      0|      continue;
   63|       |
   64|      0|    auto *detour = builder.createBasicBlock(target->getParent());
   65|      0|    builder.setInsertionBlock(detour);
   66|      0|    auto *bounce = builder.createBranchInst(target);
   67|      0|    inst->setOperand(detour, i);
   68|      0|    updateIncomingPhiValues(target, inst->getParent(), detour);
   69|      0|    points.push_back(bounce);
   70|      0|  }
   71|      0|  return points;
   72|  2.85k|}

_ZN6hermes3hbc24LowerBuiltinCallsContextC2ERNS_11StringTableE:
   59|     56|LowerBuiltinCallsContext::LowerBuiltinCallsContext(StringTable &strTab) {
   60|     56|  hermesInternalID_ = strTab.getIdentifier("HermesInternal");
   61|       |
   62|       |  // First insert all objects.
   63|     56|  int objIndex = 0;
   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
   65|     56|#include "hermes/FrontEndDefs/Builtins.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |///===----------------------------------------------------------------------===
  |  |    9|       |/// \file
  |  |   10|       |/// Define Hermes builtin functions.
  |  |   11|       |///
  |  |   12|       |/// All builtin functions in Hermes are registered in a vector of `Callable *`
  |  |   13|       |/// in the runtime with an index as its builtin method id.
  |  |   14|       |///
  |  |   15|       |/// There are 3 kinds of builtins in Hermes:
  |  |   16|       |/// 1. (Public Native) Builtins: those are global objects and methods of JSLib
  |  |   17|       |///   implemented natively which the compiler can assume have not been
  |  |   18|       |///   overwritten and can be treated as builtins under the "static builtin"
  |  |   19|       |///   optimizations (`-fstatic-builtins` flag).
  |  |   20|       |///
  |  |   21|       |/// 2. Private (Native) Builtins: those are native functions meant to be only
  |  |   22|       |///   called internally by the compiler to help with implementing JS features
  |  |   23|       |///   without introducing extra opcodes. They are notationally written as
  |  |   24|       |///   `HermesBuiltin_name`.
  |  |   25|       |///
  |  |   26|       |/// 3. (Private) JS Builtins: those are JS functions returned from the result of
  |  |   27|       |///   executing internal bytecode. They are also there to help with implementing
  |  |   28|       |///   JS features.
  |  |   29|       |///
  |  |   30|       |/// At this moment,
  |  |   31|       |/// Native builtins are invoked via `CallBuiltin` instruction.
  |  |   32|       |/// JS builtins are invoked via `GetBuiltinClosure` followed by a `Call`.
  |  |   33|       |///
  |  |   34|       |/// We might separate them in the future.
  |  |   35|       |///
  |  |   36|       |/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |   37|       |/// IMPORTANT: DO NOT FORGET TO INCREASE THE BYTECODE FILE FORMAT VERSION IF
  |  |   38|       |/// YOU MODIFY THIS FILE.
  |  |   39|       |/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |   40|       |///===----------------------------------------------------------------------===
  |  |   41|       |
  |  |   42|       |#ifndef BUILTIN_OBJECT
  |  |   43|       |#define BUILTIN_OBJECT(object)
  |  |   44|       |#endif
  |  |   45|     56|#ifndef BUILTIN_METHOD
  |  |   46|     56|#define BUILTIN_METHOD(object, name)
  |  |   47|     56|#endif
  |  |   48|     56|#ifndef PRIVATE_BUILTIN
  |  |   49|     56|#define PRIVATE_BUILTIN(name)
  |  |   50|     56|#endif
  |  |   51|     56|#ifndef MARK_FIRST_PRIVATE_BUILTIN
  |  |   52|     56|#define MARK_FIRST_PRIVATE_BUILTIN(name)
  |  |   53|     56|#endif
  |  |   54|     56|#ifndef JS_BUILTIN
  |  |   55|     56|#define JS_BUILTIN(name)
  |  |   56|     56|#endif
  |  |   57|     56|#ifndef MARK_FIRST_JS_BUILTIN
  |  |   58|     56|#define MARK_FIRST_JS_BUILTIN(name)
  |  |   59|     56|#endif
  |  |   60|       |
  |  |   61|     56|BUILTIN_OBJECT(Array)
  |  |  ------------------
  |  |  |  |   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   62|       |// BUILTIN_METHOD(Array, from)
  |  |   63|     56|BUILTIN_METHOD(Array, isArray)
  |  |   64|       |
  |  |   65|     56|BUILTIN_METHOD(Date, UTC)
  |  |   66|     56|BUILTIN_METHOD(Date, parse)
  |  |   67|       |
  |  |   68|       |// BUILTIN_OBJECT(HermesInternal)
  |  |   69|       |// BUILTIN_METHOD(HermesInternal, getEpilogues)
  |  |   70|       |
  |  |   71|     56|BUILTIN_OBJECT(JSON)
  |  |  ------------------
  |  |  |  |   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   72|     56|BUILTIN_METHOD(JSON, parse)
  |  |   73|     56|BUILTIN_METHOD(JSON, stringify)
  |  |   74|       |
  |  |   75|     56|BUILTIN_OBJECT(Math)
  |  |  ------------------
  |  |  |  |   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |   76|     56|BUILTIN_METHOD(Math, abs)
  |  |   77|     56|BUILTIN_METHOD(Math, acos)
  |  |   78|     56|BUILTIN_METHOD(Math, asin)
  |  |   79|     56|BUILTIN_METHOD(Math, atan)
  |  |   80|     56|BUILTIN_METHOD(Math, atan2)
  |  |   81|     56|BUILTIN_METHOD(Math, ceil)
  |  |   82|     56|BUILTIN_METHOD(Math, cos)
  |  |   83|     56|BUILTIN_METHOD(Math, exp)
  |  |   84|     56|BUILTIN_METHOD(Math, floor)
  |  |   85|     56|BUILTIN_METHOD(Math, hypot)
  |  |   86|     56|BUILTIN_METHOD(Math, imul)
  |  |   87|     56|BUILTIN_METHOD(Math, log)
  |  |   88|     56|BUILTIN_METHOD(Math, max)
  |  |   89|     56|BUILTIN_METHOD(Math, min)
  |  |   90|     56|BUILTIN_METHOD(Math, pow)
  |  |   91|     56|BUILTIN_METHOD(Math, round)
  |  |   92|     56|BUILTIN_METHOD(Math, sin)
  |  |   93|     56|BUILTIN_METHOD(Math, sqrt)
  |  |   94|     56|BUILTIN_METHOD(Math, tan)
  |  |   95|     56|BUILTIN_METHOD(Math, trunc)
  |  |   96|       |
  |  |   97|       |// BUILTIN_OBJECT(Number)
  |  |   98|       |// BUILTIN_METHOD(Number, isNaN)
  |  |   99|       |
  |  |  100|     56|BUILTIN_OBJECT(Object)
  |  |  ------------------
  |  |  |  |   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |  101|     56|BUILTIN_METHOD(Object, create)
  |  |  102|     56|BUILTIN_METHOD(Object, defineProperties)
  |  |  103|     56|BUILTIN_METHOD(Object, defineProperty)
  |  |  104|       |// BUILTIN_METHOD(Object, entries)
  |  |  105|     56|BUILTIN_METHOD(Object, freeze)
  |  |  106|     56|BUILTIN_METHOD(Object, getOwnPropertyDescriptor)
  |  |  107|     56|BUILTIN_METHOD(Object, getOwnPropertyNames)
  |  |  108|       |// BUILTIN_METHOD(Object, getOwnPropertySymbols)
  |  |  109|     56|BUILTIN_METHOD(Object, getPrototypeOf)
  |  |  110|     56|BUILTIN_METHOD(Object, isExtensible)
  |  |  111|     56|BUILTIN_METHOD(Object, isFrozen)
  |  |  112|     56|BUILTIN_METHOD(Object, keys)
  |  |  113|     56|BUILTIN_METHOD(Object, seal)
  |  |  114|       |// BUILTIN_METHOD(Object, setPrototypeOf)
  |  |  115|       |// BUILTIN_METHOD(Object, values)
  |  |  116|       |
  |  |  117|     56|BUILTIN_OBJECT(String)
  |  |  ------------------
  |  |  |  |   64|     56|#define BUILTIN_OBJECT(name) objects_[strTab.getIdentifier(#name)] = objIndex++;
  |  |  ------------------
  |  |  118|     56|BUILTIN_METHOD(String, fromCharCode)
  |  |  119|       |
  |  |  120|     56|PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  121|     56|MARK_FIRST_PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  122|     56|PRIVATE_BUILTIN(requireFast)
  |  |  123|     56|PRIVATE_BUILTIN(getTemplateObject)
  |  |  124|     56|PRIVATE_BUILTIN(ensureObject)
  |  |  125|     56|PRIVATE_BUILTIN(getMethod)
  |  |  126|     56|PRIVATE_BUILTIN(throwTypeError)
  |  |  127|     56|PRIVATE_BUILTIN(generatorSetDelegated)
  |  |  128|     56|PRIVATE_BUILTIN(copyDataProperties)
  |  |  129|     56|PRIVATE_BUILTIN(copyRestArgs)
  |  |  130|     56|PRIVATE_BUILTIN(arraySpread)
  |  |  131|     56|PRIVATE_BUILTIN(apply)
  |  |  132|     56|PRIVATE_BUILTIN(exportAll)
  |  |  133|     56|PRIVATE_BUILTIN(exponentiationOperator)
  |  |  134|     56|PRIVATE_BUILTIN(initRegexNamedGroups)
  |  |  135|       |
  |  |  136|     56|JS_BUILTIN(spawnAsync)
  |  |  137|     56|MARK_FIRST_JS_BUILTIN(spawnAsync)
  |  |  138|       |
  |  |  139|     56|#undef BUILTIN_OBJECT
  |  |  140|     56|#undef BUILTIN_METHOD
  |  |  141|     56|#undef PRIVATE_BUILTIN
  |  |  142|     56|#undef MARK_FIRST_PRIVATE_BUILTIN
  |  |  143|     56|#undef JS_BUILTIN
  |  |  144|     56|#undef MARK_FIRST_JS_BUILTIN
  ------------------
   66|       |
   67|       |  // Now insert all methods.
   68|     56|  int methodIndex = 0;
   69|     56|#define BUILTIN_METHOD(object, name)                                           \
   70|     56|  methods_[std::make_pair(                                                     \
   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
   73|     56|#include "hermes/FrontEndDefs/Builtins.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |///===----------------------------------------------------------------------===
  |  |    9|       |/// \file
  |  |   10|       |/// Define Hermes builtin functions.
  |  |   11|       |///
  |  |   12|       |/// All builtin functions in Hermes are registered in a vector of `Callable *`
  |  |   13|       |/// in the runtime with an index as its builtin method id.
  |  |   14|       |///
  |  |   15|       |/// There are 3 kinds of builtins in Hermes:
  |  |   16|       |/// 1. (Public Native) Builtins: those are global objects and methods of JSLib
  |  |   17|       |///   implemented natively which the compiler can assume have not been
  |  |   18|       |///   overwritten and can be treated as builtins under the "static builtin"
  |  |   19|       |///   optimizations (`-fstatic-builtins` flag).
  |  |   20|       |///
  |  |   21|       |/// 2. Private (Native) Builtins: those are native functions meant to be only
  |  |   22|       |///   called internally by the compiler to help with implementing JS features
  |  |   23|       |///   without introducing extra opcodes. They are notationally written as
  |  |   24|       |///   `HermesBuiltin_name`.
  |  |   25|       |///
  |  |   26|       |/// 3. (Private) JS Builtins: those are JS functions returned from the result of
  |  |   27|       |///   executing internal bytecode. They are also there to help with implementing
  |  |   28|       |///   JS features.
  |  |   29|       |///
  |  |   30|       |/// At this moment,
  |  |   31|       |/// Native builtins are invoked via `CallBuiltin` instruction.
  |  |   32|       |/// JS builtins are invoked via `GetBuiltinClosure` followed by a `Call`.
  |  |   33|       |///
  |  |   34|       |/// We might separate them in the future.
  |  |   35|       |///
  |  |   36|       |/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |   37|       |/// IMPORTANT: DO NOT FORGET TO INCREASE THE BYTECODE FILE FORMAT VERSION IF
  |  |   38|       |/// YOU MODIFY THIS FILE.
  |  |   39|       |/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |   40|       |///===----------------------------------------------------------------------===
  |  |   41|       |
  |  |   42|     56|#ifndef BUILTIN_OBJECT
  |  |   43|     56|#define BUILTIN_OBJECT(object)
  |  |   44|     56|#endif
  |  |   45|       |#ifndef BUILTIN_METHOD
  |  |   46|       |#define BUILTIN_METHOD(object, name)
  |  |   47|       |#endif
  |  |   48|     56|#ifndef PRIVATE_BUILTIN
  |  |   49|     56|#define PRIVATE_BUILTIN(name)
  |  |   50|     56|#endif
  |  |   51|     56|#ifndef MARK_FIRST_PRIVATE_BUILTIN
  |  |   52|     56|#define MARK_FIRST_PRIVATE_BUILTIN(name)
  |  |   53|     56|#endif
  |  |   54|     56|#ifndef JS_BUILTIN
  |  |   55|     56|#define JS_BUILTIN(name)
  |  |   56|     56|#endif
  |  |   57|     56|#ifndef MARK_FIRST_JS_BUILTIN
  |  |   58|     56|#define MARK_FIRST_JS_BUILTIN(name)
  |  |   59|     56|#endif
  |  |   60|       |
  |  |   61|     56|BUILTIN_OBJECT(Array)
  |  |   62|       |// BUILTIN_METHOD(Array, from)
  |  |   63|     56|BUILTIN_METHOD(Array, isArray)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   64|       |
  |  |   65|     56|BUILTIN_METHOD(Date, UTC)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   66|     56|BUILTIN_METHOD(Date, parse)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   67|       |
  |  |   68|       |// BUILTIN_OBJECT(HermesInternal)
  |  |   69|       |// BUILTIN_METHOD(HermesInternal, getEpilogues)
  |  |   70|       |
  |  |   71|     56|BUILTIN_OBJECT(JSON)
  |  |   72|     56|BUILTIN_METHOD(JSON, parse)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   73|     56|BUILTIN_METHOD(JSON, stringify)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   74|       |
  |  |   75|     56|BUILTIN_OBJECT(Math)
  |  |   76|     56|BUILTIN_METHOD(Math, abs)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   77|     56|BUILTIN_METHOD(Math, acos)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   78|     56|BUILTIN_METHOD(Math, asin)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   79|     56|BUILTIN_METHOD(Math, atan)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   80|     56|BUILTIN_METHOD(Math, atan2)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   81|     56|BUILTIN_METHOD(Math, ceil)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   82|     56|BUILTIN_METHOD(Math, cos)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   83|     56|BUILTIN_METHOD(Math, exp)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   84|     56|BUILTIN_METHOD(Math, floor)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   85|     56|BUILTIN_METHOD(Math, hypot)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   86|     56|BUILTIN_METHOD(Math, imul)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   87|     56|BUILTIN_METHOD(Math, log)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   88|     56|BUILTIN_METHOD(Math, max)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   89|     56|BUILTIN_METHOD(Math, min)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   90|     56|BUILTIN_METHOD(Math, pow)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   91|     56|BUILTIN_METHOD(Math, round)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   92|     56|BUILTIN_METHOD(Math, sin)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   93|     56|BUILTIN_METHOD(Math, sqrt)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   94|     56|BUILTIN_METHOD(Math, tan)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   95|     56|BUILTIN_METHOD(Math, trunc)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |   96|       |
  |  |   97|       |// BUILTIN_OBJECT(Number)
  |  |   98|       |// BUILTIN_METHOD(Number, isNaN)
  |  |   99|       |
  |  |  100|     56|BUILTIN_OBJECT(Object)
  |  |  101|     56|BUILTIN_METHOD(Object, create)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  102|     56|BUILTIN_METHOD(Object, defineProperties)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  103|     56|BUILTIN_METHOD(Object, defineProperty)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  104|       |// BUILTIN_METHOD(Object, entries)
  |  |  105|     56|BUILTIN_METHOD(Object, freeze)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  106|     56|BUILTIN_METHOD(Object, getOwnPropertyDescriptor)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  107|     56|BUILTIN_METHOD(Object, getOwnPropertyNames)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  108|       |// BUILTIN_METHOD(Object, getOwnPropertySymbols)
  |  |  109|     56|BUILTIN_METHOD(Object, getPrototypeOf)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  110|     56|BUILTIN_METHOD(Object, isExtensible)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  111|     56|BUILTIN_METHOD(Object, isFrozen)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  112|     56|BUILTIN_METHOD(Object, keys)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  113|     56|BUILTIN_METHOD(Object, seal)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  114|       |// BUILTIN_METHOD(Object, setPrototypeOf)
  |  |  115|       |// BUILTIN_METHOD(Object, values)
  |  |  116|       |
  |  |  117|     56|BUILTIN_OBJECT(String)
  |  |  118|     56|BUILTIN_METHOD(String, fromCharCode)
  |  |  ------------------
  |  |  |  |   70|     56|  methods_[std::make_pair(                                                     \
  |  |  |  |   71|     56|      objects_[strTab.getIdentifier(#object)], strTab.getIdentifier(#name))] = \
  |  |  |  |   72|     56|      (BuiltinMethod::Enum)(methodIndex++);
  |  |  ------------------
  |  |  119|       |
  |  |  120|     56|PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  121|     56|MARK_FIRST_PRIVATE_BUILTIN(silentSetPrototypeOf)
  |  |  122|     56|PRIVATE_BUILTIN(requireFast)
  |  |  123|     56|PRIVATE_BUILTIN(getTemplateObject)
  |  |  124|     56|PRIVATE_BUILTIN(ensureObject)
  |  |  125|     56|PRIVATE_BUILTIN(getMethod)
  |  |  126|     56|PRIVATE_BUILTIN(throwTypeError)
  |  |  127|     56|PRIVATE_BUILTIN(generatorSetDelegated)
  |  |  128|     56|PRIVATE_BUILTIN(copyDataProperties)
  |  |  129|     56|PRIVATE_BUILTIN(copyRestArgs)
  |  |  130|     56|PRIVATE_BUILTIN(arraySpread)
  |  |  131|     56|PRIVATE_BUILTIN(apply)
  |  |  132|     56|PRIVATE_BUILTIN(exportAll)
  |  |  133|     56|PRIVATE_BUILTIN(exponentiationOperator)
  |  |  134|     56|PRIVATE_BUILTIN(initRegexNamedGroups)
  |  |  135|       |
  |  |  136|     56|JS_BUILTIN(spawnAsync)
  |  |  137|     56|MARK_FIRST_JS_BUILTIN(spawnAsync)
  |  |  138|       |
  |  |  139|     56|#undef BUILTIN_OBJECT
  |  |  140|     56|#undef BUILTIN_METHOD
  |  |  141|     56|#undef PRIVATE_BUILTIN
  |  |  142|     56|#undef MARK_FIRST_PRIVATE_BUILTIN
  |  |  143|     56|#undef JS_BUILTIN
  |  |  144|     56|#undef MARK_FIRST_JS_BUILTIN
  ------------------
   74|     56|}
_ZN6hermes3hbc17LowerBuiltinCalls13runOnFunctionEPNS_8FunctionE:
  181|   114k|bool LowerBuiltinCalls::runOnFunction(Function *F) {
  182|   114k|  return run(F);
  183|   114k|}
LowerBuiltinCalls.cpp:_ZN6hermes3hbcL3runEPNS_8FunctionE:
   91|   114k|static bool run(Function *F) {
   92|   114k|  IRBuilder builder{F};
   93|   114k|  bool changed = false;
   94|       |
   95|   114k|  auto &builtins = LowerBuiltinCallsContext::get(F->getContext());
   96|       |
   97|   267k|  for (auto &BB : *F) {
  ------------------
  |  Branch (97:17): [True: 267k, False: 114k]
  ------------------
   98|  1.48M|    for (auto it = BB.begin(), e = BB.end(); it != e;) {
  ------------------
  |  Branch (98:46): [True: 1.21M, False: 267k]
  ------------------
   99|       |      // Get a pointer to the instruction and increment the iterator so we
  100|       |      // can delete the instruction if we want to.
  101|  1.21M|      auto *inst = &*it++;
  102|       |
  103|       |      // Look for an instruction sequence of the kind:
  104|       |      //    (Call
  105|       |      //        (LoadProperty
  106|       |      //            (LoadProperty globalObject, "objectLiteral")
  107|       |      //            Prop)
  108|       |      //        ...)
  109|       |      // where \c Object.Prop is a pre-defined builtin.
  110|       |      // Note: we only want to check for call. Not for construct.
  111|  1.21M|      if (inst->getKind() != ValueKind::CallInstKind)
  ------------------
  |  Branch (111:11): [True: 1.21M, False: 291]
  ------------------
  112|  1.21M|        continue;
  113|    291|      auto *callInst = cast<CallInst>(inst);
  114|    291|      auto *loadProp = llvh::dyn_cast<LoadPropertyInst>(callInst->getCallee());
  115|    291|      if (!loadProp)
  ------------------
  |  Branch (115:11): [True: 4, False: 287]
  ------------------
  116|      4|        continue;
  117|    287|      auto propLit = llvh::dyn_cast<LiteralString>(loadProp->getProperty());
  118|    287|      if (!propLit)
  ------------------
  |  Branch (118:11): [True: 0, False: 287]
  ------------------
  119|      0|        continue;
  120|    287|      auto *loadGlobalProp =
  121|    287|          llvh::dyn_cast<LoadPropertyInst>(loadProp->getObject());
  122|    287|      if (!loadGlobalProp)
  ------------------
  |  Branch (122:11): [True: 287, False: 0]
  ------------------
  123|    287|        continue;
  124|      0|      if (!llvh::isa<GlobalObject>(loadGlobalProp->getObject()))
  ------------------
  |  Branch (124:11): [True: 0, False: 0]
  ------------------
  125|      0|        continue;
  126|      0|      LiteralString *objLit =
  127|      0|          llvh::dyn_cast<LiteralString>(loadGlobalProp->getProperty());
  128|      0|      if (!objLit)
  ------------------
  |  Branch (128:11): [True: 0, False: 0]
  ------------------
  129|      0|        continue;
  130|       |
  131|       |      // Uncomment this to get a dump of all global calls detected during
  132|       |      // compilation.
  133|       |      // llvh::outs() << "global call: " << objLit->getValue() << "."
  134|       |      //             << propLit->getValue() << "\n";
  135|       |
  136|      0|      auto builtinIndex =
  137|      0|          builtins.findBuiltinMethod(objLit->getValue(), propLit->getValue());
  138|      0|      if (!builtinIndex)
  ------------------
  |  Branch (138:11): [True: 0, False: 0]
  ------------------
  139|      0|        continue;
  140|       |
  141|      0|      LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  142|      0|          llvh::dbgs() << "Found builtin [" << (int)*builtinIndex << "] "
  143|      0|                       << getBuiltinMethodName(*builtinIndex) << "()\n");
  144|       |
  145|       |      // Always lower HermesInternal.xxx() calls, but only lower the rest if
  146|       |      // -fstatic-builtins is enabled.
  147|      0|      if (objLit->getValue() != builtins.getHermesInternalID() &&
  ------------------
  |  Branch (147:11): [True: 0, False: 0]
  |  Branch (147:11): [True: 0, False: 0]
  ------------------
  148|      0|          !F->getContext().getOptimizationSettings().staticBuiltins) {
  ------------------
  |  Branch (148:11): [True: 0, False: 0]
  ------------------
  149|      0|        continue;
  150|      0|      }
  151|       |
  152|      0|      changed = true;
  153|      0|      builder.setInsertionPoint(callInst);
  154|      0|      builder.setLocation(callInst->getLocation());
  155|      0|      builder.setCurrentSourceLevelScope(callInst->getSourceLevelScope());
  156|       |
  157|      0|      llvh::SmallVector<Value *, 8> args{};
  158|      0|      unsigned numArgsExcludingThis = callInst->getNumArguments() - 1;
  159|      0|      args.reserve(numArgsExcludingThis);
  160|      0|      for (unsigned i = 0; i < numArgsExcludingThis; ++i)
  ------------------
  |  Branch (160:28): [True: 0, False: 0]
  ------------------
  161|      0|        args.push_back(callInst->getArgument(i + 1));
  162|       |
  163|      0|      auto *callBuiltin = builder.createCallBuiltinInst(*builtinIndex, args);
  164|      0|      callInst->replaceAllUsesWith(callBuiltin);
  165|      0|      callInst->eraseFromParent();
  166|       |
  167|       |      // The property access instructions are not normally optimizable since
  168|       |      // they have side effects, but in this case it is safe to remove them.
  169|      0|      if (!loadProp->hasUsers())
  ------------------
  |  Branch (169:11): [True: 0, False: 0]
  ------------------
  170|      0|        loadProp->eraseFromParent();
  171|      0|      if (!loadGlobalProp->hasUsers())
  ------------------
  |  Branch (171:11): [True: 0, False: 0]
  ------------------
  172|      0|        loadGlobalProp->eraseFromParent();
  173|       |
  174|      0|      ++NumLowered;
  175|      0|    }
  176|   267k|  }
  177|       |
  178|   114k|  return changed;
  179|   114k|}
_ZN6hermes3hbc24LowerBuiltinCallsContext3getERNS_7ContextE:
   29|   114k|  static LowerBuiltinCallsContext &get(Context &ctx) {
   30|   114k|    auto &BEC = BackendContext::get(ctx);
   31|   114k|    if (!BEC.lowerBuiltinCallsContext)
  ------------------
  |  Branch (31:9): [True: 56, False: 114k]
  ------------------
   32|     56|      BEC.lowerBuiltinCallsContext =
   33|     56|          std::make_shared<LowerBuiltinCallsContext>(ctx.getStringTable());
   34|       |
   35|   114k|    return *BEC.lowerBuiltinCallsContext;
   36|   114k|  }

_ZN6hermes3hbc26SerializedLiteralGenerator15serializeBufferEN4llvh8ArrayRefIPNS_7LiteralEEERNSt3__16vectorIhNS7_9allocatorIhEEEEb:
   49|  35.2k|    bool isKeyBuffer) {
   50|       |  // Stores the last type parsed by the for loop
   51|  35.2k|  TagType lastTag = NumberTag;
   52|       |
   53|       |  // Stores the type currently being parsed by the for loop
   54|  35.2k|  TagType newTag = NumberTag;
   55|       |
   56|       |  // Stores the values of each serialized Literal in a sequence so that
   57|       |  // they can be added to tempBuff after the tag is finalized
   58|  35.2k|  std::vector<unsigned char> tmpSeqBuffer;
   59|       |
   60|       |  // Stores the length of the current type sequence
   61|  35.2k|  size_t seqLength = 0;
   62|       |
   63|   513k|  for (size_t i = 0, buffSize = literals.size(); i < buffSize; ++i) {
  ------------------
  |  Branch (63:50): [True: 478k, False: 35.2k]
  ------------------
   64|       |    // The first switch simply sets newTag.
   65|       |    // If newTag is different from lastTag, we append the tag and the
   66|       |    // tmpSeqBuffer to buff.
   67|       |    // After this check, we serialize the value to tmpSeqBuffer if possible.
   68|       |    // Since we can only write the tmpSeqBuffer to buff once we know the
   69|       |    // sequence ends, the check has to go after the type checking switch.
   70|       |    // Since we can only write to tmpSeqBuffer after it's been cleared (if
   71|       |    // the sequence is over), the only way to delay the write to tmpSeqBuffer
   72|       |    // is to either write to a second temporary buffer, and write that to
   73|       |    // tmpSeqBuffer afterwards, or add a second switch.
   74|   478k|    switch (literals[i]->getKind()) {
   75|   474k|      case ValueKind::LiteralNumberKind:
  ------------------
  |  Branch (75:7): [True: 474k, False: 3.82k]
  ------------------
   76|   474k|        newTag = llvh::cast<LiteralNumber>(literals[i])
  ------------------
  |  Branch (76:18): [True: 474k, False: 1]
  ------------------
   77|   474k|                     ->isIntTypeRepresentible<int32_t>()
   78|   474k|            ? IntegerTag
   79|   474k|            : NumberTag;
   80|   474k|        break;
   81|  1.81k|      case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (81:7): [True: 1.81k, False: 476k]
  ------------------
   82|  1.81k|        auto str = llvh::cast<LiteralString>(literals[i])->getValue().str();
   83|  1.81k|        int ind =
   84|  1.81k|            isKeyBuffer ? BMGen_.getIdentifierID(str) : BMGen_.getStringID(str);
  ------------------
  |  Branch (84:13): [True: 1.81k, False: 0]
  ------------------
   85|       |
   86|  1.81k|        if (ind > UINT16_MAX) {
  ------------------
  |  Branch (86:13): [True: 0, False: 1.81k]
  ------------------
   87|      0|          newTag = LongStringTag;
   88|  1.81k|        } else if (ind > UINT8_MAX) {
  ------------------
  |  Branch (88:20): [True: 0, False: 1.81k]
  ------------------
   89|      0|          newTag = ShortStringTag;
   90|  1.81k|        } else {
   91|  1.81k|          newTag = ByteStringTag;
   92|  1.81k|        }
   93|  1.81k|        break;
   94|      0|      }
   95|  2.00k|      case ValueKind::LiteralBoolKind:
  ------------------
  |  Branch (95:7): [True: 2.00k, False: 476k]
  ------------------
   96|  2.00k|        newTag = llvh::cast<LiteralBool>(literals[i])->getValue() ? TrueTag
  ------------------
  |  Branch (96:18): [True: 0, False: 2.00k]
  ------------------
   97|  2.00k|                                                                  : FalseTag;
   98|  2.00k|        break;
   99|      0|      case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (99:7): [True: 0, False: 478k]
  ------------------
  100|      0|        newTag = NullTag;
  101|      0|        break;
  102|      0|      default:
  ------------------
  |  Branch (102:7): [True: 0, False: 478k]
  ------------------
  103|      0|        llvm_unreachable("Invalid Literal Kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  104|   478k|    }
  105|       |
  106|   478k|    if (newTag != lastTag || seqLength == SequenceMax) {
  ------------------
  |  Branch (106:9): [True: 21.9k, False: 456k]
  |  Branch (106:30): [True: 104, False: 456k]
  ------------------
  107|  22.0k|      if (seqLength > 0) {
  ------------------
  |  Branch (107:11): [True: 106, False: 21.9k]
  ------------------
  108|    106|        appendTagToBuffer(buff, lastTag, seqLength);
  109|    106|        buff.insert(buff.end(), tmpSeqBuffer.begin(), tmpSeqBuffer.end());
  110|    106|        tmpSeqBuffer.resize(0);
  111|    106|      }
  112|  22.0k|      lastTag = newTag;
  113|  22.0k|      seqLength = 0;
  114|  22.0k|    }
  115|   478k|    seqLength++;
  116|       |
  117|   478k|    switch (literals[i]->getKind()) {
  118|   474k|      case ValueKind::LiteralNumberKind: {
  ------------------
  |  Branch (118:7): [True: 474k, False: 3.82k]
  ------------------
  119|   474k|        auto litNum = llvh::cast<LiteralNumber>(literals[i]);
  120|   474k|        if (llvh::Optional<int> intPointer =
  ------------------
  |  Branch (120:33): [True: 474k, False: 1]
  ------------------
  121|   474k|                litNum->isIntTypeRepresentible<int32_t>()) {
  122|   474k|          int n = intPointer.getValue();
  123|   474k|          serializeValueToBuffer<uint32_t>(n, tmpSeqBuffer);
  124|   474k|        } else {
  125|      1|          double num = litNum->getValue();
  126|      1|          serializeValueToBuffer<double>(num, tmpSeqBuffer);
  127|      1|        }
  128|   474k|        break;
  129|      0|      }
  130|  1.81k|      case ValueKind::LiteralStringKind: {
  ------------------
  |  Branch (130:7): [True: 1.81k, False: 476k]
  ------------------
  131|       |        // For strings, we are going to store the index to the string table,
  132|       |        // which will need to be decoded at runtime.
  133|  1.81k|        auto str = llvh::cast<LiteralString>(literals[i])->getValue().str();
  134|  1.81k|        auto stringID =
  135|  1.81k|            isKeyBuffer ? BMGen_.getIdentifierID(str) : BMGen_.getStringID(str);
  ------------------
  |  Branch (135:13): [True: 1.81k, False: 0]
  ------------------
  136|       |
  137|  1.81k|        if (stringID > UINT16_MAX) {
  ------------------
  |  Branch (137:13): [True: 0, False: 1.81k]
  ------------------
  138|      0|          serializeValueToBuffer<uint32_t>(stringID, tmpSeqBuffer);
  139|  1.81k|        } else if (stringID > UINT8_MAX) {
  ------------------
  |  Branch (139:20): [True: 0, False: 1.81k]
  ------------------
  140|      0|          serializeValueToBuffer<uint16_t>(stringID, tmpSeqBuffer);
  141|  1.81k|        } else {
  142|  1.81k|          serializeValueToBuffer<uint8_t>(stringID, tmpSeqBuffer);
  143|  1.81k|        }
  144|  1.81k|        break;
  145|      0|      }
  146|  2.00k|      case ValueKind::LiteralBoolKind:
  ------------------
  |  Branch (146:7): [True: 2.00k, False: 476k]
  ------------------
  147|  2.00k|      case ValueKind::LiteralNullKind:
  ------------------
  |  Branch (147:7): [True: 0, False: 478k]
  ------------------
  148|       |        /* no-op */
  149|  2.00k|        break;
  150|      0|      default:
  ------------------
  |  Branch (150:7): [True: 0, False: 478k]
  ------------------
  151|      0|        llvm_unreachable("Invalid Literal Kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  152|   478k|    }
  153|   478k|  }
  154|       |  // The last value in the buffer can't get serialized in the loop.
  155|  35.2k|  appendTagToBuffer(buff, lastTag, seqLength);
  156|  35.2k|  buff.insert(buff.end(), tmpSeqBuffer.begin(), tmpSeqBuffer.end());
  157|  35.2k|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_117appendTagToBufferERNSt3__16vectorIhNS2_9allocatorIhEEEEhi:
   19|  35.3k|    int seqLength) {
   20|  35.3k|  if (seqLength > 15) {
  ------------------
  |  Branch (20:7): [True: 117, False: 35.2k]
  ------------------
   21|    117|    buff.push_back((tag | 0x80) | (seqLength >> 8));
   22|    117|    buff.push_back(seqLength & 0xffff);
   23|  35.2k|  } else {
   24|  35.2k|    buff.push_back(tag + seqLength);
   25|  35.2k|  }
   26|  35.3k|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_122serializeValueToBufferIjEEvT_RNSt3__16vectorIhNS4_9allocatorIhEEEE:
   32|   474k|    std::vector<unsigned char> &buff) {
   33|       |  // Since endian::write takes a pointer, we can write directly to
   34|       |  // the buffer. First we resize it to make sure the data fits, then
   35|       |  // we pass a pointer to the original end of the vector.
   36|       |  // Since the buffer is a char buffer, we pass in an alignment of 1
   37|       |  // to endian::write.
   38|   474k|  buff.resize(buff.size() + sizeof(value_type));
   39|   474k|  llvh::support::endian::write<value_type, 1>(
   40|   474k|      buff.data() + buff.size() - sizeof(value_type),
   41|   474k|      value,
   42|   474k|      llvh::support::endianness::little);
   43|   474k|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_122serializeValueToBufferIdEEvT_RNSt3__16vectorIhNS4_9allocatorIhEEEE:
   32|      1|    std::vector<unsigned char> &buff) {
   33|       |  // Since endian::write takes a pointer, we can write directly to
   34|       |  // the buffer. First we resize it to make sure the data fits, then
   35|       |  // we pass a pointer to the original end of the vector.
   36|       |  // Since the buffer is a char buffer, we pass in an alignment of 1
   37|       |  // to endian::write.
   38|      1|  buff.resize(buff.size() + sizeof(value_type));
   39|      1|  llvh::support::endian::write<value_type, 1>(
   40|      1|      buff.data() + buff.size() - sizeof(value_type),
   41|      1|      value,
   42|      1|      llvh::support::endianness::little);
   43|      1|}
SerializedLiteralGenerator.cpp:_ZN6hermes3hbc12_GLOBAL__N_122serializeValueToBufferIhEEvT_RNSt3__16vectorIhNS4_9allocatorIhEEEE:
   32|  1.81k|    std::vector<unsigned char> &buff) {
   33|       |  // Since endian::write takes a pointer, we can write directly to
   34|       |  // the buffer. First we resize it to make sure the data fits, then
   35|       |  // we pass a pointer to the original end of the vector.
   36|       |  // Since the buffer is a char buffer, we pass in an alignment of 1
   37|       |  // to endian::write.
   38|  1.81k|  buff.resize(buff.size() + sizeof(value_type));
   39|  1.81k|  llvh::support::endian::write<value_type, 1>(
   40|  1.81k|      buff.data() + buff.size() - sizeof(value_type),
   41|  1.81k|      value,
   42|  1.81k|      llvh::support::endianness::little);
   43|  1.81k|}

_ZN6hermes3hbc27SerializedLiteralParserBase20parseTagAndSeqLengthEv:
   16|  13.0k|void SerializedLiteralParserBase::parseTagAndSeqLength() {
   17|  13.0k|  auto tag = buffer_[currIdx_];
   18|       |  // If the first bit in the tag is set to 1, it is an indication that the
   19|       |  // sequence is longer than 15 elements, and that the tag is two bytes long.
   20|       |  // The format is still the same as described in
   21|       |  // `SerializedLiteralParserBase.h`.
   22|  13.0k|  if (tag & 0x80) {
  ------------------
  |  Branch (22:7): [True: 117, False: 12.9k]
  ------------------
   23|    117|    leftInSeq_ = ((tag & 0x0f) << 8) | (buffer_[currIdx_ + 1]);
   24|    117|    currIdx_ += 2;
   25|  12.9k|  } else {
   26|  12.9k|    leftInSeq_ = tag & 0x0f;
   27|  12.9k|    currIdx_ += 1;
   28|  12.9k|  }
   29|       |
   30|  13.0k|  lastTag_ = tag & SerializedLiteralGenerator::TagMask;
   31|  13.0k|}

_ZN6hermes3hbc21SimpleBytecodeBuilder22generateBytecodeBufferEv:
   37|     99|std::unique_ptr<Buffer> SimpleBytecodeBuilder::generateBytecodeBuffer() {
   38|       |  // TODO: There is a fair amount of logic duplication between this function
   39|       |  // and the BytecodeSerializer. We should consider merging some of them.
   40|     99|  std::vector<uint8_t> bytecode;
   41|       |  // First do a dry-run to compute the bytecode offset of each function.
   42|     99|  uint32_t functionCount = functions_.size();
   43|     99|  uint32_t currentSize =
   44|     99|      sizeof(BytecodeFileHeader) + sizeof(SmallFuncHeader) * functionCount;
   45|    297|  for (uint32_t i = 0; i < functionCount; ++i) {
  ------------------
  |  Branch (45:24): [True: 198, False: 99]
  ------------------
   46|       |    // Populate the offset of the function's bytecode.
   47|    198|    functions_[i].offset = currentSize;
   48|    198|    currentSize += functions_[i].opcodes.size();
   49|    198|  }
   50|       |  // DebugInfo comes after the bytescodes, padded by 4 bytes.
   51|     99|  uint32_t debugOffset = llvh::alignTo(currentSize, 4);
   52|     99|  uint32_t totalSize =
   53|     99|      debugOffset + sizeof(DebugInfoHeader) + sizeof(BytecodeFileFooter);
   54|     99|  BytecodeOptions options;
   55|     99|  BytecodeFileHeader header{
   56|     99|      MAGIC,
   57|     99|      BYTECODE_VERSION,
   58|       |      // There is no source for a bytecode builder, so
   59|       |      // leave it as zeros.
   60|     99|      SHA1{},
   61|     99|      totalSize,
   62|     99|      0,
   63|     99|      functionCount,
   64|     99|      0,
   65|     99|      0,
   66|     99|      0,
   67|     99|      0,
   68|     99|      0,
   69|     99|      0,
   70|     99|      0,
   71|     99|      0,
   72|     99|      0,
   73|     99|      0,
   74|     99|      0,
   75|     99|      0,
   76|     99|      0,
   77|     99|      0,
   78|     99|      0,
   79|     99|      debugOffset,
   80|     99|      options};
   81|       |  // Write BytecodeFileHeader to the buffer.
   82|     99|  appendStructToBytecode(bytecode, header);
   83|       |  // Write all function headers to the buffer.
   84|    297|  for (uint32_t i = 0; i < functionCount; ++i) {
  ------------------
  |  Branch (84:24): [True: 198, False: 99]
  ------------------
   85|    198|    uint32_t opcodeSize = functions_[i].opcodes.size();
   86|    198|    FunctionHeader funcHeader{
   87|    198|        opcodeSize,
   88|    198|        functions_[i].paramCount,
   89|    198|        functions_[i].frameSize,
   90|    198|        0,
   91|    198|        0,
   92|    198|        0,
   93|    198|        0};
   94|    198|    funcHeader.offset = functions_[i].offset;
   95|    198|    funcHeader.flags.strictMode = true;
   96|    198|    SmallFuncHeader small(funcHeader);
   97|    198|    assert(!small.flags.overflowed);
   98|      0|    appendStructToBytecode(bytecode, small);
   99|    198|  }
  100|       |  // Write all opcodes to the buffer.
  101|    297|  for (uint32_t i = 0; i < functionCount; ++i) {
  ------------------
  |  Branch (101:24): [True: 198, False: 99]
  ------------------
  102|    198|    bytecode.insert(
  103|    198|        bytecode.end(),
  104|    198|        functions_[i].opcodes.begin(),
  105|    198|        functions_[i].opcodes.end());
  106|    198|  }
  107|       |  // Pad by 4 bytes.
  108|     99|  bytecode.resize(llvh::alignTo(bytecode.size(), 4));
  109|       |  // Write an empty debug info header.
  110|     99|  DebugInfoHeader debugInfoHeader{0, 0, 0, 0, 0, 0, 0};
  111|     99|  appendStructToBytecode(bytecode, debugInfoHeader);
  112|       |  // Add the bytecode hash.
  113|     99|  appendStructToBytecode(
  114|     99|      bytecode, BytecodeFileFooter{llvh::SHA1::hash(bytecode)});
  115|       |  // Generate the buffer.
  116|     99|  return std::unique_ptr<Buffer>(new VectorBuffer(std::move(bytecode)));
  117|     99|}
_ZN12VectorBufferC2EONSt3__16vectorIhNS0_9allocatorIhEEEE:
   22|     99|      : bytecode_(std::move(bytecode)) {
   23|     99|    data_ = bytecode_.data();
   24|     99|    size_ = bytecode_.size();
   25|     99|  }
_Z22appendStructToBytecodeIN6hermes3hbc18BytecodeFileHeaderEEvRNSt3__16vectorIhNS3_9allocatorIhEEEERKT_:
   29|     99|void appendStructToBytecode(std::vector<uint8_t> &bytecode, const T &data) {
   30|     99|  assert((bytecode.size() % alignof(T) == 0) && "Bytecode is not aligned");
   31|      0|  bytecode.insert(
   32|     99|      bytecode.end(),
   33|     99|      reinterpret_cast<const uint8_t *>(&data),
   34|     99|      reinterpret_cast<const uint8_t *>((&data) + 1));
   35|     99|}
_Z22appendStructToBytecodeIN6hermes3hbc15SmallFuncHeaderEEvRNSt3__16vectorIhNS3_9allocatorIhEEEERKT_:
   29|    198|void appendStructToBytecode(std::vector<uint8_t> &bytecode, const T &data) {
   30|    198|  assert((bytecode.size() % alignof(T) == 0) && "Bytecode is not aligned");
   31|      0|  bytecode.insert(
   32|    198|      bytecode.end(),
   33|    198|      reinterpret_cast<const uint8_t *>(&data),
   34|    198|      reinterpret_cast<const uint8_t *>((&data) + 1));
   35|    198|}
_Z22appendStructToBytecodeIN6hermes3hbc15DebugInfoHeaderEEvRNSt3__16vectorIhNS3_9allocatorIhEEEERKT_:
   29|     99|void appendStructToBytecode(std::vector<uint8_t> &bytecode, const T &data) {
   30|     99|  assert((bytecode.size() % alignof(T) == 0) && "Bytecode is not aligned");
   31|      0|  bytecode.insert(
   32|     99|      bytecode.end(),
   33|     99|      reinterpret_cast<const uint8_t *>(&data),
   34|     99|      reinterpret_cast<const uint8_t *>((&data) + 1));
   35|     99|}
_Z22appendStructToBytecodeIN6hermes3hbc18BytecodeFileFooterEEvRNSt3__16vectorIhNS3_9allocatorIhEEEERKT_:
   29|     99|void appendStructToBytecode(std::vector<uint8_t> &bytecode, const T &data) {
   30|     99|  assert((bytecode.size() % alignof(T) == 0) && "Bytecode is not aligned");
   31|      0|  bytecode.insert(
   32|     99|      bytecode.end(),
   33|     99|      reinterpret_cast<const uint8_t *>(&data),
   34|     99|      reinterpret_cast<const uint8_t *>((&data) + 1));
   35|     99|}

_ZN6hermes10StringKind5EntryC2ENS0_4KindEj:
   13|     94|    : datum_{kind | count} {
   14|     94|  assert((kind & MaxCount) == 0 && "kind overlapping with count storage.");
   15|      0|  assert(1 <= count && count <= MaxCount && "Count out of bounds");
   16|     94|}
_ZN6hermes10StringKind5EntryppEv:
   18|    830|StringKind::Entry &StringKind::Entry::operator++() {
   19|    830|  assert(count() < MaxCount && "Count Overflow");
   20|      0|  datum_++;
   21|    830|  return *this;
   22|    830|}
_ZN6hermes10StringKind11Accumulator9push_backENS0_4KindE:
   24|    924|void StringKind::Accumulator::push_back(Kind k) {
   25|    924|  if (LLVM_UNLIKELY(entries_.empty())) {
  ------------------
  |  |  189|    924|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 56, False: 868]
  |  |  ------------------
  ------------------
   26|     56|    entries_.emplace_back(k);
   27|     56|    return;
   28|     56|  }
   29|       |
   30|    868|  auto &back = entries_.back();
   31|    868|  if (back.kind() != k || LLVM_UNLIKELY(back.count() >= MaxCount)) {
  ------------------
  |  |  189|    830|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 830]
  |  |  ------------------
  ------------------
  |  Branch (31:7): [True: 38, False: 830]
  ------------------
   32|     38|    entries_.emplace_back(k);
   33|    830|  } else {
   34|    830|    ++back;
   35|    830|  }
   36|    868|}

_ZN6hermes3hbc17traverseFunctionsEPNS_6ModuleENSt3__18functionIFbPNS_8FunctionEEEENS4_IFvN4llvh9StringRefEEEEb:
   53|     56|    bool stripFunctionNames) {
   54|   114k|  for (auto &F : *M) {
  ------------------
  |  Branch (54:16): [True: 114k, False: 56]
  ------------------
   55|   114k|    if (!shouldVisitFunction(&F)) {
  ------------------
  |  Branch (55:9): [True: 0, False: 114k]
  ------------------
   56|      0|      continue;
   57|      0|    }
   58|   114k|    if (!stripFunctionNames) {
  ------------------
  |  Branch (58:9): [True: 114k, False: 0]
  ------------------
   59|   114k|      traversal(F.getOriginalOrInferredName().str());
   60|   114k|    }
   61|       |    // The source visibility of the global function indicate the presence of
   62|       |    // top-level source visibility directives, but we should not preserve the
   63|       |    // source code of the global function.
   64|   114k|    if (!F.isGlobalScope()) {
  ------------------
  |  Branch (64:9): [True: 114k, False: 56]
  ------------------
   65|       |      // Only add non-default source representation to the string table.
   66|   114k|      if (auto source = F.getSourceRepresentationStr()) {
  ------------------
  |  Branch (66:16): [True: 0, False: 114k]
  ------------------
   67|      0|        traversal(*source);
   68|      0|      }
   69|   114k|    }
   70|   114k|  }
   71|     56|}
_ZN6hermes3hbc22traverseCJSModuleNamesEPNS_6ModuleENSt3__18functionIFbPNS_8FunctionEEEENS4_IFvN4llvh9StringRefEEEE:
   76|     56|    std::function<void(llvh::StringRef)> traversal) {
   77|   114k|  for (auto &F : *M) {
  ------------------
  |  Branch (77:16): [True: 114k, False: 56]
  ------------------
   78|   114k|    if (!shouldVisitFunction(&F)) {
  ------------------
  |  Branch (78:9): [True: 0, False: 114k]
  ------------------
   79|      0|      continue;
   80|      0|    }
   81|       |
   82|   114k|    if (auto *cjsModule = M->findCJSModule(&F)) {
  ------------------
  |  Branch (82:15): [True: 0, False: 114k]
  ------------------
   83|      0|      traversal(cjsModule->filename.str());
   84|      0|    }
   85|   114k|  }
   86|     56|}
_ZN6hermes3hbc22traverseLiteralStringsEPNS_6ModuleENSt3__18functionIFbPNS_8FunctionEEEENS4_IFvN4llvh9StringRefEbEEE:
   91|     56|    std::function<void(llvh::StringRef, bool)> traversal) {
   92|       |  // Walk declared global properties.
   93|  3.40k|  for (auto *prop : M->getGlobalProperties()) {
  ------------------
  |  Branch (93:19): [True: 3.40k, False: 56]
  ------------------
   94|  3.40k|    if (prop->isDeclared()) {
  ------------------
  |  Branch (94:9): [True: 2, False: 3.40k]
  ------------------
   95|      2|      traversal(prop->getName()->getValue().str(), /* isIdentifier */ true);
   96|      2|    }
   97|  3.40k|  }
   98|       |
   99|       |  // Walk functions.
  100|   114k|  for (auto &F : *M) {
  ------------------
  |  Branch (100:16): [True: 114k, False: 56]
  ------------------
  101|   114k|    if (!shouldVisitFunction(&F)) {
  ------------------
  |  Branch (101:9): [True: 0, False: 114k]
  ------------------
  102|      0|      continue;
  103|      0|    }
  104|       |
  105|   267k|    for (auto &BB : F) {
  ------------------
  |  Branch (105:19): [True: 267k, False: 114k]
  ------------------
  106|       |      // Walk instruction operands.
  107|  1.53M|      for (auto &I : BB) {
  ------------------
  |  Branch (107:20): [True: 1.53M, False: 267k]
  ------------------
  108|  5.02M|        for (int i = 0, e = I.getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (108:49): [True: 3.49M, False: 1.53M]
  ------------------
  109|  3.49M|          auto *op = I.getOperand(i);
  110|  3.49M|          if (auto *str = llvh::dyn_cast<LiteralString>(op)) {
  ------------------
  |  Branch (110:21): [True: 164k, False: 3.32M]
  ------------------
  111|   164k|            traversal(str->getValue().str(), isIdOperand(&I, i));
  112|   164k|          }
  113|  3.49M|        }
  114|  1.53M|      }
  115|   267k|    }
  116|   114k|  }
  117|     56|}
TraverseLiteralStrings.cpp:_ZN12_GLOBAL__N_111isIdOperandEPN6hermes11InstructionEj:
   20|   164k|bool isIdOperand(Instruction *I, unsigned idx) {
   21|   164k|#define CASE_WITH_PROP_IDX(INSN) \
   22|   164k|  case ValueKind::INSN##Kind:    \
   23|   164k|    return idx == INSN::PropertyIdx
   24|       |
   25|   164k|  switch (I->getKind()) {
   26|      0|    CASE_WITH_PROP_IDX(DeletePropertyInst);
  ------------------
  |  |   22|      0|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 0, False: 164k]
  |  |  ------------------
  |  |   23|      0|    return idx == INSN::PropertyIdx
  ------------------
   27|     20|    CASE_WITH_PROP_IDX(LoadPropertyInst);
  ------------------
  |  |   22|     20|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 20, False: 164k]
  |  |  ------------------
  |  |   23|     20|    return idx == INSN::PropertyIdx
  ------------------
   28|  4.16k|    CASE_WITH_PROP_IDX(StoreNewOwnPropertyInst);
  ------------------
  |  |   22|  4.16k|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 4.16k, False: 160k]
  |  |  ------------------
  |  |   23|  4.16k|    return idx == INSN::PropertyIdx
  ------------------
   29|  3.78k|    CASE_WITH_PROP_IDX(StorePropertyInst);
  ------------------
  |  |   22|  3.78k|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 3.78k, False: 160k]
  |  |  ------------------
  |  |   23|  3.78k|    return idx == INSN::PropertyIdx
  ------------------
   30|   131k|    CASE_WITH_PROP_IDX(TryLoadGlobalPropertyInst);
  ------------------
  |  |   22|   131k|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 131k, False: 32.8k]
  |  |  ------------------
  |  |   23|   131k|    return idx == INSN::PropertyIdx
  ------------------
   31|      0|    CASE_WITH_PROP_IDX(TryStoreGlobalPropertyInst);
  ------------------
  |  |   22|      0|  case ValueKind::INSN##Kind:    \
  |  |  ------------------
  |  |  |  Branch (22:3): [True: 0, False: 164k]
  |  |  ------------------
  |  |   23|      0|    return idx == INSN::PropertyIdx
  ------------------
   32|       |
   33|  1.81k|    case ValueKind::HBCAllocObjectFromBufferInstKind:
  ------------------
  |  Branch (33:5): [True: 1.81k, False: 162k]
  ------------------
   34|       |      // AllocObjectFromBuffer stores the keys and values as alternating
   35|       |      // operands starting from FirstKeyIdx.
   36|  1.81k|      return (idx - HBCAllocObjectFromBufferInst::FirstKeyIdx) % 2 == 0;
   37|       |
   38|  23.1k|    default:
  ------------------
  |  Branch (38:5): [True: 23.1k, False: 141k]
  ------------------
   39|  23.1k|      return false;
   40|   164k|  }
   41|   164k|#undef CASE
   42|   164k|}

_ZN6hermes3hbc21UniquingFilenameTable11addFilenameEN4llvh9StringRefE:
   15|     56|uint32_t UniquingFilenameTable::addFilename(llvh::StringRef filename) {
   16|     56|  return filenames_.insert(filename);
   17|     56|}
_ZN6hermes3hbc21UniquingFilenameTable9toStorageES1_:
   20|     56|    UniquingFilenameTable table) {
   21|     56|  auto &filenames = table.filenames_;
   22|     56|  return ConsecutiveStringStorage{
   23|     56|      filenames.begin(), filenames.end(), std::false_type{}, false};
   24|     56|}

_ZN6hermes3hbc22StringLiteralIDMappingC2ENS0_24ConsecutiveStringStorageENSt3__16vectorIbNS3_9allocatorIbEEEE:
   32|     56|    : storage_(std::move(storage)), isIdentifier_(std::move(isIdentifier)) {
   33|       |  // Initialize our tables by decoding our storage's string table.
   34|     56|  std::string utf8Storage;
   35|     56|  uint32_t count = storage_.count();
   36|     56|  assert(isIdentifier_.size() == count);
   37|    980|  for (uint32_t i = 0; i < count; i++) {
  ------------------
  |  Branch (37:24): [True: 924, False: 56]
  ------------------
   38|    924|    uint32_t j = strings_.insert(storage_.getStringAtIndex(i, utf8Storage));
   39|    924|    assert(i == j && "Duplicate string in storage.");
   40|      0|    (void)j;
   41|    924|  }
   42|     56|}
_ZNK6hermes3hbc18StringLiteralTable19getIdentifierHashesEv:
   44|     56|std::vector<uint32_t> StringLiteralTable::getIdentifierHashes() const {
   45|     56|  std::vector<uint32_t> result;
   46|     56|  assert(strings_.size() == isIdentifier_.size());
   47|    980|  for (size_t i = 0; i < strings_.size(); ++i) {
  ------------------
  |  Branch (47:22): [True: 924, False: 56]
  ------------------
   48|    924|    if (!isIdentifier_[i]) {
  ------------------
  |  Branch (48:9): [True: 306, False: 618]
  ------------------
   49|    306|      continue;
   50|    306|    }
   51|    618|    result.push_back(storage_.getEntryHash(i));
   52|    618|  }
   53|       |
   54|     56|  return result;
   55|     56|}
_ZNK6hermes3hbc18StringLiteralTable14getStringKindsEv:
   57|     56|std::vector<StringKind::Entry> StringLiteralTable::getStringKinds() const {
   58|     56|  StringKind::Accumulator acc;
   59|       |
   60|     56|  assert(strings_.size() == isIdentifier_.size());
   61|    980|  for (size_t i = 0; i < strings_.size(); ++i) {
  ------------------
  |  Branch (61:22): [True: 924, False: 56]
  ------------------
   62|    924|    acc.push_back(kind(strings_[i], isIdentifier_[i]));
   63|    924|  }
   64|       |
   65|     56|  return std::move(acc).entries();
   66|     56|}
_ZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_b:
   70|     56|    bool optimize) {
   71|     56|  auto &storage = accum.storage_;
   72|     56|  auto &strings = accum.strings_;
   73|     56|  auto &isIdentifier = accum.isIdentifier_;
   74|     56|  auto &numIdentifierRefs = accum.numIdentifierRefs_;
   75|       |
   76|     56|  const size_t existingStrings = storage.count();
   77|     56|  const size_t allStrings = strings.size();
   78|     56|  const size_t newStrings = allStrings - existingStrings;
   79|     56|  assert(
   80|     56|      existingStrings <= allStrings &&
   81|     56|      "Cannot have more written strings than strings");
   82|       |
   83|       |  /// Associate a string with its original index in the table.
   84|      0|  struct Index {
   85|     56|    size_t origIndex;
   86|     56|    llvh::StringRef str;
   87|     56|    StringKind::Kind kind;
   88|       |
   89|     56|    Index(size_t origIndex, llvh::StringRef str, StringKind::Kind kind)
   90|     56|        : origIndex(origIndex), str(str), kind(kind) {}
   91|       |
   92|     56|    using Key = std::tuple<StringKind::Kind, llvh::StringRef>;
   93|       |
   94|     56|    inline Key key() const {
   95|     56|      return std::make_tuple(kind, str);
   96|     56|    }
   97|       |
   98|     56|    inline bool operator<(const Index &that) const {
   99|     56|      return this->key() < that.key();
  100|     56|    }
  101|     56|  };
  102|       |
  103|       |  /// Associates a StringTableEntry with its String Kind.
  104|     56|  struct KindedEntry {
  105|     56|    StringKind::Kind kind;
  106|     56|    StringTableEntry entry;
  107|       |
  108|     56|    KindedEntry(StringKind::Kind kind, StringTableEntry entry)
  109|     56|        : kind(kind), entry(entry) {}
  110|       |
  111|     56|   private:
  112|       |    // Key for performing comparisons with.  Ordering on this key is used to
  113|       |    // optimise string index layout to compress better.
  114|     56|    using Key = std::tuple<StringKind::Kind, uint32_t, uint32_t>;
  115|     56|    inline Key key() const {
  116|     56|      return std::make_tuple(kind, entry.getOffset(), entry.getLength());
  117|     56|    }
  118|       |
  119|     56|   public:
  120|     56|    inline bool operator<(const KindedEntry &that) const {
  121|     56|      return this->key() < that.key();
  122|     56|    }
  123|     56|  };
  124|       |
  125|     56|  std::vector<Index> indices;
  126|     56|  indices.reserve(newStrings);
  127|       |
  128|    980|  for (size_t i = existingStrings; i < allStrings; ++i) {
  ------------------
  |  Branch (128:36): [True: 924, False: 56]
  ------------------
  129|    924|    indices.emplace_back(i, strings[i], kind(strings[i], isIdentifier[i]));
  130|    924|  }
  131|       |
  132|       |  // Sort indices of new strings by frequency of identifier references.
  133|     56|  std::stable_sort(
  134|     56|      indices.begin(),
  135|     56|      indices.end(),
  136|     56|      [&numIdentifierRefs, existingStrings](const Index &a, const Index &b) {
  137|     56|        assert(a.origIndex >= existingStrings && "Sorting an old string");
  138|     56|        assert(b.origIndex >= existingStrings && "Sorting an old string");
  139|       |
  140|     56|        auto ai = a.origIndex - existingStrings;
  141|     56|        auto bi = b.origIndex - existingStrings;
  142|       |
  143|     56|        return numIdentifierRefs[ai] > numIdentifierRefs[bi];
  144|     56|      });
  145|       |
  146|       |  // Take an index into all the strings, and map it to an index in to a data
  147|       |  // structure containing only the new strings.
  148|     56|  const auto remap = [allStrings, existingStrings](size_t ix) {
  149|       |    // Skip the existing strings.
  150|     56|    ix = std::max(ix, existingStrings);
  151|       |
  152|       |    // Avoid a buffer overrun;
  153|     56|    ix = std::min(ix, allStrings);
  154|       |
  155|       |    // Translate by the number of strings we skipped over.
  156|     56|    ix -= existingStrings;
  157|       |
  158|     56|    return ix;
  159|     56|  };
  160|       |
  161|       |  // Sort indices within each frequency class by kind, and alphabetically.
  162|     56|  const auto indicesFrom = [&remap, &indices](size_t ix) {
  163|     56|    return indices.begin() + remap(ix);
  164|     56|  };
  165|       |
  166|     56|  std::sort(indicesFrom(0), indicesFrom(UINT8_MAX));
  167|     56|  std::sort(indicesFrom(UINT8_MAX), indicesFrom(UINT16_MAX));
  168|     56|  std::sort(indicesFrom(UINT16_MAX), indicesFrom(SIZE_MAX));
  169|       |
  170|     56|  { // Add the new strings to the storage.
  171|     56|    std::vector<llvh::StringRef> refs;
  172|     56|    refs.reserve(newStrings);
  173|    924|    for (auto &i : indices) {
  ------------------
  |  Branch (173:18): [True: 924, False: 56]
  ------------------
  174|    924|      refs.emplace_back(i.str);
  175|    924|    }
  176|     56|    ConsecutiveStringStorage newStrings(refs, optimize);
  177|     56|    storage.appendStorage(std::move(newStrings));
  178|     56|  }
  179|       |
  180|       |  // Associate the new string table index entries with their string kind.
  181|     56|  auto tableView = storage.getStringTableView();
  182|     56|  std::vector<KindedEntry> kindedEntries;
  183|     56|  kindedEntries.reserve(newStrings);
  184|       |
  185|    980|  for (size_t i = 0, j = existingStrings; i < newStrings; ++i, ++j) {
  ------------------
  |  Branch (185:43): [True: 924, False: 56]
  ------------------
  186|    924|    kindedEntries.emplace_back(indices[i].kind, tableView[j]);
  187|    924|  }
  188|       |
  189|       |  // Sort index entries within each frequency and kind bucket by their offset
  190|       |  // in the storage and length.
  191|     56|  const auto entriesFrom = [&remap, &kindedEntries](size_t ix) {
  192|     56|    return kindedEntries.begin() + remap(ix);
  193|     56|  };
  194|       |
  195|     56|  std::sort(entriesFrom(0), entriesFrom(UINT8_MAX));
  196|     56|  std::sort(entriesFrom(UINT8_MAX), entriesFrom(UINT16_MAX));
  197|     56|  std::sort(entriesFrom(UINT16_MAX), entriesFrom(SIZE_MAX));
  198|       |
  199|       |  // Write the re-ordered entries back into the table.
  200|    980|  for (size_t i = 0, j = existingStrings; i < newStrings; ++i, ++j) {
  ------------------
  |  Branch (200:43): [True: 924, False: 56]
  ------------------
  201|    924|    tableView[j] = kindedEntries[i].entry;
  202|    924|    isIdentifier[j] = kindedEntries[i].kind != StringKind::String;
  203|    924|  }
  204|       |
  205|     56|  return StringLiteralTable{std::move(storage), std::move(isIdentifier)};
  206|     56|}
UniquingStringLiteralTable.cpp:_ZN6hermes3hbc12_GLOBAL__N_14kindEN4llvh9StringRefEb:
   19|  1.84k|StringKind::Kind kind(llvh::StringRef str, bool isIdentifier) {
   20|  1.84k|  if (isIdentifier) {
  ------------------
  |  Branch (20:7): [True: 1.23k, False: 612]
  ------------------
   21|  1.23k|    return StringKind::Identifier;
   22|  1.23k|  } else {
   23|    612|    return StringKind::String;
   24|    612|  }
   25|  1.84k|}
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK3$_2clEm:
  162|    336|  const auto indicesFrom = [&remap, &indices](size_t ix) {
  163|    336|    return indices.begin() + remap(ix);
  164|    336|  };
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK3$_1clEm:
  148|    672|  const auto remap = [allStrings, existingStrings](size_t ix) {
  149|       |    // Skip the existing strings.
  150|    672|    ix = std::max(ix, existingStrings);
  151|       |
  152|       |    // Avoid a buffer overrun;
  153|    672|    ix = std::min(ix, allStrings);
  154|       |
  155|       |    // Translate by the number of strings we skipped over.
  156|    672|    ix -= existingStrings;
  157|       |
  158|    672|    return ix;
  159|    672|  };
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK3$_3clEm:
  191|    336|  const auto entriesFrom = [&remap, &kindedEntries](size_t ix) {
  192|    336|    return kindedEntries.begin() + remap(ix);
  193|    336|  };
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bEN5IndexC2EmN4llvh9StringRefENS_10StringKind4KindE:
   90|    924|        : origIndex(origIndex), str(str), kind(kind) {}
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK3$_0clERKZNS1_7toTableES1_bE5IndexS5_:
  136|  7.78k|      [&numIdentifierRefs, existingStrings](const Index &a, const Index &b) {
  137|  7.78k|        assert(a.origIndex >= existingStrings && "Sorting an old string");
  138|      0|        assert(b.origIndex >= existingStrings && "Sorting an old string");
  139|       |
  140|      0|        auto ai = a.origIndex - existingStrings;
  141|  7.78k|        auto bi = b.origIndex - existingStrings;
  142|       |
  143|  7.78k|        return numIdentifierRefs[ai] > numIdentifierRefs[bi];
  144|  7.78k|      });
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK5IndexltERKS2_:
   98|  6.31k|    inline bool operator<(const Index &that) const {
   99|  6.31k|      return this->key() < that.key();
  100|  6.31k|    }
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK5Index3keyEv:
   94|  12.6k|    inline Key key() const {
   95|  12.6k|      return std::make_tuple(kind, str);
   96|  12.6k|    }
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bEN11KindedEntryC2ENS_10StringKind4KindENS_16StringTableEntryE:
  109|    924|        : kind(kind), entry(entry) {}
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK11KindedEntryltERKS2_:
  120|  2.36k|    inline bool operator<(const KindedEntry &that) const {
  121|  2.36k|      return this->key() < that.key();
  122|  2.36k|    }
UniquingStringLiteralTable.cpp:_ZZN6hermes3hbc32UniquingStringLiteralAccumulator7toTableES1_bENK11KindedEntry3keyEv:
  115|  4.73k|    inline Key key() const {
  116|  4.73k|      return std::make_tuple(kind, entry.getOffset(), entry.getLength());
  117|  4.73k|    }

_ZN6hermes14SwitchLowering13runOnFunctionEPNS_8FunctionE:
   20|   114k|bool SwitchLowering::runOnFunction(Function *F) {
   21|   114k|  bool changed = false;
   22|   114k|  llvh::SmallVector<SwitchInst *, 4> switches;
   23|       |  // Collect all switch instructions.
   24|   114k|  for (BasicBlock &BB : *F)
  ------------------
  |  Branch (24:23): [True: 267k, False: 114k]
  ------------------
   25|  1.24M|    for (auto &it : BB) {
  ------------------
  |  Branch (25:19): [True: 1.24M, False: 267k]
  ------------------
   26|  1.24M|      if (auto *S = llvh::dyn_cast<SwitchInst>(&it))
  ------------------
  |  Branch (26:17): [True: 0, False: 1.24M]
  ------------------
   27|      0|        switches.push_back(S);
   28|  1.24M|    }
   29|       |
   30|   114k|  for (auto *S : switches) {
  ------------------
  |  Branch (30:16): [True: 0, False: 114k]
  ------------------
   31|      0|    lowerSwitchIntoIfs(S);
   32|      0|    changed = true;
   33|      0|  }
   34|       |
   35|   114k|  return changed;
   36|   114k|}
_ZN6hermes23LowerAllocObjectLiteral13runOnFunctionEPNS_8FunctionE:
  444|   114k|bool LowerAllocObjectLiteral::runOnFunction(Function *F) {
  445|   114k|  bool changed = false;
  446|   114k|  llvh::SmallVector<AllocObjectLiteralInst *, 4> allocs;
  447|   267k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (447:23): [True: 267k, False: 114k]
  ------------------
  448|       |    // We need to increase the iterator before calling lowerAllocObjectBuffer.
  449|       |    // Otherwise deleting the instruction will invalidate the iterator.
  450|  1.48M|    for (auto it = BB.begin(), e = BB.end(); it != e;) {
  ------------------
  |  Branch (450:46): [True: 1.21M, False: 267k]
  ------------------
  451|  1.21M|      if (auto *A = llvh::dyn_cast<AllocObjectLiteralInst>(&*it++)) {
  ------------------
  |  Branch (451:17): [True: 5.04k, False: 1.21M]
  ------------------
  452|  5.04k|        changed |= lowerAllocObjectBuffer(A);
  453|  5.04k|      }
  454|  1.21M|    }
  455|   267k|  }
  456|       |
  457|   114k|  return changed;
  458|   114k|}
_ZN6hermes23LowerAllocObjectLiteral10lowerAllocEPNS_22AllocObjectLiteralInstE:
  460|  4.16k|bool LowerAllocObjectLiteral::lowerAlloc(AllocObjectLiteralInst *allocInst) {
  461|  4.16k|  Function *F = allocInst->getParent()->getParent();
  462|  4.16k|  IRBuilder builder(F);
  463|       |
  464|  4.16k|  auto size = allocInst->getKeyValuePairCount();
  465|       |
  466|       |  // Replace AllocObjectLiteral with a regular AllocObject
  467|  4.16k|  builder.setLocation(allocInst->getLocation());
  468|  4.16k|  builder.setCurrentSourceLevelScope(allocInst->getSourceLevelScope());
  469|  4.16k|  builder.setInsertionPoint(allocInst);
  470|  4.16k|  auto *Obj = builder.createAllocObjectInst(size, nullptr);
  471|       |
  472|  8.32k|  for (unsigned i = 0; i < allocInst->getKeyValuePairCount(); i++) {
  ------------------
  |  Branch (472:24): [True: 4.16k, False: 4.16k]
  ------------------
  473|  4.16k|    Literal *key = allocInst->getKey(i);
  474|  4.16k|    Value *value = allocInst->getValue(i);
  475|  4.16k|    builder.createStoreNewOwnPropertyInst(
  476|  4.16k|        value, allocInst, key, IRBuilder::PropEnumerable::Yes);
  477|  4.16k|  }
  478|  4.16k|  allocInst->replaceAllUsesWith(Obj);
  479|  4.16k|  allocInst->eraseFromParent();
  480|       |
  481|  4.16k|  return true;
  482|  4.16k|}
_ZN6hermes23LowerAllocObjectLiteral31estimateBestNumElemsToSerializeEPNS_22AllocObjectLiteralInstE:
  485|  5.04k|    AllocObjectLiteralInst *allocInst) {
  486|       |  // Reuse calc logic from LowerAllocObject.
  487|  5.04k|  int32_t curSaving = static_cast<int32_t>(sizeof(inst::NewObjectInst)) -
  488|  5.04k|      static_cast<int32_t>(sizeof(inst::NewObjectWithBufferInst));
  489|  5.04k|  int32_t maxSaving = 0;
  490|  5.04k|  uint32_t optimumStopIndex = 0;
  491|  5.04k|  uint32_t nonLiteralPlaceholderCount = 0;
  492|       |
  493|  5.04k|  uint32_t curSize = 0;
  494|  11.0k|  for (unsigned i = 0; i < allocInst->getKeyValuePairCount(); i++) {
  ------------------
  |  Branch (494:24): [True: 5.97k, False: 5.04k]
  ------------------
  495|  5.97k|    ++curSize;
  496|  5.97k|    Literal *key = allocInst->getKey(i);
  497|  5.97k|    Value *value = allocInst->getValue(i);
  498|  5.97k|    if (isSerializableLiteral(value)) {
  ------------------
  |  Branch (498:9): [True: 5.97k, False: 0]
  ------------------
  499|  5.97k|      curSaving += kLiteralSavedBytes;
  500|  5.97k|      if (curSaving > maxSaving) {
  ------------------
  |  Branch (500:11): [True: 937, False: 5.04k]
  ------------------
  501|    937|        maxSaving = curSaving;
  502|    937|        optimumStopIndex = curSize;
  503|    937|      }
  504|  5.97k|    } else {
  505|      0|      if (llvh::isa<LiteralNumber>(key)) {
  ------------------
  |  Branch (505:11): [True: 0, False: 0]
  ------------------
  506|      0|        continue;
  507|      0|      }
  508|      0|      if (nonLiteralPlaceholderCount == kNonLiteralPlaceholderLimit) {
  ------------------
  |  Branch (508:11): [True: 0, False: 0]
  ------------------
  509|       |        // We have reached the maximum number of place holders we can put.
  510|      0|        break;
  511|      0|      }
  512|      0|      nonLiteralPlaceholderCount++;
  513|      0|      curSaving -= kNonLiteralCostBytes;
  514|      0|    }
  515|  5.97k|  }
  516|  5.04k|  return optimumStopIndex;
  517|  5.04k|}
_ZN6hermes23LowerAllocObjectLiteral22lowerAllocObjectBufferEPNS_22AllocObjectLiteralInstE:
  520|  5.04k|    AllocObjectLiteralInst *allocInst) {
  521|  5.04k|  Function *F = allocInst->getParent()->getParent();
  522|  5.04k|  IRBuilder builder(F);
  523|       |
  524|  5.04k|  auto maxSize = (unsigned)UINT16_MAX;
  525|  5.04k|  auto size = estimateBestNumElemsToSerialize(allocInst);
  526|  5.04k|  size = std::min(maxSize, size);
  527|       |
  528|       |  // Should not create HBCAllocObjectFromBufferInst.
  529|  5.04k|  if (size == 0) {
  ------------------
  |  Branch (529:7): [True: 4.16k, False: 880]
  ------------------
  530|  4.16k|    return lowerAlloc(allocInst);
  531|  4.16k|  }
  532|       |
  533|       |  // Replace AllocObjectLiteral with HBCAllocObjectFromBufferInst
  534|    880|  builder.setLocation(allocInst->getLocation());
  535|    880|  builder.setCurrentSourceLevelScope(allocInst->getSourceLevelScope());
  536|    880|  builder.setInsertionPointAfter(allocInst);
  537|    880|  HBCAllocObjectFromBufferInst::ObjectPropertyMap propMap;
  538|       |
  539|    880|  unsigned i = 0;
  540|  2.69k|  for (; i < size; i++) {
  ------------------
  |  Branch (540:10): [True: 1.81k, False: 880]
  ------------------
  541|  1.81k|    Literal *key = allocInst->getKey(i);
  542|  1.81k|    Value *value = allocInst->getValue(i);
  543|  1.81k|    Literal *propLiteral = nullptr;
  544|       |    // Property name can be either a LiteralNumber or a LiteralString.
  545|  1.81k|    if (auto *LN = llvh::dyn_cast<LiteralNumber>(key)) {
  ------------------
  |  Branch (545:15): [True: 0, False: 1.81k]
  ------------------
  546|      0|      assert(
  547|      0|          LN->convertToArrayIndex() &&
  548|      0|          "LiteralNumber can be a property name only if it can be converted to array index.");
  549|      0|      propLiteral = LN;
  550|  1.81k|    } else {
  551|  1.81k|      propLiteral = cast<LiteralString>(key);
  552|  1.81k|    }
  553|       |
  554|  1.81k|    if (isSerializableLiteral(value)) {
  ------------------
  |  Branch (554:9): [True: 1.81k, False: 0]
  ------------------
  555|  1.81k|      propMap.push_back(std::pair<Literal *, Literal *>(
  556|  1.81k|          propLiteral, llvh::cast<Literal>(value)));
  557|  1.81k|    } else if (llvh::isa<LiteralString>(propLiteral)) {
  ------------------
  |  Branch (557:16): [True: 0, False: 0]
  ------------------
  558|       |      // LiteralString key with undefined / non-constant value.
  559|      0|      propMap.push_back(std::pair<Literal *, Literal *>(
  560|      0|          propLiteral, builder.getLiteralNull()));
  561|      0|      builder.createStorePropertyInst(value, allocInst, key);
  562|      0|    } else {
  563|       |      // LiteralNumber key with undefined / non-constant value.
  564|       |      // No need to put Null in the buffer, as numeric properties can
  565|       |      // be added in any order.
  566|      0|      builder.createStoreOwnPropertyInst(
  567|      0|          value, allocInst, key, IRBuilder::PropEnumerable::Yes);
  568|      0|    }
  569|  1.81k|  }
  570|       |
  571|       |  // Handle properties beyond best num of properties or that cannot fit in
  572|       |  // maxSize.
  573|    880|  for (; i < allocInst->getKeyValuePairCount(); i++) {
  ------------------
  |  Branch (573:10): [True: 0, False: 880]
  ------------------
  574|      0|    Literal *key = allocInst->getKey(i);
  575|      0|    Value *value = allocInst->getValue(i);
  576|      0|    builder.createStoreNewOwnPropertyInst(
  577|      0|        value, allocInst, key, IRBuilder::PropEnumerable::Yes);
  578|      0|  }
  579|       |
  580|       |  // Emit HBCAllocObjectFromBufferInst.
  581|       |  // First, we reset insertion location.
  582|    880|  builder.setLocation(allocInst->getLocation());
  583|    880|  builder.setCurrentSourceLevelScope(allocInst->getSourceLevelScope());
  584|    880|  builder.setInsertionPoint(allocInst);
  585|    880|  auto *alloc = builder.createHBCAllocObjectFromBufferInst(
  586|    880|      propMap, allocInst->getKeyValuePairCount());
  587|    880|  allocInst->replaceAllUsesWith(alloc);
  588|    880|  allocInst->eraseFromParent();
  589|       |
  590|    880|  return true;
  591|  5.04k|}
_ZN6hermes16LowerStoreInstrs13runOnFunctionEPNS_8FunctionE:
  593|   114k|bool LowerStoreInstrs::runOnFunction(Function *F) {
  594|   114k|  IRBuilder builder(F);
  595|   114k|  IRBuilder::InstructionDestroyer destroyer;
  596|   114k|  bool changed = false;
  597|       |
  598|   114k|  PostOrderAnalysis PO(F);
  599|   114k|  llvh::SmallVector<BasicBlock *, 16> order(PO.rbegin(), PO.rend());
  600|   153k|  for (auto *bbit : order) {
  ------------------
  |  Branch (600:19): [True: 153k, False: 114k]
  ------------------
  601|  1.41M|    for (auto &it : bbit->getInstList()) {
  ------------------
  |  Branch (601:19): [True: 1.41M, False: 153k]
  ------------------
  602|  1.41M|      auto *SSI = llvh::dyn_cast<StoreStackInst>(&it);
  603|  1.41M|      if (!SSI)
  ------------------
  |  Branch (603:11): [True: 1.29M, False: 128k]
  ------------------
  604|  1.29M|        continue;
  605|       |
  606|   128k|      Value *ptr = SSI->getPtr();
  607|   128k|      Value *val = SSI->getValue();
  608|       |
  609|   128k|      builder.setInsertionPoint(&it);
  610|   128k|      auto dstReg = RA_.getRegister(ptr);
  611|   128k|      auto *mov = builder.createMovInst(val);
  612|   128k|      RA_.updateRegister(mov, dstReg);
  613|   128k|      it.replaceAllUsesWith(mov);
  614|   128k|      destroyer.add(&it);
  615|   128k|      changed = true;
  616|   128k|    }
  617|   153k|  }
  618|   114k|  return changed;
  619|   114k|}
_ZN6hermes22LowerNumericProperties23stringToNumericPropertyERNS_9IRBuilderERNS_11InstructionEj:
  624|   352k|    unsigned operandIdx) {
  625|   352k|  auto strLit = llvh::dyn_cast<LiteralString>(Inst.getOperand(operandIdx));
  626|   352k|  if (!strLit)
  ------------------
  |  Branch (626:7): [True: 210k, False: 141k]
  ------------------
  627|   210k|    return false;
  628|       |
  629|       |  // Check if the string looks exactly like an array index.
  630|   141k|  auto num = toArrayIndex(strLit->getValue().str());
  631|   141k|  if (num) {
  ------------------
  |  Branch (631:7): [True: 0, False: 141k]
  ------------------
  632|      0|    Inst.setOperand(builder.getLiteralNumber(*num), operandIdx);
  633|      0|    return true;
  634|      0|  }
  635|       |
  636|   141k|  return false;
  637|   141k|}
_ZN6hermes22LowerNumericProperties13runOnFunctionEPNS_8FunctionE:
  639|   114k|bool LowerNumericProperties::runOnFunction(Function *F) {
  640|   114k|  IRBuilder builder(F);
  641|   114k|  IRBuilder::InstructionDestroyer destroyer{};
  642|       |
  643|   114k|  bool changed = false;
  644|   267k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (644:23): [True: 267k, False: 114k]
  ------------------
  645|  1.21M|    for (Instruction &Inst : BB) {
  ------------------
  |  Branch (645:28): [True: 1.21M, False: 267k]
  ------------------
  646|  1.21M|      if (llvh::isa<LoadPropertyInst>(&Inst)) {
  ------------------
  |  Branch (646:11): [True: 131k, False: 1.08M]
  ------------------
  647|   131k|        changed |= stringToNumericProperty(
  648|   131k|            builder, Inst, LoadPropertyInst::PropertyIdx);
  649|  1.08M|      } else if (llvh::isa<StorePropertyInst>(&Inst)) {
  ------------------
  |  Branch (649:18): [True: 3.78k, False: 1.08M]
  ------------------
  650|  3.78k|        changed |= stringToNumericProperty(
  651|  3.78k|            builder, Inst, StorePropertyInst::PropertyIdx);
  652|  1.08M|      } else if (llvh::isa<StoreOwnPropertyInst>(&Inst)) {
  ------------------
  |  Branch (652:18): [True: 210k, False: 871k]
  ------------------
  653|   210k|        changed |= stringToNumericProperty(
  654|   210k|            builder, Inst, StoreOwnPropertyInst::PropertyIdx);
  655|   871k|      } else if (llvh::isa<DeletePropertyInst>(&Inst)) {
  ------------------
  |  Branch (655:18): [True: 0, False: 871k]
  ------------------
  656|      0|        changed |= stringToNumericProperty(
  657|      0|            builder, Inst, DeletePropertyInst::PropertyIdx);
  658|   871k|      } else if (llvh::isa<StoreGetterSetterInst>(&Inst)) {
  ------------------
  |  Branch (658:18): [True: 0, False: 871k]
  ------------------
  659|      0|        changed |= stringToNumericProperty(
  660|      0|            builder, Inst, StoreGetterSetterInst::PropertyIdx);
  661|   871k|      } else if (llvh::isa<AllocObjectLiteralInst>(&Inst)) {
  ------------------
  |  Branch (661:18): [True: 5.04k, False: 866k]
  ------------------
  662|  5.04k|        auto allocInst = cast<AllocObjectLiteralInst>(&Inst);
  663|  11.0k|        for (unsigned i = 0; i < allocInst->getKeyValuePairCount(); i++) {
  ------------------
  |  Branch (663:30): [True: 5.97k, False: 5.04k]
  ------------------
  664|  5.97k|          changed |= stringToNumericProperty(builder, Inst, i * 2);
  665|  5.97k|        }
  666|  5.04k|      }
  667|  1.21M|    }
  668|   267k|  }
  669|   114k|  return changed;
  670|   114k|}
_ZN6hermes15LimitAllocArray13runOnFunctionEPNS_8FunctionE:
  672|   114k|bool LimitAllocArray::runOnFunction(Function *F) {
  673|   114k|  bool changed = false;
  674|   267k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (674:23): [True: 267k, False: 114k]
  ------------------
  675|  1.24M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (675:25): [True: 1.24M, False: 267k]
  ------------------
  676|  1.24M|      auto *inst = llvh::dyn_cast<AllocArrayInst>(&I);
  677|  1.24M|      if (!inst || inst->getElementCount() == 0)
  ------------------
  |  Branch (677:11): [True: 1.20M, False: 33.4k]
  |  Branch (677:20): [True: 13.2k, False: 20.1k]
  ------------------
  678|  1.22M|        continue;
  679|       |
  680|  20.1k|      IRBuilder builder(F);
  681|  20.1k|      builder.setInsertionPointAfter(inst);
  682|  20.1k|      builder.setLocation(inst->getLocation());
  683|  20.1k|      builder.setCurrentSourceLevelScope(inst->getSourceLevelScope());
  684|       |
  685|       |      // Checks if any operand of an AllocArray is unserializable.
  686|       |      // If it finds one, the loop removes it along with every operand past it.
  687|  20.1k|      {
  688|  20.1k|        bool seenUnserializable = false;
  689|  20.1k|        unsigned ind = -1;
  690|  20.1k|        unsigned i = AllocArrayInst::ElementStartIdx;
  691|  20.1k|        unsigned e = inst->getElementCount() + AllocArrayInst::ElementStartIdx;
  692|   514k|        while (i < e) {
  ------------------
  |  Branch (692:16): [True: 494k, False: 20.1k]
  ------------------
  693|   494k|          ind++;
  694|   494k|          seenUnserializable |=
  695|   494k|              inst->getOperand(i)->getKind() == ValueKind::LiteralBigIntKind ||
  ------------------
  |  Branch (695:15): [True: 0, False: 494k]
  ------------------
  696|   494k|              inst->getOperand(i)->getKind() == ValueKind::LiteralUndefinedKind;
  ------------------
  |  Branch (696:15): [True: 0, False: 494k]
  ------------------
  697|   494k|          if (seenUnserializable) {
  ------------------
  |  Branch (697:15): [True: 0, False: 494k]
  ------------------
  698|      0|            e--;
  699|      0|            builder.createStoreOwnPropertyInst(
  700|      0|                inst->getOperand(i),
  701|      0|                inst,
  702|      0|                builder.getLiteralNumber(ind),
  703|      0|                IRBuilder::PropEnumerable::Yes);
  704|      0|            inst->removeOperand(i);
  705|      0|            changed = true;
  706|      0|            continue;
  707|      0|          }
  708|   494k|          i++;
  709|   494k|        }
  710|  20.1k|      }
  711|       |
  712|  20.1k|      if (inst->getElementCount() == 0)
  ------------------
  |  Branch (712:11): [True: 0, False: 20.1k]
  ------------------
  713|      0|        continue;
  714|       |
  715|       |      // Since we remove elements from inst until it fits in maxSize_,
  716|       |      // the final addition to totalElems will make it equal maxSize_. Any
  717|       |      // AllocArray past that would have all its operands removed, and add
  718|       |      // 0 to totalElems.
  719|  39.8k|      for (unsigned i = inst->getElementCount() - 1; i >= maxSize_; i--) {
  ------------------
  |  Branch (719:54): [True: 19.7k, False: 20.1k]
  ------------------
  720|  19.7k|        int operandOffset = AllocArrayInst::ElementStartIdx + i;
  721|  19.7k|        builder.createStoreOwnPropertyInst(
  722|  19.7k|            inst->getOperand(operandOffset),
  723|  19.7k|            inst,
  724|  19.7k|            builder.getLiteralNumber(i),
  725|  19.7k|            IRBuilder::PropEnumerable::Yes);
  726|  19.7k|        inst->removeOperand(operandOffset);
  727|  19.7k|      }
  728|  20.1k|      changed = true;
  729|  20.1k|    }
  730|   267k|  }
  731|   114k|  return changed;
  732|   114k|}
_ZN6hermes27LowerExponentiationOperator13runOnFunctionEPNS_8FunctionE:
  814|   114k|bool LowerExponentiationOperator::runOnFunction(Function *F) {
  815|   114k|  IRBuilder builder{F};
  816|   114k|  llvh::DenseSet<Instruction *> toTransform{};
  817|   114k|  bool changed = false;
  818|       |
  819|   267k|  for (BasicBlock &bb : *F) {
  ------------------
  |  Branch (819:23): [True: 267k, False: 114k]
  ------------------
  820|  1.48M|    for (auto it = bb.begin(), e = bb.end(); it != e; /* empty */) {
  ------------------
  |  Branch (820:46): [True: 1.21M, False: 267k]
  ------------------
  821|  1.21M|      auto *inst = &*it;
  822|       |      // Increment iterator before potentially erasing inst and invalidating
  823|       |      // iteration.
  824|  1.21M|      ++it;
  825|  1.21M|      if (auto *binOp = llvh::dyn_cast<BinaryOperatorInst>(inst)) {
  ------------------
  |  Branch (825:17): [True: 65.0k, False: 1.15M]
  ------------------
  826|  65.0k|        if (binOp->getOperatorKind() ==
  ------------------
  |  Branch (826:13): [True: 0, False: 65.0k]
  ------------------
  827|  65.0k|            BinaryOperatorInst::OpKind::ExponentiationKind) {
  828|      0|          changed |= lowerExponentiationOperator(builder, binOp);
  829|      0|        }
  830|  65.0k|      }
  831|  1.21M|    }
  832|   267k|  }
  833|       |
  834|   114k|  return changed;
  835|   114k|}
Lowering.cpp:_ZL21isSerializableLiteralPN6hermes5ValueE:
  315|  7.79k|static bool isSerializableLiteral(Value *V) {
  316|  7.79k|  return V &&
  ------------------
  |  Branch (316:10): [True: 7.79k, False: 0]
  ------------------
  317|  7.79k|      (llvh::isa<LiteralNull>(V) || llvh::isa<LiteralBool>(V) ||
  ------------------
  |  Branch (317:8): [True: 0, False: 7.79k]
  |  Branch (317:37): [True: 0, False: 7.79k]
  ------------------
  318|  7.79k|       llvh::isa<LiteralNumber>(V) || llvh::isa<LiteralString>(V));
  ------------------
  |  Branch (318:8): [True: 7.79k, False: 0]
  |  Branch (318:39): [True: 0, False: 0]
  ------------------
  319|  7.79k|}

_ZN6hermes12RegisterFile6isUsedENS_8RegisterE:
   56|  3.68M|bool RegisterFile::isUsed(Register r) {
   57|  3.68M|  return !registers.test(r.getIndex());
   58|  3.68M|}
_ZN6hermes12RegisterFile6isFreeENS_8RegisterE:
   60|  1.96M|bool RegisterFile::isFree(Register r) {
   61|  1.96M|  return !isUsed(r);
   62|  1.96M|}
_ZN6hermes12RegisterFile12killRegisterENS_8RegisterE:
   64|  1.19M|void RegisterFile::killRegister(Register reg) {
   65|  1.19M|  LLVM_DEBUG(dbgs() << "-- Releasing the register " << reg << "\n");
  ------------------
  |  |  123|  1.19M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.19M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.19M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.19M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   66|       |
   67|  1.19M|  assert(isUsed(reg) && "Killing an unused register!");
   68|      0|  registers.set(reg.getIndex());
   69|  1.19M|  assert(isFree(reg) && "Error freeing register!");
   70|  1.19M|}
_ZN6hermes12RegisterFile16allocateRegisterEv:
   82|  1.30M|Register RegisterFile::allocateRegister() {
   83|       |  // We first check for the 'all' case because we usually have a small number of
   84|       |  // active bits (<64), so this operation is actually faster than the linear
   85|       |  // scan.
   86|  1.30M|  if (registers.none()) {
  ------------------
  |  Branch (86:7): [True: 526k, False: 778k]
  ------------------
   87|       |    // If all bits are set, create a new register and return it.
   88|   526k|    unsigned numRegs = registers.size();
   89|   526k|    registers.resize(numRegs + 1, false);
   90|   526k|    Register R = Register(numRegs);
   91|   526k|    assert(isUsed(R) && "Error allocating a new register.");
   92|   526k|    LLVM_DEBUG(dbgs() << "-- Creating the new register " << R << "\n");
  ------------------
  |  |  123|   526k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   526k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 526k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   526k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   93|   526k|    return R;
   94|   526k|  }
   95|       |
   96|       |  // Search for a free register to use.
   97|   778k|  int i = registers.find_first();
   98|   778k|  assert(i >= 0 && "Unexpected failure to allocate a register");
   99|      0|  Register R(i);
  100|   778k|  LLVM_DEBUG(dbgs() << "-- Assigning the free register " << R << "\n");
  ------------------
  |  |  123|   778k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   778k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 778k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   778k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  101|   778k|  assert(isFree(R) && "Error finding a free register");
  102|      0|  registers.reset(i);
  103|   778k|  return R;
  104|  1.30M|}
_ZN6hermes12RegisterFile23tailAllocateConsecutiveEj:
  106|   114k|Register RegisterFile::tailAllocateConsecutive(unsigned n) {
  107|   114k|  assert(n > 0 && "Can't request zero registers");
  108|       |
  109|      0|  int lastUsed = registers.size() - 1;
  110|   114k|  while (lastUsed >= 0) {
  ------------------
  |  Branch (110:10): [True: 0, False: 114k]
  ------------------
  111|      0|    if (!registers.test(lastUsed))
  ------------------
  |  Branch (111:9): [True: 0, False: 0]
  ------------------
  112|      0|      break;
  113|       |
  114|      0|    lastUsed--;
  115|      0|  }
  116|       |
  117|   114k|  int firstClear = lastUsed + 1;
  118|       |
  119|   114k|  LLVM_DEBUG(
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  120|   114k|      dbgs() << "-- Found the last set bit at offset " << lastUsed << "\n");
  121|   114k|  registers.resize(std::max(registers.size(), firstClear + n), true);
  122|   114k|  registers.reset(firstClear, firstClear + n);
  123|       |
  124|   114k|  LLVM_DEBUG(
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  125|   114k|      dbgs() << "-- Allocated tail consecutive registers of length " << n
  126|   114k|             << ", starting at " << Register(firstClear) << "\n");
  127|   114k|  return Register(firstClear);
  128|   114k|}
_ZN6hermes17RegisterAllocator9lowerPhisEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  159|   114k|void RegisterAllocator::lowerPhis(ArrayRef<BasicBlock *> order) {
  160|   114k|  llvh::SmallVector<PhiInst *, 8> PHIs;
  161|   114k|  IRBuilder builder(F);
  162|       |
  163|       |  // Collect all PHIs.
  164|   153k|  for (auto &BB : order) {
  ------------------
  |  Branch (164:17): [True: 153k, False: 114k]
  ------------------
  165|  1.41M|    for (auto &Inst : *BB) {
  ------------------
  |  Branch (165:21): [True: 1.41M, False: 153k]
  ------------------
  166|  1.41M|      if (auto *P = llvh::dyn_cast<PhiInst>(&Inst)) {
  ------------------
  |  Branch (166:17): [True: 34, False: 1.41M]
  ------------------
  167|     34|        PHIs.push_back(P);
  168|     34|      }
  169|  1.41M|    }
  170|   153k|  }
  171|       |
  172|       |  // The MOV sequence at the end of the block writes the values that need to go
  173|       |  // into the PHI node registers in the jump-destination basic blocks. In the
  174|       |  // case of cycles we may need to read a value from a current PHI node and also
  175|       |  // prepare the value of the same PHI node for the next iteration. To make sure
  176|       |  // that we read an up-to-date value we copy the value using a MOV before we
  177|       |  // emit the MOV sequence and replace all external uses.
  178|   114k|  for (PhiInst *P : PHIs) {
  ------------------
  |  Branch (178:19): [True: 34, False: 114k]
  ------------------
  179|     34|    if (!phiReadWrite(P))
  ------------------
  |  Branch (179:9): [True: 34, False: 0]
  ------------------
  180|     34|      continue;
  181|       |
  182|       |    // The MOV sequence may clobber the PHI. Insert a copy.
  183|      0|    builder.setInsertionPoint(P->getParent()->getTerminator());
  184|      0|    auto *mov = builder.createMovInst(P);
  185|       |
  186|      0|    Value::UseListTy users = P->getUsers();
  187|       |    // Update all external users:
  188|      0|    for (auto *U : users) {
  ------------------
  |  Branch (188:18): [True: 0, False: 0]
  ------------------
  189|       |      // Local uses of the PHI are allowed.
  190|      0|      if (!llvh::isa<PhiInst>(U) && !llvh::isa<TerminatorInst>(U) &&
  ------------------
  |  Branch (190:11): [True: 0, False: 0]
  |  Branch (190:37): [True: 0, False: 0]
  ------------------
  191|      0|          U->getParent() == P->getParent())
  ------------------
  |  Branch (191:11): [True: 0, False: 0]
  ------------------
  192|      0|        continue;
  193|       |
  194|      0|      U->replaceFirstOperandWith(P, mov);
  195|      0|    }
  196|      0|  }
  197|       |
  198|       |  /// A list of registers that were copied to prevent clobbering. Maps the
  199|       |  /// original PHI node to the copied value.
  200|   114k|  DenseMap<Value *, MovInst *> copied;
  201|       |
  202|       |  // Lower all PHI nodes into a sequence of MOVs in the predecessor blocks.
  203|   114k|  for (PhiInst *P : PHIs) {
  ------------------
  |  Branch (203:19): [True: 34, False: 114k]
  ------------------
  204|    102|    for (unsigned i = 0, e = P->getNumEntries(); i < e; ++i) {
  ------------------
  |  Branch (204:50): [True: 68, False: 34]
  ------------------
  205|     68|      auto E = P->getEntry(i);
  206|     68|      auto *term = E.second->getTerminator();
  207|     68|      builder.setInsertionPoint(term);
  208|     68|      auto *mov = builder.createMovInst(E.first);
  209|     68|      P->updateEntry(i, mov, E.second);
  210|       |
  211|       |      // If the terminator uses the value that we are inserting then we can fix
  212|       |      // the lifetime by making it use the MOV. We can do this because we know
  213|       |      // that terminators don't modify values in destination PHI nodes and this
  214|       |      // allows us to merge the lifetime of the value and save a register.
  215|     68|      copied[E.first] = mov;
  216|     68|    }
  217|     34|  }
  218|       |
  219|       |  // The terminator comes after the MOV sequence, so make sure it uses the
  220|       |  // updated registers.
  221|   153k|  for (auto &BB : order) {
  ------------------
  |  Branch (221:17): [True: 153k, False: 114k]
  ------------------
  222|   153k|    auto *term = BB->getTerminator();
  223|       |
  224|   307k|    for (int i = 0, e = term->getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (224:49): [True: 153k, False: 153k]
  ------------------
  225|   153k|      auto *op = term->getOperand(i);
  226|   153k|      if (llvh::isa<Literal>(op))
  ------------------
  |  Branch (226:11): [True: 0, False: 153k]
  ------------------
  227|      0|        continue;
  228|   153k|      auto it = copied.find(op);
  229|   153k|      if (it != copied.end()) {
  ------------------
  |  Branch (229:11): [True: 0, False: 153k]
  ------------------
  230|      0|        if (it->second->getParent() == BB) {
  ------------------
  |  Branch (230:13): [True: 0, False: 0]
  ------------------
  231|      0|          term->setOperand(it->second, i);
  232|      0|          it->second->moveBefore(term);
  233|      0|        }
  234|      0|      }
  235|   153k|    }
  236|   153k|  }
  237|   114k|}
_ZN6hermes17RegisterAllocator22calculateLocalLivenessERNS0_17BlockLifetimeInfoEPNS_10BasicBlockE:
  241|    202|    BasicBlock *BB) {
  242|       |  // For each instruction in the block:
  243|   547k|  for (auto &it : *BB) {
  ------------------
  |  Branch (243:17): [True: 547k, False: 202]
  ------------------
  244|   547k|    Instruction *I = &it;
  245|       |
  246|   547k|    unsigned idx = getInstructionNumber(I);
  247|   547k|    livenessInfo.kill_.set(idx);
  248|       |
  249|       |    // PHI nodes require special handling because they are flow sensitive. Mask
  250|       |    // out flow that does not go in the direction of the phi edge.
  251|   547k|    if (auto *P = llvh::dyn_cast<PhiInst>(I)) {
  ------------------
  |  Branch (251:15): [True: 0, False: 547k]
  ------------------
  252|      0|      llvh::SmallVector<unsigned, 4> incomingValueNum;
  253|       |
  254|       |      // Collect all incoming value numbers.
  255|      0|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (255:47): [True: 0, False: 0]
  ------------------
  256|      0|        auto E = P->getEntry(i);
  257|       |        // Skip unreachable predecessors.
  258|      0|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (258:13): [True: 0, False: 0]
  ------------------
  259|      0|          continue;
  260|      0|        if (auto *II = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (260:19): [True: 0, False: 0]
  ------------------
  261|      0|          incomingValueNum.push_back(getInstructionNumber(II));
  262|      0|        }
  263|      0|      }
  264|       |
  265|       |      // Block the incoming values from flowing into the predecessors.
  266|      0|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (266:47): [True: 0, False: 0]
  ------------------
  267|      0|        auto E = P->getEntry(i);
  268|       |        // Skip unreachable predecessors.
  269|      0|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (269:13): [True: 0, False: 0]
  ------------------
  270|      0|          continue;
  271|      0|        for (auto num : incomingValueNum) {
  ------------------
  |  Branch (271:23): [True: 0, False: 0]
  ------------------
  272|      0|          blockLiveness_[E.second].maskIn_.set(num);
  273|      0|        }
  274|      0|      }
  275|       |
  276|       |      // Allow the flow of incoming values in specific directions:
  277|      0|      for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (277:47): [True: 0, False: 0]
  ------------------
  278|      0|        auto E = P->getEntry(i);
  279|       |        // Skip unreachable predecessors.
  280|      0|        if (!blockLiveness_.count(E.second))
  ------------------
  |  Branch (280:13): [True: 0, False: 0]
  ------------------
  281|      0|          continue;
  282|      0|        if (auto *II = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (282:19): [True: 0, False: 0]
  ------------------
  283|      0|          unsigned idxII = getInstructionNumber(II);
  284|      0|          blockLiveness_[E.second].maskIn_.reset(idxII);
  285|      0|        }
  286|      0|      }
  287|      0|    }
  288|       |
  289|       |    // For each one of the operands that are also instructions:
  290|  2.68M|    for (unsigned opIdx = 0, e = I->getNumOperands(); opIdx != e; ++opIdx) {
  ------------------
  |  Branch (290:55): [True: 2.14M, False: 547k]
  ------------------
  291|  2.14M|      auto *opInst = llvh::dyn_cast<Instruction>(I->getOperand(opIdx));
  292|  2.14M|      if (!opInst)
  ------------------
  |  Branch (292:11): [True: 1.11M, False: 1.02M]
  ------------------
  293|  1.11M|        continue;
  294|       |      // Skip instructions from unreachable blocks.
  295|  1.02M|      if (!blockLiveness_.count(opInst->getParent()))
  ------------------
  |  Branch (295:11): [True: 0, False: 1.02M]
  ------------------
  296|      0|        continue;
  297|       |
  298|       |      // Get the index of the operand.
  299|  1.02M|      auto opInstIdx = getInstructionNumber(opInst);
  300|  1.02M|      livenessInfo.gen_.set(opInstIdx);
  301|  1.02M|    }
  302|   547k|  }
  303|    202|}
_ZN6hermes17RegisterAllocator23calculateGlobalLivenessEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  318|     39|void RegisterAllocator::calculateGlobalLiveness(ArrayRef<BasicBlock *> order) {
  319|     39|  unsigned iterations = 0;
  320|     39|  bool changed = false;
  321|       |
  322|       |  // Init the live-in vector to be GEN-KILL.
  323|    202|  for (auto &it : blockLiveness_) {
  ------------------
  |  Branch (323:17): [True: 202, False: 39]
  ------------------
  324|    202|    BlockLifetimeInfo &livenessInfo = it.second;
  325|    202|    livenessInfo.liveIn_ |= livenessInfo.gen_;
  326|    202|    livenessInfo.liveIn_.reset(livenessInfo.kill_);
  327|    202|    livenessInfo.liveIn_.reset(livenessInfo.maskIn_);
  328|    202|  }
  329|       |
  330|     42|  do {
  331|     42|    iterations++;
  332|     42|    changed = false;
  333|       |
  334|    410|    for (auto it = order.rbegin(), e = order.rend(); it != e; it++) {
  ------------------
  |  Branch (334:54): [True: 368, False: 42]
  ------------------
  335|    368|      BasicBlock *BB = *it;
  336|    368|      BlockLifetimeInfo &livenessInfo = blockLiveness_[BB];
  337|       |
  338|       |      // Rule:  OUT = SUCC0_in  + SUCC1_in ...
  339|    368|      for (auto *succ : successors(BB)) {
  ------------------
  |  Branch (339:23): [True: 334, False: 368]
  ------------------
  340|    334|        BlockLifetimeInfo &succInfo = blockLiveness_[succ];
  341|       |        // Check if we are about to change bits in the live-out vector.
  342|    334|        if (succInfo.liveIn_.test(livenessInfo.liveOut_)) {
  ------------------
  |  Branch (342:13): [True: 163, False: 171]
  ------------------
  343|    163|          changed = true;
  344|    163|        }
  345|       |
  346|    334|        livenessInfo.liveOut_ |= succInfo.liveIn_;
  347|    334|      }
  348|       |
  349|       |      // Rule: In = gen + (OUT - KILL)
  350|       |      // After initializing 'in' to 'gen' - 'kill', the only way for the result
  351|       |      // to change is for 'out' to change, and we check if 'out' changes above.
  352|    368|      livenessInfo.liveIn_ = livenessInfo.liveOut_;
  353|    368|      livenessInfo.liveIn_ |= livenessInfo.gen_;
  354|    368|      livenessInfo.liveIn_.reset(livenessInfo.kill_);
  355|    368|      livenessInfo.liveIn_.reset(livenessInfo.maskIn_);
  356|    368|    }
  357|     42|  } while (changed);
  ------------------
  |  Branch (357:12): [True: 3, False: 39]
  ------------------
  358|       |
  359|     39|#ifndef NDEBUG
  360|    202|  for (auto &it : blockLiveness_) {
  ------------------
  |  Branch (360:17): [True: 202, False: 39]
  ------------------
  361|    202|    BasicBlock *BB = it.first;
  362|    202|    BlockLifetimeInfo &livenessInfo = it.second;
  363|    202|    LLVM_DEBUG(llvh::dbgs() << "Block " << BB << "\n");
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  364|    202|    LLVM_DEBUG(dumpVector(livenessInfo.gen_, "gen     ", llvh::dbgs()));
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  365|    202|    LLVM_DEBUG(dumpVector(livenessInfo.kill_, "kill    ", llvh::dbgs()));
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  366|    202|    LLVM_DEBUG(dumpVector(livenessInfo.liveIn_, "liveIn  ", llvh::dbgs()));
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  367|    202|    LLVM_DEBUG(dumpVector(livenessInfo.liveOut_, "liveOut ", llvh::dbgs()));
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  368|    202|    LLVM_DEBUG(dumpVector(livenessInfo.maskIn_, "maskIn  ", llvh::dbgs()));
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  369|    202|    LLVM_DEBUG(llvh::dbgs() << "------\n");
  ------------------
  |  |  123|    202|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    202|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 202]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    202|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  370|    202|  }
  371|     39|#endif
  372|       |
  373|     39|  LLVM_DEBUG(
  ------------------
  |  |  123|     39|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     39|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 39]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     39|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  374|     39|      dbgs() << "Completed liveness in " << iterations << " iterations\n");
  375|       |  // Suppress -Wunused-but-set-variable warning with new compilers.
  376|     39|  (void)iterations;
  377|     39|}
_ZN6hermes17RegisterAllocator8coalesceERN4llvh8DenseMapIPNS_11InstructionES4_NS1_12DenseMapInfoIS4_EENS1_6detail12DenseMapPairIS4_S4_EEEENS1_8ArrayRefIPNS_10BasicBlockEEE:
  420|     39|    ArrayRef<BasicBlock *> order) {
  421|       |  // Merge all PHI nodes into a single interval. This part is required for
  422|       |  // correctness because it bounds the MOV and the PHIs into a single interval.
  423|    202|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (423:23): [True: 202, False: 39]
  ------------------
  424|   547k|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (424:25): [True: 547k, False: 202]
  ------------------
  425|   547k|      auto *P = llvh::dyn_cast<PhiInst>(&I);
  426|   547k|      if (!P)
  ------------------
  |  Branch (426:11): [True: 547k, False: 0]
  ------------------
  427|   547k|        continue;
  428|       |
  429|      0|      unsigned phiNum = getInstructionNumber(P);
  430|      0|      for (unsigned i = 0, e = P->getNumEntries(); i < e; ++i) {
  ------------------
  |  Branch (430:52): [True: 0, False: 0]
  ------------------
  431|      0|        auto *mov = cast<MovInst>(P->getEntry(i).first);
  432|       |
  433|       |        // Bail out if the interval is already mapped, like in the case of self
  434|       |        // edges.
  435|      0|        if (map.count(mov))
  ------------------
  |  Branch (435:13): [True: 0, False: 0]
  ------------------
  436|      0|          continue;
  437|       |
  438|      0|        if (!hasInstructionNumber(mov))
  ------------------
  |  Branch (438:13): [True: 0, False: 0]
  ------------------
  439|      0|          continue;
  440|       |
  441|      0|        unsigned idx = getInstructionNumber(mov);
  442|      0|        instructionInterval_[phiNum].add(instructionInterval_[idx]);
  443|       |
  444|       |        // Record the fact that the mov should use the same register as the phi.
  445|      0|        map[mov] = P;
  446|      0|      }
  447|      0|    }
  448|    202|  }
  449|       |
  450|       |  // Given a sequence of MOVs that was generated by the PHI lowering, try to
  451|       |  // shorten the lifetime of intervals by reusing copies. For example, we
  452|       |  // shorten the lifetime of %0 by making %2 use %1.
  453|       |  // %1 = MovInst %0
  454|       |  // %2 = MovInst %0
  455|    202|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (455:23): [True: 202, False: 39]
  ------------------
  456|    202|    DenseMap<Value *, MovInst *> lastCopy;
  457|       |
  458|   547k|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (458:25): [True: 547k, False: 202]
  ------------------
  459|   547k|      auto *mov = llvh::dyn_cast<MovInst>(&I);
  460|   547k|      if (!mov)
  ------------------
  |  Branch (460:11): [True: 547k, False: 0]
  ------------------
  461|   547k|        continue;
  462|       |
  463|      0|      Value *op = mov->getSingleOperand();
  464|      0|      if (llvh::isa<Literal>(op))
  ------------------
  |  Branch (464:11): [True: 0, False: 0]
  ------------------
  465|      0|        continue;
  466|       |
  467|       |      // If we've made a copy inside this basic block then use the copy.
  468|      0|      auto it = lastCopy.find(op);
  469|      0|      if (it != lastCopy.end()) {
  ------------------
  |  Branch (469:11): [True: 0, False: 0]
  ------------------
  470|      0|        mov->setOperand(it->second, 0);
  471|      0|      }
  472|       |
  473|      0|      lastCopy[op] = mov;
  474|      0|    }
  475|    202|  }
  476|       |
  477|       |  // Optimize the program by coalescing multiple live intervals into a single
  478|       |  // long interval. This phase is optional.
  479|    202|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (479:23): [True: 202, False: 39]
  ------------------
  480|   547k|    for (Instruction &I : *BB) {
  ------------------
  |  Branch (480:25): [True: 547k, False: 202]
  ------------------
  481|   547k|      auto *mov = llvh::dyn_cast<MovInst>(&I);
  482|   547k|      if (!mov)
  ------------------
  |  Branch (482:11): [True: 547k, False: 0]
  ------------------
  483|   547k|        continue;
  484|       |
  485|      0|      auto *op = llvh::dyn_cast<Instruction>(mov->getSingleOperand());
  486|      0|      if (!op)
  ------------------
  |  Branch (486:11): [True: 0, False: 0]
  ------------------
  487|      0|        continue;
  488|       |
  489|       |      // Don't coalesce intervals that are already coalesced to other intervals
  490|       |      // or that there are other intervals that are coalesced into it, or if
  491|       |      // the interval is pre-allocated.
  492|      0|      if (map.count(op) || isAllocated(op) || isAllocated(mov))
  ------------------
  |  Branch (492:11): [True: 0, False: 0]
  |  Branch (492:28): [True: 0, False: 0]
  |  Branch (492:47): [True: 0, False: 0]
  ------------------
  493|      0|        continue;
  494|       |
  495|       |      // If the MOV is already coalesced into some other interval then merge the
  496|       |      // operand into that interval.
  497|      0|      Instruction *dest = mov;
  498|       |
  499|       |      // Don't handle instructions with target specific lowering because this
  500|       |      // means that we won't release them (and call the target specific hook)
  501|       |      // until the whole register is freed.
  502|      0|      if (isManuallyAllocatedInterval(op))
  ------------------
  |  Branch (502:11): [True: 0, False: 0]
  ------------------
  503|      0|        continue;
  504|       |
  505|       |      // If the mov is already merged into another interval then find the
  506|       |      // destination interval and try to merge the current interval into it.
  507|      0|      while (map.count(dest)) {
  ------------------
  |  Branch (507:14): [True: 0, False: 0]
  ------------------
  508|      0|        dest = map[dest];
  509|      0|      }
  510|       |
  511|      0|      unsigned destIdx = getInstructionNumber(dest);
  512|      0|      unsigned opIdx = getInstructionNumber(op);
  513|      0|      Interval &destIvl = instructionInterval_[destIdx];
  514|      0|      Interval &opIvl = instructionInterval_[opIdx];
  515|       |
  516|      0|      if (destIvl.intersects(opIvl))
  ------------------
  |  Branch (516:11): [True: 0, False: 0]
  ------------------
  517|      0|        continue;
  518|       |
  519|      0|      LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  520|      0|          dbgs() << "Coalescing instruction @" << opIdx << "  " << opIvl
  521|      0|                 << " -> @" << destIdx << "  " << destIvl << "\n");
  522|       |
  523|      0|      for (auto &it : map) {
  ------------------
  |  Branch (523:21): [True: 0, False: 0]
  ------------------
  524|      0|        if (it.second == op) {
  ------------------
  |  Branch (524:13): [True: 0, False: 0]
  ------------------
  525|      0|          LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  526|      0|              dbgs() << "Remapping @" << getInstructionNumber(it.first)
  527|      0|                     << " from @" << opIdx << " to @" << destIdx << "\n");
  528|      0|          it.second = dest;
  529|      0|        }
  530|      0|      }
  531|       |
  532|      0|      instructionInterval_[destIdx].add(opIvl);
  533|      0|      map[op] = dest;
  534|      0|    }
  535|    202|  }
  536|     39|}
_ZN6hermes17RegisterAllocator16allocateFastPassEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  551|   114k|void RegisterAllocator::allocateFastPass(ArrayRef<BasicBlock *> order) {
  552|       |  // Make sure Phis and related Movs get the same register
  553|   153k|  for (auto *bb : order) {
  ------------------
  |  Branch (553:17): [True: 153k, False: 114k]
  ------------------
  554|   872k|    for (auto &inst : *bb) {
  ------------------
  |  Branch (554:21): [True: 872k, False: 153k]
  ------------------
  555|   872k|      handleInstruction(&inst);
  556|   872k|      if (auto *phi = llvh::dyn_cast<PhiInst>(&inst)) {
  ------------------
  |  Branch (556:17): [True: 34, False: 872k]
  ------------------
  557|     34|        auto reg = file.allocateRegister();
  558|     34|        updateRegister(phi, reg);
  559|    102|        for (int i = 0, e = phi->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (559:51): [True: 68, False: 34]
  ------------------
  560|     68|          updateRegister(phi->getEntry(i).first, reg);
  561|     68|        }
  562|     34|      }
  563|   872k|    }
  564|   153k|  }
  565|       |
  566|   114k|  llvh::SmallVector<Register, 16> blockLocals;
  567|       |
  568|       |  // Then just allocate the rest sequentially, while optimizing the case
  569|       |  // where an inst is only ever used in its own block.
  570|   153k|  for (auto *bb : order) {
  ------------------
  |  Branch (570:17): [True: 153k, False: 114k]
  ------------------
  571|   872k|    for (auto &inst : *bb) {
  ------------------
  |  Branch (571:21): [True: 872k, False: 153k]
  ------------------
  572|   872k|      if (!isAllocated(&inst)) {
  ------------------
  |  Branch (572:11): [True: 757k, False: 114k]
  ------------------
  573|   757k|        Register R = file.allocateRegister();
  574|   757k|        updateRegister(&inst, R);
  575|   757k|        if (inst.getNumUsers() == 0) {
  ------------------
  |  Branch (575:13): [True: 310k, False: 447k]
  ------------------
  576|   310k|          file.killRegister(R);
  577|   447k|        } else if (isBlockLocal(&inst)) {
  ------------------
  |  Branch (577:20): [True: 333k, False: 114k]
  ------------------
  578|   333k|          blockLocals.push_back(R);
  579|   333k|        }
  580|   757k|      }
  581|   872k|    }
  582|   333k|    for (auto &reg : blockLocals) {
  ------------------
  |  Branch (582:20): [True: 333k, False: 153k]
  ------------------
  583|   333k|      file.killRegister(reg);
  584|   333k|    }
  585|   153k|    blockLocals.clear();
  586|   153k|  }
  587|   114k|}
_ZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  589|   114k|void RegisterAllocator::allocate(ArrayRef<BasicBlock *> order) {
  590|   114k|  PerfSection regAlloc("Register Allocation");
  591|       |
  592|       |  // Lower PHI nodes into a sequence of MOVs.
  593|   114k|  lowerPhis(order);
  594|       |
  595|   114k|  {
  596|       |    // We have two forms of register allocation: classic and fast pass.
  597|       |    // Classic allocation calculates and merges liveness intervals, fast pass
  598|       |    // just assigns sequentually. The fast pass can be enabled for small
  599|       |    // functions where runtime memory savings will be small, and for large
  600|       |    // functions where degenerate behavior can inflate compile time memory
  601|       |    // usage.
  602|       |
  603|   114k|    unsigned int instructionCount = 0;
  604|   153k|    for (const auto &BB : order) {
  ------------------
  |  Branch (604:25): [True: 153k, False: 114k]
  ------------------
  605|   153k|      instructionCount += BB->getInstList().size();
  606|   153k|    }
  607|       |    // We allocate five bits per instruction per basicblock in our liveness
  608|       |    // sets.
  609|   114k|    uint64_t estimatedMemoryUsage =
  610|   114k|        (uint64_t)order.size() * instructionCount * 5 / 8;
  611|   114k|    if (instructionCount < fastPassThreshold ||
  ------------------
  |  Branch (611:9): [True: 114k, False: 41]
  ------------------
  612|   114k|        estimatedMemoryUsage > memoryLimit) {
  ------------------
  |  Branch (612:9): [True: 2, False: 39]
  ------------------
  613|   114k|      allocateFastPass(order);
  614|   114k|      return;
  615|   114k|    }
  616|   114k|  }
  617|       |
  618|       |  // Number instructions:
  619|    202|  for (auto *BB : order) {
  ------------------
  |  Branch (619:17): [True: 202, False: 39]
  ------------------
  620|   547k|    for (auto &it : *BB) {
  ------------------
  |  Branch (620:19): [True: 547k, False: 202]
  ------------------
  621|   547k|      Instruction *I = &it;
  622|   547k|      auto idx = getInstructionNumber(I);
  623|   547k|      (void)idx;
  624|   547k|      assert(idx == getInstructionNumber(I) && "Invalid numbering");
  625|   547k|    }
  626|    202|  }
  627|       |
  628|       |  // Init the basic block liveness data structure and calculate the local
  629|       |  // liveness for each basic block.
  630|     39|  unsigned maxIdx = getMaxInstrIndex();
  631|    202|  for (auto *BB : order) {
  ------------------
  |  Branch (631:17): [True: 202, False: 39]
  ------------------
  632|    202|    blockLiveness_[BB].init(maxIdx);
  633|    202|  }
  634|    202|  for (auto *BB : order) {
  ------------------
  |  Branch (634:17): [True: 202, False: 39]
  ------------------
  635|    202|    calculateLocalLiveness(blockLiveness_[BB], BB);
  636|    202|  }
  637|       |
  638|       |  // Propagate the local liveness information across the whole function.
  639|     39|  calculateGlobalLiveness(order);
  640|       |
  641|       |  // Calculate the live intervals for each instruction.
  642|     39|  calculateLiveIntervals(order);
  643|       |
  644|       |  // Free the memory used for liveness.
  645|     39|  blockLiveness_.clear();
  646|       |
  647|       |  // Maps coalesced instructions. First uses the register allocated for Second.
  648|     39|  DenseMap<Instruction *, Instruction *> coalesced;
  649|       |
  650|     39|  coalesce(coalesced, order);
  651|       |
  652|       |  // Compare two intervals and return the one that starts first.
  653|     39|  auto startsFirst = [&](unsigned a, unsigned b) {
  654|     39|    Interval &IA = instructionInterval_[a];
  655|     39|    Interval &IB = instructionInterval_[b];
  656|     39|    return IA.start() < IB.start() || (IA.start() == IB.start() && a < b);
  657|     39|  };
  658|       |
  659|       |  // Compare two intervals and return the one that starts first. If two
  660|       |  // intervals end at the same place, schedule the instruction before the
  661|       |  // operands.
  662|       |
  663|     39|  auto endsFirst = [&](unsigned a, unsigned b) {
  664|     39|    auto &aInterval = instructionInterval_[a];
  665|     39|    auto &bInterval = instructionInterval_[b];
  666|     39|    if (bInterval.end() == aInterval.end()) {
  667|     39|      return bInterval.start() > aInterval.start() ||
  668|     39|          (bInterval.start() == aInterval.start() && b > a);
  669|     39|    }
  670|     39|    return bInterval.end() > aInterval.end();
  671|     39|  };
  672|       |
  673|     39|  using InstList = llvh::SmallVector<unsigned, 32>;
  674|       |
  675|     39|  std::priority_queue<unsigned, InstList, decltype(endsFirst)> intervals(
  676|     39|      endsFirst);
  677|       |
  678|   547k|  for (int i = 0, e = getMaxInstrIndex(); i < e; i++) {
  ------------------
  |  Branch (678:43): [True: 547k, False: 39]
  ------------------
  679|   547k|    intervals.push(i);
  680|   547k|  }
  681|       |
  682|     39|  std::priority_queue<unsigned, InstList, decltype(startsFirst)>
  683|     39|      liveIntervalsQueue(startsFirst);
  684|       |
  685|       |  // Perform the register allocation:
  686|   547k|  while (!intervals.empty()) {
  ------------------
  |  Branch (686:10): [True: 547k, False: 39]
  ------------------
  687|   547k|    unsigned instIdx = intervals.top();
  688|   547k|    intervals.pop();
  689|   547k|    Instruction *inst = instructionsByNumbers_[instIdx];
  690|   547k|    Interval &instInterval = instructionInterval_[instIdx];
  691|   547k|    unsigned currentIndex = instInterval.end();
  692|       |
  693|   547k|    LLVM_DEBUG(
  ------------------
  |  |  123|   547k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   547k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 547k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   547k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  694|   547k|        dbgs() << "Looking at index " << currentIndex << ": " << instInterval
  695|   547k|               << " " << inst->getName() << "\n");
  696|       |
  697|       |    // Free all of the intervals that start after the current index.
  698|  1.09M|    while (!liveIntervalsQueue.empty()) {
  ------------------
  |  Branch (698:12): [True: 1.09M, False: 150]
  ------------------
  699|  1.09M|      LLVM_DEBUG(
  ------------------
  |  |  123|  1.09M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.09M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.09M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.09M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  700|  1.09M|          dbgs() << "\t Cleaning up for index " << currentIndex << " PQ("
  701|  1.09M|                 << liveIntervalsQueue.size() << ")\n");
  702|       |
  703|  1.09M|      unsigned topIdx = liveIntervalsQueue.top();
  704|  1.09M|      Interval &range = instructionInterval_[topIdx];
  705|  1.09M|      LLVM_DEBUG(dbgs() << "\t Earliest interval: " << range << "\n");
  ------------------
  |  |  123|  1.09M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.09M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.09M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.09M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  706|       |
  707|       |      // Flush empty intervals and intervals that finished after our index.
  708|  1.09M|      bool nonEmptyInterval = range.size();
  709|  1.09M|      if (range.start() < currentIndex && nonEmptyInterval) {
  ------------------
  |  Branch (709:11): [True: 547k, False: 547k]
  |  Branch (709:43): [True: 547k, False: 0]
  ------------------
  710|   547k|        break;
  711|   547k|      }
  712|       |
  713|   547k|      liveIntervalsQueue.pop();
  714|       |
  715|   547k|      Instruction *I = instructionsByNumbers_[topIdx];
  716|   547k|      Register R = getRegister(I);
  717|   547k|      LLVM_DEBUG(
  ------------------
  |  |  123|   547k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   547k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 547k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   547k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  718|   547k|          dbgs() << "\t Reached idx #" << currentIndex << " deleting inverval "
  719|   547k|                 << range << " that's allocated to register " << R
  720|   547k|                 << " used by instruction " << I->getName() << "\n");
  721|   547k|      file.killRegister(R);
  722|       |
  723|   547k|      handleInstruction(I);
  724|   547k|    }
  725|       |
  726|       |    // Don't try to allocate registers that were merged into other live
  727|       |    // intervals.
  728|   547k|    if (coalesced.count(inst)) {
  ------------------
  |  Branch (728:9): [True: 0, False: 547k]
  ------------------
  729|      0|      continue;
  730|      0|    }
  731|       |
  732|       |    // Allocate a register for the live interval that we are currently handling.
  733|   547k|    if (!isAllocated(inst)) {
  ------------------
  |  Branch (733:9): [True: 547k, False: 39]
  ------------------
  734|   547k|      Register R = file.allocateRegister();
  735|   547k|      updateRegister(inst, R);
  736|   547k|    }
  737|       |
  738|       |    // Mark the current instruction as live and remember to perform target
  739|       |    // specific calls when we are done with the bundle.
  740|   547k|    liveIntervalsQueue.push(instIdx);
  741|   547k|  } // For each instruction in the function.
  742|       |
  743|       |  // Free the remaining intervals.
  744|    122|  while (!liveIntervalsQueue.empty()) {
  ------------------
  |  Branch (744:10): [True: 83, False: 39]
  ------------------
  745|     83|    Instruction *I = instructionsByNumbers_[liveIntervalsQueue.top()];
  746|     83|    LLVM_DEBUG(
  ------------------
  |  |  123|     83|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     83|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 83]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     83|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  747|     83|        dbgs() << "Free register used by instruction " << I->getName() << "\n");
  748|     83|    file.killRegister(getRegister(I));
  749|     83|    handleInstruction(I);
  750|     83|    liveIntervalsQueue.pop();
  751|     83|  }
  752|       |
  753|       |  // Allocate registers for the coalesced registers.
  754|     39|  for (auto &RP : coalesced) {
  ------------------
  |  Branch (754:17): [True: 0, False: 39]
  ------------------
  755|      0|    assert(!isAllocated(RP.first) && "Register should not be allocated");
  756|      0|    Instruction *dest = RP.second;
  757|      0|    updateRegister(RP.first, getRegister(dest));
  758|      0|  }
  759|     39|}
_ZN6hermes17RegisterAllocator22calculateLiveIntervalsEN4llvh8ArrayRefIPNS_10BasicBlockEEE:
  761|     39|void RegisterAllocator::calculateLiveIntervals(ArrayRef<BasicBlock *> order) {
  762|       |  /// Calculate the live intervals for each instruction. Start with a list of
  763|       |  /// intervals that only contain the instruction itself.
  764|   547k|  for (int i = 0, e = instructionsByNumbers_.size(); i < e; ++i) {
  ------------------
  |  Branch (764:54): [True: 547k, False: 39]
  ------------------
  765|       |    // The instructions are ordered consecutively. The start offset of the
  766|       |    // instruction is the index in the array plus one because the value starts
  767|       |    // to live on the next instruction.
  768|   547k|    instructionInterval_[i] = Interval(i + 1, i + 1);
  769|   547k|  }
  770|       |
  771|       |  // For each basic block in the liveness map:
  772|    202|  for (BasicBlock *BB : order) {
  ------------------
  |  Branch (772:23): [True: 202, False: 39]
  ------------------
  773|    202|    BlockLifetimeInfo &liveness = blockLiveness_[BB];
  774|       |
  775|    202|    auto startOffset = getInstructionNumber(&*BB->begin());
  776|    202|    auto endOffset = getInstructionNumber(BB->getTerminator());
  777|       |
  778|       |    // Register fly-through basic blocks (basic blocks where the value enters)
  779|       |    // and leavs without doing anything to any of the operands.
  780|  1.05M|    for (int i = 0, e = liveness.liveOut_.size(); i < e; i++) {
  ------------------
  |  Branch (780:51): [True: 1.05M, False: 202]
  ------------------
  781|  1.05M|      bool leavs = liveness.liveOut_.test(i);
  782|  1.05M|      bool enters = liveness.liveIn_.test(i);
  783|  1.05M|      if (leavs && enters) {
  ------------------
  |  Branch (783:11): [True: 610, False: 1.05M]
  |  Branch (783:20): [True: 598, False: 12]
  ------------------
  784|    598|        instructionInterval_[i].add(Segment(startOffset, endOffset + 1));
  785|    598|      }
  786|  1.05M|    }
  787|       |
  788|       |    // For each instruction in the block:
  789|   547k|    for (auto &it : *BB) {
  ------------------
  |  Branch (789:19): [True: 547k, False: 202]
  ------------------
  790|   547k|      auto instOffset = getInstructionNumber(&it);
  791|       |      // The instruction is defined in this basic block. Check if it is leaving
  792|       |      // the basic block extend the interval until the end of the block.
  793|   547k|      if (liveness.liveOut_.test(instOffset)) {
  ------------------
  |  Branch (793:11): [True: 12, False: 547k]
  ------------------
  794|     12|        instructionInterval_[instOffset].add(
  795|     12|            Segment(instOffset + 1, endOffset + 1));
  796|     12|        assert(
  797|     12|            !liveness.liveIn_.test(instOffset) &&
  798|     12|            "Livein but also killed in this block?");
  799|     12|      }
  800|       |
  801|       |      // Extend the lifetime of the operands.
  802|  2.68M|      for (int i = 0, e = it.getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (802:48): [True: 2.14M, False: 547k]
  ------------------
  803|  2.14M|        auto instOp = llvh::dyn_cast<Instruction>(it.getOperand(i));
  804|  2.14M|        if (!instOp)
  ------------------
  |  Branch (804:13): [True: 1.11M, False: 1.02M]
  ------------------
  805|  1.11M|          continue;
  806|       |
  807|  1.02M|        if (!hasInstructionNumber(instOp)) {
  ------------------
  |  Branch (807:13): [True: 0, False: 1.02M]
  ------------------
  808|      0|          assert(
  809|      0|              llvh::isa<PhiInst>(&it) &&
  810|      0|              "Only PhiInst should reference values from dead code");
  811|      0|          continue;
  812|      0|        }
  813|       |
  814|  1.02M|        auto operandIdx = getInstructionNumber(instOp);
  815|       |        // Extend the lifetime of the interval to reach this instruction.
  816|       |        // Include this instruction in the interval in order to make sure that
  817|       |        // the register is not freed before the use.
  818|       |
  819|  1.02M|        auto start = operandIdx + 1;
  820|  1.02M|        auto end = instOffset + 1;
  821|  1.02M|        if (start < end) {
  ------------------
  |  Branch (821:13): [True: 1.02M, False: 0]
  ------------------
  822|  1.02M|          auto seg = Segment(operandIdx + 1, instOffset + 1);
  823|  1.02M|          instructionInterval_[operandIdx].add(seg);
  824|  1.02M|        }
  825|  1.02M|      }
  826|       |
  827|       |      // Extend the lifetime of the PHI to include the source basic blocks.
  828|   547k|      if (auto *P = llvh::dyn_cast<PhiInst>(&it)) {
  ------------------
  |  Branch (828:17): [True: 0, False: 547k]
  ------------------
  829|      0|        for (int i = 0, e = P->getNumEntries(); i < e; i++) {
  ------------------
  |  Branch (829:49): [True: 0, False: 0]
  ------------------
  830|      0|          auto E = P->getEntry(i);
  831|       |          // PhiInsts may reference instructions from dead code blocks
  832|       |          // (which will be unnumbered and unallocated). Since the edge
  833|       |          // is necessarily also dead, we can just skip it.
  834|      0|          if (!hasInstructionNumber(E.second->getTerminator()))
  ------------------
  |  Branch (834:15): [True: 0, False: 0]
  ------------------
  835|      0|            continue;
  836|       |
  837|      0|          unsigned termIdx = getInstructionNumber(E.second->getTerminator());
  838|      0|          Segment S(termIdx, termIdx + 1);
  839|      0|          instructionInterval_[instOffset].add(S);
  840|       |
  841|       |          // Extend the lifetime of the predecessor to the end of the BB.
  842|      0|          if (auto *instOp = llvh::dyn_cast<Instruction>(E.first)) {
  ------------------
  |  Branch (842:21): [True: 0, False: 0]
  ------------------
  843|      0|            auto predIdx = getInstructionNumber(instOp);
  844|      0|            auto S2 = Segment(predIdx + 1, termIdx);
  845|      0|            instructionInterval_[predIdx].add(S2);
  846|      0|          }
  847|      0|        } // each pred.
  848|      0|      }
  849|       |
  850|   547k|    } // for each instruction in the block.
  851|    202|  } // for each block.
  852|     39|}
_ZN6hermes17RegisterAllocator11getRegisterEPNS_5ValueE:
  895|  3.91M|Register RegisterAllocator::getRegister(Value *I) {
  896|  3.91M|  assert(isAllocated(I) && "Instruction is not allocated!");
  897|      0|  return allocated[I];
  898|  3.91M|}
_ZN6hermes17RegisterAllocator14updateRegisterEPNS_5ValueENS_8RegisterE:
  900|  1.71M|void RegisterAllocator::updateRegister(Value *I, Register R) {
  901|  1.71M|  allocated[I] = R;
  902|  1.71M|}
_ZN6hermes17RegisterAllocator11isAllocatedEPNS_5ValueE:
  904|  5.89M|bool RegisterAllocator::isAllocated(Value *I) {
  905|  5.89M|  return allocated.count(I);
  906|  5.89M|}
_ZN6hermes17RegisterAllocator7reserveEN4llvh8ArrayRefIPNS_5ValueEEE:
  912|   114k|Register RegisterAllocator::reserve(ArrayRef<Value *> values) {
  913|   114k|  assert(!values.empty() && "Can't reserve zero registers");
  914|      0|  Register first = file.tailAllocateConsecutive(values.size());
  915|       |
  916|   114k|  Register T = first;
  917|   114k|  for (auto *v : values) {
  ------------------
  |  Branch (917:16): [True: 114k, False: 114k]
  ------------------
  918|   114k|    if (v)
  ------------------
  |  Branch (918:9): [True: 114k, False: 0]
  ------------------
  919|   114k|      allocated[v] = T;
  920|   114k|    T = T.getConsecutive();
  921|   114k|  }
  922|       |
  923|   114k|  return first;
  924|   114k|}
_ZN6hermes17RegisterAllocator20hasInstructionNumberEPNS_11InstructionE:
  926|  1.02M|bool RegisterAllocator::hasInstructionNumber(Instruction *I) {
  927|  1.02M|  return instructionNumbers_.count(I);
  928|  1.02M|}
_ZN6hermes17RegisterAllocator20getInstructionNumberEPNS_11InstructionE:
  930|  4.23M|unsigned RegisterAllocator::getInstructionNumber(Instruction *I) {
  931|  4.23M|  auto it = instructionNumbers_.find(I);
  932|  4.23M|  if (it != instructionNumbers_.end()) {
  ------------------
  |  Branch (932:7): [True: 3.68M, False: 547k]
  ------------------
  933|  3.68M|    return it->second;
  934|  3.68M|  }
  935|       |
  936|   547k|  instructionsByNumbers_.push_back(I);
  937|   547k|  instructionInterval_.push_back(Interval());
  938|       |
  939|   547k|  unsigned newIdx = instructionsByNumbers_.size() - 1;
  940|   547k|  instructionNumbers_[I] = newIdx;
  941|   547k|  return newIdx;
  942|  4.23M|}
_ZN6hermes21ScopeRegisterAnalysisC2EPNS_8FunctionERNS_17RegisterAllocatorE:
  959|   114k|    : RA_(RA) {
  960|       |  // Initialize the ScopeDesc -> ScopeCreationInst map; if emitting full debug
  961|       |  // info, scopeCreationInsts will be used to reserve/pre-allocate the
  962|       |  // environment registers for scopes in F.
  963|   114k|  llvh::SmallVector<Value *, 4> scopeCreationInsts;
  964|   267k|  for (BasicBlock &BB : *F) {
  ------------------
  |  Branch (964:23): [True: 267k, False: 114k]
  ------------------
  965|  1.53M|    for (Instruction &I : BB) {
  ------------------
  |  Branch (965:25): [True: 1.53M, False: 267k]
  ------------------
  966|  1.53M|      if (llvh::isa<HBCResolveEnvironment>(I)) {
  ------------------
  |  Branch (966:11): [True: 0, False: 1.53M]
  ------------------
  967|       |        // HBCResolveEnvironment instructions are used to fetch an environment
  968|       |        // outside of F. The debugger doesn't need access to these "resolved"
  969|       |        // environment.
  970|      0|        continue;
  971|  1.53M|      } else if (auto *SCI = llvh::dyn_cast<ScopeCreationInst>(&I)) {
  ------------------
  |  Branch (971:24): [True: 114k, False: 1.41M]
  ------------------
  972|   114k|        assert(
  973|   114k|            SCI->getCreatedScopeDesc()->getFunction() == F &&
  974|   114k|            "ScopeCreationInst that is creating a scope of another function");
  975|      0|        scopeCreationInsts_[SCI->getCreatedScopeDesc()] = SCI;
  976|   114k|        if (preallocateScopeRegisters(F->getContext())) {
  ------------------
  |  Branch (976:13): [True: 114k, False: 0]
  ------------------
  977|   114k|          LLVM_DEBUG(
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  978|   114k|              llvh::dbgs() << "Reserving register for ScopeCreationInst in "
  979|   114k|                           << F->getOriginalOrInferredName() << "\n");
  980|   114k|          scopeCreationInsts.push_back(SCI);
  981|   114k|        }
  982|   114k|      }
  983|  1.53M|    }
  984|   267k|  }
  985|       |
  986|   114k|  if (!scopeCreationInsts.empty()) {
  ------------------
  |  Branch (986:7): [True: 114k, False: 0]
  ------------------
  987|   114k|    RA_.reserve(scopeCreationInsts);
  988|   114k|  }
  989|   114k|}
RegAlloc.cpp:_ZL12phiReadWritePN6hermes7PhiInstE:
  132|     34|static bool phiReadWrite(PhiInst *P) {
  133|     34|  bool localPhiUse = false;
  134|     34|  bool externalUse = false;
  135|     34|  bool terminatorUse = false;
  136|       |
  137|     34|  BasicBlock *parent = P->getParent();
  138|       |
  139|     34|  for (auto *U : P->getUsers()) {
  ------------------
  |  Branch (139:16): [True: 34, False: 34]
  ------------------
  140|     34|    terminatorUse |= llvh::isa<TerminatorInst>(U);
  141|     34|    localPhiUse |=
  142|     34|        (llvh::isa<PhiInst>(U) && U->getParent() == parent && P != U);
  ------------------
  |  Branch (142:10): [True: 0, False: 34]
  |  Branch (142:35): [True: 0, False: 0]
  |  Branch (142:63): [True: 0, False: 0]
  ------------------
  143|     34|    externalUse |= U->getParent() != parent;
  144|     34|  }
  145|       |
  146|       |  // TODO: the code used to perform a stricter check which missed some cases.
  147|       |  // TODO: need to come up with a better condition.
  148|       |  // bool localWrite = false;
  149|       |  // for (int i = 0, limit = P->getNumEntries(); !localWrite && i < limit; ++i)
  150|       |  // {
  151|       |  //   auto entry = P->getEntry(i);
  152|       |  //   localWrite |= entry.first != P && entry.second == parent;
  153|       |  // }
  154|       |  // return terminatorUse || localPhiUse || (externalUse && localWrite);
  155|       |
  156|     34|  return terminatorUse || localPhiUse || externalUse;
  ------------------
  |  Branch (156:10): [True: 0, False: 34]
  |  Branch (156:27): [True: 0, False: 34]
  |  Branch (156:42): [True: 0, False: 34]
  ------------------
  157|     34|}
RegAlloc.cpp:_ZN12_GLOBAL__N_112isBlockLocalEPN6hermes11InstructionE:
  540|   447k|bool isBlockLocal(Instruction *inst) {
  541|   447k|  BasicBlock *parent = inst->getParent();
  542|   450k|  for (auto user : inst->getUsers()) {
  ------------------
  |  Branch (542:18): [True: 450k, False: 333k]
  ------------------
  543|   450k|    if (parent != user->getParent()) {
  ------------------
  |  Branch (543:9): [True: 114k, False: 336k]
  ------------------
  544|   114k|      return false;
  545|   114k|    }
  546|   450k|  }
  547|   333k|  return true;
  548|   447k|}
RegAlloc.cpp:_ZN12_GLOBAL__N_125preallocateScopeRegistersERKN6hermes7ContextE:
  953|   114k|static bool preallocateScopeRegisters(const Context &c) {
  954|   114k|  return c.getDebugInfoSetting() == DebugInfoSetting::ALL;
  955|   114k|}
RegAlloc.cpp:_ZZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEEENK3$_2clEjj:
  663|  19.0M|  auto endsFirst = [&](unsigned a, unsigned b) {
  664|  19.0M|    auto &aInterval = instructionInterval_[a];
  665|  19.0M|    auto &bInterval = instructionInterval_[b];
  666|  19.0M|    if (bInterval.end() == aInterval.end()) {
  ------------------
  |  Branch (666:9): [True: 358k, False: 18.6M]
  ------------------
  667|   358k|      return bInterval.start() > aInterval.start() ||
  ------------------
  |  Branch (667:14): [True: 252k, False: 105k]
  ------------------
  668|   358k|          (bInterval.start() == aInterval.start() && b > a);
  ------------------
  |  Branch (668:12): [True: 0, False: 105k]
  |  Branch (668:54): [True: 0, False: 0]
  ------------------
  669|   358k|    }
  670|  18.6M|    return bInterval.end() > aInterval.end();
  671|  19.0M|  };
RegAlloc.cpp:_ZZN6hermes17RegisterAllocator8allocateEN4llvh8ArrayRefIPNS_10BasicBlockEEEENK3$_1clEjj:
  653|  3.52M|  auto startsFirst = [&](unsigned a, unsigned b) {
  654|  3.52M|    Interval &IA = instructionInterval_[a];
  655|  3.52M|    Interval &IB = instructionInterval_[b];
  656|  3.52M|    return IA.start() < IB.start() || (IA.start() == IB.start() && a < b);
  ------------------
  |  Branch (656:12): [True: 2.03M, False: 1.48M]
  |  Branch (656:40): [True: 0, False: 1.48M]
  |  Branch (656:68): [True: 0, False: 0]
  ------------------
  657|  3.52M|  };

_ZN6hermes17PostOrderAnalysis14visitPostOrderEPNS_10BasicBlockERNSt3__16vectorIS2_NS3_9allocatorIS2_EEEE:
   28|   342k|void PostOrderAnalysis::visitPostOrder(BasicBlock *BB, BlockList &order) {
   29|   342k|  struct State {
   30|   342k|    BasicBlock *BB;
   31|   342k|    succ_iterator cur, end;
   32|   342k|    explicit State(BasicBlock *BB)
   33|   342k|        : BB(BB), cur(succ_begin(BB)), end(succ_end(BB)) {}
   34|   342k|  };
   35|       |
   36|   342k|  llvh::SmallPtrSet<BasicBlock *, 16> visited{};
   37|   342k|  llvh::SmallVector<State, 32> stack{};
   38|       |
   39|   342k|  stack.emplace_back(BB);
   40|   461k|  do {
   41|   580k|    while (stack.back().cur != stack.back().end) {
  ------------------
  |  Branch (41:12): [True: 118k, False: 461k]
  ------------------
   42|   118k|      BB = *stack.back().cur++;
   43|   118k|      if (visited.insert(BB).second)
  ------------------
  |  Branch (43:11): [True: 118k, False: 233]
  ------------------
   44|   118k|        stack.emplace_back(BB);
   45|   118k|    }
   46|       |
   47|   461k|    order.push_back(stack.back().BB);
   48|   461k|    stack.pop_back();
   49|   461k|  } while (!stack.empty());
  ------------------
  |  Branch (49:12): [True: 118k, False: 342k]
  ------------------
   50|   342k|}
_ZN6hermes17PostOrderAnalysisC2EPNS_8FunctionE:
   52|   342k|PostOrderAnalysis::PostOrderAnalysis(Function *F) : ctx_(F->getContext()) {
   53|   342k|  assert(Order.empty() && "vector must be empty");
   54|       |
   55|      0|  BasicBlock *entry = &*F->begin();
   56|       |
   57|       |  // Finally, do an PO scan from the entry block.
   58|   342k|  visitPostOrder(entry, Order);
   59|       |
   60|   342k|  assert(
   61|   342k|      !Order.empty() && Order[Order.size() - 1] == entry &&
   62|   342k|      "Entry block must be the last element in the vector");
   63|   342k|}
_ZN6hermes21FunctionScopeAnalysis13computeParentEPNS_9ScopeDescES2_RKNS0_9ScopeDataE:
  220|   114k|    const ScopeData &sd) {
  221|   114k|  return (parentScope->hasFunction() &&
  ------------------
  |  Branch (221:11): [True: 114k, False: 56]
  ------------------
  222|   114k|          parentScope->getFunction() != thisScope->getFunction())
  ------------------
  |  Branch (222:11): [True: 114k, False: 0]
  ------------------
  223|   114k|      ? parentScope->getFunction()
  224|   114k|      : sd.parent;
  225|   114k|}
_ZN6hermes21FunctionScopeAnalysis26calculateFunctionScopeDataEPNS_9ScopeDescEN4llvh8OptionalIiEE:
  230|   228k|    llvh::Optional<int> depth) {
  231|   228k|  auto entry = lexicalScopeDescMap_.find(scopeDesc);
  232|   228k|  if (entry != lexicalScopeDescMap_.end()) {
  ------------------
  |  Branch (232:7): [True: 114k, False: 114k]
  ------------------
  233|   114k|    return entry->second;
  234|   114k|  }
  235|       |
  236|   114k|  if (!scopeDesc->hasFunction()) {
  ------------------
  |  Branch (236:7): [True: 56, False: 114k]
  ------------------
  237|       |    // The only scope that doesn't have a function is the Module's initial
  238|       |    // scope.
  239|     56|    assert(scopeDesc->getParent() == nullptr);
  240|   114k|  } else {
  241|       |    // If the function is a CommonJS module,
  242|       |    // then it won't have a CreateFunctionInst, so calculate the depth manually.
  243|   114k|    Function *F = scopeDesc->getFunction();
  244|   114k|    Module *module = F->getParent();
  245|   114k|    if (module->findCJSModule(F)) {
  ------------------
  |  Branch (245:9): [True: 0, False: 114k]
  ------------------
  246|      0|      return ScopeData{module->getTopLevelFunction(), 1, false};
  247|      0|    }
  248|   114k|  }
  249|       |
  250|   114k|  ScopeData ret = ScopeData::orphan();
  251|   114k|  if (ScopeDesc *parentScope = scopeDesc->getParent()) {
  ------------------
  |  Branch (251:18): [True: 114k, False: 56]
  ------------------
  252|   114k|    ScopeData parentData =
  253|   114k|        calculateFunctionScopeData(parentScope, nextScopeDepth(depth));
  254|   114k|    if (!parentData.orphaned && (parentData.depth >= 0 || depth)) {
  ------------------
  |  Branch (254:9): [True: 114k, False: 0]
  |  Branch (254:34): [True: 114k, False: 56]
  |  Branch (254:59): [True: 56, False: 0]
  ------------------
  255|   114k|      assert(!depth || (depth == parentData.depth));
  256|      0|      ret = ScopeData(
  257|   114k|          computeParent(scopeDesc, parentScope, parentData),
  258|   114k|          parentData.depth + 1);
  259|   114k|    }
  260|   114k|  } else if (depth) {
  ------------------
  |  Branch (260:14): [True: 56, False: 0]
  ------------------
  261|     56|    ret = ScopeData(nullptr, *depth);
  262|     56|  }
  263|       |
  264|   114k|  LLVM_DEBUG({
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:69): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  265|   114k|    if (ret.orphaned) {
  266|   114k|      dbgs() << "Orphaned scope in function \""
  267|   114k|             << scopeDesc->getFunction()->getInternalNameStr() << "\"\n";
  268|   114k|    }
  269|   114k|  });
  270|       |
  271|   114k|  lexicalScopeDescMap_[scopeDesc] = ret;
  272|   114k|  return ret;
  273|   114k|}
_ZN6hermes21FunctionScopeAnalysis16getLexicalParentEPNS_8FunctionE:
  282|   114k|Function *FunctionScopeAnalysis::getLexicalParent(Function *F) {
  283|   114k|  return calculateFunctionScopeData(F->getFunctionScopeDesc()).parent;
  284|   114k|}
Analysis.cpp:_ZL14nextScopeDepthRN4llvh8OptionalIiEE:
  210|   114k|static llvh::Optional<int> &nextScopeDepth(llvh::Optional<int> &depth) {
  211|   114k|  if (depth) {
  ------------------
  |  Branch (211:7): [True: 56, False: 114k]
  ------------------
  212|     56|    *depth -= 1;
  213|     56|  }
  214|   114k|  return depth;
  215|   114k|}
Analysis.cpp:_ZZN6hermes17PostOrderAnalysis14visitPostOrderEPNS_10BasicBlockERNSt3__16vectorIS2_NS3_9allocatorIS2_EEEEEN5StateC2ES2_:
   33|   461k|        : BB(BB), cur(succ_begin(BB)), end(succ_end(BB)) {}

_ZN6hermes13DominanceInfoC2EPNS_8FunctionE:
   18|      2|DominanceInfo::DominanceInfo(Function *F) : DominatorTreeBase() {
   19|      2|  assert(F->begin() != F->end() && "Function is empty!");
   20|      0|  recalculate(*F);
   21|      2|}

_ZN6hermes5Value7destroyEPS0_:
   49|  3.34M|void Value::destroy(Value *V) {
   50|  3.34M|  if (!V)
  ------------------
  |  Branch (50:7): [True: 674, False: 3.34M]
  ------------------
   51|    674|    return;
   52|       |
   53|  3.34M|  switch (V->Kind) {
   54|      0|    default:
  ------------------
  |  Branch (54:5): [True: 0, False: 3.34M]
  ------------------
   55|      0|      llvm_unreachable("Invalid kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   56|      0|#define DEF_VALUE(XX, PARENT) \
   57|      0|  case ValueKind::XX##Kind:   \
   58|      0|    delete cast<XX>(V);       \
   59|      0|    break;
   60|      0|#include "hermes/IR/ValueKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef DEF_VALUE
  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |   10|       |#endif
  |  |   11|      0|#ifndef MARK_FIRST
  |  |   12|      0|#define MARK_FIRST(NAME)
  |  |   13|      0|#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|      0|#ifndef MARK_VALUE
  |  |   18|      0|#define MARK_VALUE(NAME)
  |  |   19|      0|#endif
  |  |   20|       |
  |  |   21|      0|MARK_FIRST(Value)
  |  |   22|      0|MARK_VALUE(Value)
  |  |   23|       |
  |  |   24|      0|MARK_FIRST(Instruction)
  |  |   25|      0|DEF_VALUE(Instruction, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   26|      0|#define INCLUDED_FROM_VALUEKINDS
  |  |   27|      0|#include "hermes/IR/Instrs.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |#ifndef DEF_VALUE
  |  |  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |  |  |   10|       |#endif
  |  |  |  |   11|       |#ifndef MARK_FIRST
  |  |  |  |   12|       |#define MARK_FIRST(NAME)
  |  |  |  |   13|       |#endif
  |  |  |  |   14|       |#ifndef MARK_LAST
  |  |  |  |   15|       |#define MARK_LAST(NAME)
  |  |  |  |   16|       |#endif
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef TERMINATOR
  |  |  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |  |  |   24|      0|#endif
  |  |  |  |   25|       |
  |  |  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   28|   114k|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   30|   114k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   32|      0|#endif
  |  |  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |  |  |   34|       |
  |  |  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   38|      4|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      4|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      4|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      4|    break;
  |  |  |  |  ------------------
  |  |  |  |   39|      2|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      2|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      2|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      2|    break;
  |  |  |  |  ------------------
  |  |  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   41|    105|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    105|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 105, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    105|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    105|    break;
  |  |  |  |  ------------------
  |  |  |  |   42|   264k|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   264k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 264k, False: 3.07M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   264k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   264k|    break;
  |  |  |  |  ------------------
  |  |  |  |   43|    283|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    283|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 283, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    283|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    283|    break;
  |  |  |  |  ------------------
  |  |  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   45|  4.00k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  4.00k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4.00k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  4.00k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  4.00k|    break;
  |  |  |  |  ------------------
  |  |  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   48|   114k|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   49|   114k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   51|      2|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      2|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      2|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      2|    break;
  |  |  |  |  ------------------
  |  |  |  |   52|  2.87k|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  2.87k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 2.87k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  2.87k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  2.87k|    break;
  |  |  |  |  ------------------
  |  |  |  |   53|      0|#endif
  |  |  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |  |  |   55|       |
  |  |  |  |   56|     34|DEF_VALUE(PhiInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     34|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 34, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     34|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     34|    break;
  |  |  |  |  ------------------
  |  |  |  |   57|  65.0k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  65.0k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 65.0k, False: 3.27M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  65.0k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  65.0k|    break;
  |  |  |  |  ------------------
  |  |  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |  |  |   59|  3.78k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  3.78k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 3.78k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  3.78k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  3.78k|    break;
  |  |  |  |  ------------------
  |  |  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |  |  |   62|       |
  |  |  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |  |  |   64|   230k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   230k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 230k, False: 3.11M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   230k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   230k|    break;
  |  |  |  |  ------------------
  |  |  |  |   65|  4.16k|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  4.16k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4.16k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  4.16k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  4.16k|    break;
  |  |  |  |  ------------------
  |  |  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |  |  |   67|       |
  |  |  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |  |  |   71|     22|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     22|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 22, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     22|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     22|    break;
  |  |  |  |  ------------------
  |  |  |  |   72|   131k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   131k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 131k, False: 3.21M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   131k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   131k|    break;
  |  |  |  |  ------------------
  |  |  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |  |  |   74|  10.8k|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  10.8k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 10.8k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  10.8k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  10.8k|    break;
  |  |  |  |  ------------------
  |  |  |  |   75|   128k|DEF_VALUE(StoreStackInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   128k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 128k, False: 3.21M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   128k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   128k|    break;
  |  |  |  |  ------------------
  |  |  |  |   76|   114k|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   77|    129|DEF_VALUE(AllocStackInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    129|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 129, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    129|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    129|    break;
  |  |  |  |  ------------------
  |  |  |  |   78|  4.16k|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  4.16k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 4.16k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  4.16k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  4.16k|    break;
  |  |  |  |  ------------------
  |  |  |  |   79|  33.4k|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  33.4k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 33.4k, False: 3.30M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  33.4k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  33.4k|    break;
  |  |  |  |  ------------------
  |  |  |  |   80|  5.04k|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  5.04k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 5.04k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  5.04k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  5.04k|    break;
  |  |  |  |  ------------------
  |  |  |  |   81|   114k|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   82|     12|DEF_VALUE(CatchInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     12|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 12, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     12|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     12|    break;
  |  |  |  |  ------------------
  |  |  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   84|  11.4k|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  11.4k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 11.4k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  11.4k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  11.4k|    break;
  |  |  |  |  ------------------
  |  |  |  |   85|     12|DEF_VALUE(TryEndInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     12|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 12, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     12|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     12|    break;
  |  |  |  |  ------------------
  |  |  |  |   86|      5|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      5|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 5, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      5|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      5|    break;
  |  |  |  |  ------------------
  |  |  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   88|     12|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     12|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 12, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     12|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     12|    break;
  |  |  |  |  ------------------
  |  |  |  |   89|      6|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      6|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 6, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      6|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      6|    break;
  |  |  |  |  ------------------
  |  |  |  |   90|     18|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|     18|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 18, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|     18|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|     18|    break;
  |  |  |  |  ------------------
  |  |  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |   92|   114k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   93|  10.8k|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  10.8k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 10.8k, False: 3.33M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  10.8k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  10.8k|    break;
  |  |  |  |  ------------------
  |  |  |  |   94|      0|#endif
  |  |  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |   96|       |
  |  |  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |  |  |   98|   114k|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  101|   114k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|   114k|    break;
  |  |  |  |  ------------------
  |  |  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  103|      0|#endif
  |  |  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  |  |  107|       |#endif
  |  |  |  |  108|       |
  |  |  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  111|  39.4k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  39.4k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|  39.4k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 39.4k, False: 3.30M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|  39.4k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|  39.4k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  112|   228k|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|   228k|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|   228k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 228k, False: 3.11M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|   228k|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|   228k|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  113|      6|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      6|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      6|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 6, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      6|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      6|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  115|     71|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|     71|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|     71|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 71, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|     71|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|     71|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  119|     12|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|     12|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|     12|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 12, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|     12|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|     12|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  |  |  124|       |
  |  |  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  |  |  126|    291|DEF_VALUE(CallInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    291|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 291, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    291|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    291|    break;
  |  |  |  |  ------------------
  |  |  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  128|    283|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    283|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 283, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    283|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    283|    break;
  |  |  |  |  ------------------
  |  |  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  133|      0|#endif
  |  |  |  |  134|      0|MARK_LAST(CallInst)
  |  |  |  |  135|       |
  |  |  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  139|       |
  |  |  |  |  140|       |// These are target dependent instructions:
  |  |  |  |  141|       |
  |  |  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  |  |  143|  62.5k|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|  62.5k|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 62.5k, False: 3.28M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|  62.5k|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|  62.5k|    break;
  |  |  |  |  ------------------
  |  |  |  |  144|      5|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      5|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 5, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      5|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      5|    break;
  |  |  |  |  ------------------
  |  |  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  148|    880|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|    880|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 880, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|    880|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|    880|    break;
  |  |  |  |  ------------------
  |  |  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  |  |  ------------------
  |  |  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |  |  |   59|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  150|      0|#endif
  |  |  |  |  151|       |
  |  |  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  |  |  153|       |
  |  |  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  |  |  155|       |// these macros are still used after the #include.
  |  |  |  |  156|       |#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  |  |  157|       |#undef DEF_VALUE
  |  |  |  |  158|       |#undef MARK_FIRST
  |  |  |  |  159|       |#undef MARK_LAST
  |  |  |  |  160|       |#undef TERMINATOR
  |  |  |  |  161|       |#endif
  |  |  ------------------
  |  |   28|      0|#undef INCLUDED_FROM_VALUEKINDS
  |  |   29|      0|MARK_LAST(Instruction)
  |  |   30|       |
  |  |   31|      0|MARK_FIRST(Literal)
  |  |   32|      0|DEF_VALUE(Literal, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   33|      0|DEF_VALUE(LiteralEmpty, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   34|      0|DEF_VALUE(LiteralUndefined, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   35|      0|DEF_VALUE(LiteralNull, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   36|   220k|DEF_VALUE(LiteralNumber, Literal)
  |  |  ------------------
  |  |  |  |   57|   220k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 220k, False: 3.12M]
  |  |  |  |  ------------------
  |  |  |  |   58|   220k|    delete cast<XX>(V);       \
  |  |  |  |   59|   220k|    break;
  |  |  ------------------
  |  |   37|      0|DEF_VALUE(LiteralBigInt, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   38|  4.10k|DEF_VALUE(LiteralString, Literal)
  |  |  ------------------
  |  |  |  |   57|  4.10k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 4.10k, False: 3.33M]
  |  |  |  |  ------------------
  |  |  |  |   58|  4.10k|    delete cast<XX>(V);       \
  |  |  |  |   59|  4.10k|    break;
  |  |  ------------------
  |  |   39|      0|DEF_VALUE(LiteralBool, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   40|      0|DEF_VALUE(GlobalObject, Literal)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   41|      0|MARK_LAST(Literal)
  |  |   42|       |
  |  |   43|   114k|DEF_VALUE(ScopeDesc, Value)
  |  |  ------------------
  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  ------------------
  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |   59|   114k|    break;
  |  |  ------------------
  |  |   44|      0|DEF_VALUE(EmptySentinel, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   45|      0|DEF_VALUE(Label, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   46|  3.40k|DEF_VALUE(GlobalObjectProperty, Value)
  |  |  ------------------
  |  |  |  |   57|  3.40k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 3.40k, False: 3.33M]
  |  |  |  |  ------------------
  |  |  |  |   58|  3.40k|    delete cast<XX>(V);       \
  |  |  |  |   59|  3.40k|    break;
  |  |  ------------------
  |  |   47|   114k|DEF_VALUE(Variable, Value)
  |  |  ------------------
  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  ------------------
  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |   59|   114k|    break;
  |  |  ------------------
  |  |   48|   228k|DEF_VALUE(Parameter, Value)
  |  |  ------------------
  |  |  |  |   57|   228k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 228k, False: 3.11M]
  |  |  |  |  ------------------
  |  |  |  |   58|   228k|    delete cast<XX>(V);       \
  |  |  |  |   59|   228k|    break;
  |  |  ------------------
  |  |   49|   267k|DEF_VALUE(BasicBlock, Value)
  |  |  ------------------
  |  |  |  |   57|   267k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 267k, False: 3.07M]
  |  |  |  |  ------------------
  |  |  |  |   58|   267k|    delete cast<XX>(V);       \
  |  |  |  |   59|   267k|    break;
  |  |  ------------------
  |  |   50|      0|MARK_FIRST(Function)
  |  |   51|   114k|DEF_VALUE(Function, Value)
  |  |  ------------------
  |  |  |  |   57|   114k|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 114k, False: 3.22M]
  |  |  |  |  ------------------
  |  |  |  |   58|   114k|    delete cast<XX>(V);       \
  |  |  |  |   59|   114k|    break;
  |  |  ------------------
  |  |   52|      0|DEF_VALUE(GeneratorFunction, Function)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   53|      0|DEF_VALUE(GeneratorInnerFunction, Function)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   54|      0|DEF_VALUE(AsyncFunction, Function)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   55|      0|MARK_LAST(Function)
  |  |   56|      0|DEF_VALUE(Module, Value)
  |  |  ------------------
  |  |  |  |   57|      0|  case ValueKind::XX##Kind:   \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (57:3): [True: 0, False: 3.34M]
  |  |  |  |  ------------------
  |  |  |  |   58|      0|    delete cast<XX>(V);       \
  |  |  |  |   59|      0|    break;
  |  |  ------------------
  |  |   57|       |
  |  |   58|      0|MARK_LAST(Value)
  |  |   59|       |
  |  |   60|      0|#undef DEF_VALUE
  |  |   61|      0|#undef MARK_FIRST
  |  |   62|      0|#undef MARK_LAST
  |  |   63|      0|#undef MARK_VALUE
  ------------------
   61|  3.34M|  }
   62|  3.34M|}
_ZNK6hermes5Value8getUsersEv:
   75|   447k|const Value::UseListTy &Value::getUsers() const {
   76|   447k|  return Users;
   77|   447k|}
_ZNK6hermes5Value11getNumUsersEv:
   79|   757k|unsigned Value::getNumUsers() const {
   80|   757k|  return Users.size();
   81|   757k|}
_ZNK6hermes5Value8hasUsersEv:
   83|   228k|bool Value::hasUsers() const {
   84|   228k|  return Users.size();
   85|   228k|}
_ZN6hermes5Value9removeUseENSt3__14pairIPS0_jEE:
   91|  2.32M|void Value::removeUse(Use U) {
   92|  2.32M|  assert(Users.size() && "Removing a user from an empty list");
   93|      0|  assert(U.first == this && "Invalid user");
   94|       |
   95|       |  // We don't care about the order of the operands in the use vector. One cheap
   96|       |  // way to delete an element is to pop the last element and save it on top of
   97|       |  // the element that we want to remove. This is faster than moving the whole
   98|       |  // array.
   99|      0|  Users[U.second] = Users.back();
  100|  2.32M|  Users.pop_back();
  101|       |
  102|       |  // If we've changed the location of a use in the use list then we need to
  103|       |  // update the operand in the user.
  104|  2.32M|  if (U.second != Users.size()) {
  ------------------
  |  Branch (104:7): [True: 1.49M, False: 823k]
  ------------------
  105|  1.49M|    Use oldUse = {this, static_cast<unsigned>(Users.size())};
  106|  1.49M|    auto &operands = Users[U.second]->Operands;
  107|   657M|    for (int i = 0, e = operands.size(); i < e; i++) {
  ------------------
  |  Branch (107:42): [True: 657M, False: 0]
  ------------------
  108|   657M|      if (operands[i] == oldUse) {
  ------------------
  |  Branch (108:11): [True: 1.49M, False: 655M]
  ------------------
  109|  1.49M|        operands[i] = {this, U.second};
  110|  1.49M|        return;
  111|  1.49M|      }
  112|   657M|    }
  113|      0|    llvm_unreachable("Can't find user in operand list");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  114|  1.49M|  }
  115|  2.32M|}
_ZN6hermes5Value7addUserEPNS_11InstructionE:
  117|  5.82M|Value::Use Value::addUser(Instruction *Inst) {
  118|  5.82M|  Users.push_back(Inst);
  119|  5.82M|  return {this, static_cast<unsigned>(Users.size() - 1)};
  120|  5.82M|}
_ZN6hermes5Value18replaceAllUsesWithEPS0_:
  122|   490k|void Value::replaceAllUsesWith(Value *Other) {
  123|   490k|  if (this == Other) {
  ------------------
  |  Branch (123:7): [True: 0, False: 490k]
  ------------------
  124|      0|    return;
  125|      0|  }
  126|       |
  127|       |  // Ask the users of this value to unregister themselves. Notice that the users
  128|       |  // modify and invalidate the iterators of Users.
  129|  1.05M|  while (Users.size()) {
  ------------------
  |  Branch (129:10): [True: 560k, False: 490k]
  ------------------
  130|   560k|    Users[Users.size() - 1]->replaceFirstOperandWith(this, Other);
  131|   560k|  }
  132|   490k|}
_ZN6hermes9ScopeDescD2Ev:
  146|   114k|ScopeDesc::~ScopeDesc() {
  147|   114k|  for (ScopeDesc *inner : innerScopes_) {
  ------------------
  |  Branch (147:25): [True: 114k, False: 114k]
  ------------------
  148|   114k|    Value::destroy(inner);
  149|   114k|  }
  150|       |
  151|       |  // Free all variables.
  152|   114k|  for (auto *v : variables_) {
  ------------------
  |  Branch (152:16): [True: 114k, False: 114k]
  ------------------
  153|   114k|    Value::destroy(v);
  154|   114k|  }
  155|   114k|}
_ZN6hermes8FunctionC2ENS_9ValueKindEPNS_6ModuleEPNS_9ScopeDescENS_10IdentifierENS0_14DefinitionKindEbNS_16SourceVisibilityEbN4llvh7SMRangeEPS0_:
  182|   114k|      internalName_(parent->deriveUniqueInternalName(originalName)) {
  183|   114k|  scopeDesc_->setFunction(this);
  184|   114k|  if (insertBefore) {
  ------------------
  |  Branch (184:7): [True: 0, False: 114k]
  ------------------
  185|      0|    assert(insertBefore != this && "Cannot insert a function before itself!");
  186|      0|    assert(
  187|      0|        insertBefore->getParent() == parent &&
  188|      0|        "Function to insert before is from a different module!");
  189|      0|    parent->insert(insertBefore->getIterator(), this);
  190|   114k|  } else {
  191|   114k|    parent->push_back(this);
  192|   114k|  }
  193|       |
  194|       |  // Derive internalName from originalName.
  195|      0|  assert(originalName.isValid() && "Function originalName must be valid");
  196|   114k|}
_ZN6hermes8FunctionD2Ev:
  198|   114k|Function::~Function() {
  199|       |  // Free all parameters.
  200|   114k|  for (auto *p : Parameters) {
  ------------------
  |  Branch (200:16): [True: 114k, False: 114k]
  ------------------
  201|   114k|    Value::destroy(p);
  202|   114k|  }
  203|   114k|  Value::destroy(thisParameter);
  204|   114k|}
_ZNK6hermes8Function26getSourceRepresentationStrEv:
  225|   229k|llvh::Optional<llvh::StringRef> Function::getSourceRepresentationStr() const {
  226|   229k|  switch (getSourceVisibility()) {
  227|      0|    case SourceVisibility::ShowSource: {
  ------------------
  |  Branch (227:5): [True: 0, False: 229k]
  ------------------
  228|       |      // Return the actual source code string.
  229|      0|      auto sourceRange = getSourceRange();
  230|      0|      assert(
  231|      0|          sourceRange.isValid() && "Function does not have source available");
  232|      0|      const auto sourceStart = sourceRange.Start.getPointer();
  233|      0|      llvh::StringRef strBuf{
  234|      0|          sourceStart, (size_t)(sourceRange.End.getPointer() - sourceStart)};
  235|      0|      return strBuf;
  236|      0|    }
  237|      0|    case SourceVisibility::HideSource:
  ------------------
  |  Branch (237:5): [True: 0, False: 229k]
  ------------------
  238|      0|    case SourceVisibility::Sensitive: {
  ------------------
  |  Branch (238:5): [True: 0, False: 229k]
  ------------------
  239|       |      // For implementation-hiding functions, the spec requires the source code
  240|       |      // representation of them "must have the syntax of a NativeFunction".
  241|       |      //
  242|       |      // Naively adding 'function <name>() { [ native code ] }' to string table
  243|       |      // for each function would be a huge waste of space in the generated hbc.
  244|       |      // Instead, we associate all such functions with an empty string to
  245|       |      // effectively "mark" them. (the assumption is that an real function
  246|       |      // source can't be empty). This reduced the constant factor of the space
  247|       |      // cost to only 8 bytes (one FunctionSourceTable entry) per function.
  248|      0|      return llvh::StringRef("");
  249|      0|    }
  250|   229k|    case SourceVisibility::Default:
  ------------------
  |  Branch (250:5): [True: 229k, False: 0]
  ------------------
  251|   229k|    default: {
  ------------------
  |  Branch (251:5): [True: 0, False: 229k]
  ------------------
  252|       |      // No need of special source representation for these cases, their
  253|       |      // 'toString' will return `{ [ bytecode ] }` as the default.
  254|   229k|      return llvh::None;
  255|   229k|    }
  256|   229k|  }
  257|   229k|}
_ZN6hermes10BasicBlockC2EPNS_8FunctionE:
  260|   267k|    : Value(ValueKind::BasicBlockKind), Parent(parent) {
  261|   267k|  assert(Parent && "Invalid parent function");
  262|      0|  Parent->addBlock(this);
  263|   267k|}
_ZN6hermes11Instruction11pushOperandEPNS_5ValueE:
  297|  4.50M|void Instruction::pushOperand(Value *Val) {
  298|  4.50M|  Operands.push_back({nullptr, 0});
  299|  4.50M|  setOperand(Val, getNumOperands() - 1);
  300|  4.50M|}
_ZN6hermes11Instruction10setOperandEPNS_5ValueEj:
  302|  6.82M|void Instruction::setOperand(Value *Val, unsigned Index) {
  303|  6.82M|  assert(Index < Operands.size() && "Not all operands have been pushed!");
  304|       |
  305|      0|  Value *CurrentValue = Operands[Index].first;
  306|       |
  307|       |  // If the operand is already set then there is nothing to do. The instruction
  308|       |  // is already registered in the use-list of the value.
  309|  6.82M|  if (CurrentValue == Val) {
  ------------------
  |  Branch (309:7): [True: 68, False: 6.82M]
  ------------------
  310|     68|    return;
  311|     68|  }
  312|       |
  313|       |  // Remove the current instruction from the old value that we are removing.
  314|  6.82M|  if (CurrentValue) {
  ------------------
  |  Branch (314:7): [True: 2.32M, False: 4.50M]
  ------------------
  315|  2.32M|    CurrentValue->removeUse(Operands[Index]);
  316|  2.32M|  }
  317|       |
  318|       |  // Register this instruction as a user of the new value and set the operand.
  319|  6.82M|  if (Val) {
  ------------------
  |  Branch (319:7): [True: 5.82M, False: 999k]
  ------------------
  320|  5.82M|    Operands[Index] = Val->addUser(this);
  321|  5.82M|  } else {
  322|   999k|    Operands[Index] = {nullptr, 0};
  323|   999k|  }
  324|  6.82M|}
_ZNK6hermes11Instruction10getOperandEj:
  326|  18.9M|Value *Instruction::getOperand(unsigned Index) const {
  327|  18.9M|  return Operands[Index].first;
  328|  18.9M|}
_ZNK6hermes11Instruction14getNumOperandsEv:
  330|  11.0M|unsigned Instruction::getNumOperands() const {
  331|  11.0M|  return Operands.size();
  332|  11.0M|}
_ZN6hermes11Instruction13removeOperandEj:
  334|  19.7k|void Instruction::removeOperand(unsigned index) {
  335|       |  // We call to setOperand before deleting the operand because setOperand
  336|       |  // un-registers the user from the user list.
  337|  19.7k|  setOperand(nullptr, index);
  338|  19.7k|  Operands.erase(Operands.begin() + index);
  339|  19.7k|}
_ZN6hermes11Instruction23replaceFirstOperandWithEPNS_5ValueES2_:
  341|   560k|void Instruction::replaceFirstOperandWith(Value *OldValue, Value *NewValue) {
  342|  1.03M|  for (int i = 0, e = getNumOperands(); i < e; i++) {
  ------------------
  |  Branch (342:41): [True: 1.03M, False: 0]
  ------------------
  343|  1.03M|    if (OldValue == getOperand(i)) {
  ------------------
  |  Branch (343:9): [True: 560k, False: 474k]
  ------------------
  344|   560k|      setOperand(NewValue, i);
  345|   560k|      return;
  346|   560k|    }
  347|  1.03M|  }
  348|      0|  llvm_unreachable("Can't find operand. Invalid use-def chain.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  349|   560k|}
_ZN6hermes10BasicBlock5eraseEPNS_11InstructionE:
  388|   602k|void BasicBlock::erase(Instruction *I) {
  389|   602k|  InstList.erase(I);
  390|   602k|}
_ZN6hermes11Instruction15eraseFromParentEv:
  395|   602k|void Instruction::eraseFromParent() {
  396|       |  // Release this instruction from the use-list of other instructions.
  397|  1.58M|  for (unsigned i = 0; i < getNumOperands(); i++)
  ------------------
  |  Branch (397:24): [True: 980k, False: 602k]
  ------------------
  398|   980k|    setOperand(nullptr, i);
  399|       |
  400|   602k|  getParent()->erase(this);
  401|   602k|}
_ZN6hermes11Instruction18getChangedOperandsEv:
  435|     28|WordBitSet<> Instruction::getChangedOperands() {
  436|     28|  switch (getKind()) {
  437|      0|    default:
  ------------------
  |  Branch (437:5): [True: 0, False: 28]
  ------------------
  438|      0|      llvm_unreachable("Invalid kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  439|       |
  440|      0|#define DEF_VALUE(XX, PARENT)                        \
  441|      0|  case ValueKind::XX##Kind:                          \
  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  443|      0|    break;
  444|      0|#include "hermes/IR/Instrs.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef DEF_VALUE
  |  |    9|       |#define DEF_VALUE(NAME, PARENT)
  |  |   10|       |#endif
  |  |   11|      0|#ifndef MARK_FIRST
  |  |   12|      0|#define MARK_FIRST(NAME)
  |  |   13|      0|#endif
  |  |   14|      0|#ifndef MARK_LAST
  |  |   15|      0|#define MARK_LAST(NAME)
  |  |   16|      0|#endif
  |  |   17|       |
  |  |   18|      0|#ifndef TERMINATOR
  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|      0|#endif
  |  |   21|       |
  |  |   22|      0|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|      0|#define INCLUDE_HBC_BACKEND
  |  |   24|      0|#endif
  |  |   25|       |
  |  |   26|      0|MARK_FIRST(ScopeCreationInst)
  |  |   27|      0|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   28|      0|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   29|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   30|      0|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   31|      0|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   32|      0|#endif
  |  |   33|      0|MARK_LAST(ScopeCreationInst)
  |  |   34|       |
  |  |   35|      0|MARK_FIRST(SingleOperandInst)
  |  |   36|      0|DEF_VALUE(SingleOperandInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   37|      0|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   38|      0|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   39|      0|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   40|      0|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   41|      0|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   42|      0|DEF_VALUE(MovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   43|      0|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   44|      0|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   45|     23|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|     23|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 23, False: 5]
  |  |  |  |  ------------------
  |  |  |  |  442|     23|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   46|      0|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   47|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   48|      0|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   49|      0|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   50|      0|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   51|      0|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   52|      0|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   53|      0|#endif
  |  |   54|      0|MARK_LAST(SingleOperandInst)
  |  |   55|       |
  |  |   56|      0|DEF_VALUE(PhiInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   57|      5|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      5|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 5, False: 23]
  |  |  |  |  ------------------
  |  |  |  |  442|      5|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   58|      0|MARK_FIRST(StorePropertyInst)
  |  |   59|      0|DEF_VALUE(StorePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   60|      0|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   61|      0|MARK_LAST(StorePropertyInst)
  |  |   62|       |
  |  |   63|      0|MARK_FIRST(StoreOwnPropertyInst)
  |  |   64|      0|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   65|      0|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   66|      0|MARK_LAST(StoreOwnPropertyInst)
  |  |   67|       |
  |  |   68|      0|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   69|      0|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   70|      0|MARK_FIRST(LoadPropertyInst)
  |  |   71|      0|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   72|      0|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   73|      0|MARK_LAST(LoadPropertyInst)
  |  |   74|      0|DEF_VALUE(LoadFrameInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   75|      0|DEF_VALUE(StoreStackInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   76|      0|DEF_VALUE(StoreFrameInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   77|      0|DEF_VALUE(AllocStackInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   78|      0|DEF_VALUE(AllocObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   79|      0|DEF_VALUE(AllocArrayInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   80|      0|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   81|      0|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   82|      0|DEF_VALUE(CatchInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   83|      0|DEF_VALUE(DebuggerInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   84|      0|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   85|      0|DEF_VALUE(TryEndInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   86|      0|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   87|      0|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   88|      0|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   89|      0|DEF_VALUE(IteratorNextInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   90|      0|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   91|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |   92|      0|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   93|      0|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   94|      0|#endif
  |  |   95|      0|DEF_VALUE(UnreachableInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   96|       |
  |  |   97|      0|MARK_FIRST(CreateFunctionInst)
  |  |   98|      0|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |   99|      0|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  100|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  101|      0|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  102|      0|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  103|      0|#endif
  |  |  104|      0|MARK_LAST(CreateFunctionInst)
  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  107|       |#endif
  |  |  108|       |
  |  |  109|      0|MARK_FIRST(TerminatorInst)
  |  |  110|      0|DEF_VALUE(TerminatorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  111|      0|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|      0|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  113|      0|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  114|      0|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|      0|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  116|      0|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  117|      0|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|      0|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      0|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   19|      0|#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |  |  |  ------------------
  |  |  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  |  |  443|      0|    break;
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  124|       |
  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  133|      0|#endif
  |  |  134|      0|MARK_LAST(CallInst)
  |  |  135|       |
  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  139|       |
  |  |  140|       |// These are target dependent instructions:
  |  |  141|       |
  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  ------------------
  |  |  |  |  441|      0|  case ValueKind::XX##Kind:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (441:3): [True: 0, False: 28]
  |  |  |  |  ------------------
  |  |  |  |  442|      0|    return cast<XX>(this)->getChangedOperandsImpl(); \
  |  |  |  |  443|      0|    break;
  |  |  ------------------
  |  |  150|      0|#endif
  |  |  151|       |
  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  153|       |
  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  155|       |// these macros are still used after the #include.
  |  |  156|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  157|      0|#undef DEF_VALUE
  |  |  158|      0|#undef MARK_FIRST
  |  |  159|      0|#undef MARK_LAST
  |  |  160|      0|#undef TERMINATOR
  |  |  161|      0|#endif
  ------------------
  445|     28|  }
  446|     28|}
_ZN6hermes9ParameterC2EPNS_8FunctionENS_10IdentifierE:
  449|   228k|    : Value(ValueKind::ParameterKind), Parent(parent), Name(name) {
  450|   228k|  assert(Parent && "Invalid parent");
  451|   228k|  if (name.str() == "this") {
  ------------------
  |  Branch (451:7): [True: 114k, False: 114k]
  ------------------
  452|   114k|    Parent->setThisParameter(this);
  453|   114k|  } else {
  454|   114k|    Parent->addParameter(this);
  455|   114k|  }
  456|   228k|}
_ZN6hermes8VariableC2ENS_9ValueKindEPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
  463|   114k|    : Value(k), declKind(declKind), text(txt), parent(scope) {
  464|   114k|  scope->addVariable(this);
  465|   114k|}
_ZN6hermes8VariableD2Ev:
  467|   114k|Variable::~Variable() {}
_ZNK6hermes8Variable22getIndexInVariableListEv:
  469|   125k|int Variable::getIndexInVariableList() const {
  470|   125k|  int index = 0;
  471|   125k|  for (auto V : parent->getVariables()) {
  ------------------
  |  Branch (471:15): [True: 125k, False: 0]
  ------------------
  472|   125k|    if (V == this)
  ------------------
  |  Branch (472:9): [True: 125k, False: 12]
  ------------------
  473|   125k|      return index;
  474|     12|    index++;
  475|     12|  }
  476|      0|  llvm_unreachable("Cannot find variable in the variable list");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  477|   125k|}
_ZN6hermes10BasicBlock13getTerminatorEv:
  487|  1.30M|TerminatorInst *BasicBlock::getTerminator() {
  488|  1.30M|  if (InstList.empty())
  ------------------
  |  Branch (488:7): [True: 0, False: 1.30M]
  ------------------
  489|      0|    return nullptr;
  490|  1.30M|  return llvh::dyn_cast<TerminatorInst>(&InstList.back());
  491|  1.30M|}
_ZNK6hermes10BasicBlock13getTerminatorEv:
  493|   307k|const TerminatorInst *BasicBlock::getTerminator() const {
  494|   307k|  if (InstList.empty())
  ------------------
  |  Branch (494:7): [True: 0, False: 307k]
  ------------------
  495|      0|    return nullptr;
  496|   307k|  return llvh::dyn_cast<TerminatorInst>(&InstList.back());
  497|   307k|}
_ZN6hermes10BasicBlock15eraseFromParentEv:
  503|      6|void BasicBlock::eraseFromParent() {
  504|       |  // Erase all of the instructions in the block before deleting the block.
  505|       |  // We are starting to delete from the start of the block. Naturally we will
  506|       |  // have forward dependencies between instructions. To allow safe deletion
  507|       |  // we replace all uses with the invalid null value. setOperand knows how
  508|       |  // to deal with null values.
  509|      6|  while (begin() != end()) {
  ------------------
  |  Branch (509:10): [True: 0, False: 6]
  ------------------
  510|      0|    begin()->replaceAllUsesWith(nullptr);
  511|      0|    begin()->eraseFromParent();
  512|      0|  }
  513|       |
  514|      6|  assert(!hasUsers() && "Use list is not empty");
  515|       |  // Erase the block itself:
  516|      0|  getParent()->getBasicBlockList().erase(getIterator());
  517|      6|}
_ZNK6hermes8Function10getContextEv:
  519|  3.06M|Context &Function::getContext() const {
  520|  3.06M|  return parent_->getContext();
  521|  3.06M|}
_ZN6hermes8Function8addBlockEPNS_10BasicBlockE:
  523|   267k|void Function::addBlock(BasicBlock *BB) {
  524|   267k|  BasicBlockList.push_back(BB);
  525|   267k|}
_ZN6hermes8Function12addParameterEPNS_9ParameterE:
  526|   114k|void Function::addParameter(Parameter *A) {
  527|   114k|  Parameters.push_back(A);
  528|   114k|}
_ZN6hermes6ModuleD2Ev:
  530|     56|Module::~Module() {
  531|     56|  FunctionList.clear();
  532|       |
  533|       |  // Free global properties.
  534|     56|  globalPropertyMap_.clear();
  535|  3.40k|  for (auto *prop : globalPropertyList_) {
  ------------------
  |  Branch (535:19): [True: 3.40k, False: 56]
  ------------------
  536|  3.40k|    Value::destroy(prop);
  537|  3.40k|  }
  538|       |
  539|     56|  llvh::SmallVector<Literal *, 32> toDelete;
  540|       |
  541|       |  // Collect all literals.
  542|       |  // Note that we cannot delete while iterating due to the implementation
  543|       |  // of FoldingSet.
  544|   220k|  for (auto &L : literalNumbers) {
  ------------------
  |  Branch (544:16): [True: 220k, False: 56]
  ------------------
  545|   220k|    toDelete.push_back(&L);
  546|   220k|  }
  547|     56|  for (auto &L : literalBigInts) {
  ------------------
  |  Branch (547:16): [True: 0, False: 56]
  ------------------
  548|      0|    toDelete.push_back(&L);
  549|      0|  }
  550|  4.10k|  for (auto &L : literalStrings) {
  ------------------
  |  Branch (550:16): [True: 4.10k, False: 56]
  ------------------
  551|  4.10k|    toDelete.push_back(&L);
  552|  4.10k|  }
  553|       |  // Free the literals.
  554|   224k|  for (auto *L : toDelete) {
  ------------------
  |  Branch (554:16): [True: 224k, False: 56]
  ------------------
  555|   224k|    Value::destroy(L);
  556|   224k|  }
  557|     56|}
_ZN6hermes6Module9push_backEPNS_8FunctionE:
  559|   114k|void Module::push_back(Function *F) {
  560|   114k|  FunctionList.push_back(F);
  561|   114k|}
_ZN6hermes6Module17addGlobalPropertyENS_10IdentifierEb:
  574|  3.40k|    bool declared) {
  575|  3.40k|  auto &ref = globalPropertyMap_[name];
  576|       |
  577|  3.40k|  if (!ref) {
  ------------------
  |  Branch (577:7): [True: 3.40k, False: 0]
  ------------------
  578|  3.40k|    ref = new GlobalObjectProperty(this, getLiteralString(name), declared);
  579|  3.40k|    globalPropertyList_.push_back(ref);
  580|  3.40k|  } else {
  581|      0|    ref->orDeclared(declared);
  582|      0|  }
  583|       |
  584|  3.40k|  return ref;
  585|  3.40k|}
_ZN6hermes6Module19getTemplateObjectIDEONSt3__16vectorIPNS_13LiteralStringENS1_9allocatorIS4_EEEE:
  643|    283|uint32_t Module::getTemplateObjectID(RawStringList &&rawStrings) {
  644|       |  // Try inserting into the map with a dummy value.
  645|    283|  auto res = templateObjectIDMap_.emplace(std::move(rawStrings), 0);
  646|    283|  if (res.second) {
  ------------------
  |  Branch (646:7): [True: 69, False: 214]
  ------------------
  647|       |    // Insertion succeeded. Overwrite the value with the correct id.
  648|     69|    res.first->second = templateObjectIDMap_.size() - 1;
  649|     69|  }
  650|    283|  return res.first->second;
  651|    283|}
_ZN6hermes6Module24deriveUniqueInternalNameENS_10IdentifierE:
  712|   114k|Identifier Module::deriveUniqueInternalName(Identifier originalName) {
  713|   114k|  assert(originalName.isValid() && "originalName must be valid");
  714|       |
  715|       |  // Check whether the original name already is in the form "... number#" and
  716|       |  // if so, strip the suffix.
  717|      0|  originalName = stripInternalNameSuffix(getContext(), originalName);
  718|       |
  719|   114k|  auto insertResult = internalNamesMap_.try_emplace(originalName, 0);
  720|       |
  721|       |  // If inserted for the first time, there is no need for a suffix.
  722|   114k|  if (insertResult.second)
  ------------------
  |  Branch (722:7): [True: 66, False: 114k]
  ------------------
  723|     66|    return originalName;
  724|       |
  725|       |  // Construct a suffix using the number of internal names derived from this
  726|       |  // identifier.
  727|   114k|  ++insertResult.first->second;
  728|   114k|  char itoaBuf[16];
  729|   114k|  snprintf(itoaBuf, sizeof(itoaBuf), "%u", insertResult.first->second);
  730|       |
  731|   114k|  llvh::SmallString<32> buf;
  732|   114k|  buf.append(originalName.str());
  733|   114k|  buf.append(" ");
  734|   114k|  buf.append(itoaBuf);
  735|   114k|  buf.append("#");
  736|       |
  737|   114k|  return getContext().getIdentifier(buf);
  738|   114k|}
_ZN6hermes6Module16getLiteralNumberEd:
  751|  1.12M|LiteralNumber *Module::getLiteralNumber(double value) {
  752|       |  // Check to see if we've already seen this tuple before.
  753|  1.12M|  llvh::FoldingSetNodeID ID;
  754|       |
  755|  1.12M|  LiteralNumber::Profile(ID, value);
  756|       |
  757|       |  // If this is not the first time we see this tuple then return the old copy.
  758|  1.12M|  void *InsertPos = nullptr;
  759|  1.12M|  if (LiteralNumber *LN = literalNumbers.FindNodeOrInsertPos(ID, InsertPos))
  ------------------
  |  Branch (759:22): [True: 901k, False: 220k]
  ------------------
  760|   901k|    return LN;
  761|       |
  762|   220k|  auto New = new LiteralNumber(value);
  763|   220k|  literalNumbers.InsertNode(New, InsertPos);
  764|   220k|  return New;
  765|  1.12M|}
_ZN6hermes6Module16getLiteralStringENS_10IdentifierE:
  783|   322k|LiteralString *Module::getLiteralString(Identifier value) {
  784|       |  // Check to see if we've already seen this tuple before.
  785|   322k|  llvh::FoldingSetNodeID ID;
  786|       |
  787|   322k|  LiteralString::Profile(ID, value);
  788|       |
  789|       |  // If this is not the first time we see this tuple then return the old copy.
  790|   322k|  void *InsertPos = nullptr;
  791|   322k|  if (LiteralString *LS = literalStrings.FindNodeOrInsertPos(ID, InsertPos))
  ------------------
  |  Branch (791:22): [True: 318k, False: 4.10k]
  ------------------
  792|   318k|    return LS;
  793|       |
  794|  4.10k|  auto New = new LiteralString(value);
  795|  4.10k|  literalStrings.InsertNode(New, InsertPos);
  796|  4.10k|  return New;
  797|   322k|}
_ZN6hermes6Module14getLiteralBoolEb:
  799|   237k|LiteralBool *Module::getLiteralBool(bool value) {
  800|   237k|  if (value)
  ------------------
  |  Branch (800:7): [True: 235k, False: 2.03k]
  ------------------
  801|   235k|    return &literalTrue;
  802|  2.03k|  return &literalFalse;
  803|   237k|}
IR.cpp:_ZL23stripInternalNameSuffixRN6hermes7ContextENS_10IdentifierE:
  691|   114k|    Identifier originalName) {
  692|   114k|  auto originalStr = originalName.str();
  693|   114k|  auto e = originalStr.end();
  694|       |
  695|   114k|  if (!(e - originalStr.begin() >= 3 && e[-1] == '#' && e[-2] >= '0' &&
  ------------------
  |  Branch (695:9): [True: 56, False: 114k]
  |  Branch (695:41): [True: 0, False: 56]
  |  Branch (695:57): [True: 0, False: 0]
  ------------------
  696|   114k|        e[-2] <= '9')) {
  ------------------
  |  Branch (696:9): [True: 0, False: 0]
  ------------------
  697|   114k|    return originalName;
  698|   114k|  }
  699|       |
  700|      0|  e -= 2;
  701|      0|  while (e != originalStr.begin() && e[-1] >= '0' && e[-1] <= '9') {
  ------------------
  |  Branch (701:10): [True: 0, False: 0]
  |  Branch (701:38): [True: 0, False: 0]
  |  Branch (701:54): [True: 0, False: 0]
  ------------------
  702|      0|    --e;
  703|      0|  }
  704|       |
  705|      0|  if (!(e != originalStr.begin() && e[-1] == ' '))
  ------------------
  |  Branch (705:9): [True: 0, False: 0]
  |  Branch (705:37): [True: 0, False: 0]
  ------------------
  706|      0|    return originalName;
  707|       |
  708|      0|  --e;
  709|      0|  return context.getIdentifier(originalStr.slice(0, e - originalStr.begin()));
  710|      0|}

_ZN6hermes9IRBuilder16createBasicBlockEPNS_8FunctionE:
   17|   267k|BasicBlock *IRBuilder::createBasicBlock(Function *Parent) {
   18|   267k|  assert(Parent && "Invalid insertion point");
   19|      0|  return new BasicBlock(Parent);
   20|   267k|}
_ZN6hermes9IRBuilder14createFunctionEPNS_9ScopeDescENS_10IdentifierENS_8Function14DefinitionKindEbNS_16SourceVisibilityEN4llvh7SMRangeEbPS4_:
   30|   114k|    Function *insertBefore) {
   31|       |  // Function must have a name. If the source doesn't provide the function name,
   32|       |  // Hermes will try to infer the name from the name of a variable or property
   33|       |  // it is assigned to. If there was no inference, an empty string is used.
   34|   114k|  if (!OriginalName.isValid()) {
  ------------------
  |  Branch (34:7): [True: 112k, False: 2.53k]
  ------------------
   35|   112k|    OriginalName = createIdentifier("");
   36|   112k|  }
   37|   114k|  return new Function(
   38|   114k|      M,
   39|   114k|      scopeDesc,
   40|   114k|      OriginalName,
   41|   114k|      definitionKind,
   42|   114k|      strictMode,
   43|   114k|      sourceVisibility,
   44|   114k|      isGlobal,
   45|   114k|      sourceRange,
   46|   114k|      insertBefore);
   47|   114k|}
_ZN6hermes9IRBuilder22createTopLevelFunctionEPNS_9ScopeDescEbNS_16SourceVisibilityEN4llvh7SMRangeE:
  101|     56|    SMRange sourceRange) {
  102|       |  // Notice that this synthesized name is not a legal javascript name and
  103|       |  // can't collide with functions in the processed program.
  104|     56|  return createFunction(
  105|     56|      scopeDesc,
  106|     56|      "global",
  107|     56|      Function::DefinitionKind::ES5Function,
  108|     56|      strictMode,
  109|     56|      sourceVisibility,
  110|     56|      sourceRange,
  111|     56|      true);
  112|     56|}
_ZN6hermes9IRBuilder14createFunctionEPNS_9ScopeDescEN4llvh9StringRefENS_8Function14DefinitionKindEbNS_16SourceVisibilityENS3_7SMRangeEbPS5_:
  122|     56|    Function *insertBefore) {
  123|     56|  Identifier OrigIden =
  124|     56|      OriginalName.empty() ? Identifier{} : createIdentifier(OriginalName);
  ------------------
  |  Branch (124:7): [True: 0, False: 56]
  ------------------
  125|     56|  return createFunction(
  126|     56|      scopeDesc,
  127|     56|      OrigIden,
  128|     56|      definitionKind,
  129|     56|      strictMode,
  130|     56|      sourceVisibility,
  131|     56|      sourceRange,
  132|     56|      isGlobal,
  133|     56|      insertBefore);
  134|     56|}
_ZN6hermes9IRBuilder26createGlobalObjectPropertyENS_10IdentifierEb:
  163|  3.40k|    bool declared) {
  164|  3.40k|  return M->addGlobalProperty(name, declared);
  165|  3.40k|}
_ZN6hermes9IRBuilder15createParameterEPNS_8FunctionENS_10IdentifierE:
  173|   228k|Parameter *IRBuilder::createParameter(Function *Parent, Identifier Name) {
  174|   228k|  return new Parameter(Parent, Name);
  175|   228k|}
_ZN6hermes9IRBuilder15createParameterEPNS_8FunctionEN4llvh9StringRefE:
  177|   114k|Parameter *IRBuilder::createParameter(Function *Parent, llvh::StringRef Name) {
  178|   114k|  return createParameter(Parent, createIdentifier(Name));
  179|   114k|}
_ZN6hermes9IRBuilder14createVariableEPNS_9ScopeDescENS_18JavaScriptDeclKindENS_10IdentifierE:
  184|   114k|    Identifier Name) {
  185|   114k|  return new Variable(Parent, declKind, Name);
  186|   114k|}
_ZN6hermes9IRBuilder16getLiteralNumberEd:
  195|  1.11M|LiteralNumber *IRBuilder::getLiteralNumber(double value) {
  196|  1.11M|  return M->getLiteralNumber(value);
  197|  1.11M|}
_ZN6hermes9IRBuilder16getLiteralStringEN4llvh9StringRefE:
  216|   295k|LiteralString *IRBuilder::getLiteralString(llvh::StringRef value) {
  217|   295k|  Identifier Iden = createIdentifier(value);
  218|   295k|  return getLiteralString(Iden);
  219|   295k|}
_ZN6hermes9IRBuilder16getLiteralStringENS_10IdentifierE:
  221|   318k|LiteralString *IRBuilder::getLiteralString(Identifier value) {
  222|   318k|  return M->getLiteralString(value);
  223|   318k|}
_ZN6hermes9IRBuilder14getLiteralBoolEb:
  225|   237k|LiteralBool *IRBuilder::getLiteralBool(bool value) {
  226|   237k|  return M->getLiteralBool(value);
  227|   237k|}
_ZN6hermes9IRBuilder19getLiteralUndefinedEv:
  233|   229k|LiteralUndefined *IRBuilder::getLiteralUndefined() {
  234|   229k|  return M->getLiteralUndefined();
  235|   229k|}
_ZN6hermes9IRBuilder15getGlobalObjectEv:
  241|   135k|GlobalObject *IRBuilder::getGlobalObject() {
  242|   135k|  return M->getGlobalObject();
  243|   135k|}
_ZN6hermes9IRBuilder16getEmptySentinelEv:
  245|  4.16k|EmptySentinel *IRBuilder::getEmptySentinel() {
  246|  4.16k|  return M->getEmptySentinel();
  247|  4.16k|}
_ZN6hermes9IRBuilder16createIdentifierEN4llvh9StringRefE:
  249|   528k|Identifier IRBuilder::createIdentifier(llvh::StringRef str) {
  250|   528k|  return M->getContext().getIdentifier(str);
  251|   528k|}
_ZN6hermes9IRBuilder16createBranchInstEPNS_10BasicBlockE:
  253|  39.4k|BranchInst *IRBuilder::createBranchInst(BasicBlock *Destination) {
  254|  39.4k|  auto *BI = new BranchInst(getInsertionBlock(), Destination);
  255|  39.4k|  insert(BI);
  256|  39.4k|  return BI;
  257|  39.4k|}
_ZN6hermes9IRBuilder20createCondBranchInstEPNS_5ValueEPNS_10BasicBlockES4_:
  260|     71|IRBuilder::createCondBranchInst(Value *Cond, BasicBlock *T, BasicBlock *F) {
  261|     71|  auto *CBI = new CondBranchInst(getInsertionBlock(), Cond, T, F);
  262|     71|  insert(CBI);
  263|     71|  return CBI;
  264|     71|}
_ZN6hermes9IRBuilder16createReturnInstEPNS_5ValueE:
  266|   228k|ReturnInst *IRBuilder::createReturnInst(Value *Val) {
  267|   228k|  auto *RI = new ReturnInst(Val);
  268|   228k|  insert(RI);
  269|   228k|  return RI;
  270|   228k|}
_ZN6hermes9IRBuilder15createCatchInstEv:
  272|     12|CatchInst *IRBuilder::createCatchInst() {
  273|     12|  auto *CI = new CatchInst();
  274|     12|  insert(CI);
  275|     12|  return CI;
  276|     12|}
_ZN6hermes9IRBuilder15createThrowInstEPNS_5ValueE:
  278|      6|ThrowInst *IRBuilder::createThrowInst(Value *thrownValue) {
  279|      6|  auto *TI = new ThrowInst(thrownValue);
  280|      6|  insert(TI);
  281|      6|  return TI;
  282|      6|}
_ZN6hermes9IRBuilder18createTryStartInstEPNS_10BasicBlockES2_:
  297|     12|    BasicBlock *catchTargetBlock) {
  298|     12|  auto *I = new TryStartInst(tryBodyBlock, catchTargetBlock);
  299|     12|  insert(I);
  300|     12|  return I;
  301|     12|}
_ZN6hermes9IRBuilder16createTryEndInstEv:
  303|     12|TryEndInst *IRBuilder::createTryEndInst() {
  304|     12|  auto *I = new TryEndInst();
  305|     12|  insert(I);
  306|     12|  return I;
  307|     12|}
_ZN6hermes9IRBuilder20createAllocStackInstEN4llvh9StringRefE:
  309|      2|AllocStackInst *IRBuilder::createAllocStackInst(llvh::StringRef varName) {
  310|      2|  Identifier Iden = createIdentifier(varName);
  311|      2|  return createAllocStackInst(Iden);
  312|      2|}
_ZN6hermes9IRBuilder20createAllocStackInstENS_10IdentifierE:
  314|    129|AllocStackInst *IRBuilder::createAllocStackInst(Identifier varName) {
  315|    129|  auto *AHI = new AllocStackInst(varName);
  316|    129|  insert(AHI);
  317|    129|  return AHI;
  318|    129|}
_ZN6hermes9IRBuilder18createAsNumberInstEPNS_5ValueE:
  320|      4|AsNumberInst *IRBuilder::createAsNumberInst(Value *val) {
  321|      4|  auto *ANI = new AsNumberInst(val);
  322|      4|  insert(ANI);
  323|      4|  return ANI;
  324|      4|}
_ZN6hermes9IRBuilder19createAsNumericInstEPNS_5ValueE:
  326|      2|AsNumericInst *IRBuilder::createAsNumericInst(Value *val) {
  327|      2|  auto *ANI = new AsNumericInst(val);
  328|      2|  insert(ANI);
  329|      2|  return ANI;
  330|      2|}
_ZN6hermes9IRBuilder21createCreateScopeInstEPNS_9ScopeDescE:
  344|   114k|CreateScopeInst *IRBuilder::createCreateScopeInst(ScopeDesc *scopeDesc) {
  345|   114k|  auto CII = new CreateScopeInst(scopeDesc);
  346|   114k|  insert(CII);
  347|   114k|  return CII;
  348|   114k|}
_ZN6hermes9IRBuilder24createCreateFunctionInstEPNS_8FunctionEPNS_17ScopeCreationInstE:
  352|   114k|    ScopeCreationInst *environment) {
  353|   114k|  auto CFI = new CreateFunctionInst(code, environment);
  354|   114k|  insert(CFI);
  355|   114k|  return CFI;
  356|   114k|}
_ZN6hermes9IRBuilder19createLoadFrameInstEPNS_8VariableEPNS_17ScopeCreationInstE:
  360|  10.8k|    ScopeCreationInst *scope) {
  361|  10.8k|  auto LI = new LoadFrameInst(ptr, scope);
  362|  10.8k|  insert(LI);
  363|  10.8k|  return LI;
  364|  10.8k|}
_ZN6hermes9IRBuilder19createLoadStackInstEPNS_14AllocStackInstE:
  366|    105|LoadStackInst *IRBuilder::createLoadStackInst(AllocStackInst *ptr) {
  367|    105|  auto LI = new LoadStackInst(ptr);
  368|    105|  insert(LI);
  369|    105|  return LI;
  370|    105|}
_ZN6hermes9IRBuilder20createStoreFrameInstEPNS_5ValueEPNS_8VariableEPNS_17ScopeCreationInstE:
  375|   114k|    ScopeCreationInst *scope) {
  376|   114k|  auto SI = new StoreFrameInst(storedValue, ptr, scope);
  377|   114k|  insert(SI);
  378|   114k|  return SI;
  379|   114k|}
_ZN6hermes9IRBuilder20createStoreStackInstEPNS_5ValueEPNS_14AllocStackInstE:
  383|   128k|    AllocStackInst *ptr) {
  384|   128k|  auto SI = new StoreStackInst(storedValue, ptr);
  385|   128k|  insert(SI);
  386|   128k|  return SI;
  387|   128k|}
_ZN6hermes9IRBuilder14createCallInstEPNS_13LiteralStringEPNS_5ValueES4_N4llvh8ArrayRefIS4_EE:
  393|    291|    ArrayRef<Value *> args) {
  394|    291|  auto CI = new CallInst(
  395|    291|      ValueKind::CallInstKind, textifiedCallee, callee, thisValue, args);
  396|    291|  insert(CI);
  397|    291|  return CI;
  398|    291|}
_ZN6hermes9IRBuilder22createLoadPropertyInstEPNS_5ValueES2_:
  420|     22|    Value *property) {
  421|     22|  auto LPI = new LoadPropertyInst(object, property);
  422|     22|  insert(LPI);
  423|     22|  return LPI;
  424|     22|}
_ZN6hermes9IRBuilder31createTryLoadGlobalPropertyInstEPNS_13LiteralStringE:
  427|   131k|    LiteralString *property) {
  428|   131k|  auto *inst = new TryLoadGlobalPropertyInst(getGlobalObject(), property);
  429|   131k|  insert(inst);
  430|   131k|  return inst;
  431|   131k|}
_ZN6hermes9IRBuilder31createTryLoadGlobalPropertyInstEPNS_20GlobalObjectPropertyE:
  434|   131k|    GlobalObjectProperty *property) {
  435|   131k|  return createTryLoadGlobalPropertyInst(property->getName());
  436|   131k|}
_ZN6hermes9IRBuilder23createStorePropertyInstEPNS_5ValueES2_S2_:
  449|  3.78k|    Value *property) {
  450|  3.78k|  auto SPI = new StorePropertyInst(storedValue, object, property);
  451|  3.78k|  insert(SPI);
  452|  3.78k|  return SPI;
  453|  3.78k|}
_ZN6hermes9IRBuilder26createStoreOwnPropertyInstEPNS_5ValueES2_S2_NS0_14PropEnumerableE:
  472|   230k|    PropEnumerable isEnumerable) {
  473|   230k|  auto SPI = new StoreOwnPropertyInst(
  474|   230k|      storedValue,
  475|   230k|      object,
  476|   230k|      property,
  477|   230k|      getLiteralBool(isEnumerable == PropEnumerable::Yes));
  478|   230k|  insert(SPI);
  479|   230k|  return SPI;
  480|   230k|}
_ZN6hermes9IRBuilder29createStoreNewOwnPropertyInstEPNS_5ValueES2_PNS_7LiteralENS0_14PropEnumerableE:
  485|  4.16k|    PropEnumerable isEnumerable) {
  486|  4.16k|  auto *inst = new StoreNewOwnPropertyInst(
  487|  4.16k|      storedValue,
  488|  4.16k|      object,
  489|  4.16k|      property,
  490|  4.16k|      getLiteralBool(isEnumerable == PropEnumerable::Yes));
  491|  4.16k|  insert(inst);
  492|  4.16k|  return inst;
  493|  4.16k|}
_ZN6hermes9IRBuilder21createAllocObjectInstEjPNS_5ValueE:
  579|  4.16k|    Value *parent) {
  580|  4.16k|  auto AOI = new AllocObjectInst(
  581|  4.16k|      M->getLiteralNumber(size), parent ? parent : getEmptySentinel());
  ------------------
  |  Branch (581:34): [True: 0, False: 4.16k]
  ------------------
  582|  4.16k|  insert(AOI);
  583|  4.16k|  return AOI;
  584|  4.16k|}
_ZN6hermes9IRBuilder20createAllocArrayInstEPNS_13LiteralNumberEN4llvh11SmallVectorIPNS_5ValueELj4EEE:
  588|  33.4k|    AllocArrayInst::ArrayValueList val_list) {
  589|  33.4k|  auto AAI = new AllocArrayInst(val_list, sizeHint);
  590|  33.4k|  insert(AAI);
  591|  33.4k|  return AAI;
  592|  33.4k|}
_ZN6hermes9IRBuilder20createAllocArrayInstEN4llvh11SmallVectorIPNS_5ValueELj4EEEj:
  596|  33.4k|    unsigned sizeHint) {
  597|  33.4k|  return createAllocArrayInst(this->getLiteralNumber(sizeHint), val_list);
  598|  33.4k|}
_ZN6hermes9IRBuilder25createCreateArgumentsInstEv:
  600|   114k|CreateArgumentsInst *IRBuilder::createCreateArgumentsInst() {
  601|   114k|  auto CAI = new CreateArgumentsInst();
  602|   114k|  insert(CAI);
  603|   114k|  return CAI;
  604|   114k|}
_ZN6hermes9IRBuilder22createGetNewTargetInstEv:
  606|      5|GetNewTargetInst *IRBuilder::createGetNewTargetInst() {
  607|      5|  auto *inst = new GetNewTargetInst();
  608|      5|  insert(inst);
  609|      5|  return inst;
  610|      5|}
_ZN6hermes9IRBuilder28createHBCGetGlobalObjectInstEv:
  618|  62.5k|HBCGetGlobalObjectInst *IRBuilder::createHBCGetGlobalObjectInst() {
  619|  62.5k|  auto inst = new HBCGetGlobalObjectInst();
  620|  62.5k|  insert(inst);
  621|  62.5k|  return inst;
  622|  62.5k|}
_ZN6hermes9IRBuilder16createRegExpInstENS_10IdentifierES1_:
  626|  11.4k|    Identifier flags) {
  627|  11.4k|  auto res =
  628|  11.4k|      new CreateRegExpInst(getLiteralString(pattern), getLiteralString(flags));
  629|  11.4k|  insert(res);
  630|  11.4k|  return res;
  631|  11.4k|}
_ZN6hermes9IRBuilder23createUnaryOperatorInstEPNS_5ValueENS_17UnaryOperatorInst6OpKindE:
  635|  4.00k|    UnaryOperatorInst::OpKind opKind) {
  636|  4.00k|  auto UOI = new UnaryOperatorInst(value, opKind);
  637|  4.00k|  insert(UOI);
  638|  4.00k|  return UOI;
  639|  4.00k|}
_ZN6hermes9IRBuilder24createBinaryOperatorInstEPNS_5ValueES2_NS_18BinaryOperatorInst6OpKindE:
  644|  65.0k|    BinaryOperatorInst::OpKind opKind) {
  645|  65.0k|  auto BOI = new BinaryOperatorInst(left, right, opKind);
  646|  65.0k|  insert(BOI);
  647|  65.0k|  return BOI;
  648|  65.0k|}
_ZN6hermes9IRBuilder13createPhiInstERKN4llvh11SmallVectorIPNS_5ValueELj8EEERKNS2_IPNS_10BasicBlockELj8EEE:
  669|     34|    const PhiInst::BasicBlockListType &blocks) {
  670|     34|  auto PI = new PhiInst(values, blocks);
  671|     34|  insert(PI);
  672|     34|  return PI;
  673|     34|}
_ZN6hermes9IRBuilder13createMovInstEPNS_5ValueE:
  715|   264k|MovInst *IRBuilder::createMovInst(Value *input) {
  716|   264k|  auto MI = new MovInst(input);
  717|   264k|  insert(MI);
  718|   264k|  return MI;
  719|   264k|}
_ZN6hermes9IRBuilder21createImplicitMovInstEPNS_5ValueE:
  721|    283|ImplicitMovInst *IRBuilder::createImplicitMovInst(Value *input) {
  722|    283|  auto IMI = new ImplicitMovInst(input);
  723|    283|  insert(IMI);
  724|    283|  return IMI;
  725|    283|}
_ZN6hermes9IRBuilder31createHBCStoreToEnvironmentInstEPNS_5ValueES2_PNS_8VariableE:
  778|   114k|    Variable *var) {
  779|   114k|  auto PSI = new HBCStoreToEnvironmentInst(env, toPut, var);
  780|   114k|  insert(PSI);
  781|   114k|  return PSI;
  782|   114k|}
_ZN6hermes9IRBuilder32createHBCLoadFromEnvironmentInstEPNS_5ValueEPNS_8VariableE:
  786|  10.8k|    Variable *var) {
  787|  10.8k|  auto GSI = new HBCLoadFromEnvironmentInst(env, var);
  788|  10.8k|  insert(GSI);
  789|  10.8k|  return GSI;
  790|  10.8k|}
_ZN6hermes9IRBuilder22createHBCLoadConstInstEPNS_7LiteralE:
  811|   114k|HBCLoadConstInst *IRBuilder::createHBCLoadConstInst(Literal *value) {
  812|   114k|  auto inst = new HBCLoadConstInst(value);
  813|   114k|  insert(inst);
  814|   114k|  return inst;
  815|   114k|}
_ZN6hermes9IRBuilder22createHBCLoadParamInstEPNS_13LiteralNumberE:
  817|   114k|HBCLoadParamInst *IRBuilder::createHBCLoadParamInst(LiteralNumber *value) {
  818|   114k|  auto inst = new HBCLoadParamInst(value);
  819|   114k|  insert(inst);
  820|   114k|  return inst;
  821|   114k|}
_ZN6hermes9IRBuilder30createHBCCreateEnvironmentInstEPNS_9ScopeDescE:
  824|   114k|    ScopeDesc *scopeDesc) {
  825|   114k|  auto inst = new HBCCreateEnvironmentInst(scopeDesc);
  826|   114k|  insert(inst);
  827|   114k|  return inst;
  828|   114k|}
_ZN6hermes9IRBuilder22createHBCGetThisNSInstEv:
  830|      5|HBCGetThisNSInst *IRBuilder::createHBCGetThisNSInst() {
  831|      5|  auto inst = new HBCGetThisNSInst();
  832|      5|  insert(inst);
  833|      5|  return inst;
  834|      5|}
_ZN6hermes9IRBuilder27createHBCReifyArgumentsInstEPNS_14AllocStackInstE:
  849|      2|    AllocStackInst *lazyReg) {
  850|      2|  auto inst = new HBCReifyArgumentsInst(lazyReg);
  851|      2|  insert(inst);
  852|      2|  return inst;
  853|      2|}
_ZN6hermes9IRBuilder21createCallBuiltinInstENS_13BuiltinMethod4EnumEN4llvh8ArrayRefIPNS_5ValueEEE:
  886|    283|    ArrayRef<Value *> arguments) {
  887|    283|  auto *inst = new CallBuiltinInst(
  888|    283|      getLiteralNumber(builtinIndex), getLiteralUndefined(), arguments);
  889|    283|  insert(inst);
  890|    283|  return inst;
  891|    283|}
_ZN6hermes9IRBuilder27createHBCCreateFunctionInstEPNS_8FunctionEPNS_5ValueE:
  924|   114k|    Value *env) {
  925|   114k|  auto inst = new HBCCreateFunctionInst(function, env);
  926|   114k|  insert(inst);
  927|   114k|  return inst;
  928|   114k|}
_ZN6hermes9IRBuilder21createHBCSpillMovInstEPNS_11InstructionE:
  930|  2.87k|HBCSpillMovInst *IRBuilder::createHBCSpillMovInst(Instruction *value) {
  931|  2.87k|  auto *inst = new HBCSpillMovInst(value);
  932|  2.87k|  insert(inst);
  933|  2.87k|  return inst;
  934|  2.87k|}
_ZN6hermes9IRBuilder34createHBCAllocObjectFromBufferInstEN4llvh11SmallVectorINSt3__14pairIPNS_7LiteralES6_EELj4EEEj:
  946|    880|    uint32_t size) {
  947|    880|  auto *inst =
  948|    880|      new HBCAllocObjectFromBufferInst(M->getLiteralNumber(size), prop_map);
  949|    880|  insert(inst);
  950|    880|  return inst;
  951|    880|}
_ZN6hermes9IRBuilder28createAllocObjectLiteralInstERKN4llvh11SmallVectorINSt3__14pairIPNS_13LiteralStringEPNS_5ValueEEELj4EEE:
  954|  5.04k|    const AllocObjectLiteralInst::ObjectPropertyMap &propMap) {
  955|  5.04k|  auto *inst = new AllocObjectLiteralInst(propMap);
  956|  5.04k|  insert(inst);
  957|  5.04k|  return inst;
  958|  5.04k|}
_ZN6hermes9IRBuilder23createIteratorBeginInstEPNS_14AllocStackInstE:
  973|     12|    AllocStackInst *sourceOrNext) {
  974|     12|  auto *I = new IteratorBeginInst(sourceOrNext);
  975|     12|  insert(I);
  976|     12|  return I;
  977|     12|}
_ZN6hermes9IRBuilder22createIteratorNextInstEPNS_14AllocStackInstES2_:
  981|      6|    AllocStackInst *sourceOrNext) {
  982|      6|  auto *I = new IteratorNextInst(iterator, sourceOrNext);
  983|      6|  insert(I);
  984|      6|  return I;
  985|      6|}
_ZN6hermes9IRBuilder23createIteratorCloseInstEPNS_14AllocStackInstEb:
  989|     18|    bool ignoreInnerException) {
  990|     18|  auto *I =
  991|     18|      new IteratorCloseInst(iterator, getLiteralBool(ignoreInnerException));
  992|     18|  insert(I);
  993|     18|  return I;
  994|     18|}
_ZN6hermes9IRBuilder6insertEPNS_11InstructionE:
 1008|  2.27M|void IRBuilder::insert(Instruction *Inst) {
 1009|       |  // Set the statement of the new instruction based on the current function's
 1010|       |  // statement counter.
 1011|  2.27M|  OptValue<uint32_t> statementOpt = getFunction()->getStatementCount();
 1012|  2.27M|  uint32_t statement;
 1013|  2.27M|  if (LLVM_LIKELY(statementOpt.hasValue())) {
  ------------------
  |  |  188|  2.27M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.33M, False: 943k]
  |  |  ------------------
  ------------------
 1014|  1.33M|    statement = *statementOpt;
 1015|  1.33M|  } else {
 1016|       |    // If we've cleared the statement count,
 1017|       |    // then just set the new instruction's statement to the statement of the
 1018|       |    // instruction we're inserting at (0 if it doesn't exist).
 1019|   943k|    statement = InsertionPoint != Block->getInstList().end()
  ------------------
  |  Branch (1019:17): [True: 943k, False: 0]
  ------------------
 1020|   943k|        ? InsertionPoint->getStatementIndex()
 1021|   943k|        : 0;
 1022|   943k|  }
 1023|  2.27M|  Inst->setStatementIndex(statement);
 1024|       |
 1025|  2.27M|  Inst->setLocation(Location);
 1026|  2.27M|  Inst->setSourceLevelScope(CurrentSourceLevelScope);
 1027|       |
 1028|  2.27M|  return justInsert(Inst);
 1029|  2.27M|}
_ZN6hermes9IRBuilder17setInsertionBlockEPNS_10BasicBlockE:
 1031|   496k|void IRBuilder::setInsertionBlock(BasicBlock *BB) {
 1032|   496k|  if (BB) {
  ------------------
  |  Branch (1032:7): [True: 496k, False: 56]
  ------------------
 1033|   496k|    InsertionPoint = BB->end();
 1034|   496k|    Block = BB;
 1035|   496k|  } else {
 1036|     56|    InsertionPoint = BasicBlock::iterator(nullptr);
 1037|     56|    Block = nullptr;
 1038|     56|  }
 1039|   496k|}
_ZN6hermes9IRBuilder17getInsertionBlockEv:
 1041|   267k|BasicBlock *IRBuilder::getInsertionBlock() {
 1042|   267k|  return Block;
 1043|   267k|}
_ZN6hermes9IRBuilder22setInsertionPointAfterEPNS_11InstructionE:
 1045|  21.0k|void IRBuilder::setInsertionPointAfter(Instruction *IP) {
 1046|  21.0k|  InsertionPoint = IP->getIterator();
 1047|  21.0k|  InsertionPoint++;
 1048|  21.0k|  Block = IP->getParent();
 1049|  21.0k|}
_ZN6hermes9IRBuilder17setInsertionPointEPNS_11InstructionE:
 1051|   834k|void IRBuilder::setInsertionPoint(Instruction *IP) {
 1052|   834k|  InsertionPoint = IP->getIterator();
 1053|   834k|  Block = IP->getParent();
 1054|   834k|}
_ZN6hermes9IRBuilder10justInsertEPNS_11InstructionE:
 1002|  2.27M|inline void IRBuilder::justInsert(Instruction *Inst) {
 1003|  2.27M|  assert(!Inst->getParent() && "Instr that's already inserted elsewhere");
 1004|      0|  Inst->setParent(Block);
 1005|  2.27M|  Block->getInstList().insert(InsertionPoint, Inst);
 1006|  2.27M|}

_ZNK6hermes14TerminatorInst16getNumSuccessorsEv:
   22|   852k|unsigned TerminatorInst::getNumSuccessors() const {
   23|   852k|#undef TERMINATOR
   24|   852k|#define TERMINATOR(CLASS, PARENT)           \
   25|   852k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
   26|   852k|    return I->getNumSuccessors();
   27|   852k|#include "hermes/IR/Instrs.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|   852k|#ifndef DEF_VALUE
  |  |    9|   852k|#define DEF_VALUE(NAME, PARENT)
  |  |   10|   852k|#endif
  |  |   11|   852k|#ifndef MARK_FIRST
  |  |   12|   852k|#define MARK_FIRST(NAME)
  |  |   13|   852k|#endif
  |  |   14|   852k|#ifndef MARK_LAST
  |  |   15|   852k|#define MARK_LAST(NAME)
  |  |   16|   852k|#endif
  |  |   17|       |
  |  |   18|       |#ifndef TERMINATOR
  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|   852k|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|   852k|#define INCLUDE_HBC_BACKEND
  |  |   24|   852k|#endif
  |  |   25|       |
  |  |   26|   852k|MARK_FIRST(ScopeCreationInst)
  |  |   27|   852k|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |   28|   852k|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |   29|   852k|#ifdef INCLUDE_HBC_BACKEND
  |  |   30|   852k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |   31|   852k|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |   32|   852k|#endif
  |  |   33|   852k|MARK_LAST(ScopeCreationInst)
  |  |   34|       |
  |  |   35|   852k|MARK_FIRST(SingleOperandInst)
  |  |   36|   852k|DEF_VALUE(SingleOperandInst, Instruction)
  |  |   37|   852k|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |   38|   852k|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |   39|   852k|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |   40|   852k|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |   41|   852k|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |   42|   852k|DEF_VALUE(MovInst, SingleOperandInst)
  |  |   43|   852k|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |   44|   852k|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |   45|   852k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |   46|   852k|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |   47|   852k|#ifdef INCLUDE_HBC_BACKEND
  |  |   48|   852k|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |   49|   852k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |   50|   852k|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |   51|   852k|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |   52|   852k|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |   53|   852k|#endif
  |  |   54|   852k|MARK_LAST(SingleOperandInst)
  |  |   55|       |
  |  |   56|   852k|DEF_VALUE(PhiInst, Instruction)
  |  |   57|   852k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |   58|   852k|MARK_FIRST(StorePropertyInst)
  |  |   59|   852k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |   60|   852k|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |   61|   852k|MARK_LAST(StorePropertyInst)
  |  |   62|       |
  |  |   63|   852k|MARK_FIRST(StoreOwnPropertyInst)
  |  |   64|   852k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |   65|   852k|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |   66|   852k|MARK_LAST(StoreOwnPropertyInst)
  |  |   67|       |
  |  |   68|   852k|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |   69|   852k|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |   70|   852k|MARK_FIRST(LoadPropertyInst)
  |  |   71|   852k|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |   72|   852k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |   73|   852k|MARK_LAST(LoadPropertyInst)
  |  |   74|   852k|DEF_VALUE(LoadFrameInst, Instruction)
  |  |   75|   852k|DEF_VALUE(StoreStackInst, Instruction)
  |  |   76|   852k|DEF_VALUE(StoreFrameInst, Instruction)
  |  |   77|   852k|DEF_VALUE(AllocStackInst, Instruction)
  |  |   78|   852k|DEF_VALUE(AllocObjectInst, Instruction)
  |  |   79|   852k|DEF_VALUE(AllocArrayInst, Instruction)
  |  |   80|   852k|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |   81|   852k|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |   82|   852k|DEF_VALUE(CatchInst, Instruction)
  |  |   83|   852k|DEF_VALUE(DebuggerInst, Instruction)
  |  |   84|   852k|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |   85|   852k|DEF_VALUE(TryEndInst, Instruction)
  |  |   86|   852k|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |   87|   852k|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |   88|   852k|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |   89|   852k|DEF_VALUE(IteratorNextInst, Instruction)
  |  |   90|   852k|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |   91|   852k|#ifdef INCLUDE_HBC_BACKEND
  |  |   92|   852k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |   93|   852k|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |   94|   852k|#endif
  |  |   95|   852k|DEF_VALUE(UnreachableInst, Instruction)
  |  |   96|       |
  |  |   97|   852k|MARK_FIRST(CreateFunctionInst)
  |  |   98|   852k|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |   99|   852k|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  100|   852k|#ifdef INCLUDE_HBC_BACKEND
  |  |  101|   852k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  102|   852k|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  103|   852k|#endif
  |  |  104|   852k|MARK_LAST(CreateFunctionInst)
  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  107|       |#endif
  |  |  108|       |
  |  |  109|   852k|MARK_FIRST(TerminatorInst)
  |  |  110|   852k|DEF_VALUE(TerminatorInst, Instruction)
  |  |  111|   852k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   852k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 394k, False: 458k]
  |  |  |  |  ------------------
  |  |  |  |   26|   852k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  112|   458k|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|   458k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 456k, False: 1.23k]
  |  |  |  |  ------------------
  |  |  |  |   26|   458k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  113|  1.23k|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  1.23k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 30, False: 1.20k]
  |  |  |  |  ------------------
  |  |  |  |   26|  1.23k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  114|  1.20k|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  1.20k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 1.20k]
  |  |  |  |  ------------------
  |  |  |  |   26|  1.20k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  115|  1.20k|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|  1.20k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 1.06k, False: 144]
  |  |  |  |  ------------------
  |  |  |  |   26|  1.20k|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  116|    144|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|    144|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 144]
  |  |  |  |  ------------------
  |  |  |  |   26|    144|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  117|    144|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|    144|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 144]
  |  |  |  |  ------------------
  |  |  |  |   26|    144|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  118|    144|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|    144|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 144]
  |  |  |  |  ------------------
  |  |  |  |   26|    144|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  119|    144|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|    144|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 144, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   26|    144|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   26|      0|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   26|      0|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   25|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (25:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   26|      0|    return I->getNumSuccessors();
  |  |  ------------------
  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  124|       |
  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  133|      0|#endif
  |  |  134|      0|MARK_LAST(CallInst)
  |  |  135|       |
  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  139|       |
  |  |  140|       |// These are target dependent instructions:
  |  |  141|       |
  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  150|      0|#endif
  |  |  151|       |
  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  153|       |
  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  155|       |// these macros are still used after the #include.
  |  |  156|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  157|      0|#undef DEF_VALUE
  |  |  158|      0|#undef MARK_FIRST
  |  |  159|      0|#undef MARK_LAST
  |  |  160|      0|#undef TERMINATOR
  |  |  161|      0|#endif
  ------------------
   28|      0|  llvm_unreachable("not a terminator?!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   29|   462k|}
_ZNK6hermes14TerminatorInst12getSuccessorEj:
   31|   198k|BasicBlock *TerminatorInst::getSuccessor(unsigned idx) const {
   32|   198k|#undef TERMINATOR
   33|   198k|#define TERMINATOR(CLASS, PARENT)           \
   34|   198k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
   35|   198k|    return I->getSuccessor(idx);
   36|   198k|#include "hermes/IR/Instrs.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|   198k|#ifndef DEF_VALUE
  |  |    9|   198k|#define DEF_VALUE(NAME, PARENT)
  |  |   10|   198k|#endif
  |  |   11|   198k|#ifndef MARK_FIRST
  |  |   12|   198k|#define MARK_FIRST(NAME)
  |  |   13|   198k|#endif
  |  |   14|   198k|#ifndef MARK_LAST
  |  |   15|   198k|#define MARK_LAST(NAME)
  |  |   16|   198k|#endif
  |  |   17|       |
  |  |   18|       |#ifndef TERMINATOR
  |  |   19|       |#define TERMINATOR(NAME, PARENT) DEF_VALUE(NAME, PARENT)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|   198k|#if defined(INCLUDE_ALL_INSTRS) || defined(INCLUDE_HBC_INSTRS)
  |  |   23|   198k|#define INCLUDE_HBC_BACKEND
  |  |   24|   198k|#endif
  |  |   25|       |
  |  |   26|   198k|MARK_FIRST(ScopeCreationInst)
  |  |   27|   198k|DEF_VALUE(ScopeCreationInst, Instruction)
  |  |   28|   198k|DEF_VALUE(CreateScopeInst, ScopeCreationInst)
  |  |   29|   198k|#ifdef INCLUDE_HBC_BACKEND
  |  |   30|   198k|DEF_VALUE(HBCCreateEnvironmentInst, ScopeCreationInst)
  |  |   31|   198k|DEF_VALUE(HBCResolveEnvironment, ScopeCreationInst)
  |  |   32|   198k|#endif
  |  |   33|   198k|MARK_LAST(ScopeCreationInst)
  |  |   34|       |
  |  |   35|   198k|MARK_FIRST(SingleOperandInst)
  |  |   36|   198k|DEF_VALUE(SingleOperandInst, Instruction)
  |  |   37|   198k|DEF_VALUE(AddEmptyStringInst, SingleOperandInst)
  |  |   38|   198k|DEF_VALUE(AsNumberInst, SingleOperandInst)
  |  |   39|   198k|DEF_VALUE(AsNumericInst, SingleOperandInst)
  |  |   40|   198k|DEF_VALUE(AsInt32Inst, SingleOperandInst)
  |  |   41|   198k|DEF_VALUE(LoadStackInst, SingleOperandInst)
  |  |   42|   198k|DEF_VALUE(MovInst, SingleOperandInst)
  |  |   43|   198k|DEF_VALUE(ImplicitMovInst, Instruction)
  |  |   44|   198k|DEF_VALUE(CoerceThisNSInst, SingleOperandInst)
  |  |   45|   198k|DEF_VALUE(UnaryOperatorInst, SingleOperandInst)
  |  |   46|   198k|DEF_VALUE(DirectEvalInst, SingleOperandInst)
  |  |   47|   198k|#ifdef INCLUDE_HBC_BACKEND
  |  |   48|   198k|DEF_VALUE(HBCLoadConstInst, SingleOperandInst)
  |  |   49|   198k|DEF_VALUE(HBCLoadParamInst, SingleOperandInst)
  |  |   50|   198k|DEF_VALUE(HBCGetArgumentsLengthInst, SingleOperandInst)
  |  |   51|   198k|DEF_VALUE(HBCReifyArgumentsInst, SingleOperandInst)
  |  |   52|   198k|DEF_VALUE(HBCSpillMovInst, SingleOperandInst)
  |  |   53|   198k|#endif
  |  |   54|   198k|MARK_LAST(SingleOperandInst)
  |  |   55|       |
  |  |   56|   198k|DEF_VALUE(PhiInst, Instruction)
  |  |   57|   198k|DEF_VALUE(BinaryOperatorInst, Instruction)
  |  |   58|   198k|MARK_FIRST(StorePropertyInst)
  |  |   59|   198k|DEF_VALUE(StorePropertyInst, Instruction)
  |  |   60|   198k|DEF_VALUE(TryStoreGlobalPropertyInst, StorePropertyInst)
  |  |   61|   198k|MARK_LAST(StorePropertyInst)
  |  |   62|       |
  |  |   63|   198k|MARK_FIRST(StoreOwnPropertyInst)
  |  |   64|   198k|DEF_VALUE(StoreOwnPropertyInst, Instruction)
  |  |   65|   198k|DEF_VALUE(StoreNewOwnPropertyInst, StoreOwnPropertyInst)
  |  |   66|   198k|MARK_LAST(StoreOwnPropertyInst)
  |  |   67|       |
  |  |   68|   198k|DEF_VALUE(StoreGetterSetterInst, Instruction)
  |  |   69|   198k|DEF_VALUE(DeletePropertyInst, Instruction)
  |  |   70|   198k|MARK_FIRST(LoadPropertyInst)
  |  |   71|   198k|DEF_VALUE(LoadPropertyInst, Instruction)
  |  |   72|   198k|DEF_VALUE(TryLoadGlobalPropertyInst, LoadPropertyInst)
  |  |   73|   198k|MARK_LAST(LoadPropertyInst)
  |  |   74|   198k|DEF_VALUE(LoadFrameInst, Instruction)
  |  |   75|   198k|DEF_VALUE(StoreStackInst, Instruction)
  |  |   76|   198k|DEF_VALUE(StoreFrameInst, Instruction)
  |  |   77|   198k|DEF_VALUE(AllocStackInst, Instruction)
  |  |   78|   198k|DEF_VALUE(AllocObjectInst, Instruction)
  |  |   79|   198k|DEF_VALUE(AllocArrayInst, Instruction)
  |  |   80|   198k|DEF_VALUE(AllocObjectLiteralInst, Instruction)
  |  |   81|   198k|DEF_VALUE(CreateArgumentsInst, Instruction)
  |  |   82|   198k|DEF_VALUE(CatchInst, Instruction)
  |  |   83|   198k|DEF_VALUE(DebuggerInst, Instruction)
  |  |   84|   198k|DEF_VALUE(CreateRegExpInst, Instruction)
  |  |   85|   198k|DEF_VALUE(TryEndInst, Instruction)
  |  |   86|   198k|DEF_VALUE(GetNewTargetInst, Instruction)
  |  |   87|   198k|DEF_VALUE(ThrowIfEmptyInst, Instruction)
  |  |   88|   198k|DEF_VALUE(IteratorBeginInst, Instruction)
  |  |   89|   198k|DEF_VALUE(IteratorNextInst, Instruction)
  |  |   90|   198k|DEF_VALUE(IteratorCloseInst, Instruction)
  |  |   91|   198k|#ifdef INCLUDE_HBC_BACKEND
  |  |   92|   198k|DEF_VALUE(HBCStoreToEnvironmentInst, Instruction)
  |  |   93|   198k|DEF_VALUE(HBCLoadFromEnvironmentInst, Instruction)
  |  |   94|   198k|#endif
  |  |   95|   198k|DEF_VALUE(UnreachableInst, Instruction)
  |  |   96|       |
  |  |   97|   198k|MARK_FIRST(CreateFunctionInst)
  |  |   98|   198k|DEF_VALUE(CreateFunctionInst, Instruction)
  |  |   99|   198k|DEF_VALUE(CreateGeneratorInst, Instruction)
  |  |  100|   198k|#ifdef INCLUDE_HBC_BACKEND
  |  |  101|   198k|DEF_VALUE(HBCCreateFunctionInst, CreateFunctionInst)
  |  |  102|   198k|DEF_VALUE(HBCCreateGeneratorInst, Instruction)
  |  |  103|   198k|#endif
  |  |  104|   198k|MARK_LAST(CreateFunctionInst)
  |  |  105|       |#ifdef HERMES_RUN_WASM
  |  |  106|       |DEF_VALUE(CallIntrinsicInst, Instruction)
  |  |  107|       |#endif
  |  |  108|       |
  |  |  109|   198k|MARK_FIRST(TerminatorInst)
  |  |  110|   198k|DEF_VALUE(TerminatorInst, Instruction)
  |  |  111|   198k|TERMINATOR(BranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|   198k|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 197k, False: 804]
  |  |  |  |  ------------------
  |  |  |  |   35|   198k|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  112|    804|TERMINATOR(ReturnInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|    804|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 804]
  |  |  |  |  ------------------
  |  |  |  |   35|    804|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  113|    804|TERMINATOR(ThrowInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|    804|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 804]
  |  |  |  |  ------------------
  |  |  |  |   35|    804|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  114|    804|TERMINATOR(SwitchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|    804|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 804]
  |  |  |  |  ------------------
  |  |  |  |   35|    804|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  115|    804|TERMINATOR(CondBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|    804|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 708, False: 96]
  |  |  |  |  ------------------
  |  |  |  |   35|    804|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  116|     96|TERMINATOR(GetPNamesInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|     96|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  |  |   35|     96|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  117|     96|TERMINATOR(GetNextPNameInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|     96|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  |  |   35|     96|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  118|     96|TERMINATOR(CheckHasInstanceInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|     96|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 96]
  |  |  |  |  ------------------
  |  |  |  |   35|     96|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  119|     96|TERMINATOR(TryStartInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|     96|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 96, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   35|     96|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  120|      0|TERMINATOR(CompareBranchInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   35|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  121|      0|TERMINATOR(SwitchImmInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   35|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  122|      0|TERMINATOR(SaveAndYieldInst, TerminatorInst)
  |  |  ------------------
  |  |  |  |   34|      0|  if (auto I = llvh::dyn_cast<CLASS>(this)) \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (34:12): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   35|      0|    return I->getSuccessor(idx);
  |  |  ------------------
  |  |  123|      0|MARK_LAST(TerminatorInst)
  |  |  124|       |
  |  |  125|      0|MARK_FIRST(CallInst)
  |  |  126|      0|DEF_VALUE(CallInst, Instruction)
  |  |  127|      0|DEF_VALUE(ConstructInst, CallInst)
  |  |  128|      0|DEF_VALUE(CallBuiltinInst, CallInst)
  |  |  129|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  130|      0|DEF_VALUE(HBCConstructInst, CallInst)
  |  |  131|      0|DEF_VALUE(HBCCallDirectInst, CallInst)
  |  |  132|      0|DEF_VALUE(HBCCallNInst, CallInst)
  |  |  133|      0|#endif
  |  |  134|      0|MARK_LAST(CallInst)
  |  |  135|       |
  |  |  136|      0|DEF_VALUE(GetBuiltinClosureInst, Instruction)
  |  |  137|      0|DEF_VALUE(StartGeneratorInst, Instruction)
  |  |  138|      0|DEF_VALUE(ResumeGeneratorInst, Instruction)
  |  |  139|       |
  |  |  140|       |// These are target dependent instructions:
  |  |  141|       |
  |  |  142|      0|#ifdef INCLUDE_HBC_BACKEND
  |  |  143|      0|DEF_VALUE(HBCGetGlobalObjectInst, Instruction)
  |  |  144|      0|DEF_VALUE(HBCGetThisNSInst, Instruction)
  |  |  145|      0|DEF_VALUE(HBCCreateThisInst, Instruction)
  |  |  146|      0|DEF_VALUE(HBCGetArgumentsPropByValInst, Instruction)
  |  |  147|      0|DEF_VALUE(HBCGetConstructedObjectInst, Instruction)
  |  |  148|      0|DEF_VALUE(HBCAllocObjectFromBufferInst, Instruction)
  |  |  149|      0|DEF_VALUE(HBCProfilePointInst, Instruction)
  |  |  150|      0|#endif
  |  |  151|       |
  |  |  152|      0|#undef INCLUDE_HBC_BACKEND
  |  |  153|       |
  |  |  154|       |// Don't undef these if this file is being included in ValueKinds.def, since
  |  |  155|       |// these macros are still used after the #include.
  |  |  156|      0|#ifndef INCLUDED_FROM_VALUEKINDS
  |  |  157|      0|#undef DEF_VALUE
  |  |  158|      0|#undef MARK_FIRST
  |  |  159|      0|#undef MARK_LAST
  |  |  160|      0|#undef TERMINATOR
  |  |  161|      0|#endif
  ------------------
   37|      0|  llvm_unreachable("not a terminator?!");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   38|  3.60k|}
_ZN6hermes17UnaryOperatorInst13parseOperatorEN4llvh9StringRefE:
   66|  4.00k|UnaryOperatorInst::OpKind UnaryOperatorInst::parseOperator(llvh::StringRef op) {
   67|  20.0k|  for (int i = 0; i < static_cast<int>(BinaryOperatorInst::OpKind::LAST_OPCODE);
  ------------------
  |  Branch (67:19): [True: 20.0k, False: 0]
  ------------------
   68|  20.0k|       i++) {
   69|  20.0k|    if (op == UnaryOperatorInst::opStringRepr[i]) {
  ------------------
  |  Branch (69:9): [True: 4.00k, False: 16.0k]
  ------------------
   70|  4.00k|      return static_cast<UnaryOperatorInst::OpKind>(i);
   71|  4.00k|    }
   72|  20.0k|  }
   73|       |
   74|      0|  llvm_unreachable("invalid operator string");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   75|  4.00k|}
_ZN6hermes18BinaryOperatorInst13parseOperatorEN4llvh9StringRefE:
  112|  65.0k|    llvh::StringRef op) {
  113|  65.0k|  return parseOperator_impl(op, opStringRepr);
  114|  65.0k|}
_ZN6hermes7PhiInstC2ERKN4llvh11SmallVectorIPNS_5ValueELj8EEERKNS2_IPNS_10BasicBlockELj8EEE:
  229|     34|    : Instruction(ValueKind::PhiInstKind) {
  230|     34|  assert(values.size() == blocks.size() && "Block-value pairs mismatch");
  231|       |  // Push the incoming values.
  232|    102|  for (int i = 0, e = values.size(); i < e; ++i) {
  ------------------
  |  Branch (232:38): [True: 68, False: 34]
  ------------------
  233|     68|    pushOperand(values[i]);
  234|     68|    pushOperand(blocks[i]);
  235|     68|  }
  236|     34|}
_ZNK6hermes7PhiInst13getNumEntriesEv:
  238|     68|unsigned PhiInst::getNumEntries() const {
  239|       |  // The PHI operands are just pairs of values and basic blocks.
  240|     68|  return getNumOperands() / 2;
  241|     68|}
_ZNK6hermes7PhiInst8getEntryEj:
  248|    136|std::pair<Value *, BasicBlock *> PhiInst::getEntry(unsigned i) const {
  249|    136|  return std::make_pair(
  250|    136|      getOperand(indexOfPhiEntry(i)),
  251|    136|      cast<BasicBlock>(getOperand(indexOfPhiEntry(i) + 1)));
  252|    136|}
_ZN6hermes7PhiInst11updateEntryEjPNS_5ValueEPNS_10BasicBlockE:
  254|     68|void PhiInst::updateEntry(unsigned i, Value *val, BasicBlock *BB) {
  255|     68|  setOperand(val, indexOfPhiEntry(i));
  256|     68|  setOperand(BB, indexOfPhiEntry(i) + 1);
  257|     68|}
Instrs.cpp:_ZL18parseOperator_implN4llvh9StringRefEPPKc:
  100|  65.0k|    const char **lookup_table) {
  101|   846k|  for (int i = 0; i < static_cast<int>(BinaryOperatorInst::OpKind::LAST_OPCODE);
  ------------------
  |  Branch (101:19): [True: 846k, False: 0]
  ------------------
  102|   846k|       i++) {
  103|   846k|    if (op == lookup_table[i]) {
  ------------------
  |  Branch (103:9): [True: 65.0k, False: 781k]
  ------------------
  104|  65.0k|      return static_cast<BinaryOperatorInst::OpKind>(i);
  105|  65.0k|    }
  106|   846k|  }
  107|       |
  108|      0|  llvm_unreachable("invalid operator string");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  109|  65.0k|}
Instrs.cpp:_ZL15indexOfPhiEntryj:
  244|    408|static unsigned indexOfPhiEntry(unsigned index) {
  245|    408|  return index * 2;
  246|    408|}

_ZN6hermes5irgen11ESTreeIRGen29genFinallyBeforeControlChangeEPNS0_14SurroundingTryES3_NS0_17ControlFlowChangeEPNS_10BasicBlockE:
  135|   114k|    BasicBlock *continueTarget) {
  136|   114k|  assert(
  137|   114k|      (cfc == ControlFlowChange::Break || continueTarget != nullptr) &&
  138|   114k|      "Continue ControlFlowChange must have a target");
  139|       |  // We walk the nested try statements starting from the source, until we reach
  140|       |  // the target, generating the finally statements on the way.
  141|   114k|  for (; sourceTry != targetTry; sourceTry = sourceTry->outer) {
  ------------------
  |  Branch (141:10): [True: 0, False: 114k]
  ------------------
  142|      0|    assert(sourceTry && "invalid try chain");
  143|       |
  144|       |    // Emit an end of the try statement.
  145|      0|    auto *tryEndBlock = Builder.createBasicBlock(curFunction()->function);
  146|      0|    Builder.createBranchInst(tryEndBlock);
  147|      0|    Builder.setInsertionBlock(tryEndBlock);
  148|       |
  149|       |    // Make sure we use the correct debug location for tryEndInst.
  150|      0|    if (sourceTry->tryEndLoc.isValid()) {
  ------------------
  |  Branch (150:9): [True: 0, False: 0]
  ------------------
  151|      0|      hermes::IRBuilder::ScopedLocationChange slc(
  152|      0|          Builder, sourceTry->tryEndLoc);
  153|      0|      Builder.createTryEndInst();
  154|      0|    } else {
  155|      0|      Builder.createTryEndInst();
  156|      0|    }
  157|       |
  158|      0|    if (sourceTry->genFinalizer) {
  ------------------
  |  Branch (158:9): [True: 0, False: 0]
  ------------------
  159|       |      // Recreate the state of the try stack on entrance to the finally block.
  160|      0|      llvh::SaveAndRestore<SurroundingTry *> sr{
  161|      0|          curFunction()->surroundingTry, sourceTry->outer};
  162|      0|      sourceTry->genFinalizer(sourceTry->node, cfc, continueTarget);
  163|      0|    }
  164|      0|  }
  165|   114k|}

_ZN6hermes5irgen11ESTreeIRGen13genExpressionEPNS_6ESTree4NodeENS_10IdentifierE:
   17|  1.11M|Value *ESTreeIRGen::genExpression(ESTree::Node *expr, Identifier nameHint) {
   18|  1.11M|  LLVM_DEBUG(
  ------------------
  |  |  123|  1.11M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.11M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.11M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.11M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   19|  1.11M|      llvh::dbgs() << "IRGen expression of type " << expr->getNodeName()
   20|  1.11M|                   << "\n");
   21|  1.11M|  IRBuilder::ScopedLocationChange slc(Builder, expr->getDebugLoc());
   22|       |
   23|       |  // Handle identifiers.
   24|  1.11M|  if (auto *Iden = llvh::dyn_cast<ESTree::IdentifierNode>(expr)) {
  ------------------
  |  Branch (24:13): [True: 142k, False: 977k]
  ------------------
   25|   142k|    return genIdentifierExpression(Iden, false);
   26|   142k|  }
   27|       |
   28|       |  // Handle Null Literals.
   29|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-null-literals
   30|   977k|  if (llvh::isa<ESTree::NullLiteralNode>(expr)) {
  ------------------
  |  Branch (30:7): [True: 0, False: 977k]
  ------------------
   31|      0|    return Builder.getLiteralNull();
   32|      0|  }
   33|       |
   34|       |  // Handle String Literals.
   35|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-string-literals
   36|   977k|  if (auto *Lit = llvh::dyn_cast<ESTree::StringLiteralNode>(expr)) {
  ------------------
  |  Branch (36:13): [True: 5, False: 977k]
  ------------------
   37|      5|    LLVM_DEBUG(
  ------------------
  |  |  123|      5|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      5|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      5|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   38|      5|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
   39|      5|    return Builder.getLiteralString(Lit->_value->str());
   40|      5|  }
   41|       |
   42|       |  // Handle Regexp Literals.
   43|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-regular-expression-literals
   44|   977k|  if (auto *Lit = llvh::dyn_cast<ESTree::RegExpLiteralNode>(expr)) {
  ------------------
  |  Branch (44:13): [True: 11.4k, False: 965k]
  ------------------
   45|  11.4k|    return genRegExpLiteral(Lit);
   46|  11.4k|  }
   47|       |
   48|       |  // Handle Boolean Literals.
   49|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-boolean-literals
   50|   965k|  if (auto *Lit = llvh::dyn_cast<ESTree::BooleanLiteralNode>(expr)) {
  ------------------
  |  Branch (50:13): [True: 2.01k, False: 963k]
  ------------------
   51|  2.01k|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.01k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.01k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.01k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.01k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   52|  2.01k|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
   53|  2.01k|    return Builder.getLiteralBool(Lit->_value);
   54|  2.01k|  }
   55|       |
   56|       |  // Handle Number Literals.
   57|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-numeric-literals
   58|   963k|  if (auto *Lit = llvh::dyn_cast<ESTree::NumericLiteralNode>(expr)) {
  ------------------
  |  Branch (58:13): [True: 738k, False: 225k]
  ------------------
   59|   738k|    LLVM_DEBUG(
  ------------------
  |  |  123|   738k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   738k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 738k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   738k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   60|   738k|        llvh::dbgs() << "Loading Numeric Literal \"" << Lit->_value << "\"\n");
   61|   738k|    return Builder.getLiteralNumber(Lit->_value);
   62|   738k|  }
   63|       |
   64|       |  // Handle BigInt Literals.
   65|       |  // https://262.ecma-international.org/#sec-ecmascript-language-types-bigint-type
   66|   225k|  if (auto *Lit = llvh::dyn_cast<ESTree::BigIntLiteralNode>(expr)) {
  ------------------
  |  Branch (66:13): [True: 0, False: 225k]
  ------------------
   67|      0|    LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   68|      0|        llvh::dbgs() << "Loading BitInt Literal \"" << Lit->_bigint->str()
   69|      0|                     << "\"\n");
   70|      0|    return Builder.getLiteralBigInt(Lit->_bigint);
   71|      0|  }
   72|       |
   73|       |  // Handle the assignment expression.
   74|   225k|  if (auto Assign = llvh::dyn_cast<ESTree::AssignmentExpressionNode>(expr)) {
  ------------------
  |  Branch (74:12): [True: 3.85k, False: 221k]
  ------------------
   75|  3.85k|    return genAssignmentExpr(Assign);
   76|  3.85k|  }
   77|       |
   78|       |  // Handle Call expressions.
   79|   221k|  if (auto *call = llvh::dyn_cast<ESTree::CallExpressionNode>(expr)) {
  ------------------
  |  Branch (79:13): [True: 8, False: 221k]
  ------------------
   80|      8|    return genCallExpr(call);
   81|      8|  }
   82|       |
   83|       |  // Handle Call expressions.
   84|   221k|  if (auto *call = llvh::dyn_cast<ESTree::OptionalCallExpressionNode>(expr)) {
  ------------------
  |  Branch (84:13): [True: 0, False: 221k]
  ------------------
   85|      0|    return genOptionalCallExpr(call, nullptr);
   86|      0|  }
   87|       |
   88|       |  // Handle the 'new' expressions.
   89|   221k|  if (auto *newExp = llvh::dyn_cast<ESTree::NewExpressionNode>(expr)) {
  ------------------
  |  Branch (89:13): [True: 0, False: 221k]
  ------------------
   90|      0|    return genNewExpr(newExp);
   91|      0|  }
   92|       |
   93|       |  // Handle MemberExpression expressions for access property.
   94|   221k|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(expr)) {
  ------------------
  |  Branch (94:13): [True: 8, False: 221k]
  ------------------
   95|      8|    return genMemberExpression(Mem, MemberExpressionOperation::Load).result;
   96|      8|  }
   97|       |
   98|       |  // Handle MemberExpression expressions for access property.
   99|   221k|  if (auto *mem = llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(expr)) {
  ------------------
  |  Branch (99:13): [True: 0, False: 221k]
  ------------------
  100|      0|    return genOptionalMemberExpression(
  101|      0|               mem, nullptr, MemberExpressionOperation::Load)
  102|      0|        .result;
  103|      0|  }
  104|       |
  105|       |  // Handle Array expressions (syntax: [1,2,3]).
  106|   221k|  if (auto *Arr = llvh::dyn_cast<ESTree::ArrayExpressionNode>(expr)) {
  ------------------
  |  Branch (106:13): [True: 33.4k, False: 188k]
  ------------------
  107|  33.4k|    return genArrayExpr(Arr);
  108|  33.4k|  }
  109|       |
  110|       |  // Handle object expressions (syntax: {"1" : "2"}).
  111|   188k|  if (auto *Obj = llvh::dyn_cast<ESTree::ObjectExpressionNode>(expr)) {
  ------------------
  |  Branch (111:13): [True: 5.04k, False: 183k]
  ------------------
  112|  5.04k|    return genObjectExpr(Obj);
  113|  5.04k|  }
  114|       |
  115|       |  // Handle logical expressions (short circuiting).
  116|   183k|  if (auto *L = llvh::dyn_cast<ESTree::LogicalExpressionNode>(expr)) {
  ------------------
  |  Branch (116:13): [True: 11, False: 183k]
  ------------------
  117|     11|    return genLogicalExpression(L);
  118|     11|  }
  119|       |
  120|       |  // Handle Binary Expressions.
  121|   183k|  if (auto *Bin = llvh::dyn_cast<ESTree::BinaryExpressionNode>(expr)) {
  ------------------
  |  Branch (121:13): [True: 23.9k, False: 159k]
  ------------------
  122|  23.9k|    return genBinaryExpression(Bin);
  123|  23.9k|  }
  124|       |
  125|       |  // Handle Unary operator Expressions.
  126|   159k|  if (auto *U = llvh::dyn_cast<ESTree::UnaryExpressionNode>(expr)) {
  ------------------
  |  Branch (126:13): [True: 4.00k, False: 155k]
  ------------------
  127|  4.00k|    return genUnaryExpression(U);
  128|  4.00k|  }
  129|       |
  130|       |  // Handle the 'this' keyword.
  131|   155k|  if (llvh::isa<ESTree::ThisExpressionNode>(expr)) {
  ------------------
  |  Branch (131:7): [True: 0, False: 155k]
  ------------------
  132|      0|    if (curFunction()->function->getDefinitionKind() ==
  ------------------
  |  Branch (132:9): [True: 0, False: 0]
  ------------------
  133|      0|        Function::DefinitionKind::ES6Arrow) {
  134|      0|      assert(
  135|      0|          curFunction()->capturedThis &&
  136|      0|          "arrow function must have a captured this");
  137|      0|      return Builder.createLoadFrameInst(
  138|      0|          curFunction()->capturedThis, currentIRScope_);
  139|      0|    }
  140|      0|    return curFunction()->function->getThisParameter();
  141|      0|  }
  142|       |
  143|   155k|  if (auto *MP = llvh::dyn_cast<ESTree::MetaPropertyNode>(expr)) {
  ------------------
  |  Branch (143:13): [True: 0, False: 155k]
  ------------------
  144|      0|    return genMetaProperty(MP);
  145|      0|  }
  146|       |
  147|       |  // Handle function expressions.
  148|   155k|  if (auto *FE = llvh::dyn_cast<ESTree::FunctionExpressionNode>(expr)) {
  ------------------
  |  Branch (148:13): [True: 0, False: 155k]
  ------------------
  149|      0|    return genFunctionExpression(FE, nameHint);
  150|      0|  }
  151|       |
  152|   155k|  if (auto *AF = llvh::dyn_cast<ESTree::ArrowFunctionExpressionNode>(expr)) {
  ------------------
  |  Branch (152:13): [True: 114k, False: 41.3k]
  ------------------
  153|   114k|    return genArrowFunctionExpression(AF, nameHint);
  154|   114k|  }
  155|       |
  156|  41.3k|  if (auto *U = llvh::dyn_cast<ESTree::UpdateExpressionNode>(expr)) {
  ------------------
  |  Branch (156:13): [True: 2, False: 41.3k]
  ------------------
  157|      2|    return genUpdateExpr(U);
  158|      2|  }
  159|       |
  160|  41.3k|  if (auto *C = llvh::dyn_cast<ESTree::ConditionalExpressionNode>(expr)) {
  ------------------
  |  Branch (160:13): [True: 34, False: 41.3k]
  ------------------
  161|     34|    return genConditionalExpr(C);
  162|     34|  }
  163|       |
  164|  41.3k|  if (auto *Sq = llvh::dyn_cast<ESTree::SequenceExpressionNode>(expr)) {
  ------------------
  |  Branch (164:13): [True: 25, False: 41.2k]
  ------------------
  165|     25|    return genSequenceExpr(Sq);
  166|     25|  }
  167|       |
  168|  41.2k|  if (auto *Tl = llvh::dyn_cast<ESTree::TemplateLiteralNode>(expr)) {
  ------------------
  |  Branch (168:13): [True: 41.0k, False: 283]
  ------------------
  169|  41.0k|    return genTemplateLiteralExpr(Tl);
  170|  41.0k|  }
  171|       |
  172|    283|  if (auto *Tt = llvh::dyn_cast<ESTree::TaggedTemplateExpressionNode>(expr)) {
  ------------------
  |  Branch (172:13): [True: 283, False: 0]
  ------------------
  173|    283|    return genTaggedTemplateExpr(Tt);
  174|    283|  }
  175|       |
  176|      0|  if (auto *Y = llvh::dyn_cast<ESTree::YieldExpressionNode>(expr)) {
  ------------------
  |  Branch (176:13): [True: 0, False: 0]
  ------------------
  177|      0|    return Y->_delegate ? genYieldStarExpr(Y) : genYieldExpr(Y);
  ------------------
  |  Branch (177:12): [True: 0, False: 0]
  ------------------
  178|      0|  }
  179|       |
  180|      0|  if (auto *A = llvh::dyn_cast<ESTree::AwaitExpressionNode>(expr)) {
  ------------------
  |  Branch (180:13): [True: 0, False: 0]
  ------------------
  181|      0|    return genAwaitExpr(A);
  182|      0|  }
  183|       |
  184|      0|  Builder.getModule()->getContext().getSourceErrorManager().error(
  185|      0|      expr->getSourceRange(), Twine("Invalid expression encountered"));
  186|      0|  return Builder.getLiteralUndefined();
  187|      0|}
_ZN6hermes5irgen11ESTreeIRGen19genExpressionBranchEPNS_6ESTree4NodeEPNS_10BasicBlockES6_S6_:
  193|     36|    BasicBlock *onNullish) {
  194|     36|  switch (expr->getKind()) {
  195|      0|    case ESTree::NodeKind::LogicalExpression:
  ------------------
  |  Branch (195:5): [True: 0, False: 36]
  ------------------
  196|      0|      return genLogicalExpressionBranch(
  197|      0|          cast<ESTree::LogicalExpressionNode>(expr),
  198|      0|          onTrue,
  199|      0|          onFalse,
  200|      0|          onNullish);
  201|       |
  202|      0|    case ESTree::NodeKind::UnaryExpression: {
  ------------------
  |  Branch (202:5): [True: 0, False: 36]
  ------------------
  203|      0|      auto *e = cast<ESTree::UnaryExpressionNode>(expr);
  204|      0|      switch (UnaryOperatorInst::parseOperator(e->_operator->str())) {
  205|      0|        case UnaryOperatorInst::OpKind::BangKind:
  ------------------
  |  Branch (205:9): [True: 0, False: 0]
  ------------------
  206|       |          // Do not propagate onNullish here because !expr cannot be nullish.
  207|      0|          return genExpressionBranch(e->_argument, onFalse, onTrue, nullptr);
  208|      0|        default:
  ------------------
  |  Branch (208:9): [True: 0, False: 0]
  ------------------
  209|      0|          break;
  210|      0|      }
  211|       |
  212|      0|      break;
  213|      0|    }
  214|       |
  215|      0|    case ESTree::NodeKind::SequenceExpression: {
  ------------------
  |  Branch (215:5): [True: 0, False: 36]
  ------------------
  216|      0|      auto *e = cast<ESTree::SequenceExpressionNode>(expr);
  217|       |
  218|      0|      ESTree::NodePtr last = nullptr;
  219|      0|      for (auto &ex : e->_expressions) {
  ------------------
  |  Branch (219:21): [True: 0, False: 0]
  ------------------
  220|      0|        if (last)
  ------------------
  |  Branch (220:13): [True: 0, False: 0]
  ------------------
  221|      0|          genExpression(last);
  222|      0|        last = &ex;
  223|      0|      }
  224|      0|      if (last)
  ------------------
  |  Branch (224:11): [True: 0, False: 0]
  ------------------
  225|      0|        genExpressionBranch(last, onTrue, onFalse, onNullish);
  226|      0|      return;
  227|      0|    }
  228|       |
  229|     36|    default:
  ------------------
  |  Branch (229:5): [True: 36, False: 0]
  ------------------
  230|     36|      break;
  231|     36|  }
  232|       |
  233|     36|  Value *condVal = genExpression(expr);
  234|     36|  if (onNullish) {
  ------------------
  |  Branch (234:7): [True: 0, False: 36]
  ------------------
  235|      0|    Value *isNullish = Builder.createBinaryOperatorInst(
  236|      0|        condVal,
  237|      0|        Builder.getLiteralNull(),
  238|      0|        BinaryOperatorInst::OpKind::EqualKind);
  239|      0|    BasicBlock *notNullishBB = Builder.createBasicBlock(Builder.getFunction());
  240|      0|    Builder.createCondBranchInst(isNullish, onNullish, notNullishBB);
  241|      0|    Builder.setInsertionBlock(notNullishBB);
  242|      0|  }
  243|     36|  Builder.createCondBranchInst(condVal, onTrue, onFalse);
  244|     36|}
_ZN6hermes5irgen11ESTreeIRGen20genArrayFromElementsERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  246|  33.4k|Value *ESTreeIRGen::genArrayFromElements(ESTree::NodeList &list) {
  247|  33.4k|  LLVM_DEBUG(llvh::dbgs() << "Initializing a new array\n");
  ------------------
  |  |  123|  33.4k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  33.4k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 33.4k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  33.4k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  248|  33.4k|  AllocArrayInst::ArrayValueList elements;
  249|       |
  250|       |  // Precalculate the minimum number of elements in case we need to call
  251|       |  // AllocArrayInst at some point, as well as find out whether we have a spread
  252|       |  // element (which will result in the final array having variable length).
  253|  33.4k|  unsigned minElements = 0;
  254|  33.4k|  bool variableLength = false;
  255|   705k|  for (auto &E : list) {
  ------------------
  |  Branch (255:16): [True: 705k, False: 33.4k]
  ------------------
  256|   705k|    if (llvh::isa<ESTree::SpreadElementNode>(&E)) {
  ------------------
  |  Branch (256:9): [True: 0, False: 705k]
  ------------------
  257|      0|      variableLength = true;
  258|      0|      continue;
  259|      0|    }
  260|   705k|    ++minElements;
  261|   705k|  }
  262|       |
  263|       |  // We store consecutive elements until we encounter elision,
  264|       |  // or we enounter a non-literal in limited-register mode.
  265|       |  // The rest of them has to be initialized through property sets.
  266|       |
  267|       |  // If we have a variable length array, then we store the next index in
  268|       |  // a stack location `nextIndex`, to be updated when we encounter spread
  269|       |  // elements. Otherwise, we simply count them in `count`.
  270|  33.4k|  unsigned count = 0;
  271|  33.4k|  AllocStackInst *nextIndex = nullptr;
  272|  33.4k|  if (variableLength) {
  ------------------
  |  Branch (272:7): [True: 0, False: 33.4k]
  ------------------
  273|       |    // Avoid emitting the extra instructions unless we actually need to,
  274|       |    // to simplify tests and because it's easy.
  275|      0|    nextIndex = Builder.createAllocStackInst("nextIndex");
  276|      0|    Builder.createStoreStackInst(Builder.getLiteralPositiveZero(), nextIndex);
  277|      0|  }
  278|       |
  279|  33.4k|  bool consecutive = true;
  280|  33.4k|  auto codeGenOpts = Mod->getContext().getCodeGenerationSettings();
  281|  33.4k|  AllocArrayInst *allocArrayInst = nullptr;
  282|   705k|  for (auto &E : list) {
  ------------------
  |  Branch (282:16): [True: 705k, False: 33.4k]
  ------------------
  283|   705k|    Value *value{nullptr};
  284|   705k|    bool isSpread = false;
  285|   705k|    if (!llvh::isa<ESTree::EmptyNode>(&E)) {
  ------------------
  |  Branch (285:9): [True: 705k, False: 12]
  ------------------
  286|   705k|      if (auto *spread = llvh::dyn_cast<ESTree::SpreadElementNode>(&E)) {
  ------------------
  |  Branch (286:17): [True: 0, False: 705k]
  ------------------
  287|      0|        isSpread = true;
  288|      0|        value = genExpression(spread->_argument);
  289|   705k|      } else {
  290|   705k|        value = genExpression(&E);
  291|   705k|      }
  292|   705k|    }
  293|   705k|    if (!value ||
  ------------------
  |  Branch (293:9): [True: 12, False: 705k]
  ------------------
  294|   705k|        (!llvh::isa<Literal>(value) && !codeGenOpts.unlimitedRegisters) ||
  ------------------
  |  Branch (294:10): [True: 38.4k, False: 666k]
  |  Branch (294:40): [True: 38.4k, False: 0]
  ------------------
  295|   705k|        isSpread) {
  ------------------
  |  Branch (295:9): [True: 0, False: 666k]
  ------------------
  296|       |      // This is either an elision,
  297|       |      // or a non-literal in limited-register mode,
  298|       |      // or a spread element.
  299|  38.5k|      if (consecutive) {
  ------------------
  |  Branch (299:11): [True: 80, False: 38.4k]
  ------------------
  300|       |        // So far we have been storing elements consecutively,
  301|       |        // but not anymore, time to create the array.
  302|     80|        allocArrayInst = Builder.createAllocArrayInst(elements, minElements);
  303|     80|        consecutive = false;
  304|     80|      }
  305|  38.5k|    }
  306|   705k|    if (isSpread) {
  ------------------
  |  Branch (306:9): [True: 0, False: 705k]
  ------------------
  307|       |      // Spread the SpreadElement argument into the array.
  308|       |      // HermesInternal.arraySpread returns the new value of nextIndex,
  309|       |      // so update nextIndex accordingly and finish this iteration of the loop.
  310|      0|      auto *newNextIndex = genBuiltinCall(
  311|      0|          BuiltinMethod::HermesBuiltin_arraySpread,
  312|      0|          {allocArrayInst, value, Builder.createLoadStackInst(nextIndex)});
  313|      0|      Builder.createStoreStackInst(newNextIndex, nextIndex);
  314|      0|      continue;
  315|      0|    }
  316|       |    // The element is not a spread element, so perform the store here.
  317|   705k|    if (value) {
  ------------------
  |  Branch (317:9): [True: 705k, False: 12]
  ------------------
  318|   705k|      if (consecutive) {
  ------------------
  |  Branch (318:11): [True: 494k, False: 210k]
  ------------------
  319|   494k|        elements.push_back(value);
  320|   494k|      } else {
  321|   210k|        Builder.createStoreOwnPropertyInst(
  322|   210k|            value,
  323|   210k|            allocArrayInst,
  324|   210k|            variableLength ? cast<Value>(Builder.createLoadStackInst(nextIndex))
  ------------------
  |  Branch (324:13): [True: 0, False: 210k]
  ------------------
  325|   210k|                           : cast<Value>(Builder.getLiteralNumber(count)),
  326|   210k|            IRBuilder::PropEnumerable::Yes);
  327|   210k|      }
  328|   705k|    }
  329|       |    // Update the next index or the count depending on if it's a variable length
  330|       |    // array.
  331|   705k|    if (variableLength) {
  ------------------
  |  Branch (331:9): [True: 0, False: 705k]
  ------------------
  332|       |      // We perform this update on any leading elements before the first spread
  333|       |      // element as well, but the optimizer will eliminate the extra adds
  334|       |      // because we know the initial value (0) and how incrementing works.
  335|      0|      Builder.createStoreStackInst(
  336|      0|          Builder.createBinaryOperatorInst(
  337|      0|              Builder.createLoadStackInst(nextIndex),
  338|      0|              Builder.getLiteralNumber(1),
  339|      0|              BinaryOperatorInst::OpKind::AddKind),
  340|      0|          nextIndex);
  341|   705k|    } else {
  342|   705k|      count++;
  343|   705k|    }
  344|   705k|  }
  345|       |
  346|  33.4k|  if (!allocArrayInst) {
  ------------------
  |  Branch (346:7): [True: 33.3k, False: 80]
  ------------------
  347|  33.3k|    assert(
  348|  33.3k|        !variableLength &&
  349|  33.3k|        "variable length arrays must allocate their own arrays");
  350|      0|    allocArrayInst = Builder.createAllocArrayInst(elements, list.size());
  351|  33.3k|  }
  352|  33.4k|  if (!list.empty() && llvh::isa<ESTree::EmptyNode>(&list.back())) {
  ------------------
  |  Branch (352:7): [True: 20.2k, False: 13.2k]
  |  Branch (352:7): [True: 0, False: 33.4k]
  |  Branch (352:24): [True: 0, False: 20.2k]
  ------------------
  353|       |    // Last element is an elision, VM cannot derive the length properly.
  354|       |    // We have to explicitly set it.
  355|      0|    Value *newLength;
  356|      0|    if (variableLength)
  ------------------
  |  Branch (356:9): [True: 0, False: 0]
  ------------------
  357|      0|      newLength = Builder.createLoadStackInst(nextIndex);
  358|      0|    else
  359|      0|      newLength = Builder.getLiteralNumber(count);
  360|      0|    Builder.createStorePropertyInst(
  361|      0|        newLength, allocArrayInst, llvh::StringRef("length"));
  362|      0|  }
  363|  33.4k|  return allocArrayInst;
  364|  33.4k|}
_ZN6hermes5irgen11ESTreeIRGen12genArrayExprEPNS_6ESTree19ArrayExpressionNodeE:
  366|  33.4k|Value *ESTreeIRGen::genArrayExpr(ESTree::ArrayExpressionNode *Expr) {
  367|  33.4k|  return genArrayFromElements(Expr->_elements);
  368|  33.4k|}
_ZN6hermes5irgen11ESTreeIRGen11genCallExprEPNS_6ESTree18CallExpressionNodeE:
  370|      8|Value *ESTreeIRGen::genCallExpr(ESTree::CallExpressionNode *call) {
  371|      8|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'call' statement/expression.\n");
  ------------------
  |  |  123|      8|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      8|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 8]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      8|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  372|       |
  373|       |  // Check for a direct call to eval().
  374|      8|  if (auto *identNode = llvh::dyn_cast<ESTree::IdentifierNode>(call->_callee)) {
  ------------------
  |  Branch (374:13): [True: 0, False: 8]
  ------------------
  375|      0|    if (Identifier::getFromPointer(identNode->_name) == identEval_) {
  ------------------
  |  Branch (375:9): [True: 0, False: 0]
  ------------------
  376|      0|      auto *evalVar = nameTable_.lookup(identEval_);
  377|      0|      if (!evalVar || llvh::isa<GlobalObjectProperty>(evalVar))
  ------------------
  |  Branch (377:11): [True: 0, False: 0]
  |  Branch (377:23): [True: 0, False: 0]
  ------------------
  378|      0|        return genCallEvalExpr(call);
  379|      0|    }
  380|      0|  }
  381|       |
  382|      8|  Value *thisVal;
  383|      8|  Value *callee;
  384|       |
  385|       |  // Handle MemberExpression expression calls that sets the 'this' property.
  386|      8|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(call->_callee)) {
  ------------------
  |  Branch (386:13): [True: 4, False: 4]
  ------------------
  387|      4|    MemberExpressionResult memResult =
  388|      4|        genMemberExpression(Mem, MemberExpressionOperation::Load);
  389|       |
  390|       |    // Call the callee with obj as the 'this' pointer.
  391|      4|    thisVal = memResult.base;
  392|      4|    callee = memResult.result;
  393|      4|  } else if (
  394|      4|      auto *Mem =
  ------------------
  |  Branch (394:13): [True: 0, False: 4]
  ------------------
  395|      4|          llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(call->_callee)) {
  396|      0|    MemberExpressionResult memResult = genOptionalMemberExpression(
  397|      0|        Mem, nullptr, MemberExpressionOperation::Load);
  398|       |
  399|       |    // Call the callee with obj as the 'this' pointer.
  400|      0|    thisVal = memResult.base;
  401|      0|    callee = memResult.result;
  402|      4|  } else {
  403|      4|    thisVal = Builder.getLiteralUndefined();
  404|      4|    callee = genExpression(call->_callee);
  405|      4|  }
  406|       |
  407|      8|  return emitCall(call, callee, thisVal);
  408|      8|}
_ZN6hermes5irgen11ESTreeIRGen8emitCallEPNS_6ESTree22CallExpressionLikeNodeEPNS_5ValueES6_:
  640|      8|    Value *thisVal) {
  641|      8|  bool hasSpread = false;
  642|      8|  for (auto &arg : getArguments(call)) {
  ------------------
  |  Branch (642:18): [True: 8, False: 8]
  ------------------
  643|      8|    if (llvh::isa<ESTree::SpreadElementNode>(&arg)) {
  ------------------
  |  Branch (643:9): [True: 0, False: 8]
  ------------------
  644|      0|      hasSpread = true;
  645|      0|    }
  646|      8|  }
  647|       |
  648|      8|  if (!hasSpread) {
  ------------------
  |  Branch (648:7): [True: 8, False: 0]
  ------------------
  649|      8|    CallInst::ArgumentList args;
  650|      8|    for (auto &arg : getArguments(call)) {
  ------------------
  |  Branch (650:20): [True: 8, False: 8]
  ------------------
  651|      8|      args.push_back(genExpression(&arg));
  652|      8|    }
  653|       |
  654|      8|    return Builder.createCallInst(
  655|      8|        getTextifiedCallExpr(Builder, call), callee, thisVal, args);
  656|      8|  }
  657|       |
  658|       |  // Otherwise, there exists a spread argument, so the number of arguments
  659|       |  // is variable.
  660|       |  // Generate IR for this by creating an array and populating it with the
  661|       |  // arguments, then calling HermesInternal.apply.
  662|      0|  auto *args = genArrayFromElements(getArguments(call));
  663|      0|  return genBuiltinCall(
  664|      0|      BuiltinMethod::HermesBuiltin_apply, {callee, args, thisVal});
  665|      8|}
_ZN6hermes5irgen11ESTreeIRGen19genMemberExpressionEPNS_6ESTree20MemberExpressionNodeENS1_25MemberExpressionOperationE:
  669|     12|    MemberExpressionOperation op) {
  670|     12|  Value *baseValue = genExpression(mem->_object);
  671|     12|  Value *prop = genMemberExpressionProperty(mem);
  672|     12|  switch (op) {
  ------------------
  |  Branch (672:11): [True: 0, False: 12]
  ------------------
  673|     12|    case MemberExpressionOperation::Load:
  ------------------
  |  Branch (673:5): [True: 12, False: 0]
  ------------------
  674|     12|      return MemberExpressionResult{
  675|     12|          Builder.createLoadPropertyInst(baseValue, prop), baseValue};
  676|      0|    case MemberExpressionOperation::Delete:
  ------------------
  |  Branch (676:5): [True: 0, False: 12]
  ------------------
  677|      0|      return MemberExpressionResult{
  678|      0|          Builder.createDeletePropertyInst(baseValue, prop), baseValue};
  679|     12|  }
  680|      0|  llvm_unreachable("No other kind of member expression");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  681|     12|}
_ZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS_6ESTree20ObjectExpressionNodeE:
  826|  5.04k|Value *ESTreeIRGen::genObjectExpr(ESTree::ObjectExpressionNode *Expr) {
  827|  5.04k|  LLVM_DEBUG(llvh::dbgs() << "Initializing a new object\n");
  ------------------
  |  |  123|  5.04k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  5.04k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 5.04k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  5.04k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  828|       |
  829|       |  /// Store information about a property. Is it an accessor (getter/setter) or
  830|       |  /// a value, and the actual value.
  831|  5.04k|  class PropertyValue {
  832|  5.04k|   public:
  833|       |    /// Is this a getter/setter value.
  834|  5.04k|    bool isAccessor = false;
  835|       |    /// Tracks the state of generating IR for this value.
  836|  5.04k|    enum { None, Placeholder, IRGenerated } state{None};
  837|       |    /// The value, if this is a regular property
  838|  5.04k|    ESTree::Node *valueNode{};
  839|       |    /// Getter accessor, if this is an accessor property.
  840|  5.04k|    ESTree::FunctionExpressionNode *getterNode{};
  841|       |    /// Setter accessor, if this is an accessor property.
  842|  5.04k|    ESTree::FunctionExpressionNode *setterNode{};
  843|       |
  844|  5.04k|    SMRange getSourceRange() {
  845|  5.04k|      if (valueNode) {
  846|  5.04k|        return valueNode->getSourceRange();
  847|  5.04k|      }
  848|       |
  849|  5.04k|      if (getterNode) {
  850|  5.04k|        return getterNode->getSourceRange();
  851|  5.04k|      }
  852|       |
  853|  5.04k|      if (setterNode) {
  854|  5.04k|        return setterNode->getSourceRange();
  855|  5.04k|      }
  856|       |
  857|  5.04k|      llvm_unreachable("Unset node has no location info");
  858|  5.04k|    }
  859|       |
  860|  5.04k|    void setValue(ESTree::Node *val) {
  861|  5.04k|      isAccessor = false;
  862|  5.04k|      valueNode = val;
  863|  5.04k|      getterNode = setterNode = nullptr;
  864|  5.04k|    }
  865|  5.04k|    void setGetter(ESTree::FunctionExpressionNode *get) {
  866|  5.04k|      if (!isAccessor) {
  867|  5.04k|        valueNode = nullptr;
  868|  5.04k|        setterNode = nullptr;
  869|  5.04k|        isAccessor = true;
  870|  5.04k|      }
  871|  5.04k|      getterNode = get;
  872|  5.04k|    }
  873|  5.04k|    void setSetter(ESTree::FunctionExpressionNode *set) {
  874|  5.04k|      if (!isAccessor) {
  875|  5.04k|        valueNode = nullptr;
  876|  5.04k|        getterNode = nullptr;
  877|  5.04k|        isAccessor = true;
  878|  5.04k|      }
  879|  5.04k|      setterNode = set;
  880|  5.04k|    }
  881|  5.04k|  };
  882|       |
  883|       |  // First accumulate all getters and setters. We walk all properties, convert
  884|       |  // them to string and store the value into propMap, possibly overwriting the
  885|       |  // previous value.
  886|       |  // Note that computed properties are not stored in the propMap as we do not
  887|       |  // know the keys at compilation time.
  888|  5.04k|  llvh::StringMap<PropertyValue> propMap;
  889|       |  // The first location where a given property name is encountered.
  890|  5.04k|  llvh::StringMap<SMRange> firstLocMap;
  891|  5.04k|  llvh::SmallVector<char, 32> stringStorage;
  892|       |  /// The optional __proto__ property.
  893|  5.04k|  ESTree::PropertyNode *protoProperty = nullptr;
  894|       |
  895|  5.04k|  uint32_t numComputed = 0;
  896|  5.04k|  bool hasSpread = false;
  897|  5.04k|  bool hasAccessor = false;
  898|  5.04k|  bool hasDuplicateProperty = false;
  899|       |
  900|  5.97k|  for (auto &P : Expr->_properties) {
  ------------------
  |  Branch (900:16): [True: 5.97k, False: 5.04k]
  ------------------
  901|  5.97k|    if (llvh::isa<ESTree::SpreadElementNode>(&P)) {
  ------------------
  |  Branch (901:9): [True: 0, False: 5.97k]
  ------------------
  902|      0|      hasSpread = true;
  903|      0|      continue;
  904|      0|    }
  905|       |
  906|       |    // We are reusing the storage, so make sure it is cleared at every
  907|       |    // iteration.
  908|  5.97k|    stringStorage.clear();
  909|       |
  910|  5.97k|    auto *prop = cast<ESTree::PropertyNode>(&P);
  911|  5.97k|    if (prop->_computed) {
  ------------------
  |  Branch (911:9): [True: 0, False: 5.97k]
  ------------------
  912|       |      // Can't store any useful information if the name is computed.
  913|       |      // Just generate the code in the next loop.
  914|      0|      ++numComputed;
  915|      0|      continue;
  916|      0|    }
  917|       |
  918|  5.97k|    auto propName = propertyKeyAsString(stringStorage, prop->_key);
  919|       |
  920|       |    // protoProperty should only be recorded if the property is not a method
  921|       |    // nor a shorthand value.
  922|  5.97k|    if (prop->_kind->str() == "init" && propName == "__proto__" &&
  ------------------
  |  Branch (922:9): [True: 5.97k, False: 0]
  |  Branch (922:41): [True: 0, False: 5.97k]
  ------------------
  923|  5.97k|        !prop->_method && !prop->_shorthand) {
  ------------------
  |  Branch (923:9): [True: 0, False: 0]
  |  Branch (923:27): [True: 0, False: 0]
  ------------------
  924|      0|      if (!protoProperty) {
  ------------------
  |  Branch (924:11): [True: 0, False: 0]
  ------------------
  925|      0|        protoProperty = prop;
  926|      0|      } else {
  927|      0|        Builder.getModule()->getContext().getSourceErrorManager().error(
  928|      0|            prop->getSourceRange(),
  929|      0|            "__proto__ was set multiple times in the object definition.");
  930|      0|        Builder.getModule()->getContext().getSourceErrorManager().note(
  931|      0|            protoProperty->getSourceRange(), "The first definition was here.");
  932|      0|      }
  933|      0|      continue;
  934|      0|    }
  935|       |
  936|  5.97k|    PropertyValue *propValue = &propMap[propName];
  937|  5.97k|    if (prop->_kind->str() == "get") {
  ------------------
  |  Branch (937:9): [True: 0, False: 5.97k]
  ------------------
  938|      0|      propValue->setGetter(cast<ESTree::FunctionExpressionNode>(prop->_value));
  939|      0|      hasAccessor = true;
  940|  5.97k|    } else if (prop->_kind->str() == "set") {
  ------------------
  |  Branch (940:16): [True: 0, False: 5.97k]
  ------------------
  941|      0|      propValue->setSetter(cast<ESTree::FunctionExpressionNode>(prop->_value));
  942|      0|      hasAccessor = true;
  943|  5.97k|    } else {
  944|  5.97k|      assert(prop->_kind->str() == "init" && "invalid PropertyNode kind");
  945|       |      // We record the propValue if this is a regular property
  946|      0|      propValue->setValue(prop->_value);
  947|  5.97k|    }
  948|       |
  949|      0|    std::string key = (prop->_kind->str() + propName).str();
  950|  5.97k|    auto iterAndSuccess = firstLocMap.try_emplace(key, prop->getSourceRange());
  951|  5.97k|    if (!iterAndSuccess.second) {
  ------------------
  |  Branch (951:9): [True: 0, False: 5.97k]
  ------------------
  952|      0|      hasDuplicateProperty = true;
  953|      0|      Builder.getModule()->getContext().getSourceErrorManager().warning(
  954|      0|          prop->getSourceRange(),
  955|      0|          Twine("the property \"") + propName +
  956|      0|              "\" was set multiple times in the object definition.");
  957|       |
  958|      0|      Builder.getModule()->getContext().getSourceErrorManager().note(
  959|      0|          iterAndSuccess.first->second, "The first definition was here.");
  960|      0|    }
  961|  5.97k|  }
  962|       |
  963|       |  // Heuristically determine if we emit AllocObjectLiteral.
  964|       |  // We do so if there is no computed key, no __proto__, no spread element
  965|       |  // node, no duplicate properties, no accessors, and object literal is not
  966|       |  // empty.
  967|  5.04k|  if (numComputed == 0 && !protoProperty && !hasSpread &&
  ------------------
  |  Branch (967:7): [True: 5.04k, False: 0]
  |  Branch (967:27): [True: 5.04k, False: 0]
  |  Branch (967:45): [True: 5.04k, False: 0]
  ------------------
  968|  5.04k|      !hasDuplicateProperty && !hasAccessor && propMap.size()) {
  ------------------
  |  Branch (968:7): [True: 5.04k, False: 0]
  |  Branch (968:32): [True: 5.04k, False: 0]
  |  Branch (968:48): [True: 5.04k, False: 0]
  ------------------
  969|  5.04k|    AllocObjectLiteralInst::ObjectPropertyMap objPropMap;
  970|       |    // It is safe to assume that there is no computed keys, and
  971|       |    // no __proto__.
  972|  5.97k|    for (auto &P : Expr->_properties) {
  ------------------
  |  Branch (972:18): [True: 5.97k, False: 5.04k]
  ------------------
  973|  5.97k|      auto *prop = cast<ESTree::PropertyNode>(&P);
  974|  5.97k|      assert(
  975|  5.97k|          !prop->_computed &&
  976|  5.97k|          "Cannot handle computed key in AllocObjectLiteral");
  977|       |
  978|       |      // We are reusing the storage, so make sure it is cleared at every
  979|       |      // iteration.
  980|      0|      stringStorage.clear();
  981|       |
  982|  5.97k|      llvh::StringRef keyStr = propertyKeyAsString(stringStorage, prop->_key);
  983|  5.97k|      auto *Key = Builder.getLiteralString(keyStr);
  984|  5.97k|      assert(
  985|  5.97k|          propMap[keyStr].valueNode == prop->_value &&
  986|  5.97k|          "Should only have one value for each property.");
  987|      0|      auto value =
  988|  5.97k|          genExpression(prop->_value, Builder.createIdentifier(keyStr));
  989|  5.97k|      objPropMap.push_back(std::pair<LiteralString *, Value *>(Key, value));
  990|  5.97k|    }
  991|       |
  992|  5.04k|    return Builder.createAllocObjectLiteralInst(objPropMap);
  993|  5.04k|  }
  994|       |
  995|       |  /// Attempt to determine whether we can directly use the value of the
  996|       |  /// __proto__ property as a parent when creating the object for an object
  997|       |  /// initializer, instead of setting it later with
  998|       |  /// HermesInternal.silentSetPrototypeOf(). That is not possible to determine
  999|       |  /// statically in the general case, but we can check for the simple cases:
 1000|       |  /// - __proto__ property is first.
 1001|       |  /// - the value of __proto__ is constant.
 1002|      0|  Value *objectParent = nullptr;
 1003|      0|  if (protoProperty &&
  ------------------
  |  Branch (1003:7): [True: 0, False: 0]
  ------------------
 1004|      0|      (&Expr->_properties.front() == protoProperty ||
  ------------------
  |  Branch (1004:8): [True: 0, False: 0]
  ------------------
 1005|      0|       isConstantExpr(protoProperty->_value))) {
  ------------------
  |  Branch (1005:8): [True: 0, False: 0]
  ------------------
 1006|      0|    objectParent = genExpression(protoProperty->_value);
 1007|      0|  }
 1008|       |
 1009|       |  // Allocate a new javascript object on the heap.
 1010|      0|  auto Obj =
 1011|      0|      Builder.createAllocObjectInst(propMap.size() + numComputed, objectParent);
 1012|       |
 1013|       |  // haveSeenComputedProp tracks whether we have processed a computed property.
 1014|       |  // Once we do, for all future properties, we can no longer generate
 1015|       |  // StoreNewOwnPropertyInst because the computed property could have already
 1016|       |  // defined any property.
 1017|      0|  bool haveSeenComputedProp = false;
 1018|       |
 1019|       |  // Initialize all properties. We check whether the value of each property
 1020|       |  // will be overwritten (by comparing against what we have saved in propMap).
 1021|       |  // In that case we still compute the value (it could have side effects), but
 1022|       |  // we don't store it. The exception to this are accessor functions - there
 1023|       |  // is no need to create them if we don't use them because creating a function
 1024|       |  // has no side effects.
 1025|      0|  for (auto &P : Expr->_properties) {
  ------------------
  |  Branch (1025:16): [True: 0, False: 0]
  ------------------
 1026|      0|    if (auto *spread = llvh::dyn_cast<ESTree::SpreadElementNode>(&P)) {
  ------------------
  |  Branch (1026:15): [True: 0, False: 0]
  ------------------
 1027|      0|      genBuiltinCall(
 1028|      0|          BuiltinMethod::HermesBuiltin_copyDataProperties,
 1029|      0|          {Obj, genExpression(spread->_argument)});
 1030|      0|      haveSeenComputedProp = true;
 1031|      0|      continue;
 1032|      0|    }
 1033|       |
 1034|       |    // We are reusing the storage, so make sure it is cleared at every
 1035|       |    // iteration.
 1036|      0|    stringStorage.clear();
 1037|       |
 1038|      0|    auto *prop = cast<ESTree::PropertyNode>(&P);
 1039|       |
 1040|      0|    if (prop->_computed) {
  ------------------
  |  Branch (1040:9): [True: 0, False: 0]
  ------------------
 1041|       |      // TODO (T46136220): Set the .name property for anonymous functions that
 1042|       |      // are values for computed property keys.
 1043|      0|      auto *key = genExpression(prop->_key);
 1044|      0|      auto *value = genExpression(prop->_value);
 1045|      0|      if (prop->_kind->str() == "get") {
  ------------------
  |  Branch (1045:11): [True: 0, False: 0]
  ------------------
 1046|      0|        Builder.createStoreGetterSetterInst(
 1047|      0|            value,
 1048|      0|            Builder.getLiteralUndefined(),
 1049|      0|            Obj,
 1050|      0|            key,
 1051|      0|            IRBuilder::PropEnumerable::Yes);
 1052|      0|      } else if (prop->_kind->str() == "set") {
  ------------------
  |  Branch (1052:18): [True: 0, False: 0]
  ------------------
 1053|      0|        Builder.createStoreGetterSetterInst(
 1054|      0|            Builder.getLiteralUndefined(),
 1055|      0|            value,
 1056|      0|            Obj,
 1057|      0|            key,
 1058|      0|            IRBuilder::PropEnumerable::Yes);
 1059|      0|      } else {
 1060|      0|        Builder.createStoreOwnPropertyInst(
 1061|      0|            value, Obj, key, IRBuilder::PropEnumerable::Yes);
 1062|      0|      }
 1063|      0|      haveSeenComputedProp = true;
 1064|      0|      continue;
 1065|      0|    }
 1066|       |
 1067|      0|    llvh::StringRef keyStr = propertyKeyAsString(stringStorage, prop->_key);
 1068|       |
 1069|      0|    if (prop == protoProperty) {
  ------------------
  |  Branch (1069:9): [True: 0, False: 0]
  ------------------
 1070|       |      // This is the first definition of __proto__. If we already used it
 1071|       |      // as an object parent we just skip it, but otherwise we must
 1072|       |      // explicitly set the parent now by calling \c
 1073|       |      // HermesInternal.silentSetPrototypeOf().
 1074|      0|      if (!objectParent) {
  ------------------
  |  Branch (1074:11): [True: 0, False: 0]
  ------------------
 1075|      0|        auto *parent = genExpression(prop->_value);
 1076|       |
 1077|      0|        IRBuilder::SaveRestore saveState{Builder};
 1078|      0|        Builder.setLocation(prop->_key->getDebugLoc());
 1079|       |
 1080|      0|        genBuiltinCall(
 1081|      0|            BuiltinMethod::HermesBuiltin_silentSetPrototypeOf, {Obj, parent});
 1082|      0|      }
 1083|       |
 1084|      0|      continue;
 1085|      0|    }
 1086|       |
 1087|      0|    PropertyValue *propValue = &propMap[keyStr];
 1088|       |
 1089|       |    // For any node that has a corresponding propValue, we need to ensure that
 1090|       |    // the we insert either a placeholder or the final IR before the end of this
 1091|       |    // iteration.
 1092|      0|    auto checkState = llvh::make_scope_exit(
 1093|      0|        [&] { assert(propValue->state != PropertyValue::None); });
 1094|       |
 1095|      0|    auto *Key = Builder.getLiteralString(keyStr);
 1096|       |
 1097|      0|    auto maybeInsertPlaceholder = [&] {
 1098|      0|      if (propValue->state == PropertyValue::None) {
 1099|       |        // This value is going to be overwritten, but insert a placeholder in
 1100|       |        // order to maintain insertion order.
 1101|      0|        if (haveSeenComputedProp) {
 1102|      0|          Builder.createStoreOwnPropertyInst(
 1103|      0|              Builder.getLiteralNull(),
 1104|      0|              Obj,
 1105|      0|              Key,
 1106|      0|              IRBuilder::PropEnumerable::Yes);
 1107|      0|        } else {
 1108|      0|          Builder.createStoreNewOwnPropertyInst(
 1109|      0|              Builder.getLiteralNull(),
 1110|      0|              Obj,
 1111|      0|              Key,
 1112|      0|              IRBuilder::PropEnumerable::Yes);
 1113|      0|        }
 1114|      0|        propValue->state = PropertyValue::Placeholder;
 1115|      0|      }
 1116|      0|    };
 1117|       |
 1118|      0|    if (prop->_kind->str() == "get" || prop->_kind->str() == "set") {
  ------------------
  |  Branch (1118:9): [True: 0, False: 0]
  |  Branch (1118:40): [True: 0, False: 0]
  ------------------
 1119|       |      // If  we already generated it, skip.
 1120|      0|      if (propValue->state == PropertyValue::IRGenerated)
  ------------------
  |  Branch (1120:11): [True: 0, False: 0]
  ------------------
 1121|      0|        continue;
 1122|       |
 1123|      0|      if (!propValue->isAccessor) {
  ------------------
  |  Branch (1123:11): [True: 0, False: 0]
  ------------------
 1124|      0|        maybeInsertPlaceholder();
 1125|      0|        continue;
 1126|      0|      }
 1127|       |
 1128|      0|      Value *getter = Builder.getLiteralUndefined();
 1129|      0|      Value *setter = Builder.getLiteralUndefined();
 1130|       |
 1131|      0|      if (propValue->getterNode) {
  ------------------
  |  Branch (1131:11): [True: 0, False: 0]
  ------------------
 1132|      0|        getter = genExpression(
 1133|      0|            propValue->getterNode,
 1134|      0|            Builder.createIdentifier("get " + keyStr.str()));
 1135|      0|      }
 1136|       |
 1137|      0|      if (propValue->setterNode) {
  ------------------
  |  Branch (1137:11): [True: 0, False: 0]
  ------------------
 1138|      0|        setter = genExpression(
 1139|      0|            propValue->setterNode,
 1140|      0|            Builder.createIdentifier("set " + keyStr.str()));
 1141|      0|      }
 1142|       |
 1143|      0|      Builder.createStoreGetterSetterInst(
 1144|      0|          getter, setter, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1145|       |
 1146|      0|      propValue->state = PropertyValue::IRGenerated;
 1147|       |
 1148|      0|      continue;
 1149|      0|    }
 1150|       |
 1151|       |    // Always generate the values, even if we don't need it, for the side
 1152|       |    // effects.
 1153|      0|    auto value = genExpression(prop->_value, Builder.createIdentifier(keyStr));
 1154|       |
 1155|       |    // Only store the value if it won't be overwritten.
 1156|      0|    if (propMap[keyStr].valueNode == prop->_value) {
  ------------------
  |  Branch (1156:9): [True: 0, False: 0]
  ------------------
 1157|      0|      assert(
 1158|      0|          propValue->state != PropertyValue::IRGenerated &&
 1159|      0|          "IR can only be generated once");
 1160|      0|      if (haveSeenComputedProp ||
  ------------------
  |  Branch (1160:11): [True: 0, False: 0]
  ------------------
 1161|      0|          propValue->state == PropertyValue::Placeholder) {
  ------------------
  |  Branch (1161:11): [True: 0, False: 0]
  ------------------
 1162|      0|        Builder.createStoreOwnPropertyInst(
 1163|      0|            value, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1164|      0|      } else {
 1165|      0|        Builder.createStoreNewOwnPropertyInst(
 1166|      0|            value, Obj, Key, IRBuilder::PropEnumerable::Yes);
 1167|      0|      }
 1168|      0|      propValue->state = PropertyValue::IRGenerated;
 1169|      0|    } else {
 1170|      0|      maybeInsertPlaceholder();
 1171|      0|    }
 1172|      0|  }
 1173|       |
 1174|       |  // Return the newly allocated object (because this is an expression, not a
 1175|       |  // statement).
 1176|      0|  return Obj;
 1177|  5.04k|}
_ZN6hermes5irgen11ESTreeIRGen15genSequenceExprEPNS_6ESTree22SequenceExpressionNodeE:
 1179|     25|Value *ESTreeIRGen::genSequenceExpr(ESTree::SequenceExpressionNode *Sq) {
 1180|     25|  Value *result = Builder.getLiteralUndefined();
 1181|       |
 1182|       |  // Generate all expressions in the sequence, but take only the last one.
 1183|     50|  for (auto &Ex : Sq->_expressions) {
  ------------------
  |  Branch (1183:17): [True: 50, False: 25]
  ------------------
 1184|     50|    result = genExpression(&Ex);
 1185|     50|  }
 1186|       |
 1187|     25|  return result;
 1188|     25|}
_ZN6hermes5irgen11ESTreeIRGen19genBinaryExpressionEPNS_6ESTree20BinaryExpressionNodeE:
 1502|  23.9k|Value *ESTreeIRGen::genBinaryExpression(ESTree::BinaryExpressionNode *bin) {
 1503|       |  // Handle long chains of +/- non-recursively.
 1504|  23.9k|  if (bin->_operator->str() == "+" || bin->_operator->str() == "-") {
  ------------------
  |  Branch (1504:7): [True: 77, False: 23.8k]
  |  Branch (1504:39): [True: 2, False: 23.8k]
  ------------------
 1505|     79|    auto list = linearizeLeft(bin, {"+", "-"});
 1506|       |
 1507|     79|    Value *LHS = genExpression(list[0]->_left);
 1508|  41.1k|    for (auto *e : list) {
  ------------------
  |  Branch (1508:18): [True: 41.1k, False: 79]
  ------------------
 1509|  41.1k|      Value *RHS = genExpression(e->_right);
 1510|  41.1k|      Builder.setLocation(e->getDebugLoc());
 1511|  41.1k|      auto cookie = instrumentIR_.preBinaryExpression(e, LHS, RHS);
 1512|  41.1k|      auto Kind = BinaryOperatorInst::parseOperator(e->_operator->str());
 1513|  41.1k|      BinaryOperatorInst *result =
 1514|  41.1k|          Builder.createBinaryOperatorInst(LHS, RHS, Kind);
 1515|  41.1k|      LHS = instrumentIR_.postBinaryExpression(e, cookie, result, LHS, RHS);
 1516|  41.1k|    }
 1517|       |
 1518|     79|    return LHS;
 1519|     79|  }
 1520|       |
 1521|  23.8k|  Value *LHS = genExpression(bin->_left);
 1522|  23.8k|  Value *RHS = genExpression(bin->_right);
 1523|  23.8k|  auto cookie = instrumentIR_.preBinaryExpression(bin, LHS, RHS);
 1524|       |
 1525|  23.8k|  auto Kind = BinaryOperatorInst::parseOperator(bin->_operator->str());
 1526|       |
 1527|  23.8k|  BinaryOperatorInst *result = Builder.createBinaryOperatorInst(LHS, RHS, Kind);
 1528|  23.8k|  return instrumentIR_.postBinaryExpression(bin, cookie, result, LHS, RHS);
 1529|  23.9k|}
_ZN6hermes5irgen11ESTreeIRGen18genUnaryExpressionEPNS_6ESTree19UnaryExpressionNodeE:
 1531|  4.00k|Value *ESTreeIRGen::genUnaryExpression(ESTree::UnaryExpressionNode *U) {
 1532|  4.00k|  auto kind = UnaryOperatorInst::parseOperator(U->_operator->str());
 1533|       |
 1534|       |  // Handle the delete unary expression. https://es5.github.io/#x11.4.1
 1535|  4.00k|  if (kind == UnaryOperatorInst::OpKind::DeleteKind) {
  ------------------
  |  Branch (1535:7): [True: 0, False: 4.00k]
  ------------------
 1536|      0|    if (auto *memberExpr =
  ------------------
  |  Branch (1536:15): [True: 0, False: 0]
  ------------------
 1537|      0|            llvh::dyn_cast<ESTree::MemberExpressionNode>(U->_argument)) {
 1538|      0|      LLVM_DEBUG(llvh::dbgs() << "IRGen delete member expression.\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1539|       |
 1540|      0|      return genMemberExpression(memberExpr, MemberExpressionOperation::Delete)
 1541|      0|          .result;
 1542|      0|    }
 1543|       |
 1544|      0|    if (auto *memberExpr = llvh::dyn_cast<ESTree::OptionalMemberExpressionNode>(
  ------------------
  |  Branch (1544:15): [True: 0, False: 0]
  ------------------
 1545|      0|            U->_argument)) {
 1546|      0|      LLVM_DEBUG(llvh::dbgs() << "IRGen delete optional member expression.\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1547|       |
 1548|      0|      return genOptionalMemberExpression(
 1549|      0|                 memberExpr, nullptr, MemberExpressionOperation::Delete)
 1550|      0|          .result;
 1551|      0|    }
 1552|       |
 1553|       |    // Check for "delete identifier". Note that deleting unqualified identifiers
 1554|       |    // is prohibited in strict mode, so that case is handled earlier in the
 1555|       |    // semantic validator. Here we are left to handle the non-strict mode case.
 1556|      0|    if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(U->_argument)) {
  ------------------
  |  Branch (1556:15): [True: 0, False: 0]
  ------------------
 1557|      0|      assert(
 1558|      0|          !curFunction()->function->isStrictMode() &&
 1559|      0|          "delete identifier encountered in strict mode");
 1560|       |      // Check if this is a known variable.
 1561|      0|      Identifier name = getNameFieldFromID(iden);
 1562|      0|      auto *var = nameTable_.lookup(name);
 1563|       |
 1564|      0|      if (!var || llvh::isa<GlobalObjectProperty>(var)) {
  ------------------
  |  Branch (1564:11): [True: 0, False: 0]
  |  Branch (1564:19): [True: 0, False: 0]
  ------------------
 1565|       |        // If the variable doesn't exist or if it is global, we must generate
 1566|       |        // a delete global property instruction.
 1567|      0|        return Builder.createDeletePropertyInst(
 1568|      0|            Builder.getGlobalObject(), Builder.getLiteralString(name));
 1569|      0|      } else {
 1570|       |        // Otherwise it is a local variable which can't be deleted and we just
 1571|       |        // return false.
 1572|      0|        return Builder.getLiteralBool(false);
 1573|      0|      }
 1574|      0|    }
 1575|       |
 1576|       |    // Generate the code for the delete operand.
 1577|      0|    genExpression(U->_argument);
 1578|       |
 1579|       |    // Deleting any value or a result of an expression returns True.
 1580|      0|    return Builder.getLiteralBool(true);
 1581|      0|  }
 1582|       |
 1583|       |  // Need to handle the special case of "typeof <undefined variable>".
 1584|  4.00k|  if (kind == UnaryOperatorInst::OpKind::TypeofKind) {
  ------------------
  |  Branch (1584:7): [True: 0, False: 4.00k]
  ------------------
 1585|      0|    if (auto *id = llvh::dyn_cast<ESTree::IdentifierNode>(U->_argument)) {
  ------------------
  |  Branch (1585:15): [True: 0, False: 0]
  ------------------
 1586|      0|      Value *argument = genIdentifierExpression(id, true);
 1587|      0|      return Builder.createUnaryOperatorInst(argument, kind);
 1588|      0|    }
 1589|      0|  }
 1590|       |
 1591|       |  // Generate the unary operand:
 1592|  4.00k|  Value *argument = genExpression(U->_argument);
 1593|  4.00k|  auto *cookie = instrumentIR_.preUnaryExpression(U, argument);
 1594|       |
 1595|  4.00k|  Value *result;
 1596|  4.00k|  if (kind == UnaryOperatorInst::OpKind::PlusKind)
  ------------------
  |  Branch (1596:7): [True: 4, False: 4.00k]
  ------------------
 1597|      4|    result = Builder.createAsNumberInst(argument);
 1598|  4.00k|  else
 1599|  4.00k|    result = Builder.createUnaryOperatorInst(argument, kind);
 1600|  4.00k|  return instrumentIR_.postUnaryExpression(U, cookie, result, argument);
 1601|  4.00k|}
_ZN6hermes5irgen11ESTreeIRGen13genUpdateExprEPNS_6ESTree20UpdateExpressionNodeE:
 1603|      2|Value *ESTreeIRGen::genUpdateExpr(ESTree::UpdateExpressionNode *updateExpr) {
 1604|      2|  LLVM_DEBUG(llvh::dbgs() << "IRGen update expression.\n");
  ------------------
  |  |  123|      2|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      2|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      2|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1605|      2|  bool isPrefix = updateExpr->_prefix;
 1606|       |
 1607|      2|  UnaryOperatorInst::OpKind opKind;
 1608|      2|  if (updateExpr->_operator->str() == "++") {
  ------------------
  |  Branch (1608:7): [True: 2, False: 0]
  ------------------
 1609|      2|    opKind = UnaryOperatorInst::OpKind::IncKind;
 1610|      2|  } else if (updateExpr->_operator->str() == "--") {
  ------------------
  |  Branch (1610:14): [True: 0, False: 0]
  ------------------
 1611|      0|    opKind = UnaryOperatorInst::OpKind::DecKind;
 1612|      0|  } else {
 1613|      0|    llvm_unreachable("Invalid update operator");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1614|      0|  }
 1615|       |
 1616|      2|  LReference lref = createLRef(updateExpr->_argument, false);
 1617|       |
 1618|       |  // Load the original value. Postfix updates need to convert it toNumeric
 1619|       |  // before Inc/Dec to ensure the updateExpr has the proper result value.
 1620|      2|  Value *original =
 1621|      2|      isPrefix ? lref.emitLoad() : Builder.createAsNumericInst(lref.emitLoad());
  ------------------
  |  Branch (1621:7): [True: 0, False: 2]
  ------------------
 1622|       |
 1623|       |  // Create the inc or dec.
 1624|      2|  Value *result = Builder.createUnaryOperatorInst(original, opKind);
 1625|       |
 1626|       |  // Store the result.
 1627|      2|  lref.emitStore(result);
 1628|       |
 1629|       |  // Depending on the prefixness return the previous value or the modified
 1630|       |  // value.
 1631|      2|  return (isPrefix ? result : original);
  ------------------
  |  Branch (1631:11): [True: 0, False: 2]
  ------------------
 1632|      2|}
_ZN6hermes5irgen11ESTreeIRGen17genAssignmentExprEPNS_6ESTree24AssignmentExpressionNodeE:
 1645|  3.85k|Value *ESTreeIRGen::genAssignmentExpr(ESTree::AssignmentExpressionNode *AE) {
 1646|  3.85k|  LLVM_DEBUG(llvh::dbgs() << "IRGen assignment operator.\n");
  ------------------
  |  |  123|  3.85k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.85k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.85k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.85k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1647|       |
 1648|  3.85k|  auto opStr = AE->_operator->str();
 1649|       |
 1650|       |  // Handle nested normal assignments non-recursively.
 1651|  3.85k|  if (opStr == "=") {
  ------------------
  |  Branch (1651:7): [True: 3.85k, False: 0]
  ------------------
 1652|  3.85k|    auto list = ESTree::linearizeRight(AE, {"="});
 1653|       |
 1654|       |    // Create an LReference for every assignment left side.
 1655|  3.85k|    llvh::SmallVector<LReference, 1> lrefs;
 1656|  3.85k|    lrefs.reserve(list.size());
 1657|  3.85k|    for (auto *e : list) {
  ------------------
  |  Branch (1657:18): [True: 3.85k, False: 3.85k]
  ------------------
 1658|  3.85k|      lrefs.push_back(createLRef(e->_left, false));
 1659|  3.85k|    }
 1660|       |
 1661|  3.85k|    Value *RHS = nullptr;
 1662|  3.85k|    auto lrefIterator = lrefs.end();
 1663|  3.85k|    for (auto *e : llvh::make_range(list.rbegin(), list.rend())) {
  ------------------
  |  Branch (1663:18): [True: 3.85k, False: 3.85k]
  ------------------
 1664|  3.85k|      --lrefIterator;
 1665|  3.85k|      if (!RHS)
  ------------------
  |  Branch (1665:11): [True: 3.85k, False: 2]
  ------------------
 1666|  3.85k|        RHS = genExpression(e->_right, extractNameHint(*lrefIterator));
 1667|  3.85k|      Builder.setLocation(e->getDebugLoc());
 1668|  3.85k|      auto *cookie = instrumentIR_.preAssignment(e, nullptr, RHS);
 1669|  3.85k|      RHS = instrumentIR_.postAssignment(e, cookie, RHS, nullptr, RHS);
 1670|  3.85k|      lrefIterator->emitStore(RHS);
 1671|  3.85k|    }
 1672|       |
 1673|  3.85k|    return RHS;
 1674|  3.85k|  }
 1675|       |
 1676|      0|  auto AssignmentKind = BinaryOperatorInst::parseAssignmentOperator(opStr);
 1677|       |
 1678|      0|  LReference lref = createLRef(AE->_left, false);
 1679|      0|  Identifier nameHint = extractNameHint(lref);
 1680|       |
 1681|      0|  Value *result;
 1682|      0|  if (AssignmentKind == BinaryOperatorInst::OpKind::AssignShortCircuitOrKind ||
  ------------------
  |  Branch (1682:7): [True: 0, False: 0]
  ------------------
 1683|      0|      AssignmentKind == BinaryOperatorInst::OpKind::AssignShortCircuitAndKind ||
  ------------------
  |  Branch (1683:7): [True: 0, False: 0]
  ------------------
 1684|      0|      AssignmentKind == BinaryOperatorInst::OpKind::AssignNullishCoalesceKind) {
  ------------------
  |  Branch (1684:7): [True: 0, False: 0]
  ------------------
 1685|      0|    return genLogicalAssignmentExpr(AE, AssignmentKind, lref, nameHint);
 1686|      0|  }
 1687|       |
 1688|      0|  assert(AssignmentKind != BinaryOperatorInst::OpKind::IdentityKind);
 1689|       |  // Section 11.13.1 specifies that we should first load the
 1690|       |  // LHS before materializing the RHS. Unlike in C, this
 1691|       |  // code is well defined: "x+= x++".
 1692|       |  // https://es5.github.io/#x11.13.1
 1693|      0|  auto V = lref.emitLoad();
 1694|      0|  auto *RHS = genExpression(AE->_right, nameHint);
 1695|      0|  auto *cookie = instrumentIR_.preAssignment(AE, V, RHS);
 1696|      0|  result = Builder.createBinaryOperatorInst(V, RHS, AssignmentKind);
 1697|      0|  result = instrumentIR_.postAssignment(AE, cookie, result, V, RHS);
 1698|       |
 1699|      0|  lref.emitStore(result);
 1700|       |
 1701|       |  // Return the value that we stored as the result of the expression.
 1702|      0|  return result;
 1703|      0|}
_ZN6hermes5irgen11ESTreeIRGen16genRegExpLiteralEPNS_6ESTree17RegExpLiteralNodeE:
 1705|  11.4k|Value *ESTreeIRGen::genRegExpLiteral(ESTree::RegExpLiteralNode *RE) {
 1706|  11.4k|  LLVM_DEBUG(llvh::dbgs() << "IRGen reg exp literal.\n");
  ------------------
  |  |  123|  11.4k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  11.4k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 11.4k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  11.4k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1707|  11.4k|  LLVM_DEBUG(
  ------------------
  |  |  123|  11.4k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  11.4k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 11.4k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  11.4k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1708|  11.4k|      llvh::dbgs() << "Loading regexp Literal \"" << RE->_pattern->str()
 1709|  11.4k|                   << " / " << RE->_flags->str() << "\"\n");
 1710|  11.4k|  auto exp = Builder.createRegExpInst(
 1711|  11.4k|      Identifier::getFromPointer(RE->_pattern),
 1712|  11.4k|      Identifier::getFromPointer(RE->_flags));
 1713|       |
 1714|  11.4k|  auto &regexp = Builder.getModule()->getContext().getCompiledRegExp(
 1715|  11.4k|      RE->_pattern, RE->_flags);
 1716|       |
 1717|  11.4k|  if (regexp.getMapping().size()) {
  ------------------
  |  Branch (1717:7): [True: 0, False: 11.4k]
  ------------------
 1718|      0|    auto &mapping = regexp.getMapping();
 1719|      0|    HBCAllocObjectFromBufferInst::ObjectPropertyMap propMap;
 1720|      0|    for (auto &identifier : regexp.getOrderedGroupNames()) {
  ------------------
  |  Branch (1720:27): [True: 0, False: 0]
  ------------------
 1721|      0|      std::string converted;
 1722|      0|      convertUTF16ToUTF8WithSingleSurrogates(converted, identifier);
 1723|      0|      auto *key = Builder.getLiteralString(converted);
 1724|      0|      auto groupIdxRes = mapping.find(identifier);
 1725|      0|      assert(
 1726|      0|          groupIdxRes != mapping.end() &&
 1727|      0|          "identifier not found in named groups");
 1728|      0|      auto groupIdx = groupIdxRes->second;
 1729|      0|      auto *val = Builder.getLiteralNumber(groupIdx);
 1730|      0|      propMap.emplace_back(key, val);
 1731|      0|    }
 1732|      0|    auto sz = mapping.size();
 1733|       |
 1734|      0|    auto literalObj = Builder.createHBCAllocObjectFromBufferInst(propMap, sz);
 1735|       |
 1736|      0|    Value *params[] = {exp, literalObj};
 1737|      0|    Builder.createCallBuiltinInst(
 1738|      0|        BuiltinMethod::HermesBuiltin_initRegexNamedGroups, params);
 1739|      0|  }
 1740|       |
 1741|  11.4k|  return exp;
 1742|  11.4k|}
_ZN6hermes5irgen11ESTreeIRGen18genConditionalExprEPNS_6ESTree25ConditionalExpressionNodeE:
 1797|     34|Value *ESTreeIRGen::genConditionalExpr(ESTree::ConditionalExpressionNode *C) {
 1798|     34|  auto parentFunc = Builder.getInsertionBlock()->getParent();
 1799|       |
 1800|     34|  PhiInst::ValueListType values;
 1801|     34|  PhiInst::BasicBlockListType blocks;
 1802|       |
 1803|     34|  auto alternateBlock = Builder.createBasicBlock(parentFunc);
 1804|     34|  auto consequentBlock = Builder.createBasicBlock(parentFunc);
 1805|     34|  auto continueBlock = Builder.createBasicBlock(parentFunc);
 1806|       |
 1807|       |  // Implement the ternary operator using control flow. We must use control
 1808|       |  // flow because the expressions may have side effects.
 1809|     34|  genExpressionBranch(C->_test, consequentBlock, alternateBlock, nullptr);
 1810|       |
 1811|       |  // The 'then' side:
 1812|     34|  Builder.setInsertionBlock(consequentBlock);
 1813|       |
 1814|     34|  values.push_back(genExpression(C->_consequent));
 1815|     34|  blocks.push_back(Builder.getInsertionBlock());
 1816|     34|  Builder.createBranchInst(continueBlock);
 1817|       |
 1818|       |  // The 'else' side:
 1819|     34|  Builder.setInsertionBlock(alternateBlock);
 1820|     34|  values.push_back(genExpression(C->_alternate));
 1821|     34|  blocks.push_back(Builder.getInsertionBlock());
 1822|     34|  Builder.createBranchInst(continueBlock);
 1823|       |
 1824|       |  // Continue:
 1825|     34|  Builder.setInsertionBlock(continueBlock);
 1826|     34|  return Builder.createPhiInst(values, blocks);
 1827|     34|}
_ZN6hermes5irgen11ESTreeIRGen23genIdentifierExpressionEPNS_6ESTree14IdentifierNodeEb:
 1831|   142k|    bool afterTypeOf) {
 1832|   142k|  LLVM_DEBUG(
  ------------------
  |  |  123|   142k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   142k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 142k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   142k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1833|   142k|      llvh::dbgs() << "Looking for identifier \"" << Iden->_name << "\"\n");
 1834|       |
 1835|       |  // 'arguments' is an array-like object holding all function arguments.
 1836|       |  // If one of the parameters is called "arguments" then it shadows the
 1837|       |  // arguments keyword.
 1838|   142k|  if (Iden->_name->str() == "arguments" &&
  ------------------
  |  Branch (1838:7): [True: 2, False: 142k]
  |  Branch (1838:7): [True: 2, False: 142k]
  ------------------
 1839|   142k|      !nameTable_.count(getNameFieldFromID(Iden))) {
  ------------------
  |  Branch (1839:7): [True: 2, False: 0]
  ------------------
 1840|       |    // If it is captured, we must use the captured value.
 1841|      2|    if (curFunction()->capturedArguments) {
  ------------------
  |  Branch (1841:9): [True: 0, False: 2]
  ------------------
 1842|      0|      return Builder.createLoadFrameInst(
 1843|      0|          curFunction()->capturedArguments, currentIRScope_);
 1844|      0|    }
 1845|       |
 1846|      2|    return curFunction()->createArgumentsInst;
 1847|      2|  }
 1848|       |
 1849|       |  // Lookup variable name.
 1850|   142k|  auto StrName = getNameFieldFromID(Iden);
 1851|       |
 1852|   142k|  auto *Var = ensureVariableExists(Iden);
 1853|       |
 1854|       |  // For uses of undefined as the global property, we make an optimization
 1855|       |  // to always return undefined constant.
 1856|   142k|  if (llvh::isa<GlobalObjectProperty>(Var) && StrName.str() == "undefined") {
  ------------------
  |  Branch (1856:7): [True: 131k, False: 10.8k]
  |  Branch (1856:47): [True: 0, False: 131k]
  ------------------
 1857|      0|    return Builder.getLiteralUndefined();
 1858|      0|  }
 1859|       |
 1860|   142k|  LLVM_DEBUG(
  ------------------
  |  |  123|   142k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   142k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 142k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:69): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   142k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1861|   142k|      llvh::dbgs() << "Found variable " << StrName << " in function \""
 1862|   142k|                   << (llvh::isa<GlobalObjectProperty>(Var)
 1863|   142k|                           ? llvh::StringRef("global")
 1864|   142k|                           : cast<Variable>(Var)
 1865|   142k|                                 ->getParent()
 1866|   142k|                                 ->getFunction()
 1867|   142k|                                 ->getInternalNameStr())
 1868|   142k|                   << "\"\n");
 1869|       |
 1870|       |  // Typeof <variable> does not throw.
 1871|   142k|  return emitLoad(Var, afterTypeOf);
 1872|   142k|}
_ZN6hermes5irgen11ESTreeIRGen20genLogicalExpressionEPNS_6ESTree21LogicalExpressionNodeE:
 1931|     11|    ESTree::LogicalExpressionNode *logical) {
 1932|     11|  auto opStr = logical->_operator->str();
 1933|     11|  LLVM_DEBUG(llvh::dbgs() << "IRGen of short circuiting: " << opStr << ".\n");
  ------------------
  |  |  123|     11|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     11|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 11]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     11|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1934|       |
 1935|     11|  enum class Kind {
 1936|     11|    And, // &&
 1937|     11|    Or, // ||
 1938|     11|    Coalesce, // ??
 1939|     11|  };
 1940|       |
 1941|     11|  Kind kind;
 1942|       |
 1943|     11|  if (opStr == "&&") {
  ------------------
  |  Branch (1943:7): [True: 2, False: 9]
  ------------------
 1944|      2|    kind = Kind::And;
 1945|      9|  } else if (opStr == "||") {
  ------------------
  |  Branch (1945:14): [True: 9, False: 0]
  ------------------
 1946|      9|    kind = Kind::Or;
 1947|      9|  } else if (opStr == "??") {
  ------------------
  |  Branch (1947:14): [True: 0, False: 0]
  ------------------
 1948|      0|    kind = Kind::Coalesce;
 1949|      0|  } else {
 1950|      0|    llvm_unreachable("Invalid update operator");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1951|      0|  }
 1952|       |
 1953|       |  // Generate a new temporary stack allocation.
 1954|     11|  auto tempVarName = genAnonymousLabelName("logical");
 1955|     11|  auto parentFunc = Builder.getInsertionBlock()->getParent();
 1956|     11|  auto tempVar = Builder.createAllocStackInst(tempVarName);
 1957|       |
 1958|     11|  auto evalRHSBlock = Builder.createBasicBlock(parentFunc);
 1959|     11|  auto continueBlock = Builder.createBasicBlock(parentFunc);
 1960|       |
 1961|     11|  auto LHS = genExpression(logical->_left);
 1962|       |
 1963|       |  // Store the LHS value of the expression in preparation for the case where we
 1964|       |  // won't need to evaluate the RHS side of the expression. In that case, we
 1965|       |  // jump to continueBlock, which returns tempVar.
 1966|     11|  Builder.createStoreStackInst(LHS, tempVar);
 1967|       |
 1968|       |  // Notice that instead of negating the condition we swap the operands of the
 1969|       |  // branch.
 1970|     11|  switch (kind) {
  ------------------
  |  Branch (1970:11): [True: 0, False: 11]
  ------------------
 1971|      2|    case Kind::And:
  ------------------
  |  Branch (1971:5): [True: 2, False: 9]
  ------------------
 1972|       |      // Evaluate RHS only when the LHS is true.
 1973|      2|      Builder.createCondBranchInst(LHS, evalRHSBlock, continueBlock);
 1974|      2|      break;
 1975|      9|    case Kind::Or:
  ------------------
  |  Branch (1975:5): [True: 9, False: 2]
  ------------------
 1976|       |      // Evaluate RHS only when the LHS is false.
 1977|      9|      Builder.createCondBranchInst(LHS, continueBlock, evalRHSBlock);
 1978|      9|      break;
 1979|      0|    case Kind::Coalesce:
  ------------------
  |  Branch (1979:5): [True: 0, False: 11]
  ------------------
 1980|       |      // Evaluate RHS only if the value is undefined or null.
 1981|       |      // Use == instead of === to account for both values at once.
 1982|      0|      Builder.createCondBranchInst(
 1983|      0|          Builder.createBinaryOperatorInst(
 1984|      0|              LHS,
 1985|      0|              Builder.getLiteralNull(),
 1986|      0|              BinaryOperatorInst::OpKind::EqualKind),
 1987|      0|          evalRHSBlock,
 1988|      0|          continueBlock);
 1989|       |
 1990|      0|      break;
 1991|     11|  }
 1992|       |
 1993|       |  // Continue the evaluation of the right-hand-side of the expression.
 1994|     11|  Builder.setInsertionBlock(evalRHSBlock);
 1995|     11|  auto RHS = genExpression(logical->_right);
 1996|       |
 1997|       |  // Evaluate the RHS and store the result into the temporary variable.
 1998|     11|  Builder.createStoreStackInst(RHS, tempVar);
 1999|       |
 2000|       |  // Finally, jump to the continuation block.
 2001|     11|  Builder.createBranchInst(continueBlock);
 2002|       |
 2003|       |  // Load the content of the temp variable that was set in one of the branches.
 2004|     11|  Builder.setInsertionBlock(continueBlock);
 2005|     11|  return Builder.createLoadStackInst(tempVar);
 2006|     11|}
_ZN6hermes5irgen11ESTreeIRGen22genTemplateLiteralExprEPNS_6ESTree19TemplateLiteralNodeE:
 2033|  41.0k|Value *ESTreeIRGen::genTemplateLiteralExpr(ESTree::TemplateLiteralNode *Expr) {
 2034|  41.0k|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'TemplateLiteral' expression.\n");
  ------------------
  |  |  123|  41.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  41.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 41.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  41.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2035|       |
 2036|  41.0k|  assert(
 2037|  41.0k|      Expr->_quasis.size() == Expr->_expressions.size() + 1 &&
 2038|  41.0k|      "The string count should always be one more than substitution count.");
 2039|       |
 2040|       |  // Construct an argument list for calling HermesInternal.concat():
 2041|       |  // cookedStr0, substitution0, cookedStr1, ..., substitutionN, cookedStrN + 1,
 2042|       |  // skipping any empty string, except for the first cooked string, which is
 2043|       |  // going to be the `this` to the concat call.
 2044|       |
 2045|       |  // Get the first cooked string.
 2046|      0|  auto strItr = Expr->_quasis.begin();
 2047|  41.0k|  auto *tempEltNode = cast<ESTree::TemplateElementNode>(&*strItr);
 2048|  41.0k|  auto *firstCookedStr = Builder.getLiteralString(tempEltNode->_cooked->str());
 2049|  41.0k|  ++strItr;
 2050|       |  // If the template literal is effectively only one string, directly return it.
 2051|  41.0k|  if (strItr == Expr->_quasis.end()) {
  ------------------
  |  Branch (2051:7): [True: 41.0k, False: 0]
  ------------------
 2052|  41.0k|    return firstCookedStr;
 2053|  41.0k|  }
 2054|      0|  CallInst::ArgumentList argList;
 2055|      0|  auto exprItr = Expr->_expressions.begin();
 2056|      0|  while (strItr != Expr->_quasis.end()) {
  ------------------
  |  Branch (2056:10): [True: 0, False: 0]
  ------------------
 2057|      0|    auto *sub = genExpression(&*exprItr);
 2058|      0|    argList.push_back(sub);
 2059|      0|    tempEltNode = cast<ESTree::TemplateElementNode>(&*strItr);
 2060|      0|    auto cookedStr = tempEltNode->_cooked->str();
 2061|      0|    if (!cookedStr.empty()) {
  ------------------
  |  Branch (2061:9): [True: 0, False: 0]
  ------------------
 2062|      0|      argList.push_back(Builder.getLiteralString(cookedStr));
 2063|      0|    }
 2064|      0|    ++strItr;
 2065|      0|    ++exprItr;
 2066|      0|  }
 2067|      0|  assert(
 2068|      0|      exprItr == Expr->_expressions.end() &&
 2069|      0|      "All the substitutions must have been collected.");
 2070|       |
 2071|       |  // Generate a function call to HermesInternal.concat() with these arguments.
 2072|      0|  return genHermesInternalCall("concat", firstCookedStr, argList);
 2073|  41.0k|}
_ZN6hermes5irgen11ESTreeIRGen21genTaggedTemplateExprEPNS_6ESTree28TaggedTemplateExpressionNodeE:
 2076|    283|    ESTree::TaggedTemplateExpressionNode *Expr) {
 2077|    283|  LLVM_DEBUG(llvh::dbgs() << "IRGen 'TaggedTemplateExpression' expression.\n");
  ------------------
  |  |  123|    283|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    283|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 283]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    283|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 2078|       |  // Step 1: get the template object.
 2079|    283|  auto *templateLit = cast<ESTree::TemplateLiteralNode>(Expr->_quasi);
 2080|       |
 2081|       |  // Construct an argument list for calling HermesInternal.getTemplateObject():
 2082|       |  // [template object ID, dup, raw strings, (optional) cooked strings].
 2083|    283|  CallInst::ArgumentList argList;
 2084|       |  // Retrieve template object ID.
 2085|    283|  Module::RawStringList rawStrings;
 2086|  67.3k|  for (auto &n : templateLit->_quasis) {
  ------------------
  |  Branch (2086:16): [True: 67.3k, False: 283]
  ------------------
 2087|  67.3k|    auto element = cast<ESTree::TemplateElementNode>(&n);
 2088|  67.3k|    rawStrings.push_back(Builder.getLiteralString(element->_raw->str()));
 2089|  67.3k|  }
 2090|    283|  uint32_t templateObjID = Mod->getTemplateObjectID(std::move(rawStrings));
 2091|    283|  argList.push_back(Builder.getLiteralNumber(templateObjID));
 2092|       |
 2093|       |  // dup is true if the cooked strings and raw strings are duplicated.
 2094|    283|  bool dup = true;
 2095|       |  // Add the argument dup first as a placeholder which we overwrite with
 2096|       |  // the correct value later.
 2097|    283|  argList.push_back(Builder.getLiteralBool(dup));
 2098|  67.3k|  for (auto &node : templateLit->_quasis) {
  ------------------
  |  Branch (2098:19): [True: 67.3k, False: 283]
  ------------------
 2099|  67.3k|    auto *templateElt = cast<ESTree::TemplateElementNode>(&node);
 2100|  67.3k|    if (templateElt->_cooked != templateElt->_raw) {
  ------------------
  |  Branch (2100:9): [True: 5, False: 67.3k]
  ------------------
 2101|      5|      dup = false;
 2102|      5|    }
 2103|  67.3k|    argList.push_back(Builder.getLiteralString(templateElt->_raw->str()));
 2104|  67.3k|  }
 2105|    283|  argList[1] = Builder.getLiteralBool(dup);
 2106|       |  // If the cooked strings are not the same as raw strings, append them to
 2107|       |  // argument list.
 2108|    283|  if (!dup) {
  ------------------
  |  Branch (2108:7): [True: 5, False: 278]
  ------------------
 2109|      5|    for (auto &node : templateLit->_quasis) {
  ------------------
  |  Branch (2109:21): [True: 5, False: 5]
  ------------------
 2110|      5|      auto *templateElt = cast<ESTree::TemplateElementNode>(&node);
 2111|      5|      if (templateElt->_cooked) {
  ------------------
  |  Branch (2111:11): [True: 5, False: 0]
  ------------------
 2112|      5|        argList.push_back(
 2113|      5|            Builder.getLiteralString(templateElt->_cooked->str()));
 2114|      5|      } else {
 2115|      0|        argList.push_back(Builder.getLiteralUndefined());
 2116|      0|      }
 2117|      5|    }
 2118|      5|  }
 2119|       |
 2120|       |  // Generate a function call to HermesInternal.getTemplateObject() with these
 2121|       |  // arguments.
 2122|    283|  auto *templateObj =
 2123|    283|      genBuiltinCall(BuiltinMethod::HermesBuiltin_getTemplateObject, argList);
 2124|       |
 2125|       |  // Step 2: call the tag function, passing the template object followed by a
 2126|       |  // list of substitutions as arguments.
 2127|    283|  CallInst::ArgumentList tagFuncArgList;
 2128|    283|  tagFuncArgList.push_back(templateObj);
 2129|  67.0k|  for (auto &sub : templateLit->_expressions) {
  ------------------
  |  Branch (2129:18): [True: 67.0k, False: 283]
  ------------------
 2130|  67.0k|    tagFuncArgList.push_back(genExpression(&sub));
 2131|  67.0k|  }
 2132|       |
 2133|    283|  Value *callee;
 2134|    283|  Value *thisVal;
 2135|       |  // Tag function is a member expression.
 2136|    283|  if (auto *Mem = llvh::dyn_cast<ESTree::MemberExpressionNode>(Expr->_tag)) {
  ------------------
  |  Branch (2136:13): [True: 8, False: 275]
  ------------------
 2137|      8|    Value *obj = genExpression(Mem->_object);
 2138|      8|    Value *prop = genMemberExpressionProperty(Mem);
 2139|       |    // Call the callee with obj as the 'this'.
 2140|      8|    thisVal = obj;
 2141|      8|    callee = Builder.createLoadPropertyInst(obj, prop);
 2142|    275|  } else {
 2143|    275|    thisVal = Builder.getLiteralUndefined();
 2144|    275|    callee = genExpression(Expr->_tag);
 2145|    275|  }
 2146|       |
 2147|    283|  return Builder.createCallInst(
 2148|    283|      CallInst::kNoTextifiedCallee, callee, thisVal, tagFuncArgList);
 2149|    283|}
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL20getTextifiedCallExprERNS_9IRBuilderEPNS_6ESTree22CallExpressionLikeNodeE:
  515|      8|    ESTree::CallExpressionLikeNode *call) {
  516|      8|  constexpr uint32_t kMaxTextifiedCalleeSizeUTF8Chars = 64;
  517|       |  // Pessimizing the maximum buffer size for the textified callee as if all
  518|       |  // characters were 4 bytes.
  519|      8|  llvh::SmallVector<char, kMaxTextifiedCalleeSizeUTF8Chars * 4> textifiedCallee;
  520|      8|  llvh::raw_svector_ostream OS(textifiedCallee);
  521|      8|  ESTree::Node *callee{};
  522|      8|  if (auto *C = llvh::dyn_cast<ESTree::CallExpressionNode>(call)) {
  ------------------
  |  Branch (522:13): [True: 8, False: 0]
  ------------------
  523|      8|    callee = C->_callee;
  524|      8|  } else if (
  525|      0|      auto *O = llvh::dyn_cast<ESTree::OptionalCallExpressionNode>(call)) {
  ------------------
  |  Branch (525:13): [True: 0, False: 0]
  ------------------
  526|      0|    callee = O->_callee;
  527|      0|  } else {
  528|      0|    llvm_unreachable("Unhandled CallExpressionLikeNode sub-type.");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  529|      0|  }
  530|       |
  531|       |  // Count of how many UTF8 character are on the textified callee string.
  532|      8|  uint32_t numUTF8Chars = 0;
  533|      8|  const char *begin = callee->getSourceRange().Start.getPointer();
  534|      8|  const char *end = callee->getSourceRange().End.getPointer();
  535|       |
  536|      8|  const char *pos = begin;
  537|       |
  538|       |  /// Helper function that scans the input source code searching for the next
  539|       |  /// UTF8 char starting at \p iter. \return a StringRef with the chars that
  540|       |  /// form the next UTF8 char on the input, or None if the input has been
  541|       |  /// exhausted. Upon return, \p iter will be modified 1-past the last char
  542|       |  /// consumed from the input.
  543|      8|  auto nextUTF8Char = [end](const char *&iter) -> OptValue<llvh::StringRef> {
  544|      8|    assert(iter < end && "iter is past end");
  545|      8|    const char *start;
  546|      8|    bool skipSpace = false;
  547|      8|    bool newLine;
  548|      8|    bool unprintableChar;
  549|       |    // The function may need to decode several UTF8 charaters to skip new lines,
  550|       |    // spaces following new lines, and unprintable characters.
  551|      8|    do {
  552|      8|      if (iter == end) {
  553|      8|        return llvh::None;
  554|      8|      }
  555|       |
  556|       |      // From start, where does the current UTF8 character ends?
  557|      8|      start = iter;
  558|      8|      for (++iter; iter < end && isUTF8ContinuationByte(*iter); ++iter) {
  559|       |        // nothing
  560|      8|      }
  561|       |
  562|      8|      newLine = *start == '\n';
  563|      8|      skipSpace |= newLine;
  564|      8|      unprintableChar = static_cast<uint8_t>(*start) < 32;
  565|      8|    } while (unprintableChar || newLine || (skipSpace && *start == ' '));
  566|       |
  567|      8|    const size_t utf8CharLength = static_cast<size_t>(iter - start);
  568|      8|    return llvh::StringRef{start, utf8CharLength};
  569|      8|  };
  570|       |
  571|       |  // The algorithm is split in three separate steps:
  572|       |  // 1. Find the range in the input source that contains the first half of the
  573|       |  //    UTF8 characters that should be present on the output.
  574|       |  // 2. Find the window into the input source starting at the end of the range
  575|       |  //    computed in 1. and containing another half of the maximum output length.
  576|       |  //    This window is [mark, pos).
  577|       |  // 3. Slide the [mark, pos) window found in 2 until pos equals end.
  578|       |  //
  579|       |  // If the input is exhausted in 1. or 2., then the output string will contain
  580|       |  // a "copy" of the input source (minus the characters listed above); it will
  581|       |  // otherwise be prefix"(...)"suffix, with prefix being the first
  582|       |  // kMaxTextifiedCalleeSizeUTF8Chars / 2 UTF8 chars in the input source, and
  583|       |  // suffix, the last kMaxTextifiedCalleeSizeUTF8Chars / 2 UTF8 chars.
  584|       |
  585|       |  // Scan the input string starting from the first position until half of the
  586|       |  // maximum of allowed character have been scanned.
  587|    264|  while (pos < end && numUTF8Chars < kMaxTextifiedCalleeSizeUTF8Chars / 2) {
  ------------------
  |  Branch (587:10): [True: 264, False: 0]
  |  Branch (587:23): [True: 256, False: 8]
  ------------------
  588|    256|    if (auto ch = nextUTF8Char(pos)) {
  ------------------
  |  Branch (588:14): [True: 256, False: 0]
  ------------------
  589|    256|      ++numUTF8Chars;
  590|    256|      OS << *ch;
  591|    256|    }
  592|    256|  }
  593|       |
  594|      8|  assert(
  595|      8|      (pos == end || numUTF8Chars == kMaxTextifiedCalleeSizeUTF8Chars / 2) &&
  596|      8|      "Invalid source range");
  597|       |
  598|       |  // Now save the current position, and advance it until the end of the buffer,
  599|       |  // or until enough UTF8 characters are found.
  600|      0|  const char *mark = pos;
  601|    264|  while (pos < end && numUTF8Chars < kMaxTextifiedCalleeSizeUTF8Chars) {
  ------------------
  |  Branch (601:10): [True: 264, False: 0]
  |  Branch (601:23): [True: 256, False: 8]
  ------------------
  602|    256|    if (nextUTF8Char(pos)) {
  ------------------
  |  Branch (602:9): [True: 256, False: 0]
  ------------------
  603|    256|      ++numUTF8Chars;
  604|    256|    }
  605|    256|  }
  606|       |
  607|      8|  assert(
  608|      8|      (pos == end || numUTF8Chars == kMaxTextifiedCalleeSizeUTF8Chars) &&
  609|      8|      "Invalid source range");
  610|       |
  611|      8|  if (pos < end) {
  ------------------
  |  Branch (611:7): [True: 8, False: 0]
  ------------------
  612|       |    // Slide the suffix window if pos is not at the end of the input.
  613|      8|    OS << "(...)";
  614|       |
  615|   285k|    while (pos < end) {
  ------------------
  |  Branch (615:12): [True: 285k, False: 8]
  ------------------
  616|   285k|      auto ch = nextUTF8Char(mark);
  617|   285k|      assert(ch && "should have a character");
  618|      0|      (void)ch;
  619|   285k|      nextUTF8Char(pos);
  620|   285k|    }
  621|      8|  }
  622|       |
  623|       |  // The input should be exhausted by now, and pos should be equal to end --
  624|       |  // meaning all characters have been decoded.
  625|      8|  assert(pos == end && "Invalid source range");
  626|       |
  627|       |  // Now add all characters between mark and end to the textified callable.
  628|    264|  while (mark < end) {
  ------------------
  |  Branch (628:10): [True: 256, False: 8]
  ------------------
  629|    256|    auto ch = nextUTF8Char(mark);
  630|    256|    assert(ch && "should have a character");
  631|      0|    OS << *ch;
  632|    256|  }
  633|       |
  634|      8|  return builder.getLiteralString(OS.str());
  635|      8|}
ESTreeIRGen-expr.cpp:_ZZN6hermes5irgenL20getTextifiedCallExprERNS_9IRBuilderEPNS_6ESTree22CallExpressionLikeNodeEENK3$_5clERPKc:
  543|   572k|  auto nextUTF8Char = [end](const char *&iter) -> OptValue<llvh::StringRef> {
  544|   572k|    assert(iter < end && "iter is past end");
  545|      0|    const char *start;
  546|   572k|    bool skipSpace = false;
  547|   572k|    bool newLine;
  548|   572k|    bool unprintableChar;
  549|       |    // The function may need to decode several UTF8 charaters to skip new lines,
  550|       |    // spaces following new lines, and unprintable characters.
  551|   891k|    do {
  552|   891k|      if (iter == end) {
  ------------------
  |  Branch (552:11): [True: 0, False: 891k]
  ------------------
  553|      0|        return llvh::None;
  554|      0|      }
  555|       |
  556|       |      // From start, where does the current UTF8 character ends?
  557|   891k|      start = iter;
  558|   908k|      for (++iter; iter < end && isUTF8ContinuationByte(*iter); ++iter) {
  ------------------
  |  Branch (558:20): [True: 908k, False: 16]
  |  Branch (558:34): [True: 17.3k, False: 891k]
  ------------------
  559|       |        // nothing
  560|  17.3k|      }
  561|       |
  562|   891k|      newLine = *start == '\n';
  563|   891k|      skipSpace |= newLine;
  564|   891k|      unprintableChar = static_cast<uint8_t>(*start) < 32;
  565|   891k|    } while (unprintableChar || newLine || (skipSpace && *start == ' '));
  ------------------
  |  Branch (565:14): [True: 319k, False: 572k]
  |  Branch (565:33): [True: 0, False: 572k]
  |  Branch (565:45): [True: 289k, False: 282k]
  |  Branch (565:58): [True: 0, False: 289k]
  ------------------
  566|       |
  567|   572k|    const size_t utf8CharLength = static_cast<size_t>(iter - start);
  568|   572k|    return llvh::StringRef{start, utf8CharLength};
  569|   572k|  };
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL19propertyKeyAsStringERN4llvh15SmallVectorImplIcEEPNS_6ESTree4NodeE:
  796|  11.9k|    ESTree::Node *Key) {
  797|       |  // Handle String Literals.
  798|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-string-literals
  799|  11.9k|  if (auto *Lit = llvh::dyn_cast<ESTree::StringLiteralNode>(Key)) {
  ------------------
  |  Branch (799:13): [True: 11.9k, False: 0]
  ------------------
  800|  11.9k|    LLVM_DEBUG(
  ------------------
  |  |  123|  11.9k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  11.9k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 11.9k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  11.9k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  801|  11.9k|        llvh::dbgs() << "Loading String Literal \"" << Lit->_value << "\"\n");
  802|  11.9k|    return Lit->_value->str();
  803|  11.9k|  }
  804|       |
  805|       |  // Handle identifiers as if they are String Literals.
  806|      0|  if (auto *Iden = llvh::dyn_cast<ESTree::IdentifierNode>(Key)) {
  ------------------
  |  Branch (806:13): [True: 0, False: 0]
  ------------------
  807|      0|    LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  808|      0|        llvh::dbgs() << "Loading String Literal \"" << Iden->_name << "\"\n");
  809|      0|    return Iden->_name->str();
  810|      0|  }
  811|       |
  812|       |  // Handle Number Literals.
  813|       |  // http://www.ecma-international.org/ecma-262/6.0/#sec-literals-numeric-literals
  814|      0|  if (auto *Lit = llvh::dyn_cast<ESTree::NumericLiteralNode>(Key)) {
  ------------------
  |  Branch (814:13): [True: 0, False: 0]
  ------------------
  815|      0|    LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  816|      0|        llvh::dbgs() << "Loading Numeric Literal \"" << Lit->_value << "\"\n");
  817|      0|    storage.resize(NUMBER_TO_STRING_BUF_SIZE);
  818|      0|    auto len = numberToString(Lit->_value, storage.data(), storage.size());
  819|      0|    return llvh::StringRef(storage.begin(), len);
  820|      0|  }
  821|       |
  822|      0|  llvm_unreachable("Don't know this kind of property key");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  823|      0|  return llvh::StringRef();
  824|      0|}
ESTreeIRGen-expr.cpp:_ZZN6hermes5irgen11ESTreeIRGen13genObjectExprEPNS_6ESTree20ObjectExpressionNodeEEN13PropertyValue8setValueEPNS2_4NodeE:
  860|  5.97k|    void setValue(ESTree::Node *val) {
  861|  5.97k|      isAccessor = false;
  862|  5.97k|      valueNode = val;
  863|  5.97k|      getterNode = setterNode = nullptr;
  864|  5.97k|    }
ESTreeIRGen-expr.cpp:_ZN6hermes5irgenL15extractNameHintERKNS0_10LReferenceE:
 1635|  3.85k|static Identifier extractNameHint(const LReference &lref) {
 1636|  3.85k|  Identifier nameHint{};
 1637|  3.85k|  if (auto *var = lref.castAsVariable()) {
  ------------------
  |  Branch (1637:13): [True: 836, False: 3.01k]
  ------------------
 1638|    836|    nameHint = var->getName();
 1639|  3.01k|  } else if (auto *globProp = lref.castAsGlobalObjectProperty()) {
  ------------------
  |  Branch (1639:20): [True: 3.00k, False: 6]
  ------------------
 1640|  3.00k|    nameHint = globProp->getName()->getValue();
 1641|  3.00k|  }
 1642|  3.85k|  return nameHint;
 1643|  3.85k|}

_ZN6hermes5irgen15FunctionContextC2EPNS0_11ESTreeIRGenEPNS_8FunctionEPNS_3sem12FunctionInfoE:
   30|   114k|      anonymousIDs_(function->getContext().getStringTable()) {
   31|   114k|  irGen->functionContext_ = this;
   32|   114k|  irGen->currentIRScopeDesc_ = function->getFunctionScopeDesc();
   33|       |
   34|       |  // Temporarily set the current IR scope to nullptr. IRGen should materialize
   35|       |  // currentIRScopeDesc_ before trying to access it.
   36|   114k|  irGen->currentIRScope_ = nullptr;
   37|       |
   38|       |  // Initialize it to LiteralUndefined by default to avoid corner cases.
   39|   114k|  this->capturedNewTarget = irGen->Builder.getLiteralUndefined();
   40|       |
   41|   114k|  if (semInfo_) {
  ------------------
  |  Branch (41:7): [True: 114k, False: 0]
  ------------------
   42|       |    // Allocate the label table. Each label definition will be encountered in
   43|       |    // the AST before it is referenced (because of the nature of JavaScript), at
   44|       |    // which point we will initialize the GotoLabel structure with basic blocks
   45|       |    // targets.
   46|   114k|    labels_.resize(semInfo_->labelCount);
   47|   114k|  }
   48|   114k|}
_ZN6hermes5irgen15FunctionContextD2Ev:
   50|   114k|FunctionContext::~FunctionContext() {
   51|   114k|  irGen_->currentIRScope_ = oldIRScope_;
   52|   114k|  irGen_->currentIRScopeDesc_ = oldIRScopeDesc_;
   53|   114k|  irGen_->functionContext_ = oldContext_;
   54|   114k|  irGen_->Builder.setCurrentSourceLevelScope(irGen_->currentIRScopeDesc_);
   55|   114k|}
_ZN6hermes5irgen15FunctionContext21genAnonymousLabelNameEN4llvh9StringRefE:
   57|    137|Identifier FunctionContext::genAnonymousLabelName(llvh::StringRef hint) {
   58|    137|  return anonymousIDs_.next(hint);
   59|    137|}
_ZN6hermes5irgen11ESTreeIRGen22genFunctionDeclarationEPNS_6ESTree23FunctionDeclarationNodeE:
   65|    768|    ESTree::FunctionDeclarationNode *func) {
   66|    768|  if (func->_async && func->_generator) {
  ------------------
  |  Branch (66:7): [True: 0, False: 768]
  |  Branch (66:23): [True: 0, False: 0]
  ------------------
   67|      0|    Builder.getModule()->getContext().getSourceErrorManager().error(
   68|      0|        func->getSourceRange(), Twine("async generators are unsupported"));
   69|      0|    return;
   70|      0|  }
   71|       |
   72|       |  // Find the name of the function.
   73|    768|  Identifier functionName = getNameFieldFromID(func->_id);
   74|    768|  LLVM_DEBUG(llvh::dbgs() << "IRGen function \"" << functionName << "\".\n");
  ------------------
  |  |  123|    768|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    768|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 768]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    768|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   75|       |
   76|    768|  auto *funcStorage = nameTable_.lookup(functionName);
   77|    768|  assert(
   78|    768|      funcStorage && "function declaration variable should have been hoisted");
   79|       |
   80|    768|  Function *newFunc = func->_async
  ------------------
  |  Branch (80:23): [True: 0, False: 768]
  ------------------
   81|    768|      ? genAsyncFunction(functionName, nullptr, func)
   82|    768|      : func->_generator ? genGeneratorFunction(functionName, nullptr, func)
  ------------------
  |  Branch (82:9): [True: 0, False: 768]
  ------------------
   83|    768|                         : genES5Function(functionName, nullptr, func);
   84|       |
   85|       |  // Store the newly created closure into a frame variable with the same name.
   86|    768|  auto *newClosure = Builder.createCreateFunctionInst(newFunc, currentIRScope_);
   87|       |
   88|    768|  emitStore(newClosure, funcStorage, true);
   89|    768|}
_ZN6hermes5irgen11ESTreeIRGen26genArrowFunctionExpressionEPNS_6ESTree27ArrowFunctionExpressionNodeENS_10IdentifierE:
  142|   114k|    Identifier nameHint) {
  143|   114k|  LLVM_DEBUG(
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  144|   114k|      llvh::dbgs()
  145|   114k|      << "Creating arrow function. "
  146|   114k|      << Builder.getInsertionBlock()->getParent()->getInternalName() << ".\n");
  147|       |
  148|   114k|  if (AF->_async) {
  ------------------
  |  Branch (148:7): [True: 0, False: 114k]
  ------------------
  149|      0|    Builder.getModule()->getContext().getSourceErrorManager().error(
  150|      0|        AF->getSourceRange(), Twine("async functions are unsupported"));
  151|      0|    return Builder.getLiteralUndefined();
  152|      0|  }
  153|       |
  154|   114k|  auto *newFunc = Builder.createFunction(
  155|   114k|      newScopeDesc(),
  156|   114k|      genAnonymousFunctionNameIfNeeded(nameHint),
  157|   114k|      Function::DefinitionKind::ES6Arrow,
  158|   114k|      ESTree::isStrict(AF->strictness),
  159|   114k|      AF->sourceVisibility,
  160|   114k|      AF->getSourceRange());
  161|       |
  162|   114k|  {
  163|   114k|    FunctionContext newFunctionContext{this, newFunc, AF->getSemInfo()};
  164|       |
  165|       |    // Propagate captured "this", "new.target" and "arguments" from parents.
  166|   114k|    auto *prev = curFunction()->getPreviousContext();
  167|   114k|    curFunction()->capturedThis = prev->capturedThis;
  168|   114k|    curFunction()->capturedNewTarget = prev->capturedNewTarget;
  169|   114k|    curFunction()->capturedArguments = prev->capturedArguments;
  170|       |
  171|   114k|    emitFunctionPrologue(
  172|   114k|        AF,
  173|   114k|        Builder.createBasicBlock(newFunc),
  174|   114k|        InitES5CaptureState::No,
  175|   114k|        DoEmitParameters::Yes);
  176|       |
  177|   114k|    genStatement(AF->_body);
  178|   114k|    emitFunctionEpilogue(Builder.getLiteralUndefined());
  179|   114k|  }
  180|       |
  181|       |  // Emit CreateFunctionInst after we have restored the builder state.
  182|   114k|  return Builder.createCreateFunctionInst(newFunc, currentIRScope_);
  183|   114k|}
_ZN6hermes5irgen11ESTreeIRGen14genES5FunctionENS_10IdentifierEPNS_8VariableEPNS_6ESTree16FunctionLikeNodeEb:
  200|    768|    bool isGeneratorInnerFunction) {
  201|    768|  assert(functionNode && "Function AST cannot be null");
  202|       |
  203|      0|  auto *body = ESTree::getBlockStatement(functionNode);
  204|    768|  assert(body && "body of ES5 function cannot be null");
  205|       |
  206|    768|  Function *newFunction = isGeneratorInnerFunction
  ------------------
  |  Branch (206:27): [True: 0, False: 768]
  ------------------
  207|    768|      ? Builder.createGeneratorInnerFunction(
  208|      0|            newScopeDesc(),
  209|      0|            genAnonymousFunctionNameIfNeeded(originalName),
  210|      0|            Function::DefinitionKind::ES5Function,
  211|      0|            ESTree::isStrict(functionNode->strictness),
  212|      0|            functionNode->getSourceRange(),
  213|      0|            /* insertBefore */ nullptr)
  214|    768|      : Builder.createFunction(
  215|    768|            newScopeDesc(),
  216|    768|            genAnonymousFunctionNameIfNeeded(originalName),
  217|    768|            Function::DefinitionKind::ES5Function,
  218|    768|            ESTree::isStrict(functionNode->strictness),
  219|    768|            functionNode->sourceVisibility,
  220|    768|            functionNode->getSourceRange(),
  221|    768|            /* isGlobal */ false,
  222|    768|            /* insertBefore */ nullptr);
  223|       |
  224|    768|  newFunction->setLazyClosureAlias(lazyClosureAlias);
  225|       |
  226|    768|  if (auto *bodyBlock = llvh::dyn_cast<ESTree::BlockStatementNode>(body)) {
  ------------------
  |  Branch (226:13): [True: 768, False: 0]
  ------------------
  227|    768|    if (bodyBlock->isLazyFunctionBody) {
  ------------------
  |  Branch (227:9): [True: 674, False: 94]
  ------------------
  228|    674|      assert(
  229|    674|          !isGeneratorInnerFunction &&
  230|    674|          "generator inner function should be included with outer function");
  231|      0|      setupLazyScope(functionNode, newFunction, body);
  232|    674|      return newFunction;
  233|    674|    }
  234|    768|  }
  235|       |
  236|     94|  FunctionContext newFunctionContext{
  237|     94|      this, newFunction, functionNode->getSemInfo()};
  238|       |
  239|     94|  if (isGeneratorInnerFunction) {
  ------------------
  |  Branch (239:7): [True: 0, False: 94]
  ------------------
  240|       |    // StartGeneratorInst
  241|       |    // ResumeGeneratorInst
  242|       |    // at the beginning of the function, to allow for the first .next() call.
  243|      0|    auto *initGenBB = Builder.createBasicBlock(newFunction);
  244|      0|    Builder.setInsertionBlock(initGenBB);
  245|      0|    Builder.createStartGeneratorInst();
  246|      0|    auto *prologueBB = Builder.createBasicBlock(newFunction);
  247|      0|    auto *prologueResumeIsReturn = Builder.createAllocStackInst(
  248|      0|        genAnonymousLabelName("isReturn_prologue"));
  249|      0|    genResumeGenerator(GenFinally::No, prologueResumeIsReturn, prologueBB);
  250|       |
  251|      0|    if (hasSimpleParams(functionNode)) {
  ------------------
  |  Branch (251:9): [True: 0, False: 0]
  ------------------
  252|       |      // If there are simple params, then we don't need an extra yield/resume.
  253|       |      // They can simply be initialized on the first call to `.next`.
  254|      0|      Builder.setInsertionBlock(prologueBB);
  255|      0|      emitFunctionPrologue(
  256|      0|          functionNode,
  257|      0|          prologueBB,
  258|      0|          InitES5CaptureState::Yes,
  259|      0|          DoEmitParameters::Yes);
  260|      0|    } else {
  261|       |      // If there are non-simple params, then we must add a new yield/resume.
  262|       |      // The `.next()` call will occur once in the outer function, before
  263|       |      // the iterator is returned to the caller of the `function*`.
  264|      0|      auto *entryPointBB = Builder.createBasicBlock(newFunction);
  265|      0|      auto *entryPointResumeIsReturn =
  266|      0|          Builder.createAllocStackInst(genAnonymousLabelName("isReturn_entry"));
  267|       |
  268|       |      // Initialize parameters.
  269|      0|      Builder.setInsertionBlock(prologueBB);
  270|      0|      emitFunctionPrologue(
  271|      0|          functionNode,
  272|      0|          prologueBB,
  273|      0|          InitES5CaptureState::Yes,
  274|      0|          DoEmitParameters::Yes);
  275|      0|      Builder.createSaveAndYieldInst(
  276|      0|          Builder.getLiteralUndefined(), entryPointBB);
  277|       |
  278|       |      // Actual entry point of function from the caller's perspective.
  279|      0|      Builder.setInsertionBlock(entryPointBB);
  280|      0|      genResumeGenerator(
  281|      0|          GenFinally::No,
  282|      0|          entryPointResumeIsReturn,
  283|      0|          Builder.createBasicBlock(newFunction));
  284|      0|    }
  285|     94|  } else {
  286|     94|    emitFunctionPrologue(
  287|     94|        functionNode,
  288|     94|        Builder.createBasicBlock(newFunction),
  289|     94|        InitES5CaptureState::Yes,
  290|     94|        DoEmitParameters::Yes);
  291|     94|  }
  292|       |
  293|     94|  genStatement(body);
  294|     94|  emitFunctionEpilogue(Builder.getLiteralUndefined());
  295|       |
  296|     94|  return curFunction()->function;
  297|    768|}
_ZN6hermes5irgen11ESTreeIRGen14setupLazyScopeEPNS_6ESTree16FunctionLikeNodeEPNS_8FunctionEPNS2_18BlockStatementNodeE:
  366|    674|    ESTree::BlockStatementNode *bodyBlock) {
  367|    674|  assert(
  368|    674|      bodyBlock->isLazyFunctionBody &&
  369|    674|      "setupLazyScope can only be used with lazy function bodies");
  370|       |  // Set the AST position and variable context so we can continue later.
  371|       |  // Save the scope chain starting from function's parent (i.e., the last
  372|       |  // materialized scope).
  373|      0|  function->setLazyScope(
  374|    674|      saveScopeChain(function->getFunctionScopeDesc()->getParent()));
  375|    674|  auto &lazySource = function->getLazySource();
  376|    674|  lazySource.bufferId = bodyBlock->bufferId;
  377|    674|  lazySource.nodeKind = getLazyFunctionKind(functionNode);
  378|    674|  lazySource.functionRange = functionNode->getSourceRange();
  379|    674|  lazySource.paramYield = bodyBlock->paramYield;
  380|    674|  lazySource.paramAwait = bodyBlock->paramAwait;
  381|       |
  382|       |  // Set the function's .length.
  383|    674|  function->setExpectedParamCountIncludingThis(
  384|    674|      countExpectedArgumentsIncludingThis(functionNode));
  385|    674|}
_ZN6hermes5irgen11ESTreeIRGen35initCaptureStateInES5FunctionHelperEv:
  456|    150|void ESTreeIRGen::initCaptureStateInES5FunctionHelper() {
  457|       |  // Capture "this", "new.target" and "arguments" if there are inner arrows.
  458|    150|  if (!curFunction()->getSemInfo()->containsArrowFunctions)
  ------------------
  |  Branch (458:7): [True: 145, False: 5]
  ------------------
  459|    145|    return;
  460|       |
  461|      5|  auto *scope = curFunction()->function->getFunctionScopeDesc();
  462|       |
  463|       |  // "this".
  464|      5|  curFunction()->capturedThis = Builder.createVariable(
  465|      5|      scope, Variable::DeclKind::Var, genAnonymousLabelName("this"));
  466|      5|  emitStore(
  467|      5|      Builder.getFunction()->getThisParameter(),
  468|      5|      curFunction()->capturedThis,
  469|      5|      true);
  470|       |
  471|       |  // "new.target".
  472|      5|  curFunction()->capturedNewTarget = Builder.createVariable(
  473|      5|      scope, Variable::DeclKind::Var, genAnonymousLabelName("new.target"));
  474|      5|  emitStore(
  475|      5|      Builder.createGetNewTargetInst(), curFunction()->capturedNewTarget, true);
  476|       |
  477|       |  // "arguments".
  478|      5|  if (curFunction()->getSemInfo()->containsArrowFunctionsUsingArguments) {
  ------------------
  |  Branch (478:7): [True: 0, False: 5]
  ------------------
  479|      0|    curFunction()->capturedArguments = Builder.createVariable(
  480|      0|        scope, Variable::DeclKind::Var, genAnonymousLabelName("arguments"));
  481|      0|    emitStore(
  482|      0|        curFunction()->createArgumentsInst,
  483|      0|        curFunction()->capturedArguments,
  484|      0|        true);
  485|      0|  }
  486|      5|}
_ZN6hermes5irgen11ESTreeIRGen20emitFunctionPrologueEPNS_6ESTree16FunctionLikeNodeEPNS_10BasicBlockENS1_19InitES5CaptureStateENS1_16DoEmitParametersE:
  492|   114k|    DoEmitParameters doEmitParameters) {
  493|   114k|  auto *newFunc = curFunction()->function;
  494|   114k|  auto *semInfo = curFunction()->getSemInfo();
  495|   114k|  LLVM_DEBUG(
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  496|   114k|      llvh::dbgs() << "Hoisting "
  497|   114k|                   << (semInfo->varDecls.size() + semInfo->closures.size())
  498|   114k|                   << " variable decls.\n");
  499|       |
  500|   114k|  Builder.setLocation(newFunc->getSourceRange().Start);
  501|   114k|  Builder.setCurrentSourceLevelScope(nullptr);
  502|       |
  503|   114k|  BasicBlock *realEntry = &newFunc->front();
  504|   114k|  if (realEntry->empty()) {
  ------------------
  |  Branch (504:7): [True: 114k, False: 0]
  ------------------
  505|   114k|    Builder.setInsertionBlock(realEntry);
  506|   114k|  } else {
  507|      0|    Builder.setInsertionPoint(&realEntry->front());
  508|      0|  }
  509|       |  // Create the function scope.
  510|   114k|  currentIRScope_ =
  511|   114k|      Builder.createCreateScopeInst(newFunc->getFunctionScopeDesc());
  512|       |
  513|       |  // Start pumping instructions into the entry basic block.
  514|   114k|  Builder.setInsertionBlock(entry);
  515|   114k|  Builder.setCurrentSourceLevelScope(newFunc->getFunctionScopeDesc());
  516|       |
  517|       |  // Always insert a CreateArgumentsInst. We will delete it later if it is
  518|       |  // unused.
  519|   114k|  curFunction()->createArgumentsInst = Builder.createCreateArgumentsInst();
  520|       |
  521|       |  // Always create the "this" parameter. It needs to be created before we
  522|       |  // initialized the ES5 capture state.
  523|   114k|  Builder.createParameter(newFunc, "this");
  524|       |
  525|   114k|  if (doInitES5CaptureState != InitES5CaptureState::No) {
  ------------------
  |  Branch (525:7): [True: 150, False: 114k]
  ------------------
  526|    150|    initCaptureStateInES5FunctionHelper();
  527|    150|  }
  528|       |
  529|   114k|  if (doEmitParameters != DoEmitParameters::No) {
  ------------------
  |  Branch (529:7): [True: 114k, False: 0]
  ------------------
  530|       |    // Create function parameters, register them in the scope, and initialize
  531|       |    // them with their income values.
  532|   114k|    emitParameters(funcNode);
  533|   114k|  } else {
  534|      0|    newFunc->setExpectedParamCountIncludingThis(
  535|      0|        countExpectedArgumentsIncludingThis(funcNode));
  536|      0|  }
  537|       |
  538|       |  // Create variable declarations for each of the hoisted variables and
  539|       |  // functions. Initialize only the variables to undefined.
  540|   114k|  for (auto decl : semInfo->varDecls) {
  ------------------
  |  Branch (540:18): [True: 7, False: 114k]
  ------------------
  541|      7|    auto res = declareVariableOrGlobalProperty(
  542|      7|        newFunc, decl.kind, getNameFieldFromID(decl.identifier));
  543|       |    // If this is not a frame variable or it was already declared, skip.
  544|      7|    auto *var = llvh::dyn_cast<Variable>(res.first);
  545|      7|    if (!var || !res.second)
  ------------------
  |  Branch (545:9): [True: 0, False: 7]
  |  Branch (545:17): [True: 0, False: 7]
  ------------------
  546|      0|      continue;
  547|       |
  548|       |    // Otherwise, initialize it to undefined or empty, depending on TDZ.
  549|      7|    Builder.createStoreFrameInst(
  550|      7|        var->getObeysTDZ() ? (Literal *)Builder.getLiteralEmpty()
  ------------------
  |  Branch (550:9): [True: 0, False: 7]
  ------------------
  551|      7|                           : (Literal *)Builder.getLiteralUndefined(),
  552|      7|        var,
  553|      7|        currentIRScope_);
  554|      7|  }
  555|   114k|  for (auto *fd : semInfo->closures) {
  ------------------
  |  Branch (555:17): [True: 768, False: 114k]
  ------------------
  556|    768|    declareVariableOrGlobalProperty(
  557|    768|        newFunc, VarDecl::Kind::Var, getNameFieldFromID(fd->_id));
  558|    768|  }
  559|       |
  560|       |  // Generate the code for import declarations before generating the rest of the
  561|       |  // body.
  562|   114k|  for (auto importDecl : semInfo->imports) {
  ------------------
  |  Branch (562:24): [True: 0, False: 114k]
  ------------------
  563|      0|    genImportDeclaration(importDecl);
  564|      0|  }
  565|       |
  566|       |  // Generate and initialize the code for the hoisted function declarations
  567|       |  // before generating the rest of the body.
  568|   114k|  for (auto funcDecl : semInfo->closures) {
  ------------------
  |  Branch (568:22): [True: 768, False: 114k]
  ------------------
  569|    768|    genFunctionDeclaration(funcDecl);
  570|    768|  }
  571|   114k|}
_ZN6hermes5irgen11ESTreeIRGen14emitParametersEPNS_6ESTree16FunctionLikeNodeE:
  573|   114k|void ESTreeIRGen::emitParameters(ESTree::FunctionLikeNode *funcNode) {
  574|   114k|  auto *newFunc = curFunction()->function;
  575|       |
  576|   114k|  LLVM_DEBUG(llvh::dbgs() << "IRGen function parameters.\n");
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  577|       |
  578|       |  // Create a variable for every parameter.
  579|   114k|  for (auto paramDecl : funcNode->getSemInfo()->paramNames) {
  ------------------
  |  Branch (579:23): [True: 114k, False: 114k]
  ------------------
  580|   114k|    Identifier paramName = getNameFieldFromID(paramDecl.identifier);
  581|   114k|    LLVM_DEBUG(llvh::dbgs() << "Adding parameter: " << paramName << "\n");
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  582|   114k|    auto *paramStorage = Builder.createVariable(
  583|   114k|        newFunc->getFunctionScopeDesc(), Variable::DeclKind::Var, paramName);
  584|       |    // Register the storage for the parameter.
  585|   114k|    nameTable_.insert(paramName, paramStorage);
  586|   114k|  }
  587|       |
  588|       |  // FIXME: T42569352 TDZ for parameters used in initializer expressions.
  589|   114k|  uint32_t paramIndex = uint32_t{0} - 1;
  590|   114k|  for (auto &elem : ESTree::getParams(funcNode)) {
  ------------------
  |  Branch (590:19): [True: 114k, False: 114k]
  ------------------
  591|   114k|    ESTree::Node *param = &elem;
  592|   114k|    ESTree::Node *init = nullptr;
  593|   114k|    ++paramIndex;
  594|       |
  595|   114k|    if (auto *rest = llvh::dyn_cast<ESTree::RestElementNode>(param)) {
  ------------------
  |  Branch (595:15): [True: 0, False: 114k]
  ------------------
  596|      0|      createLRef(rest->_argument, true)
  597|      0|          .emitStore(genBuiltinCall(
  598|      0|              BuiltinMethod::HermesBuiltin_copyRestArgs,
  599|      0|              Builder.getLiteralNumber(paramIndex)));
  600|      0|      break;
  601|      0|    }
  602|       |
  603|       |    // Unpack the optional initialization.
  604|   114k|    if (auto *assign = llvh::dyn_cast<ESTree::AssignmentPatternNode>(param)) {
  ------------------
  |  Branch (604:15): [True: 0, False: 114k]
  ------------------
  605|      0|      param = assign->_left;
  606|      0|      init = assign->_right;
  607|      0|    }
  608|       |
  609|   114k|    Identifier formalParamName = llvh::isa<ESTree::IdentifierNode>(param)
  ------------------
  |  Branch (609:34): [True: 114k, False: 0]
  ------------------
  610|   114k|        ? getNameFieldFromID(param)
  611|   114k|        : genAnonymousLabelName("param");
  612|       |
  613|   114k|    auto *formalParam = Builder.createParameter(newFunc, formalParamName);
  614|   114k|    createLRef(param, true)
  615|   114k|        .emitStore(
  616|   114k|            emitOptionalInitialization(formalParam, init, formalParamName));
  617|   114k|  }
  618|       |
  619|   114k|  newFunc->setExpectedParamCountIncludingThis(
  620|   114k|      countExpectedArgumentsIncludingThis(funcNode));
  621|   114k|}
_ZN6hermes5irgen11ESTreeIRGen35countExpectedArgumentsIncludingThisEPNS_6ESTree16FunctionLikeNodeE:
  624|   114k|    ESTree::FunctionLikeNode *funcNode) {
  625|       |  // Start at 1 to account for "this".
  626|   114k|  uint32_t count = 1;
  627|   114k|  for (auto &param : ESTree::getParams(funcNode)) {
  ------------------
  |  Branch (627:20): [True: 114k, False: 114k]
  ------------------
  628|   114k|    if (llvh::isa<ESTree::AssignmentPatternNode>(param)) {
  ------------------
  |  Branch (628:9): [True: 0, False: 114k]
  ------------------
  629|       |      // Found an initializer, stop counting expected arguments.
  630|      0|      break;
  631|      0|    }
  632|   114k|    ++count;
  633|   114k|  }
  634|   114k|  return count;
  635|   114k|}
_ZN6hermes5irgen11ESTreeIRGen20emitFunctionEpilogueEPNS_5ValueE:
  637|   114k|void ESTreeIRGen::emitFunctionEpilogue(Value *returnValue) {
  638|   114k|  if (returnValue) {
  ------------------
  |  Branch (638:7): [True: 114k, False: 0]
  ------------------
  639|   114k|    Builder.setLocation(SourceErrorManager::convertEndToLocation(
  640|   114k|        Builder.getFunction()->getSourceRange()));
  641|   114k|    Builder.createReturnInst(returnValue);
  642|   114k|  }
  643|       |
  644|       |  // Delete CreateArgumentsInst if it is unused.
  645|   114k|  if (!curFunction()->createArgumentsInst->hasUsers())
  ------------------
  |  Branch (645:7): [True: 114k, False: 2]
  ------------------
  646|   114k|    curFunction()->createArgumentsInst->eraseFromParent();
  647|       |
  648|   114k|  curFunction()->function->clearStatementCount();
  649|   114k|}
ESTreeIRGen-func.cpp:_ZN6hermes5irgen12_GLOBAL__N_119getLazyFunctionKindEPNS_6ESTree16FunctionLikeNodeE:
  186|    674|ESTree::NodeKind getLazyFunctionKind(ESTree::FunctionLikeNode *node) {
  187|    674|  if (node->isMethodDefinition) {
  ------------------
  |  Branch (187:7): [True: 0, False: 674]
  ------------------
  188|       |    // This is not a regular function expression but getter/setter.
  189|       |    // If we want to reparse it later, we have to start from an
  190|       |    // identifier and not from a 'function' keyword.
  191|      0|    return ESTree::NodeKind::Property;
  192|      0|  }
  193|    674|  return node->getKind();
  194|    674|}

_ZN6hermes5irgen11ESTreeIRGen7genBodyERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
   13|     56|void ESTreeIRGen::genBody(ESTree::NodeList &Body) {
   14|     56|  LLVM_DEBUG(llvh::dbgs() << "Compiling body.\n");
  ------------------
  |  |  123|     56|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     56|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 56]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     56|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   15|       |
   16|       |  // Generate code for the declarations statements.
   17|   259k|  for (auto &Node : Body) {
  ------------------
  |  Branch (17:19): [True: 259k, False: 56]
  ------------------
   18|   259k|    LLVM_DEBUG(
  ------------------
  |  |  123|   259k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   259k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 259k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   259k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   19|   259k|        llvh::dbgs() << "IRGen node of type " << Node.getNodeName() << ".\n");
   20|   259k|    genStatement(&Node);
   21|   259k|  }
   22|     56|}
_ZN6hermes5irgen11ESTreeIRGen12genStatementEPNS_6ESTree4NodeE:
   24|   530k|void ESTreeIRGen::genStatement(ESTree::Node *stmt) {
   25|   530k|  LLVM_DEBUG(
  ------------------
  |  |  123|   530k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   530k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 530k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   530k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   26|   530k|      llvh::dbgs() << "IRGen statement of type " << stmt->getNodeName()
   27|   530k|                   << "\n");
   28|   530k|  IRBuilder::ScopedLocationChange slc(Builder, stmt->getDebugLoc());
   29|       |
   30|   530k|  Builder.getFunction()->incrementStatementCount();
   31|       |
   32|   530k|  if (/* auto *FD = */ llvh::dyn_cast<ESTree::FunctionDeclarationNode>(stmt)) {
  ------------------
  |  Branch (32:24): [True: 768, False: 529k]
  ------------------
   33|       |    // It has already been hoisted. Do nothing.  But, keep this to
   34|       |    // match the AST structure, and we may want to do something in the
   35|       |    // future.
   36|    768|    return;
   37|    768|  }
   38|       |
   39|   529k|  if (/* auto *IS = */ llvh::dyn_cast<ESTree::ImportDeclarationNode>(stmt)) {
  ------------------
  |  Branch (39:24): [True: 0, False: 529k]
  ------------------
   40|       |    // Import has already been hoisted. Do nothing. But, keep this to
   41|       |    // match the AST structure, and we may want to do something in the
   42|       |    // future.
   43|      0|    return;
   44|      0|  }
   45|       |
   46|   529k|  if (auto *IF = llvh::dyn_cast<ESTree::IfStatementNode>(stmt)) {
  ------------------
  |  Branch (46:13): [True: 0, False: 529k]
  ------------------
   47|      0|    return genIfStatement(IF);
   48|      0|  }
   49|       |
   50|   529k|  if (auto *FIS = llvh::dyn_cast<ESTree::ForInStatementNode>(stmt)) {
  ------------------
  |  Branch (50:13): [True: 0, False: 529k]
  ------------------
   51|      0|    return genForInStatement(FIS);
   52|      0|  }
   53|       |
   54|   529k|  if (auto *FOS = llvh::dyn_cast<ESTree::ForOfStatementNode>(stmt)) {
  ------------------
  |  Branch (54:13): [True: 0, False: 529k]
  ------------------
   55|      0|    return genForOfStatement(FOS);
   56|      0|  }
   57|       |
   58|   529k|  if (auto *Ret = llvh::dyn_cast<ESTree::ReturnStatementNode>(stmt)) {
  ------------------
  |  Branch (58:13): [True: 114k, False: 415k]
  ------------------
   59|   114k|    return genReturnStatement(Ret);
   60|   114k|  }
   61|       |
   62|   415k|  if (auto *exprStmt = llvh::dyn_cast<ESTree::ExpressionStatementNode>(stmt)) {
  ------------------
  |  Branch (62:13): [True: 130k, False: 285k]
  ------------------
   63|   130k|    return genExpressionWrapper(exprStmt->_expression);
   64|   130k|  }
   65|       |
   66|   285k|  if (auto *SW = llvh::dyn_cast<ESTree::SwitchStatementNode>(stmt)) {
  ------------------
  |  Branch (66:13): [True: 0, False: 285k]
  ------------------
   67|      0|    return genSwitchStatement(SW);
   68|      0|  }
   69|       |
   70|   285k|  if (auto *VDN = llvh::dyn_cast<ESTree::VariableDeclarationNode>(stmt)) {
  ------------------
  |  Branch (70:13): [True: 7, False: 285k]
  ------------------
   71|      7|    return genVariableDeclaration(VDN);
   72|      7|  }
   73|       |
   74|       |  // IRGen the content of the block.
   75|   285k|  if (auto *BS = llvh::dyn_cast<ESTree::BlockStatementNode>(stmt)) {
  ------------------
  |  Branch (75:13): [True: 114k, False: 170k]
  ------------------
   76|   117k|    for (auto &Node : BS->_body) {
  ------------------
  |  Branch (76:21): [True: 117k, False: 114k]
  ------------------
   77|   117k|      genStatement(&Node);
   78|   117k|    }
   79|       |
   80|   114k|    return;
   81|   114k|  }
   82|       |
   83|   170k|  if (auto *Label = llvh::dyn_cast<ESTree::LabeledStatementNode>(stmt)) {
  ------------------
  |  Branch (83:13): [True: 39.2k, False: 131k]
  ------------------
   84|       |    // Create a new basic block which is the continuation of the current block
   85|       |    // and the jump target of the label.
   86|  39.2k|    BasicBlock *next = Builder.createBasicBlock(curFunction()->function);
   87|       |
   88|       |    // Set the jump point for the label to the new block.
   89|  39.2k|    curFunction()->initLabel(Label, next, nullptr);
   90|       |
   91|       |    // Now, generate the IR for the statement that the label is annotating.
   92|  39.2k|    genStatement(Label->_body);
   93|       |
   94|       |    // End the current basic block with a jump to the new basic block.
   95|  39.2k|    Builder.createBranchInst(next);
   96|  39.2k|    Builder.setInsertionBlock(next);
   97|       |
   98|  39.2k|    return;
   99|  39.2k|  }
  100|       |
  101|       |  // Handle the call expression that could appear in the context of statement
  102|       |  // expr without the ExpressionStatementNode wrapper.
  103|   131k|  if (auto *call = llvh::dyn_cast<ESTree::CallExpressionNode>(stmt)) {
  ------------------
  |  Branch (103:13): [True: 0, False: 131k]
  ------------------
  104|      0|    return genExpressionWrapper(call);
  105|      0|  }
  106|       |
  107|   131k|  if (auto *W = llvh::dyn_cast<ESTree::WhileStatementNode>(stmt)) {
  ------------------
  |  Branch (107:13): [True: 1, False: 131k]
  ------------------
  108|      1|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'while' statement\n");
  ------------------
  |  |  123|      1|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      1|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      1|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  109|      1|    genForWhileLoops(W, nullptr, W->_test, W->_test, nullptr, W->_body);
  110|      1|    return;
  111|      1|  }
  112|       |
  113|   131k|  if (auto *F = llvh::dyn_cast<ESTree::ForStatementNode>(stmt)) {
  ------------------
  |  Branch (113:13): [True: 0, False: 131k]
  ------------------
  114|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'for' statement\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  115|      0|    genForWhileLoops(F, F->_init, F->_test, F->_test, F->_update, F->_body);
  116|      0|    return;
  117|      0|  }
  118|       |
  119|   131k|  if (auto *D = llvh::dyn_cast<ESTree::DoWhileStatementNode>(stmt)) {
  ------------------
  |  Branch (119:13): [True: 0, False: 131k]
  ------------------
  120|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'do..while' statement\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  121|      0|    genForWhileLoops(D, nullptr, nullptr, D->_test, nullptr, D->_body);
  122|      0|    return;
  123|      0|  }
  124|       |
  125|   131k|  if (auto *breakStmt = llvh::dyn_cast<ESTree::BreakStatementNode>(stmt)) {
  ------------------
  |  Branch (125:13): [True: 0, False: 131k]
  ------------------
  126|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'break' statement\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  127|       |
  128|      0|    auto &label = curFunction()->label(breakStmt);
  129|      0|    assert(label.breakTarget && "breakTarget not set");
  130|       |
  131|      0|    genFinallyBeforeControlChange(
  132|      0|        curFunction()->surroundingTry,
  133|      0|        label.surroundingTry,
  134|      0|        ControlFlowChange::Break);
  135|      0|    Builder.createBranchInst(label.breakTarget);
  136|       |
  137|       |    // Continue code generation for stuff that comes after the break statement
  138|       |    // in a new dead block.
  139|      0|    auto newBlock = Builder.createBasicBlock(curFunction()->function);
  140|      0|    Builder.setInsertionBlock(newBlock);
  141|      0|    return;
  142|      0|  }
  143|       |
  144|   131k|  if (auto *continueStmt =
  ------------------
  |  Branch (144:13): [True: 0, False: 131k]
  ------------------
  145|   131k|          llvh::dyn_cast<ESTree::ContinueStatementNode>(stmt)) {
  146|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'continue' statement\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  147|       |
  148|      0|    auto &label = curFunction()->label(continueStmt);
  149|      0|    assert(label.continueTarget && "continueTarget not set");
  150|       |
  151|      0|    genFinallyBeforeControlChange(
  152|      0|        curFunction()->surroundingTry,
  153|      0|        label.surroundingTry,
  154|      0|        ControlFlowChange::Continue,
  155|      0|        label.continueTarget);
  156|      0|    Builder.createBranchInst(label.continueTarget);
  157|       |
  158|       |    // Continue code generation for stuff that comes after the break statement
  159|       |    // in a new dead block.
  160|      0|    auto newBlock = Builder.createBasicBlock(curFunction()->function);
  161|      0|    Builder.setInsertionBlock(newBlock);
  162|      0|    return;
  163|      0|  }
  164|       |
  165|   131k|  if (auto *T = llvh::dyn_cast<ESTree::TryStatementNode>(stmt)) {
  ------------------
  |  Branch (165:13): [True: 0, False: 131k]
  ------------------
  166|      0|    genTryStatement(T);
  167|      0|    return;
  168|      0|  }
  169|       |
  170|   131k|  if (auto *T = llvh::dyn_cast<ESTree::ThrowStatementNode>(stmt)) {
  ------------------
  |  Branch (170:13): [True: 0, False: 131k]
  ------------------
  171|      0|    LLVM_DEBUG(llvh::dbgs() << "IRGen 'throw' statement\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  172|      0|    Value *rightHandVal = genExpression(T->_argument);
  173|      0|    Builder.createThrowInst(rightHandVal);
  174|       |
  175|       |    // Throw interferes with control flow, hence we need a new block.
  176|      0|    auto newBlock =
  177|      0|        Builder.createBasicBlock(Builder.getInsertionBlock()->getParent());
  178|      0|    Builder.setInsertionBlock(newBlock);
  179|      0|    return;
  180|      0|  }
  181|       |
  182|       |  // Handle empty statements.
  183|   131k|  if (llvh::isa<ESTree::EmptyStatementNode>(stmt)) {
  ------------------
  |  Branch (183:7): [True: 131k, False: 0]
  ------------------
  184|   131k|    return;
  185|   131k|  }
  186|       |
  187|       |  // Handle debugger statements.
  188|      0|  if (llvh::isa<ESTree::DebuggerStatementNode>(stmt)) {
  ------------------
  |  Branch (188:7): [True: 0, False: 0]
  ------------------
  189|      0|    Builder.createDebuggerInst();
  190|      0|    return;
  191|      0|  }
  192|       |
  193|      0|  if (auto *importDecl = llvh::dyn_cast<ESTree::ImportDeclarationNode>(stmt)) {
  ------------------
  |  Branch (193:13): [True: 0, False: 0]
  ------------------
  194|      0|    return genImportDeclaration(importDecl);
  195|      0|  }
  196|       |
  197|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (197:13): [True: 0, False: 0]
  ------------------
  198|      0|          llvh::dyn_cast<ESTree::ExportNamedDeclarationNode>(stmt)) {
  199|      0|    return genExportNamedDeclaration(exportDecl);
  200|      0|  }
  201|       |
  202|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (202:13): [True: 0, False: 0]
  ------------------
  203|      0|          llvh::dyn_cast<ESTree::ExportDefaultDeclarationNode>(stmt)) {
  204|      0|    return genExportDefaultDeclaration(exportDecl);
  205|      0|  }
  206|       |
  207|      0|  if (auto *exportDecl =
  ------------------
  |  Branch (207:13): [True: 0, False: 0]
  ------------------
  208|      0|          llvh::dyn_cast<ESTree::ExportAllDeclarationNode>(stmt)) {
  209|      0|    return genExportAllDeclaration(exportDecl);
  210|      0|  }
  211|       |
  212|      0|  Builder.getModule()->getContext().getSourceErrorManager().error(
  213|      0|      stmt->getSourceRange(), Twine("invalid statement encountered."));
  214|      0|}
_ZN6hermes5irgen11ESTreeIRGen20genExpressionWrapperEPNS_6ESTree4NodeE:
  216|   130k|void ESTreeIRGen::genExpressionWrapper(ESTree::Node *expr) {
  217|   130k|  Value *val = genExpression(expr);
  218|   130k|  if (curFunction()->globalReturnRegister) {
  ------------------
  |  Branch (218:7): [True: 128k, False: 1.41k]
  ------------------
  219|   128k|    Builder.createStoreStackInst(val, curFunction()->globalReturnRegister);
  220|   128k|  }
  221|   130k|}
_ZN6hermes5irgen11ESTreeIRGen22genVariableDeclarationEPNS_6ESTree23VariableDeclarationNodeE:
  224|      7|    ESTree::VariableDeclarationNode *declaration) {
  225|      7|  for (auto &decl : declaration->_declarations)
  ------------------
  |  Branch (225:19): [True: 7, False: 7]
  ------------------
  226|      7|    genVariableDeclarator(
  227|      7|        declaration->_kind, cast<ESTree::VariableDeclaratorNode>(&decl));
  228|      7|}
_ZN6hermes5irgen11ESTreeIRGen21genVariableDeclaratorEPNS_12UniqueStringEPNS_6ESTree22VariableDeclaratorNodeE:
  232|      7|    ESTree::VariableDeclaratorNode *declarator) {
  233|      7|  IRBuilder::ScopedLocationChange slc(Builder, declarator->getDebugLoc());
  234|      7|  Builder.getFunction()->incrementStatementCount();
  235|       |
  236|      7|  auto lref = createLRef(declarator->_id, true);
  237|      7|  if (declarator->_init) {
  ------------------
  |  Branch (237:7): [True: 0, False: 7]
  ------------------
  238|      0|    Identifier nameHint{};
  239|      0|    if (llvh::isa<ESTree::IdentifierNode>(declarator->_id))
  ------------------
  |  Branch (239:9): [True: 0, False: 0]
  ------------------
  240|      0|      nameHint = getNameFieldFromID(declarator->_id);
  241|      0|    lref.emitStore(genExpression(declarator->_init, nameHint));
  242|      7|  } else if (kind == identLet_.getUnderlyingPointer()) {
  ------------------
  |  Branch (242:14): [True: 0, False: 7]
  ------------------
  243|       |    // "let" declarations without an initializer must be set to undefined.
  244|      0|    lref.emitStore(Builder.getLiteralUndefined());
  245|      0|  }
  246|      7|}
_ZN6hermes5irgen11ESTreeIRGen16genForWhileLoopsEPNS_6ESTree17LoopStatementNodeEPNS2_4NodeES6_S6_S6_S6_:
  279|      1|    ESTree::Node *body) {
  280|       |  /* In this section we generate a sequence of basic blocks that implement
  281|       |   the for, while and do..while statements. Loop inversion is applied.
  282|       |   For loops are syntactic-sugar for while
  283|       |   loops and both have pre-test and post-test. do..while loop should only
  284|       |   have post-test. They will all have the following structure:
  285|       |
  286|       |        [ current block  ]
  287|       |        [      init      ]
  288|       |        [ pre test block ]
  289|       |               |       \
  290|       |               |        \
  291|       |               |         \      ->[ exit block ]
  292|       |    /-->  [ body block ]  \____/      ^
  293|       |    |    [ update block ]             |
  294|       |    |   [ post test block ]  --------/
  295|       |    \__________/
  296|       |  */
  297|       |
  298|       |  // Create the basic blocks that make the while structure.
  299|      1|  Function *function = Builder.getInsertionBlock()->getParent();
  300|      1|  BasicBlock *bodyBlock = Builder.createBasicBlock(function);
  301|      1|  BasicBlock *exitBlock = Builder.createBasicBlock(function);
  302|      1|  BasicBlock *preTestBlock = Builder.createBasicBlock(function);
  303|      1|  BasicBlock *postTestBlock = Builder.createBasicBlock(function);
  304|      1|  BasicBlock *updateBlock = Builder.createBasicBlock(function);
  305|       |
  306|       |  // Initialize the goto labels.
  307|      1|  curFunction()->initLabel(loop, exitBlock, updateBlock);
  308|       |
  309|       |  // Generate IR for the loop initialization.
  310|       |  // The init field can be a variable declaration or any expression.
  311|       |  // https://github.com/estree/estree/blob/master/spec.md#forstatement
  312|      1|  if (init) {
  ------------------
  |  Branch (312:7): [True: 0, False: 1]
  ------------------
  313|      0|    if (llvh::isa<ESTree::VariableDeclarationNode>(init)) {
  ------------------
  |  Branch (313:9): [True: 0, False: 0]
  ------------------
  314|      0|      genStatement(init);
  315|      0|    } else {
  316|      0|      genExpression(init);
  317|      0|    }
  318|      0|  }
  319|       |
  320|       |  // Terminate the loop header section and jump to the condition block.
  321|      1|  Builder.createBranchInst(preTestBlock);
  322|      1|  Builder.setInsertionBlock(preTestBlock);
  323|       |
  324|       |  // Branch out of the loop if the condition is false.
  325|      1|  if (preTest)
  ------------------
  |  Branch (325:7): [True: 1, False: 0]
  ------------------
  326|      1|    genExpressionBranch(preTest, bodyBlock, exitBlock, nullptr);
  327|      0|  else
  328|      0|    Builder.createBranchInst(bodyBlock);
  329|       |
  330|       |  // Generate the update sequence of 'for' loops.
  331|      1|  Builder.setInsertionBlock(updateBlock);
  332|      1|  if (update) {
  ------------------
  |  Branch (332:7): [True: 0, False: 1]
  ------------------
  333|      0|    genExpression(update);
  334|      0|  }
  335|       |
  336|       |  // After executing the content of the body, jump to the post test block.
  337|      1|  Builder.createBranchInst(postTestBlock);
  338|      1|  Builder.setInsertionBlock(postTestBlock);
  339|       |
  340|       |  // Branch out of the loop if the condition is false.
  341|      1|  if (postTest)
  ------------------
  |  Branch (341:7): [True: 1, False: 0]
  ------------------
  342|      1|    genExpressionBranch(postTest, bodyBlock, exitBlock, nullptr);
  343|      0|  else
  344|      0|    Builder.createBranchInst(bodyBlock);
  345|       |
  346|       |  // Now, generate the body of the while loop.
  347|       |  // Do this last so that the test and update blocks are associated with the
  348|       |  // loop statement, and not the body statement.
  349|      1|  Builder.setInsertionBlock(bodyBlock);
  350|      1|  genStatement(body);
  351|      1|  Builder.createBranchInst(updateBlock);
  352|       |
  353|       |  // Following statements are inserted to the exit block.
  354|      1|  Builder.setInsertionBlock(exitBlock);
  355|      1|}
_ZN6hermes5irgen11ESTreeIRGen18genReturnStatementEPNS_6ESTree19ReturnStatementNodeE:
  533|   114k|void ESTreeIRGen::genReturnStatement(ESTree::ReturnStatementNode *RetStmt) {
  534|   114k|  LLVM_DEBUG(llvh::dbgs() << "IRGen Return-stmt.\n");
  ------------------
  |  |  123|   114k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   114k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   114k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  535|       |
  536|   114k|  Value *Value;
  537|       |  // Generate IR for the return value, or undefined if this is an empty return
  538|       |  // statement.
  539|   114k|  if (auto *A = RetStmt->_argument) {
  ------------------
  |  Branch (539:13): [True: 114k, False: 0]
  ------------------
  540|   114k|    Value = genExpression(A);
  541|   114k|  } else {
  542|      0|    Value = Builder.getLiteralUndefined();
  543|      0|  }
  544|       |
  545|   114k|  genFinallyBeforeControlChange(
  546|   114k|      curFunction()->surroundingTry, nullptr, ControlFlowChange::Break);
  547|   114k|  Builder.createReturnInst(Value);
  548|       |
  549|       |  // Code that comes after 'return' is dead code. Let's create a new un-linked
  550|       |  // basic block and keep IRGen in that block. The optimizer will clean things
  551|       |  // up.
  552|   114k|  auto Parent = Builder.getInsertionBlock()->getParent();
  553|   114k|  Builder.setInsertionBlock(Builder.createBasicBlock(Parent));
  554|   114k|}

_ZN6hermes5irgen24loadGlobalObjectPropertyERNS_9IRBuilderEPNS_20GlobalObjectPropertyEb:
   24|   131k|    bool inhibitThrow) {
   25|   131k|  if (from->isDeclared() || inhibitThrow) {
  ------------------
  |  Branch (25:7): [True: 0, False: 131k]
  |  Branch (25:29): [True: 0, False: 131k]
  ------------------
   26|      0|    return builder.createLoadPropertyInst(
   27|      0|        builder.getGlobalObject(), from->getName());
   28|      0|  }
   29|   131k|  return builder.createTryLoadGlobalPropertyInst(from);
   30|   131k|}
_ZN6hermes5irgen10LReference10getBuilderEv:
  179|   118k|IRBuilder &LReference::getBuilder() {
  180|   118k|  return irgen_->Builder;
  181|   118k|}
_ZN6hermes5irgen10LReference8emitLoadEv:
  183|      2|Value *LReference::emitLoad() {
  184|      2|  auto &builder = getBuilder();
  185|      2|  IRBuilder::ScopedLocationChange slc(builder, loadLoc_);
  186|       |
  187|      2|  switch (kind_) {
  ------------------
  |  Branch (187:11): [True: 0, False: 2]
  ------------------
  188|      0|    case Kind::Empty:
  ------------------
  |  Branch (188:5): [True: 0, False: 2]
  ------------------
  189|      0|      assert(false && "empty cannot be loaded");
  190|      0|      return builder.getLiteralUndefined();
  191|      2|    case Kind::Member:
  ------------------
  |  Branch (191:5): [True: 2, False: 0]
  ------------------
  192|      2|      return builder.createLoadPropertyInst(base_, property_);
  193|      0|    case Kind::VarOrGlobal:
  ------------------
  |  Branch (193:5): [True: 0, False: 2]
  ------------------
  194|      0|      return irgen_->emitLoad(base_);
  195|      0|    case Kind::Destructuring:
  ------------------
  |  Branch (195:5): [True: 0, False: 2]
  ------------------
  196|      0|      assert(false && "destructuring cannot be loaded");
  197|      0|      return builder.getLiteralUndefined();
  198|      0|    case Kind::Error:
  ------------------
  |  Branch (198:5): [True: 0, False: 2]
  ------------------
  199|      0|      return builder.getLiteralUndefined();
  200|      2|  }
  201|       |
  202|      0|  llvm_unreachable("invalid LReference kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  203|      2|}
_ZN6hermes5irgen10LReference9emitStoreEPNS_5ValueE:
  205|   117k|void LReference::emitStore(Value *value) {
  206|   117k|  auto &builder = getBuilder();
  207|       |
  208|   117k|  switch (kind_) {
  ------------------
  |  Branch (208:11): [True: 0, False: 117k]
  ------------------
  209|      0|    case Kind::Empty:
  ------------------
  |  Branch (209:5): [True: 0, False: 117k]
  ------------------
  210|      0|      return;
  211|      4|    case Kind::Member:
  ------------------
  |  Branch (211:5): [True: 4, False: 117k]
  ------------------
  212|      4|      builder.createStorePropertyInst(value, base_, property_);
  213|      4|      return;
  214|   117k|    case Kind::VarOrGlobal:
  ------------------
  |  Branch (214:5): [True: 117k, False: 16]
  ------------------
  215|   117k|      irgen_->emitStore(value, base_, declInit_);
  216|   117k|      return;
  217|      0|    case Kind::Error:
  ------------------
  |  Branch (217:5): [True: 0, False: 117k]
  ------------------
  218|      0|      return;
  219|     12|    case Kind::Destructuring:
  ------------------
  |  Branch (219:5): [True: 12, False: 117k]
  ------------------
  220|     12|      return irgen_->emitDestructuringAssignment(
  221|     12|          declInit_, destructuringTarget_, value);
  222|   117k|  }
  223|       |
  224|      0|  llvm_unreachable("invalid LReference kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  225|   117k|}
_ZNK6hermes5irgen10LReference26canStoreWithoutSideEffectsEv:
  227|      6|bool LReference::canStoreWithoutSideEffects() const {
  228|      6|  return kind_ == Kind::VarOrGlobal && llvh::isa<Variable>(base_);
  ------------------
  |  Branch (228:10): [True: 0, False: 6]
  |  Branch (228:40): [True: 0, False: 0]
  ------------------
  229|      6|}
_ZNK6hermes5irgen10LReference14castAsVariableEv:
  231|  3.85k|Variable *LReference::castAsVariable() const {
  232|  3.85k|  return kind_ == Kind::VarOrGlobal ? dyn_cast_or_null<Variable>(base_)
  ------------------
  |  Branch (232:10): [True: 3.84k, False: 6]
  ------------------
  233|  3.85k|                                    : nullptr;
  234|  3.85k|}
_ZNK6hermes5irgen10LReference26castAsGlobalObjectPropertyEv:
  235|  3.01k|GlobalObjectProperty *LReference::castAsGlobalObjectProperty() const {
  236|  3.01k|  return kind_ == Kind::VarOrGlobal
  ------------------
  |  Branch (236:10): [True: 3.00k, False: 6]
  ------------------
  237|  3.01k|      ? dyn_cast_or_null<GlobalObjectProperty>(base_)
  238|  3.01k|      : nullptr;
  239|  3.01k|}
_ZN6hermes5irgen11ESTreeIRGenC2EPNS_6ESTree4NodeERKNSt3__16vectorIPNS2_11ProgramNodeENS5_9allocatorIS8_EEEEPNS_6ModuleERKNS_10ScopeChainE:
  257|     56|      identDefaultExport_(Builder.createIdentifier("?default")) {}
_ZN6hermes5irgen11ESTreeIRGen4doItEv:
  259|     56|void ESTreeIRGen::doIt() {
  260|     56|  LLVM_DEBUG(llvh::dbgs() << "Processing top level program.\n");
  ------------------
  |  |  123|     56|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     56|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 56]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     56|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  261|       |
  262|     56|  ESTree::ProgramNode *Program;
  263|       |
  264|     56|  Program = llvh::dyn_cast<ESTree::ProgramNode>(Root);
  265|       |
  266|     56|  if (!Program) {
  ------------------
  |  Branch (266:7): [True: 0, False: 56]
  ------------------
  267|      0|    Builder.getModule()->getContext().getSourceErrorManager().error(
  268|      0|        SMLoc{}, "missing 'Program' AST node");
  269|      0|    return;
  270|      0|  }
  271|       |
  272|     56|  LLVM_DEBUG(llvh::dbgs() << "Found Program decl.\n");
  ------------------
  |  |  123|     56|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     56|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 56]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     56|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  273|       |
  274|       |  // The function which will "execute" the module.
  275|     56|  Function *topLevelFunction;
  276|       |
  277|       |  // Function context used only when compiling in an existing lexical scope
  278|       |  // chain. It is only initialized if we have a lexical scope chain.
  279|     56|  llvh::Optional<FunctionContext> wrapperFunctionContext{};
  280|       |
  281|     56|  if (!lexicalScopeChain) {
  ------------------
  |  Branch (281:7): [True: 56, False: 0]
  ------------------
  282|     56|    topLevelFunction = Builder.createTopLevelFunction(
  283|     56|        Mod->getInitialScope()->createInnerScope(),
  284|     56|        ESTree::isStrict(Program->strictness),
  285|     56|        Program->sourceVisibility,
  286|     56|        Program->getSourceRange());
  287|       |
  288|     56|  } else {
  289|       |    // If compiling in an existing lexical context, we need to install the
  290|       |    // scopes in a wrapper function, which represents the "global" code.
  291|      0|    auto [wrapperFunction, parentScope] =
  292|      0|        materializeScopeChainForEval(Builder, Program, lexicalScopeChain);
  293|       |
  294|       |    // Initialize the wrapper context.
  295|      0|    wrapperFunctionContext.emplace(this, wrapperFunction, nullptr);
  296|      0|    currentIRScopeDesc_ = parentScope;
  297|       |
  298|       |    // Restore the previously saved parent scopes.
  299|      0|    populateNameTable(nameTable_, parentScope);
  300|       |
  301|       |    // Finally create the function which will actually be executed.
  302|      0|    topLevelFunction = Builder.createFunction(
  303|      0|        parentScope->createInnerScope(),
  304|      0|        "eval",
  305|      0|        Function::DefinitionKind::ES5Function,
  306|      0|        ESTree::isStrict(Program->strictness),
  307|      0|        Program->sourceVisibility,
  308|      0|        Program->getSourceRange(),
  309|      0|        false);
  310|       |
  311|      0|    buildDummyLexicalParent(
  312|      0|        Builder, parentScope->getFunction(), topLevelFunction);
  313|      0|  }
  314|       |
  315|     56|  Mod->setTopLevelFunction(topLevelFunction);
  316|       |
  317|       |  // Function context for topLevelFunction.
  318|     56|  FunctionContext topLevelFunctionContext{
  319|     56|      this, topLevelFunction, Program->getSemInfo()};
  320|       |
  321|       |  // IRGen needs a pointer to the outer-most context, which is either
  322|       |  // topLevelContext or wrapperFunctionContext, depending on whether the latter
  323|       |  // was created.
  324|       |  // We want to set the pointer to that outer-most context, but ensure that it
  325|       |  // doesn't outlive the context it is pointing to.
  326|     56|  llvh::SaveAndRestore<FunctionContext *> saveTopLevelContext(
  327|     56|      topLevelContext,
  328|     56|      !wrapperFunctionContext.hasValue() ? &topLevelFunctionContext
  ------------------
  |  Branch (328:7): [True: 56, False: 0]
  ------------------
  329|     56|                                         : &wrapperFunctionContext.getValue());
  330|       |
  331|       |  // Now declare all externally supplied global properties, but only if we don't
  332|       |  // have a lexical scope chain.
  333|     56|  if (!lexicalScopeChain) {
  ------------------
  |  Branch (333:7): [True: 56, False: 0]
  ------------------
  334|     56|    for (auto declFile : DeclarationFileList) {
  ------------------
  |  Branch (334:24): [True: 56, False: 56]
  ------------------
  335|     56|      processDeclarationFile(declFile);
  336|     56|    }
  337|     56|  }
  338|       |
  339|     56|  emitFunctionPrologue(
  340|     56|      Program,
  341|     56|      Builder.createBasicBlock(topLevelFunction),
  342|     56|      InitES5CaptureState::Yes,
  343|     56|      DoEmitParameters::Yes);
  344|       |
  345|     56|  Value *retVal;
  346|     56|  {
  347|       |    // Allocate the return register, initialize it to undefined.
  348|     56|    curFunction()->globalReturnRegister =
  349|     56|        Builder.createAllocStackInst(genAnonymousLabelName("ret"));
  350|     56|    Builder.createStoreStackInst(
  351|     56|        Builder.getLiteralUndefined(), curFunction()->globalReturnRegister);
  352|       |
  353|     56|    genBody(Program->_body);
  354|       |
  355|       |    // Terminate the top-level scope with a return statement.
  356|     56|    retVal = Builder.createLoadStackInst(curFunction()->globalReturnRegister);
  357|     56|  }
  358|       |
  359|     56|  emitFunctionEpilogue(retVal);
  360|     56|}
_ZN6hermes5irgen11ESTreeIRGen31declareVariableOrGlobalPropertyEPNS_8FunctionENS_18JavaScriptDeclKindENS_10IdentifierE:
  463|    775|    Identifier name) {
  464|    775|  Value *found = nameTable_.lookup(name);
  465|       |
  466|       |  // If the variable is already declared in this scope, do not create a
  467|       |  // second instance.
  468|    775|  if (found) {
  ------------------
  |  Branch (468:7): [True: 766, False: 9]
  ------------------
  469|    766|    if (auto *var = llvh::dyn_cast<Variable>(found)) {
  ------------------
  |  Branch (469:15): [True: 0, False: 766]
  ------------------
  470|      0|      if (var->getParent()->getFunction() == inFunc)
  ------------------
  |  Branch (470:11): [True: 0, False: 0]
  ------------------
  471|      0|        return {found, false};
  472|    766|    } else {
  473|    766|      assert(
  474|    766|          llvh::isa<GlobalObjectProperty>(found) &&
  475|    766|          "Invalid value found in name table");
  476|    766|      if (inFunc->isGlobalScope())
  ------------------
  |  Branch (476:11): [True: 766, False: 0]
  ------------------
  477|    766|        return {found, false};
  478|    766|    }
  479|    766|  }
  480|       |
  481|       |  // Create a property if global scope, variable otherwise.
  482|      9|  Value *res;
  483|      9|  if (inFunc->isGlobalScope() && declKind == VarDecl::Kind::Var) {
  ------------------
  |  Branch (483:7): [True: 2, False: 7]
  |  Branch (483:34): [True: 2, False: 0]
  ------------------
  484|      2|    res = Builder.createGlobalObjectProperty(name, true);
  485|      7|  } else {
  486|      7|    if (!Mod->getContext().getCodeGenerationSettings().enableTDZ) {
  ------------------
  |  Branch (486:9): [True: 7, False: 0]
  ------------------
  487|       |      // short-circuit all declarations to be Var. TDZ dies here.
  488|      7|      declKind = Variable::DeclKind::Var;
  489|      7|    }
  490|       |
  491|      7|    res =
  492|      7|        Builder.createVariable(inFunc->getFunctionScopeDesc(), declKind, name);
  493|      7|  }
  494|       |
  495|       |  // Register the variable in the scoped hash table.
  496|      9|  nameTable_.insert(name, res);
  497|      9|  return {res, true};
  498|    775|}
_ZN6hermes5irgen11ESTreeIRGen28declareAmbientGlobalPropertyENS_10IdentifierE:
  501|  3.45k|    Identifier name) {
  502|       |  // Avoid redefining global properties.
  503|  3.45k|  auto *prop = dyn_cast_or_null<GlobalObjectProperty>(nameTable_.lookup(name));
  504|  3.45k|  if (prop)
  ------------------
  |  Branch (504:7): [True: 56, False: 3.40k]
  ------------------
  505|     56|    return prop;
  506|       |
  507|  3.40k|  LLVM_DEBUG(
  ------------------
  |  |  123|  3.40k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.40k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.40k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.40k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  508|  3.40k|      llvh::dbgs() << "declaring ambient global property " << name << " "
  509|  3.40k|                   << name.getUnderlyingPointer() << "\n");
  510|       |
  511|  3.40k|  prop = Builder.createGlobalObjectProperty(name, false);
  512|  3.40k|  nameTable_.insertIntoScope(&topLevelContext->scope, name, prop);
  513|  3.40k|  return prop;
  514|  3.45k|}
_ZN6hermes5irgen11ESTreeIRGen22processDeclarationFileEPNS_6ESTree11ProgramNodeE:
  562|     56|void ESTreeIRGen::processDeclarationFile(ESTree::ProgramNode *programNode) {
  563|     56|  auto Program = dyn_cast_or_null<ESTree::ProgramNode>(programNode);
  564|     56|  if (!Program)
  ------------------
  |  Branch (564:7): [True: 0, False: 56]
  ------------------
  565|      0|    return;
  566|       |
  567|     56|  DeclHoisting DH;
  568|     56|  Program->visit(DH);
  569|       |
  570|       |  // Create variable declarations for each of the hoisted variables.
  571|     56|  for (auto vd : DH.decls)
  ------------------
  |  Branch (571:16): [True: 1.34k, False: 56]
  ------------------
  572|  1.34k|    declareAmbientGlobalProperty(getNameFieldFromID(vd->_id));
  573|     56|  for (auto fd : DH.closures)
  ------------------
  |  Branch (573:16): [True: 1.90k, False: 56]
  ------------------
  574|  1.90k|    declareAmbientGlobalProperty(getNameFieldFromID(fd->_id));
  575|     56|}
_ZN6hermes5irgen11ESTreeIRGen20ensureVariableExistsEPNS_6ESTree14IdentifierNodeE:
  577|   260k|Value *ESTreeIRGen::ensureVariableExists(ESTree::IdentifierNode *id) {
  578|   260k|  assert(id && "id must be a valid Identifier node");
  579|      0|  Identifier name = getNameFieldFromID(id);
  580|       |
  581|       |  // Check if this is a known variable.
  582|   260k|  if (auto *var = nameTable_.lookup(name))
  ------------------
  |  Branch (582:13): [True: 260k, False: 211]
  ------------------
  583|   260k|    return var;
  584|       |
  585|    211|  if (curFunction()->function->isStrictMode()) {
  ------------------
  |  Branch (585:7): [True: 0, False: 211]
  ------------------
  586|       |    // Report a warning in strict mode.
  587|      0|    auto currentFunc = Builder.getInsertionBlock()->getParent();
  588|       |
  589|      0|    Builder.getModule()->getContext().getSourceErrorManager().warning(
  590|      0|        Warning::UndefinedVariable,
  591|      0|        id->getSourceRange(),
  592|      0|        Twine("the variable \"") + name.str() + "\" was not declared in " +
  593|      0|            currentFunc->getDescriptiveDefinitionKindStr() + " \"" +
  594|      0|            currentFunc->getInternalNameStr() + "\"");
  595|      0|  }
  596|       |
  597|       |  // Undeclared variable is an ambient global property.
  598|    211|  return declareAmbientGlobalProperty(name);
  599|   260k|}
_ZN6hermes5irgen11ESTreeIRGen27genMemberExpressionPropertyEPNS_6ESTree24MemberExpressionLikeNodeE:
  602|     24|    ESTree::MemberExpressionLikeNode *Mem) {
  603|       |  // If computed is true, the node corresponds to a computed (a[b]) member
  604|       |  // lookup and '_property' is an Expression. Otherwise, the node
  605|       |  // corresponds to a static (a.b) member lookup and '_property' is an
  606|       |  // Identifier.
  607|       |  // Details of the computed field are available here:
  608|       |  // https://github.com/estree/estree/blob/master/spec.md#memberexpression
  609|       |
  610|     24|  if (getComputed(Mem)) {
  ------------------
  |  Branch (610:7): [True: 2, False: 22]
  ------------------
  611|      2|    return genExpression(getProperty(Mem));
  612|      2|  }
  613|       |
  614|       |  // Arrays and objects may be accessed with integer indices.
  615|     22|  if (auto N = llvh::dyn_cast<ESTree::NumericLiteralNode>(getProperty(Mem))) {
  ------------------
  |  Branch (615:12): [True: 0, False: 22]
  ------------------
  616|      0|    return Builder.getLiteralNumber(N->_value);
  617|      0|  }
  618|       |
  619|       |  // ESTree encodes property access as MemberExpression -> Identifier.
  620|     22|  auto Id = cast<ESTree::IdentifierNode>(getProperty(Mem));
  621|       |
  622|     22|  Identifier fieldName = getNameFieldFromID(Id);
  623|     22|  LLVM_DEBUG(
  ------------------
  |  |  123|     22|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     22|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 22]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     22|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  624|     22|      llvh::dbgs() << "Emitting direct label access to field '" << fieldName
  625|     22|                   << "'\n");
  626|     22|  return Builder.getLiteralString(fieldName);
  627|     22|}
_ZN6hermes5irgen11ESTreeIRGen31canCreateLRefWithoutSideEffectsEPNS_6ESTree4NodeE:
  630|      6|    hermes::ESTree::Node *target) {
  631|       |  // Check for an identifier bound to an existing local variable.
  632|      6|  if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(target)) {
  ------------------
  |  Branch (632:13): [True: 0, False: 6]
  ------------------
  633|      0|    return dyn_cast_or_null<Variable>(
  634|      0|        nameTable_.lookup(getNameFieldFromID(iden)));
  635|      0|  }
  636|       |
  637|      6|  return false;
  638|      6|}
_ZN6hermes5irgen11ESTreeIRGen10createLRefEPNS_6ESTree4NodeEb:
  640|   118k|LReference ESTreeIRGen::createLRef(ESTree::Node *node, bool declInit) {
  641|   118k|  SMLoc sourceLoc = node->getDebugLoc();
  642|   118k|  IRBuilder::ScopedLocationChange slc(Builder, sourceLoc);
  643|       |
  644|   118k|  if (llvh::isa<ESTree::EmptyNode>(node)) {
  ------------------
  |  Branch (644:7): [True: 0, False: 118k]
  ------------------
  645|      0|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for EmptyNode.\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  646|      0|    return LReference(
  647|      0|        LReference::Kind::Empty, this, false, nullptr, nullptr, sourceLoc);
  648|      0|  }
  649|       |
  650|       |  /// Create lref for member expression (ex: o.f).
  651|   118k|  if (auto *ME = llvh::dyn_cast<ESTree::MemberExpressionNode>(node)) {
  ------------------
  |  Branch (651:13): [True: 4, False: 118k]
  ------------------
  652|      4|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for member expression.\n");
  ------------------
  |  |  123|      4|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      4|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 4]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      4|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  653|      4|    Value *obj = genExpression(ME->_object);
  654|      4|    Value *prop = genMemberExpressionProperty(ME);
  655|      4|    return LReference(
  656|      4|        LReference::Kind::Member, this, false, obj, prop, sourceLoc);
  657|      4|  }
  658|       |
  659|       |  /// Create lref for identifiers  (ex: a).
  660|   118k|  if (auto *iden = llvh::dyn_cast<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (660:13): [True: 117k, False: 12]
  ------------------
  661|   117k|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for identifier.\n");
  ------------------
  |  |  123|   117k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   117k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 117k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   117k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  662|   117k|    LLVM_DEBUG(
  ------------------
  |  |  123|   117k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   117k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 117k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   117k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  663|   117k|        llvh::dbgs() << "Looking for identifier \"" << getNameFieldFromID(iden)
  664|   117k|                     << "\"\n");
  665|   117k|    auto *var = ensureVariableExists(iden);
  666|   117k|    return LReference(
  667|   117k|        LReference::Kind::VarOrGlobal, this, declInit, var, nullptr, sourceLoc);
  668|   117k|  }
  669|       |
  670|       |  /// Create lref for variable decls (ex: var a).
  671|     12|  if (auto *V = llvh::dyn_cast<ESTree::VariableDeclarationNode>(node)) {
  ------------------
  |  Branch (671:13): [True: 0, False: 12]
  ------------------
  672|      0|    LLVM_DEBUG(llvh::dbgs() << "Creating an LRef for variable declaration.\n");
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  673|       |
  674|      0|    assert(V->_declarations.size() == 1 && "Malformed variable declaration");
  675|      0|    auto *decl =
  676|      0|        cast<ESTree::VariableDeclaratorNode>(&V->_declarations.front());
  677|       |
  678|      0|    return createLRef(decl->_id, true);
  679|      0|  }
  680|       |
  681|       |  // Destructuring assignment.
  682|     12|  if (auto *pat = llvh::dyn_cast<ESTree::PatternNode>(node)) {
  ------------------
  |  Branch (682:13): [True: 12, False: 0]
  ------------------
  683|     12|    return LReference(this, declInit, pat);
  684|     12|  }
  685|       |
  686|      0|  Builder.getModule()->getContext().getSourceErrorManager().error(
  687|      0|      node->getSourceRange(), "unsupported assignment target");
  688|       |
  689|      0|  return LReference(
  690|      0|      LReference::Kind::Error, this, false, nullptr, nullptr, sourceLoc);
  691|     12|}
_ZN6hermes5irgen11ESTreeIRGen14genBuiltinCallENS_13BuiltinMethod4EnumEN4llvh8ArrayRefIPNS_5ValueEEE:
  707|    283|    ArrayRef<Value *> args) {
  708|    283|  return Builder.createCallBuiltinInst(builtinIndex, args);
  709|    283|}
_ZN6hermes5irgen11ESTreeIRGen15emitGetIteratorEPNS_5ValueE:
  803|     12|ESTreeIRGen::IteratorRecord ESTreeIRGen::emitGetIterator(Value *obj) {
  804|       |  // Each of these will be modified by "next", so we use a stack storage.
  805|     12|  auto *iterStorage =
  806|     12|      Builder.createAllocStackInst(genAnonymousLabelName("iter"));
  807|     12|  auto *sourceOrNext =
  808|     12|      Builder.createAllocStackInst(genAnonymousLabelName("sourceOrNext"));
  809|     12|  Builder.createStoreStackInst(obj, sourceOrNext);
  810|     12|  auto *iter = Builder.createIteratorBeginInst(sourceOrNext);
  811|     12|  Builder.createStoreStackInst(iter, iterStorage);
  812|     12|  return IteratorRecord{iterStorage, sourceOrNext};
  813|     12|}
_ZN6hermes5irgen11ESTreeIRGen27emitDestructuringAssignmentEbPNS_6ESTree11PatternNodeEPNS_5ValueE:
  818|     12|    Value *source) {
  819|     12|  if (auto *APN = llvh::dyn_cast<ESTree::ArrayPatternNode>(target))
  ------------------
  |  Branch (819:13): [True: 12, False: 0]
  ------------------
  820|     12|    return emitDestructuringArray(declInit, APN, source);
  821|      0|  else if (auto *OPN = llvh::dyn_cast<ESTree::ObjectPatternNode>(target))
  ------------------
  |  Branch (821:18): [True: 0, False: 0]
  ------------------
  822|      0|    return emitDestructuringObject(declInit, OPN, source);
  823|      0|  else {
  824|      0|    Mod->getContext().getSourceErrorManager().error(
  825|      0|        target->getSourceRange(), "unsupported destructuring target");
  826|      0|  }
  827|     12|}
_ZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueE:
  832|     12|    Value *source) {
  833|     12|  const IteratorRecord iteratorRecord = emitGetIterator(source);
  834|       |
  835|       |  /// iteratorDone = undefined.
  836|     12|  auto *iteratorDone =
  837|     12|      Builder.createAllocStackInst(genAnonymousLabelName("iterDone"));
  838|     12|  Builder.createStoreStackInst(Builder.getLiteralUndefined(), iteratorDone);
  839|       |
  840|     12|  auto *value =
  841|     12|      Builder.createAllocStackInst(genAnonymousLabelName("iterValue"));
  842|       |
  843|     12|  SharedExceptionHandler handler{};
  844|     12|  handler.exc = Builder.createAllocStackInst(genAnonymousLabelName("exc"));
  845|       |  // All exception handlers branch to this block.
  846|     12|  handler.exceptionBlock = Builder.createBasicBlock(Builder.getFunction());
  847|       |
  848|     12|  bool first = true;
  849|     12|  bool emittedRest = false;
  850|       |  // The LReference created in the previous iteration of the destructuring
  851|       |  // loop. We need it because we want to put the previous store and the creation
  852|       |  // of the next LReference under one try block.
  853|     12|  llvh::Optional<LReference> lref;
  854|       |
  855|       |  /// If the previous LReference is valid and non-empty, store "value" into
  856|       |  /// it and reset the LReference.
  857|     12|  auto storePreviousValue = [&lref, &handler, this, value]() {
  858|     12|    if (lref && !lref->isEmpty()) {
  859|     12|      if (lref->canStoreWithoutSideEffects()) {
  860|     12|        lref->emitStore(Builder.createLoadStackInst(value));
  861|     12|      } else {
  862|       |        // If we can't store without side effects, wrap the store in try/catch.
  863|     12|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  864|     12|          lref->emitStore(Builder.createLoadStackInst(value));
  865|     12|        });
  866|     12|      }
  867|     12|      lref.reset();
  868|     12|    }
  869|     12|  };
  870|       |
  871|     12|  for (auto &elem : targetPat->_elements) {
  ------------------
  |  Branch (871:19): [True: 6, False: 12]
  ------------------
  872|      6|    ESTree::Node *target = &elem;
  873|      6|    ESTree::Node *init = nullptr;
  874|       |
  875|      6|    if (auto *rest = llvh::dyn_cast<ESTree::RestElementNode>(target)) {
  ------------------
  |  Branch (875:15): [True: 0, False: 6]
  ------------------
  876|      0|      storePreviousValue();
  877|      0|      emitRestElement(declInit, rest, iteratorRecord, iteratorDone, &handler);
  878|      0|      emittedRest = true;
  879|      0|      break;
  880|      0|    }
  881|       |
  882|       |    // If we have an initializer, unwrap it.
  883|      6|    if (auto *assign = llvh::dyn_cast<ESTree::AssignmentPatternNode>(target)) {
  ------------------
  |  Branch (883:15): [True: 0, False: 6]
  ------------------
  884|      0|      target = assign->_left;
  885|      0|      init = assign->_right;
  886|      0|    }
  887|       |
  888|       |    // Can we create the new LReference without side effects and avoid a
  889|       |    // try/catch. The complexity comes from having to check whether the last
  890|       |    // LReference also can avoid a try/catch or not.
  891|      6|    if (canCreateLRefWithoutSideEffects(target)) {
  ------------------
  |  Branch (891:9): [True: 0, False: 6]
  ------------------
  892|       |      // We don't need a try/catch, but last lref might. Just let the routine
  893|       |      // do the right thing.
  894|      0|      storePreviousValue();
  895|      0|      lref = createLRef(target, declInit);
  896|      6|    } else {
  897|       |      // We need a try/catch, but last lref might not. If it doesn't, emit it
  898|       |      // directly and clear it, so we won't do anything inside our try/catch.
  899|      6|      if (lref && lref->canStoreWithoutSideEffects()) {
  ------------------
  |  Branch (899:11): [True: 0, False: 6]
  |  Branch (899:19): [True: 0, False: 0]
  ------------------
  900|      0|        lref->emitStore(Builder.createLoadStackInst(value));
  901|      0|        lref.reset();
  902|      0|      }
  903|      6|      emitTryWithSharedHandler(
  904|      6|          &handler, [this, &lref, value, target, declInit]() {
  905|       |            // Store the previous value, if we have one.
  906|      6|            if (lref && !lref->isEmpty())
  907|      6|              lref->emitStore(Builder.createLoadStackInst(value));
  908|      6|            lref = createLRef(target, declInit);
  909|      6|          });
  910|      6|    }
  911|       |
  912|       |    // Pseudocode of the algorithm for a step:
  913|       |    //
  914|       |    //   value = undefined;
  915|       |    //   if (iteratorDone) goto nextBlock
  916|       |    // notDoneBlock:
  917|       |    //   stepResult = IteratorNext(iteratorRecord)
  918|       |    //   stepDone = IteratorComplete(stepResult)
  919|       |    //   iteratorDone = stepDone
  920|       |    //   if (stepDone) goto nextBlock
  921|       |    // newValueBlock:
  922|       |    //   value = IteratorValue(stepResult)
  923|       |    // nextBlock:
  924|       |    //   if (value !== undefined) goto storeBlock    [if initializer present]
  925|       |    //   value = initializer                         [if initializer present]
  926|       |    // storeBlock:
  927|       |    //   lref.emitStore(value)
  928|       |
  929|      6|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
  930|      6|    auto *newValueBlock = Builder.createBasicBlock(Builder.getFunction());
  931|      6|    auto *nextBlock = Builder.createBasicBlock(Builder.getFunction());
  932|      6|    auto *getDefaultBlock =
  933|      6|        init ? Builder.createBasicBlock(Builder.getFunction()) : nullptr;
  ------------------
  |  Branch (933:9): [True: 0, False: 6]
  ------------------
  934|      6|    auto *storeBlock =
  935|      6|        init ? Builder.createBasicBlock(Builder.getFunction()) : nullptr;
  ------------------
  |  Branch (935:9): [True: 0, False: 6]
  ------------------
  936|       |
  937|      6|    Builder.createStoreStackInst(Builder.getLiteralUndefined(), value);
  938|       |
  939|       |    // In the first iteration we know that "done" is false.
  940|      6|    if (first) {
  ------------------
  |  Branch (940:9): [True: 6, False: 0]
  ------------------
  941|      6|      first = false;
  942|      6|      Builder.createBranchInst(notDoneBlock);
  943|      6|    } else {
  944|      0|      Builder.createCondBranchInst(
  945|      0|          Builder.createLoadStackInst(iteratorDone), nextBlock, notDoneBlock);
  946|      0|    }
  947|       |
  948|       |    // notDoneBlock:
  949|      6|    Builder.setInsertionBlock(notDoneBlock);
  950|      6|    auto *stepValue = emitIteratorNext(iteratorRecord);
  951|      6|    auto *stepDone = emitIteratorComplete(iteratorRecord);
  952|      6|    Builder.createStoreStackInst(stepDone, iteratorDone);
  953|      6|    Builder.createCondBranchInst(
  954|      6|        stepDone, init ? getDefaultBlock : nextBlock, newValueBlock);
  ------------------
  |  Branch (954:19): [True: 0, False: 6]
  ------------------
  955|       |
  956|       |    // newValueBlock:
  957|      6|    Builder.setInsertionBlock(newValueBlock);
  958|      6|    Builder.createStoreStackInst(stepValue, value);
  959|      6|    Builder.createBranchInst(nextBlock);
  960|       |
  961|       |    // nextBlock:
  962|      6|    Builder.setInsertionBlock(nextBlock);
  963|       |
  964|       |    // NOTE: we can't use emitOptionalInitializationHere() because we want to
  965|       |    // be able to jump directly to getDefaultBlock.
  966|      6|    if (init) {
  ------------------
  |  Branch (966:9): [True: 0, False: 6]
  ------------------
  967|       |      //    if (value !== undefined) goto storeBlock    [if initializer present]
  968|       |      //    value = initializer                         [if initializer present]
  969|       |      //  storeBlock:
  970|      0|      Builder.createCondBranchInst(
  971|      0|          Builder.createBinaryOperatorInst(
  972|      0|              Builder.createLoadStackInst(value),
  973|      0|              Builder.getLiteralUndefined(),
  974|      0|              BinaryOperatorInst::OpKind::StrictlyNotEqualKind),
  975|      0|          storeBlock,
  976|      0|          getDefaultBlock);
  977|       |
  978|      0|      Identifier nameHint = llvh::isa<ESTree::IdentifierNode>(target)
  ------------------
  |  Branch (978:29): [True: 0, False: 0]
  ------------------
  979|      0|          ? getNameFieldFromID(target)
  980|      0|          : Identifier{};
  981|       |
  982|       |      // getDefaultBlock:
  983|      0|      Builder.setInsertionBlock(getDefaultBlock);
  984|      0|      Builder.createStoreStackInst(genExpression(init, nameHint), value);
  985|      0|      Builder.createBranchInst(storeBlock);
  986|       |
  987|       |      // storeBlock:
  988|      0|      Builder.setInsertionBlock(storeBlock);
  989|      0|    }
  990|      6|  }
  991|       |
  992|     12|  storePreviousValue();
  993|       |
  994|       |  // If in the end the iterator is not done, close it. We only need to do
  995|       |  // that if we didn't end with a rest element because it would have exhausted
  996|       |  // the iterator.
  997|     12|  if (!emittedRest) {
  ------------------
  |  Branch (997:7): [True: 12, False: 0]
  ------------------
  998|     12|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
  999|     12|    auto *doneBlock = Builder.createBasicBlock(Builder.getFunction());
 1000|     12|    Builder.createCondBranchInst(
 1001|     12|        Builder.createLoadStackInst(iteratorDone), doneBlock, notDoneBlock);
 1002|       |
 1003|     12|    Builder.setInsertionBlock(notDoneBlock);
 1004|     12|    emitIteratorClose(iteratorRecord, false);
 1005|     12|    Builder.createBranchInst(doneBlock);
 1006|       |
 1007|     12|    Builder.setInsertionBlock(doneBlock);
 1008|     12|  }
 1009|       |
 1010|       |  // If we emitted at least one try block, generate the exception handler.
 1011|     12|  if (handler.emittedTry) {
  ------------------
  |  Branch (1011:7): [True: 6, False: 6]
  ------------------
 1012|      6|    IRBuilder::SaveRestore saveRestore{Builder};
 1013|      6|    Builder.setInsertionBlock(handler.exceptionBlock);
 1014|       |
 1015|      6|    auto *notDoneBlock = Builder.createBasicBlock(Builder.getFunction());
 1016|      6|    auto *doneBlock = Builder.createBasicBlock(Builder.getFunction());
 1017|       |
 1018|      6|    Builder.createCondBranchInst(
 1019|      6|        Builder.createLoadStackInst(iteratorDone), doneBlock, notDoneBlock);
 1020|       |
 1021|      6|    Builder.setInsertionBlock(notDoneBlock);
 1022|      6|    emitIteratorClose(iteratorRecord, true);
 1023|      6|    Builder.createBranchInst(doneBlock);
 1024|       |
 1025|      6|    Builder.setInsertionBlock(doneBlock);
 1026|      6|    Builder.createThrowInst(Builder.createLoadStackInst(handler.exc));
 1027|      6|  } else {
 1028|       |    // If we didn't use the exception block, we need to delete it, otherwise
 1029|       |    // it fails IR validation even though it will be never executed.
 1030|      6|    handler.exceptionBlock->eraseFromParent();
 1031|       |
 1032|       |    // Delete the not needed exception stack allocation. It would be optimized
 1033|       |    // out later, but it is nice to produce cleaner non-optimized IR, if it is
 1034|       |    // easy to do so.
 1035|      6|    assert(
 1036|      6|        !handler.exc->hasUsers() &&
 1037|      6|        "should not have any users if no try/catch was emitted");
 1038|      0|    handler.exc->eraseFromParent();
 1039|      6|  }
 1040|     12|}
_ZN6hermes5irgen11ESTreeIRGen26emitOptionalInitializationEPNS_5ValueEPNS_6ESTree4NodeENS_10IdentifierE:
 1244|   114k|    Identifier nameHint) {
 1245|   114k|  if (!init)
  ------------------
  |  Branch (1245:7): [True: 114k, False: 0]
  ------------------
 1246|   114k|    return value;
 1247|       |
 1248|      0|  auto *currentBlock = Builder.getInsertionBlock();
 1249|      0|  auto *getDefaultBlock = Builder.createBasicBlock(Builder.getFunction());
 1250|      0|  auto *storeBlock = Builder.createBasicBlock(Builder.getFunction());
 1251|       |
 1252|       |  //    if (value !== undefined) goto storeBlock    [if initializer present]
 1253|       |  //    value = initializer                         [if initializer present]
 1254|       |  //  storeBlock:
 1255|      0|  Builder.createCondBranchInst(
 1256|      0|      Builder.createBinaryOperatorInst(
 1257|      0|          value,
 1258|      0|          Builder.getLiteralUndefined(),
 1259|      0|          BinaryOperatorInst::OpKind::StrictlyNotEqualKind),
 1260|      0|      storeBlock,
 1261|      0|      getDefaultBlock);
 1262|       |
 1263|       |  // getDefaultBlock:
 1264|      0|  Builder.setInsertionBlock(getDefaultBlock);
 1265|      0|  auto *defaultValue = genExpression(init, nameHint);
 1266|      0|  auto *defaultResultBlock = Builder.getInsertionBlock();
 1267|      0|  Builder.createBranchInst(storeBlock);
 1268|       |
 1269|       |  // storeBlock:
 1270|      0|  Builder.setInsertionBlock(storeBlock);
 1271|      0|  return Builder.createPhiInst(
 1272|      0|      {value, defaultValue}, {currentBlock, defaultResultBlock});
 1273|   114k|}
_ZN6hermes5irgen11ESTreeIRGen23resolveScopeIdentifiersERKNS_10ScopeChainE:
 1276|     56|    const ScopeChain &chain) {
 1277|     56|  SerializedScopePtr current{};
 1278|     56|  for (auto it = chain.functions.rbegin(), end = chain.functions.rend();
 1279|     56|       it < end;
  ------------------
  |  Branch (1279:8): [True: 0, False: 56]
  ------------------
 1280|     56|       it++) {
 1281|      0|    auto next = std::make_shared<SerializedScope>();
 1282|      0|    next->variables.reserve(it->variables.size());
 1283|      0|    for (auto var : it->variables) {
  ------------------
  |  Branch (1283:19): [True: 0, False: 0]
  ------------------
 1284|      0|      next->variables.push_back(SerializedScope::Declaration{
 1285|      0|          Builder.createIdentifier(var), Variable::DeclKind::Var});
 1286|      0|    }
 1287|      0|    next->parentScope = current;
 1288|      0|    current = next;
 1289|      0|  }
 1290|     56|  return current;
 1291|     56|}
_ZN6hermes5irgen11ESTreeIRGen14serializeScopeEPNS_9ScopeDescEb:
 1295|  1.34k|    bool includeGlobal) {
 1296|       |  // Serialize the global scope if and only if it's the only scope.
 1297|       |  // We serialize the global scope to avoid re-declaring variables,
 1298|       |  // and only do it once to avoid creating spurious scopes.
 1299|  1.34k|  if (!S->getParent() || S->getSerializedScope()) {
  ------------------
  |  Branch (1299:7): [True: 674, False: 674]
  |  Branch (1299:7): [True: 674, False: 674]
  |  Branch (1299:26): [True: 0, False: 674]
  ------------------
 1300|    674|    return S->getSerializedScope();
 1301|    674|  }
 1302|       |
 1303|    674|  auto scope = std::make_shared<SerializedScope>();
 1304|    674|  auto *func = S->getFunction();
 1305|       |
 1306|    674|  if (S == func->getFunctionScopeDesc()) {
  ------------------
  |  Branch (1306:7): [True: 674, False: 0]
  ------------------
 1307|    674|    scope->originalName = func->getOriginalOrInferredName();
 1308|    674|    if (auto *closure = func->getLazyClosureAlias()) {
  ------------------
  |  Branch (1308:15): [True: 0, False: 674]
  ------------------
 1309|      0|      scope->closureAlias = closure->getName();
 1310|      0|    }
 1311|    674|  }
 1312|    674|  for (auto *var : S->getVariables()) {
  ------------------
  |  Branch (1312:18): [True: 0, False: 674]
  ------------------
 1313|      0|    scope->variables.push_back(
 1314|      0|        SerializedScope::Declaration{var->getName(), var->getDeclKind()});
 1315|      0|  }
 1316|    674|  scope->parentScope = serializeScope(S->getParent(), false);
 1317|    674|  return scope;
 1318|  1.34k|}
_ZN6hermes5irgen11ESTreeIRGen8emitLoadEPNS_5ValueEb:
 1320|   142k|Instruction *ESTreeIRGen::emitLoad(Value *from, bool inhibitThrow) {
 1321|   142k|  if (auto *var = llvh::dyn_cast<Variable>(from)) {
  ------------------
  |  Branch (1321:13): [True: 10.8k, False: 131k]
  ------------------
 1322|  10.8k|    Instruction *res = Builder.createLoadFrameInst(var, currentIRScope_);
 1323|  10.8k|    if (var->getObeysTDZ())
  ------------------
  |  Branch (1323:9): [True: 0, False: 10.8k]
  ------------------
 1324|      0|      res = Builder.createThrowIfEmptyInst(res);
 1325|  10.8k|    return res;
 1326|   131k|  } else if (auto *globalProp = llvh::dyn_cast<GlobalObjectProperty>(from)) {
  ------------------
  |  Branch (1326:20): [True: 131k, False: 0]
  ------------------
 1327|   131k|    return loadGlobalObjectProperty(Builder, globalProp, inhibitThrow);
 1328|   131k|  } else {
 1329|      0|    llvm_unreachable("invalid value to load from");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1330|      0|  }
 1331|   142k|}
_ZN6hermes5irgen11ESTreeIRGen9emitStoreEPNS_5ValueES3_b:
 1334|   118k|ESTreeIRGen::emitStore(Value *storedValue, Value *ptr, bool declInit) {
 1335|   118k|  if (auto *var = llvh::dyn_cast<Variable>(ptr)) {
  ------------------
  |  Branch (1335:13): [True: 114k, False: 3.77k]
  ------------------
 1336|   114k|    if (!declInit && var->getObeysTDZ()) {
  ------------------
  |  Branch (1336:9): [True: 836, False: 114k]
  |  Branch (1336:22): [True: 0, False: 836]
  ------------------
 1337|       |      // Must verify whether the variable is initialized.
 1338|      0|      Builder.createThrowIfEmptyInst(
 1339|      0|          Builder.createLoadFrameInst(var, currentIRScope_));
 1340|      0|    }
 1341|   114k|    return Builder.createStoreFrameInst(storedValue, var, currentIRScope_);
 1342|   114k|  } else if (auto *globalProp = llvh::dyn_cast<GlobalObjectProperty>(ptr)) {
  ------------------
  |  Branch (1342:20): [True: 3.77k, False: 0]
  ------------------
 1343|  3.77k|    if (globalProp->isDeclared() || !Builder.getFunction()->isStrictMode())
  ------------------
  |  Branch (1343:9): [True: 768, False: 3.00k]
  |  Branch (1343:37): [True: 3.00k, False: 0]
  ------------------
 1344|  3.77k|      return Builder.createStorePropertyInst(
 1345|  3.77k|          storedValue, Builder.getGlobalObject(), globalProp->getName());
 1346|      0|    else
 1347|      0|      return Builder.createTryStoreGlobalPropertyInst(storedValue, globalProp);
 1348|  3.77k|  } else {
 1349|      0|    llvm_unreachable("unvalid value to load from");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1350|      0|  }
 1351|   118k|}
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoistingC2Ev:
  527|     56|  explicit DeclHoisting() = default;
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoistingD2Ev:
  528|     56|  ~DeclHoisting() = default;
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEv:
  857|     12|  auto storePreviousValue = [&lref, &handler, this, value]() {
  858|     12|    if (lref && !lref->isEmpty()) {
  ------------------
  |  Branch (858:9): [True: 6, False: 6]
  |  Branch (858:17): [True: 6, False: 0]
  ------------------
  859|      6|      if (lref->canStoreWithoutSideEffects()) {
  ------------------
  |  Branch (859:11): [True: 0, False: 6]
  ------------------
  860|      0|        lref->emitStore(Builder.createLoadStackInst(value));
  861|      6|      } else {
  862|       |        // If we can't store without side effects, wrap the store in try/catch.
  863|      6|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  864|      6|          lref->emitStore(Builder.createLoadStackInst(value));
  865|      6|        });
  866|      6|      }
  867|      6|      lref.reset();
  868|      6|    }
  869|     12|  };
ESTreeIRGen.cpp:_ZZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEvENKUlvE_clEv:
  863|      6|        emitTryWithSharedHandler(&handler, [this, &lref, value]() {
  864|      6|          lref->emitStore(Builder.createLoadStackInst(value));
  865|      6|        });
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting11shouldVisitEPNS_6ESTree4NodeE:
  543|  5.99k|  bool shouldVisit(ESTree::Node *V) {
  544|       |    // Collect declared names, even if we don't descend into children nodes.
  545|  5.99k|    collectDecls(V);
  546|       |
  547|       |    // Do not descend to child closures because the variables they define are
  548|       |    // not exposed to the outside function.
  549|  5.99k|    if (llvh::isa<ESTree::FunctionDeclarationNode>(V) ||
  ------------------
  |  Branch (549:9): [True: 1.90k, False: 4.08k]
  ------------------
  550|  5.99k|        llvh::isa<ESTree::FunctionExpressionNode>(V) ||
  ------------------
  |  Branch (550:9): [True: 0, False: 4.08k]
  ------------------
  551|  5.99k|        llvh::isa<ESTree::ArrowFunctionExpressionNode>(V))
  ------------------
  |  Branch (551:9): [True: 0, False: 4.08k]
  ------------------
  552|  1.90k|      return false;
  553|  4.08k|    return true;
  554|  5.99k|  }
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting12collectDeclsEPNS_6ESTree4NodeE:
  533|  5.99k|  void collectDecls(ESTree::Node *V) {
  534|  5.99k|    if (auto VD = llvh::dyn_cast<ESTree::VariableDeclaratorNode>(V)) {
  ------------------
  |  Branch (534:14): [True: 1.34k, False: 4.64k]
  ------------------
  535|  1.34k|      return decls.push_back(VD);
  536|  1.34k|    }
  537|       |
  538|  4.64k|    if (auto FD = llvh::dyn_cast<ESTree::FunctionDeclarationNode>(V)) {
  ------------------
  |  Branch (538:14): [True: 1.90k, False: 2.74k]
  ------------------
  539|  1.90k|      return closures.push_back(FD);
  540|  1.90k|    }
  541|  4.64k|  }
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting5enterEPNS_6ESTree4NodeE:
  556|  4.08k|  void enter(ESTree::Node *V) {}
ESTreeIRGen.cpp:_ZN6hermes5irgen12_GLOBAL__N_112DeclHoisting5leaveEPNS_6ESTree4NodeE:
  557|  4.08k|  void leave(ESTree::Node *V) {}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_4clEv:
  904|      6|          &handler, [this, &lref, value, target, declInit]() {
  905|       |            // Store the previous value, if we have one.
  906|      6|            if (lref && !lref->isEmpty())
  ------------------
  |  Branch (906:17): [True: 0, False: 6]
  |  Branch (906:25): [True: 0, False: 0]
  ------------------
  907|      0|              lref->emitStore(Builder.createLoadStackInst(value));
  908|      6|            lref = createLRef(target, declInit);
  909|      6|          });

_ZNK6hermes5irgen15FunctionContext18getPreviousContextEv:
  148|   114k|  FunctionContext *getPreviousContext() const {
  149|   114k|    return oldContext_;
  150|   114k|  }
_ZN6hermes5irgen15FunctionContext10getSemInfoEv:
  154|   114k|  sem::FunctionInfo *getSemInfo() {
  155|   114k|    assert(semInfo_ && "semInfo is not set");
  156|      0|    return semInfo_;
  157|   114k|  }
_ZN6hermes5irgen15FunctionContext9initLabelEPNS_6ESTree19LabelDecorationBaseEPNS_10BasicBlockES6_:
  171|  39.2k|      BasicBlock *continueTarget) {
  172|  39.2k|    auto &label = labels_[LDB->getLabelIndex()];
  173|  39.2k|    label.breakTarget = breakTarget;
  174|  39.2k|    label.continueTarget = continueTarget;
  175|  39.2k|    label.surroundingTry = surroundingTry;
  176|  39.2k|  }
_ZN6hermes5irgen10LReferenceC2ENS1_4KindEPNS0_11ESTreeIRGenEbPNS_5ValueES6_N4llvh5SMLocE:
  262|   117k|      : kind_(kind), irgen_(irgen), declInit_(declInit) {
  263|   117k|    base_ = base;
  264|   117k|    property_ = property;
  265|   117k|    loadLoc_ = loadLoc;
  266|   117k|  }
_ZN6hermes5irgen10LReferenceC2EPNS0_11ESTreeIRGenEbPNS_6ESTree11PatternNodeE:
  269|     12|      : kind_(Kind::Destructuring), irgen_(irgen), declInit_(declInit) {
  270|     12|    destructuringTarget_ = target;
  271|     12|  }
_ZNK6hermes5irgen10LReference7isEmptyEv:
  273|      6|  bool isEmpty() const {
  274|      6|    return kind_ == Kind::Empty;
  275|      6|  }
_ZN6hermes5irgen11ESTreeIRGen21genAnonymousLabelNameEN4llvh9StringRefE:
  372|    137|  Identifier genAnonymousLabelName(llvh::StringRef hint) {
  373|    137|    return curFunction()->genAnonymousLabelName(hint);
  374|    137|  }
_ZN6hermes5irgen11ESTreeIRGen11curFunctionEv:
  824|  1.70M|  inline FunctionContext *curFunction() {
  825|  1.70M|    assert(functionContext_ && "No active function context");
  826|      0|    return functionContext_;
  827|  1.70M|  }
_ZN6hermes5irgen11ESTreeIRGen16emitIteratorNextENS1_14IteratorRecordE:
  955|      6|  Value *emitIteratorNext(IteratorRecord iteratorRecord) {
  956|      6|    return Builder.createIteratorNextInst(
  957|      6|        iteratorRecord.iterStorage, iteratorRecord.sourceOrNext);
  958|      6|  }
_ZN6hermes5irgen11ESTreeIRGen20emitIteratorCompleteENS1_14IteratorRecordE:
  963|      6|  Value *emitIteratorComplete(IteratorRecord iteratorRecord) {
  964|      6|    return Builder.createBinaryOperatorInst(
  965|      6|        Builder.createLoadStackInst(iteratorRecord.iterStorage),
  966|      6|        Builder.getLiteralUndefined(),
  967|      6|        BinaryOperatorInst::OpKind::StrictlyEqualKind);
  968|      6|  }
_ZN6hermes5irgen11ESTreeIRGen17emitIteratorCloseENS1_14IteratorRecordEb:
  975|     18|      bool ignoreInnerException) {
  976|     18|    return Builder.createIteratorCloseInst(
  977|     18|        iteratorRecord.iterStorage, ignoreInnerException);
  978|     18|  }
_ZN6hermes5irgen11ESTreeIRGen14saveScopeChainEPNS_9ScopeDescE:
 1046|    674|  SerializedScopePtr saveScopeChain(ScopeDesc *S) {
 1047|    674|    return serializeScope(S, true);
 1048|    674|  }
_ZN6hermes5irgen11ESTreeIRGen12newScopeDescEv:
 1054|   114k|  ScopeDesc *newScopeDesc() {
 1055|   114k|    return currentIRScopeDesc_->createInnerScope();
 1056|   114k|  }
_ZN6hermes5irgen11ESTreeIRGen32genAnonymousFunctionNameIfNeededENS_10IdentifierE:
 1060|   114k|  Identifier genAnonymousFunctionNameIfNeeded(Identifier name) {
 1061|   114k|    if (LLVM_LIKELY(
  ------------------
  |  |  188|   227k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 114k, False: 0]
  |  |  |  Branch (188:51): [True: 2.48k, False: 112k]
  |  |  |  Branch (188:51): [True: 112k, False: 0]
  |  |  ------------------
  ------------------
 1062|   114k|            name.isValid() ||
 1063|   114k|            !Mod->getContext()
 1064|   114k|                 .getCodeGenerationSettings()
 1065|   114k|                 .generateNameForUnnamedFunctions)) {
 1066|   114k|      return name;
 1067|   114k|    }
 1068|       |
 1069|       |    // Use the current function's name to generate a globally-unique name.
 1070|      0|    return genAnonymousLabelName(
 1071|      0|        std::string("anonFunc@") +
 1072|      0|        curFunction()->function->getOriginalOrInferredName().c_str());
 1073|   114k|  }
_ZN6hermes5irgen18getNameFieldFromIDEPKNS_6ESTree4NodeE:
   45|   636k|inline Identifier getNameFieldFromID(const ESTree::Node *ID) {
   46|   636k|  return Identifier::getFromPointer(cast<ESTree::IdentifierNode>(ID)->_name);
   47|   636k|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_:
 1134|      6|    EB emitBody) {
 1135|      6|  emitTryCatchScaffolding(
 1136|      6|      nullptr,
 1137|       |      // emitBody.
 1138|      6|      emitBody,
 1139|       |      // emitNormalCleanup.
 1140|      6|      []() {},
 1141|       |      // emitHandler.
 1142|      6|      [this, handler](BasicBlock *nextBlock) {
 1143|      6|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1144|      6|        Builder.createBranchInst(handler->exceptionBlock);
 1145|      6|        Builder.setInsertionBlock(nextBlock);
 1146|      6|      });
 1147|      6|  handler->emittedTry = true;
 1148|      6|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen23emitTryCatchScaffoldingIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEvEUlvE_ZNS1_24emitTryWithSharedHandlerIS9_EEvPNS1_22SharedExceptionHandlerET_EUlvE_ZNSA_IS9_EEvSC_SD_EUlPNS_10BasicBlockEE_EESG_SG_SD_T0_T1_:
 1098|      6|    EH emitHandler) {
 1099|      6|  auto *function = Builder.getFunction();
 1100|       |
 1101|      6|  auto *catchBlock = Builder.createBasicBlock(function);
 1102|      6|  if (!nextBlock)
  ------------------
  |  Branch (1102:7): [True: 6, False: 0]
  ------------------
 1103|      6|    nextBlock = Builder.createBasicBlock(function);
 1104|      6|  auto *tryBodyBlock = Builder.createBasicBlock(function);
 1105|       |
 1106|       |  // Start with a TryStartInst, and transition to try body.
 1107|      6|  Builder.createTryStartInst(tryBodyBlock, catchBlock);
 1108|      6|  Builder.setInsertionBlock(tryBodyBlock);
 1109|       |
 1110|       |  // Generate IR for the body of Try
 1111|      6|  emitBody();
 1112|       |
 1113|       |  // Emit TryEnd in a new block.
 1114|      6|  auto *tryEndBlock = Builder.createBasicBlock(function);
 1115|      6|  Builder.createBranchInst(tryEndBlock);
 1116|      6|  Builder.setInsertionBlock(tryEndBlock);
 1117|      6|  Builder.createTryEndInst();
 1118|       |
 1119|      6|  emitNormalCleanup();
 1120|       |
 1121|      6|  Builder.createBranchInst(nextBlock);
 1122|       |
 1123|       |  // Generate the catch/finally block.
 1124|      6|  Builder.setInsertionBlock(catchBlock);
 1125|       |
 1126|      6|  emitHandler(nextBlock);
 1127|       |
 1128|      6|  return nextBlock;
 1129|      6|}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_ENKUlvE_clEv:
 1140|      6|      []() {},
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEENK3$_3clEvEUlvE_EEvPNS1_22SharedExceptionHandlerET_ENKUlPNS_10BasicBlockEE_clESE_:
 1142|      6|      [this, handler](BasicBlock *nextBlock) {
 1143|      6|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1144|      6|        Builder.createBranchInst(handler->exceptionBlock);
 1145|      6|        Builder.setInsertionBlock(nextBlock);
 1146|      6|      });
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_4EEvPNS1_22SharedExceptionHandlerET_:
 1134|      6|    EB emitBody) {
 1135|      6|  emitTryCatchScaffolding(
 1136|      6|      nullptr,
 1137|       |      // emitBody.
 1138|      6|      emitBody,
 1139|       |      // emitNormalCleanup.
 1140|      6|      []() {},
 1141|       |      // emitHandler.
 1142|      6|      [this, handler](BasicBlock *nextBlock) {
 1143|      6|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1144|      6|        Builder.createBranchInst(handler->exceptionBlock);
 1145|      6|        Builder.setInsertionBlock(nextBlock);
 1146|      6|      });
 1147|      6|  handler->emittedTry = true;
 1148|      6|}
ESTreeIRGen.cpp:_ZN6hermes5irgen11ESTreeIRGen23emitTryCatchScaffoldingIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_4ZNS1_24emitTryWithSharedHandlerIS8_EEvPNS1_22SharedExceptionHandlerET_EUlvE_ZNS9_IS8_EEvSB_SC_EUlPNS_10BasicBlockEE_EESF_SF_SC_T0_T1_:
 1098|      6|    EH emitHandler) {
 1099|      6|  auto *function = Builder.getFunction();
 1100|       |
 1101|      6|  auto *catchBlock = Builder.createBasicBlock(function);
 1102|      6|  if (!nextBlock)
  ------------------
  |  Branch (1102:7): [True: 6, False: 0]
  ------------------
 1103|      6|    nextBlock = Builder.createBasicBlock(function);
 1104|      6|  auto *tryBodyBlock = Builder.createBasicBlock(function);
 1105|       |
 1106|       |  // Start with a TryStartInst, and transition to try body.
 1107|      6|  Builder.createTryStartInst(tryBodyBlock, catchBlock);
 1108|      6|  Builder.setInsertionBlock(tryBodyBlock);
 1109|       |
 1110|       |  // Generate IR for the body of Try
 1111|      6|  emitBody();
 1112|       |
 1113|       |  // Emit TryEnd in a new block.
 1114|      6|  auto *tryEndBlock = Builder.createBasicBlock(function);
 1115|      6|  Builder.createBranchInst(tryEndBlock);
 1116|      6|  Builder.setInsertionBlock(tryEndBlock);
 1117|      6|  Builder.createTryEndInst();
 1118|       |
 1119|      6|  emitNormalCleanup();
 1120|       |
 1121|      6|  Builder.createBranchInst(nextBlock);
 1122|       |
 1123|       |  // Generate the catch/finally block.
 1124|      6|  Builder.setInsertionBlock(catchBlock);
 1125|       |
 1126|      6|  emitHandler(nextBlock);
 1127|       |
 1128|      6|  return nextBlock;
 1129|      6|}
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_4EEvPNS1_22SharedExceptionHandlerET_ENKUlvE_clEv:
 1140|      6|      []() {},
ESTreeIRGen.cpp:_ZZN6hermes5irgen11ESTreeIRGen24emitTryWithSharedHandlerIZNS1_22emitDestructuringArrayEbPNS_6ESTree16ArrayPatternNodeEPNS_5ValueEE3$_4EEvPNS1_22SharedExceptionHandlerET_ENKUlPNS_10BasicBlockEE_clESD_:
 1142|      6|      [this, handler](BasicBlock *nextBlock) {
 1143|      6|        Builder.createStoreStackInst(Builder.createCatchInst(), handler->exc);
 1144|      6|        Builder.createBranchInst(handler->exceptionBlock);
 1145|      6|        Builder.setInsertionBlock(nextBlock);
 1146|      6|      });

_ZN6hermes20generateIRFromESTreeEPNS_6ESTree4NodeEPNS_6ModuleERKNSt3__16vectorIPNS0_11ProgramNodeENS5_9allocatorIS8_EEEERKNS_10ScopeChainE:
   24|     56|    const ScopeChain &scopeChain) {
   25|       |  // Generate IR into the module M.
   26|     56|  ESTreeIRGen Generator(node, declFileList, M, scopeChain);
   27|     56|  Generator.doIt();
   28|       |
   29|     56|  LLVM_DEBUG(dbgs() << "Finished IRGen.\n");
  ------------------
  |  |  123|     56|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     56|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 56]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     56|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   30|     56|  return false;
   31|     56|}

_ZN6hermes12IRInstrumentC2EPNS_6ModuleERNS_9IRBuilderE:
   91|     56|  IRInstrument(Module *M, IRBuilder &builder) {}
_ZN6hermes12IRInstrument19preBinaryExpressionEPNS_6ESTree20BinaryExpressionNodeEPNS_5ValueES5_:
   97|  65.0k|      Value *right) {
   98|  65.0k|    return nullptr;
   99|  65.0k|  }
_ZN6hermes12IRInstrument20postBinaryExpressionEPNS_6ESTree20BinaryExpressionNodeEPNS_5ValueES5_S5_S5_:
  105|  65.0k|      Value *right) {
  106|  65.0k|    return result;
  107|  65.0k|  }
_ZN6hermes12IRInstrument18preUnaryExpressionEPNS_6ESTree19UnaryExpressionNodeEPNS_5ValueE:
  111|  4.00k|      Value *operand) {
  112|  4.00k|    return nullptr;
  113|  4.00k|  }
_ZN6hermes12IRInstrument19postUnaryExpressionEPNS_6ESTree19UnaryExpressionNodeEPNS_5ValueES5_S5_:
  118|  4.00k|      Value *operand) {
  119|  4.00k|    return result;
  120|  4.00k|  }
_ZN6hermes12IRInstrument13preAssignmentEPNS_6ESTree24AssignmentExpressionNodeEPNS_5ValueES5_:
  125|  3.85k|      Value *right) {
  126|  3.85k|    return nullptr;
  127|  3.85k|  }
_ZN6hermes12IRInstrument14postAssignmentEPNS_6ESTree24AssignmentExpressionNodeEPNS_5ValueES5_S5_S5_:
  133|  3.85k|      Value *right) {
  134|  3.85k|    return result;
  135|  3.85k|  }

_ZN6hermes2vm19getInternalBytecodeEv:
   14|     99|llvh::ArrayRef<uint8_t> getInternalBytecode() {
   15|       |  // Bytecode is required to be aligned, so ensure we don't fail to load it
   16|       |  // at runtime.
   17|     99|  alignas(hbc::BYTECODE_ALIGNMENT) static const uint8_t InternalBytecode[] = {
   18|     99|#ifdef HERMES_CMAKE_BUILD
   19|     99|#include "InternalBytecode.inc"
   20|       |#else
   21|       |#include "hermes/InternalBytecode/InternalBytecode.inc"
   22|       |#endif
   23|     99|  };
   24|       |
   25|     99|  return llvh::makeArrayRef(InternalBytecode, sizeof(InternalBytecode));
   26|     99|}

_ZN6hermes11PassManagerC2ERKNS_22CodeGenerationSettingsE:
   22|   114k|    : cgSettings_(settings) {}
_ZN6hermes11PassManagerD2Ev:
   24|   114k|PassManager::~PassManager() = default;
_ZN6hermes11PassManager7addPassENSt3__110unique_ptrINS_4PassENS1_14default_deleteIS3_EEEE:
  150|   343k|void PassManager::addPass(std::unique_ptr<Pass> P) {
  151|   343k|  if (shouldDump(cgSettings_.dumpBefore, *P) ||
  ------------------
  |  Branch (151:7): [True: 0, False: 343k]
  ------------------
  152|   343k|      shouldDump(cgSettings_.dumpAfter, *P)) {
  ------------------
  |  Branch (152:7): [True: 0, False: 343k]
  ------------------
  153|      0|    std::unique_ptr<Pass> tmp = makeDumpPass(std::move(P));
  154|      0|    P = std::move(tmp);
  155|      0|  }
  156|       |
  157|   343k|  pipeline_.emplace_back(std::move(P));
  158|   343k|}
_ZN6hermes11PassManager3runEPNS_8FunctionE:
  160|   114k|void PassManager::run(Function *F) {
  161|   114k|  if (F->isLazy())
  ------------------
  |  Branch (161:7): [True: 0, False: 114k]
  ------------------
  162|      0|    return;
  163|       |
  164|       |  // For each pass:
  165|   342k|  for (const std::unique_ptr<Pass> &P : pipeline_) {
  ------------------
  |  Branch (165:39): [True: 342k, False: 114k]
  ------------------
  166|   342k|    auto *FP = llvh::dyn_cast<FunctionPass>(P.get());
  167|   342k|    assert(FP && "Invalid pass kind");
  168|   342k|    LLVM_DEBUG(llvh::dbgs() << "Running the pass " << FP->getName() << "\n");
  ------------------
  |  |  123|   342k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   342k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 342k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   342k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  169|   342k|    LLVM_DEBUG(
  ------------------
  |  |  123|   342k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   342k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 342k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   342k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  170|   342k|        llvh::dbgs() << "Optimizing the function " << F->getInternalNameStr()
  171|   342k|                     << "\n");
  172|   342k|    FP->runOnFunction(F);
  173|   342k|  }
  174|   114k|}
_ZN6hermes11PassManager3runEPNS_6ModuleE:
  176|     56|void PassManager::run(Module *M) {
  177|     56|  llvh::SmallVector<Timer, 32> timers;
  178|     56|  std::unique_ptr<TimerGroup> timerGroup{nullptr};
  179|     56|  if (AreStatisticsEnabled()) {
  ------------------
  |  Branch (179:7): [True: 0, False: 56]
  ------------------
  180|      0|    timerGroup.reset(new TimerGroup("", "PassManager Timers"));
  181|      0|  }
  182|       |
  183|       |  // For each pass:
  184|    784|  for (std::unique_ptr<Pass> &P : pipeline_) {
  ------------------
  |  Branch (184:33): [True: 784, False: 56]
  ------------------
  185|    784|    TimeRegion timeRegion(
  186|    784|        timerGroup ? timers.emplace_back("", P->getName(), *timerGroup),
  ------------------
  |  Branch (186:9): [True: 0, False: 784]
  ------------------
  187|      0|        &timers.back()
  188|    784|                   : nullptr);
  189|       |
  190|       |    /// Handle function passes:
  191|    784|    if (auto *FP = llvh::dyn_cast<FunctionPass>(P.get())) {
  ------------------
  |  Branch (191:15): [True: 784, False: 0]
  ------------------
  192|    784|      LLVM_DEBUG(
  ------------------
  |  |  123|    784|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    784|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 784]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    784|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  193|    784|          llvh::dbgs() << "Running the function pass " << FP->getName()
  194|    784|                       << "\n");
  195|       |
  196|  1.60M|      for (auto &I : *M) {
  ------------------
  |  Branch (196:20): [True: 1.60M, False: 784]
  ------------------
  197|  1.60M|        Function *F = &I;
  198|  1.60M|        if (F->isLazy())
  ------------------
  |  Branch (198:13): [True: 9.43k, False: 1.59M]
  ------------------
  199|  9.43k|          continue;
  200|  1.59M|        LLVM_DEBUG(
  ------------------
  |  |  123|  1.59M|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.59M|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.59M]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.59M|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  201|  1.59M|            llvh::dbgs() << "Optimizing the function "
  202|  1.59M|                         << F->getInternalNameStr() << "\n");
  203|  1.59M|        FP->runOnFunction(F);
  204|  1.59M|      }
  205|       |
  206|       |      // Move to the next pass.
  207|    784|      continue;
  208|    784|    }
  209|       |
  210|       |    /// Handle module passes:
  211|      0|    if (auto *MP = llvh::dyn_cast<ModulePass>(P.get())) {
  ------------------
  |  Branch (211:15): [True: 0, False: 0]
  ------------------
  212|      0|      LLVM_DEBUG(
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  213|      0|          llvh::dbgs() << "Running the module pass " << MP->getName() << "\n");
  214|      0|      MP->runOnModule(M);
  215|       |      // Move to the next pass.
  216|      0|      continue;
  217|      0|    }
  218|       |
  219|      0|    llvm_unreachable("Unknown pass kind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  220|      0|  }
  221|     56|}
PassManager.cpp:_ZN6hermes12_GLOBAL__N_110shouldDumpERKNS_35CodeGenerationSettings_DumpSettingsERKNS_4PassE:
   30|   686k|    const Pass &P) {
   31|   686k|  return dumpSettings.all || dumpSettings.passes.count(P.getName()) != 0;
  ------------------
  |  Branch (31:10): [True: 0, False: 686k]
  |  Branch (31:30): [True: 0, False: 686k]
  ------------------
   32|   686k|}

_ZN6hermes19HoistStartGenerator13runOnFunctionEPNS_8FunctionE:
   16|   114k|bool HoistStartGenerator::runOnFunction(Function *F) {
   17|   114k|  auto *innerFn = llvh::dyn_cast<GeneratorInnerFunction>(F);
   18|   114k|  if (!innerFn) {
  ------------------
  |  Branch (18:7): [True: 114k, False: 0]
  ------------------
   19|       |    // StartGenerator is only in GeneratorInnerFunction.
   20|   114k|    return false;
   21|   114k|  }
   22|       |
   23|      0|  for (BasicBlock &bb : *F) {
  ------------------
  |  Branch (23:23): [True: 0, False: 0]
  ------------------
   24|      0|    for (Instruction &inst : bb) {
  ------------------
  |  Branch (24:28): [True: 0, False: 0]
  ------------------
   25|      0|      if (auto *startGen = llvh::dyn_cast<StartGeneratorInst>(&inst)) {
  ------------------
  |  Branch (25:17): [True: 0, False: 0]
  ------------------
   26|      0|        startGen->moveBefore(&*F->front().begin());
   27|       |        // GeneratorInnerFunction may only have one StartGeneratorInst,
   28|       |        // so we are done.
   29|      0|        return true;
   30|      0|      }
   31|      0|    }
   32|      0|  }
   33|       |
   34|      0|  return false;
   35|      0|}
_ZN6hermes25createHoistStartGeneratorEv:
   37|     56|std::unique_ptr<Pass> hermes::createHoistStartGenerator() {
   38|     56|  return std::make_unique<HoistStartGenerator>();
   39|     56|}

_ZN6hermes6parser12tokenKindStrENS0_9TokenKindE:
   38|  31.8k|const char *tokenKindStr(TokenKind kind) {
   39|  31.8k|  assert(kind <= TokenKind::_last_token);
   40|      0|  return g_tokenStr[static_cast<unsigned>(kind)];
   41|  31.8k|}
_ZN6hermes6parser7JSLexerC2EjRNS_18SourceErrorManagerERNS_28BacktrackingBumpPtrAllocatorEPNS_11StringTableEbb:
   75|    164|      convertSurrogates_(convertSurrogates) {
   76|    164|  initializeWithBufferId(bufId);
   77|    164|  initializeReservedIdentifiers();
   78|    164|}
_ZN6hermes6parser7JSLexerC2ENSt3__110unique_ptrIN4llvh12MemoryBufferENS2_14default_deleteIS5_EEEERNS_18SourceErrorManagerERNS_28BacktrackingBumpPtrAllocatorEPNS_11StringTableEbb:
   95|     99|      convertSurrogates_(convertSurrogates) {
   96|     99|  auto bufId = sm_.addNewSourceBuffer(std::move(input));
   97|     99|  initializeWithBufferId(bufId);
   98|     99|  initializeReservedIdentifiers();
   99|     99|}
_ZN6hermes6parser7JSLexer22initializeWithBufferIdEj:
  101|    263|void JSLexer::initializeWithBufferId(uint32_t bufId) {
  102|    263|  auto *buffer = sm_.getSourceBuffer(bufId);
  103|    263|  bufId_ = bufId;
  104|    263|  bufferStart_ = buffer->getBufferStart();
  105|    263|  bufferEnd_ = buffer->getBufferEnd();
  106|    263|  curCharPtr_ = bufferStart_;
  107|    263|  assert(*bufferEnd_ == 0 && "buffer must be zero terminated");
  108|    263|}
_ZN6hermes6parser7JSLexer29initializeReservedIdentifiersEv:
  110|    263|void JSLexer::initializeReservedIdentifiers() {
  111|       |  // Add all reserved words to the identifier table
  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  113|    263|#include "hermes/Parser/TokenKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|    263|#ifndef TOK
  |  |    9|    263|#define TOK(name, str)
  |  |   10|    263|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RESWORD
  |  |   13|       |#define RESWORD(name) TOK(rw_##name, #name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|    263|#ifndef PUNCTUATOR
  |  |   17|    263|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|    263|#endif
  |  |   19|       |
  |  |   20|    263|#ifndef PUNCTUATOR_FLOW
  |  |   21|    263|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|    263|#endif
  |  |   23|       |
  |  |   24|    263|#ifndef BINOP
  |  |   25|    263|#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|    263|#endif
  |  |   27|       |
  |  |   28|    263|#ifndef TEMPLATE
  |  |   29|    263|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|    263|#endif
  |  |   31|       |
  |  |   32|    263|#ifndef RANGE_MARKER
  |  |   33|    263|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   34|    263|#endif
  |  |   35|       |
  |  |   36|       |// clang-format off
  |  |   37|       |
  |  |   38|    263|TOK(none, "<none>")
  |  |   39|    263|TOK(identifier, "identifier")
  |  |   40|    263|TOK(private_identifier, "private identifier")
  |  |   41|       |
  |  |   42|    263|RANGE_MARKER(_first_resword)
  |  |   43|    263|RESWORD(function)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   44|    263|RESWORD(for)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   45|    263|RESWORD(if)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   46|    263|RESWORD(in)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   47|    263|RESWORD(var)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   48|    263|RESWORD(break)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   49|    263|RESWORD(continue)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   50|    263|RESWORD(return)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   51|    263|RESWORD(switch)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   52|    263|RESWORD(this)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   53|       |
  |  |   54|    263|RESWORD(true)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   55|    263|RESWORD(false)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   56|    263|RESWORD(null)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   57|    263|RESWORD(case)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   58|    263|RESWORD(catch)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   59|    263|RESWORD(const)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   60|    263|RESWORD(debugger)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   61|    263|RESWORD(default)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   62|    263|RESWORD(delete)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   63|    263|RESWORD(do)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   64|    263|RESWORD(else)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   65|    263|RESWORD(finally)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   66|    263|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   67|    263|RESWORD(new)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   68|    263|RESWORD(throw)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   69|    263|RESWORD(try)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   70|    263|RESWORD(typeof)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   71|    263|RESWORD(void)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   72|    263|RESWORD(while)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   73|    263|RESWORD(with)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   74|       |
  |  |   75|    263|RESWORD(export)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   76|    263|RESWORD(import)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   77|       |
  |  |   78|    263|RESWORD(class)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   79|    263|RESWORD(static)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   80|    263|RESWORD(extends)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   81|    263|RESWORD(super)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   82|       |
  |  |   83|       |// Future reserved words
  |  |   84|    263|RESWORD(enum)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   85|       |
  |  |   86|       |// Strict mode future reserved words
  |  |   87|    263|RESWORD(implements)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   88|    263|RESWORD(interface)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   89|    263|RESWORD(package)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   90|    263|RESWORD(private)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   91|    263|RESWORD(protected)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   92|    263|RESWORD(public)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   93|    263|RESWORD(yield)
  |  |  ------------------
  |  |  |  |  112|    263|#define RESWORD(name) resWordIdent(TokenKind::rw_##name) = getIdentifier(#name);
  |  |  ------------------
  |  |   94|    263|RANGE_MARKER(_last_resword)
  |  |   95|       |
  |  |   96|    263|PUNCTUATOR(l_brace,             "{")
  |  |   97|    263|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |   98|    263|PUNCTUATOR(r_brace,             "}")
  |  |   99|    263|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  100|    263|PUNCTUATOR(l_paren,             "(")
  |  |  101|    263|PUNCTUATOR(r_paren,             ")")
  |  |  102|    263|PUNCTUATOR(l_square,            "[")
  |  |  103|    263|PUNCTUATOR(r_square,            "]")
  |  |  104|    263|PUNCTUATOR(period,              ".")
  |  |  105|    263|PUNCTUATOR(questiondot,         "?.")
  |  |  106|    263|PUNCTUATOR(dotdotdot,           "...")
  |  |  107|    263|PUNCTUATOR(semi,                ";")
  |  |  108|    263|PUNCTUATOR(comma,               ",")
  |  |  109|    263|PUNCTUATOR(plusplus,            "++")
  |  |  110|    263|PUNCTUATOR(minusminus,          "--")
  |  |  111|    263|RANGE_MARKER(_first_binary)
  |  |  112|    263|BINOP(     starstar,            "**",  12)
  |  |  113|    263|BINOP(     star,                "*",   11)
  |  |  114|    263|BINOP(     percent,             "%",   11)
  |  |  115|    263|BINOP(     slash,               "/",   11)
  |  |  116|    263|BINOP(     plus,                "+",   10)
  |  |  117|    263|BINOP(     minus,               "-",   10)
  |  |  118|    263|BINOP(     lessless,            "<<",   9)
  |  |  119|    263|BINOP(     greatergreater,      ">>",   9)
  |  |  120|    263|BINOP(     greatergreatergreater,">>>", 9)
  |  |  121|    263|BINOP(     less,                "<",    8)
  |  |  122|    263|BINOP(     greater,             ">",    8)
  |  |  123|    263|BINOP(     lessequal,           "<=",   8)
  |  |  124|    263|BINOP(     greaterequal,        ">=",   8)
  |  |  125|    263|BINOP(     equalequal,          "==",   7)
  |  |  126|    263|BINOP(     exclaimequal,        "!=",   7)
  |  |  127|    263|BINOP(     equalequalequal,     "===",  7)
  |  |  128|    263|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  129|    263|BINOP(     amp,                 "&",    6)
  |  |  130|    263|BINOP(     caret,               "^",    5)
  |  |  131|    263|BINOP(     pipe,                "|",    4)
  |  |  132|    263|BINOP(     ampamp,              "&&",   3)
  |  |  133|    263|BINOP(     pipepipe,            "||",   2)
  |  |  134|    263|BINOP(     questionquestion,    "??",   1)
  |  |  135|    263|RANGE_MARKER(_last_binary)
  |  |  136|    263|PUNCTUATOR(exclaim,             "!")
  |  |  137|    263|PUNCTUATOR(tilde,               "~")
  |  |  138|    263|PUNCTUATOR(question,            "?")
  |  |  139|    263|PUNCTUATOR(colon,               ":")
  |  |  140|    263|PUNCTUATOR(equal,               "=")
  |  |  141|    263|PUNCTUATOR(plusequal,           "+=")
  |  |  142|    263|PUNCTUATOR(minusequal,          "-=")
  |  |  143|    263|PUNCTUATOR(starequal,           "*=")
  |  |  144|    263|PUNCTUATOR(starstarequal,       "**=")
  |  |  145|    263|PUNCTUATOR(percentequal,        "%=")
  |  |  146|    263|PUNCTUATOR(slashequal,          "/=")
  |  |  147|    263|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  148|    263|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  149|    263|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  150|    263|PUNCTUATOR(ampequal,            "&=")
  |  |  151|    263|PUNCTUATOR(pipeequal,           "|=")
  |  |  152|    263|PUNCTUATOR(ampampequal,         "&&=")
  |  |  153|    263|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  154|    263|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  155|    263|PUNCTUATOR(caretequal,          "^=")
  |  |  156|    263|PUNCTUATOR(equalgreater,        "=>")
  |  |  157|       |
  |  |  158|    263|TOK(numeric_literal, "number")
  |  |  159|    263|TOK(string_literal, "string")
  |  |  160|    263|TOK(regexp_literal, "regexp")
  |  |  161|    263|TOK(jsx_text, "JSX text")
  |  |  162|    263|TOK(bigint_literal, "bigint")
  |  |  163|       |
  |  |  164|    263|TEMPLATE(no_substitution_template, "template literal")
  |  |  165|    263|TEMPLATE(template_head, "template literal start")
  |  |  166|    263|TEMPLATE(template_middle, "template literal resume")
  |  |  167|    263|TEMPLATE(template_tail, "template literal end")
  |  |  168|       |
  |  |  169|    263|TOK(eof, "<eof>")
  |  |  170|    263|RANGE_MARKER(_last_token)
  |  |  171|       |
  |  |  172|    263|#undef TOK
  |  |  173|    263|#undef RESWORD
  |  |  174|    263|#undef PUNCTUATOR
  |  |  175|    263|#undef PUNCTUATOR_FLOW
  |  |  176|    263|#undef BINOP
  |  |  177|    263|#undef TEMPLATE
  |  |  178|    263|#undef RANGE_MARKER
  ------------------
  114|    263|}
_ZN6hermes6parser7JSLexer7advanceENS1_14GrammarContextE:
  116|  8.13M|const Token *JSLexer::advance(GrammarContext grammarContext) {
  117|  8.13M|  newLineBeforeCurrentToken_ = false;
  118|       |
  119|  11.5M|  for (;;) {
  120|  11.5M|    assert(curCharPtr_ <= bufferEnd_ && "lexing past end of input");
  121|      0|#define PUNC_L1_1(ch, tok)        \
  122|      0|  case ch:                        \
  123|      0|    token_.setStart(curCharPtr_); \
  124|      0|    token_.setPunctuator(tok);    \
  125|      0|    ++curCharPtr_;                \
  126|      0|    break
  127|       |
  128|      0|#define PUNC_L2_3(ch1, tok1, ch2a, tok2a, ch2b, tok2b) \
  129|      0|  case ch1:                                            \
  130|      0|    token_.setStart(curCharPtr_);                      \
  131|      0|    if (curCharPtr_[1] == ch2a) {                      \
  132|      0|      token_.setPunctuator(tok2a);                     \
  133|      0|      curCharPtr_ += 2;                                \
  134|      0|    } else if (curCharPtr_[1] == ch2b) {               \
  135|      0|      token_.setPunctuator(tok2b);                     \
  136|      0|      curCharPtr_ += 2;                                \
  137|      0|    } else {                                           \
  138|      0|      token_.setPunctuator(tok1);                      \
  139|      0|      curCharPtr_ += 1;                                \
  140|      0|    }                                                  \
  141|      0|    break
  142|       |
  143|      0|#define PUNC_L2_2(ch1, tok1, ch2, tok2) \
  144|      0|  case ch1:                             \
  145|      0|    token_.setStart(curCharPtr_);       \
  146|      0|    if (curCharPtr_[1] == (ch2)) {      \
  147|      0|      token_.setPunctuator(tok2);       \
  148|      0|      curCharPtr_ += 2;                 \
  149|      0|    } else {                            \
  150|      0|      token_.setPunctuator(tok1);       \
  151|      0|      curCharPtr_ += 1;                 \
  152|      0|    }                                   \
  153|      0|    break
  154|       |
  155|      0|#define PUNC_L3_3(ch1, tok1, ch2, tok2, ch3, tok3) \
  156|      0|  case ch1:                                        \
  157|      0|    token_.setStart(curCharPtr_);                  \
  158|      0|    if (curCharPtr_[1] != (ch2)) {                 \
  159|      0|      token_.setPunctuator(tok1);                  \
  160|      0|      curCharPtr_ += 1;                            \
  161|      0|    } else if (curCharPtr_[2] == (ch3)) {          \
  162|      0|      token_.setPunctuator(tok3);                  \
  163|      0|      curCharPtr_ += 3;                            \
  164|      0|    } else {                                       \
  165|      0|      token_.setPunctuator(tok2);                  \
  166|      0|      curCharPtr_ += 2;                            \
  167|      0|    }                                              \
  168|      0|    break
  169|       |
  170|      0|    switch ((unsigned char)*curCharPtr_) {
  171|    262|      case 0:
  ------------------
  |  Branch (171:7): [True: 262, False: 11.5M]
  ------------------
  172|    262|        token_.setStart(curCharPtr_);
  173|    262|        if (curCharPtr_ == bufferEnd_) {
  ------------------
  |  Branch (173:13): [True: 251, False: 11]
  ------------------
  174|    251|          token_.setEof();
  175|    251|        } else {
  176|     11|          if (!error(
  ------------------
  |  Branch (176:15): [True: 5, False: 6]
  ------------------
  177|     11|                  token_.getStartLoc(),
  178|     11|                  "unrecognized Unicode character \\u0000")) {
  179|      5|            token_.setEof();
  180|      6|          } else {
  181|      6|            ++curCharPtr_;
  182|      6|            continue;
  183|      6|          }
  184|     11|        }
  185|    256|        break;
  186|       |
  187|       |        // clang-format off
  188|   171k|      PUNC_L1_1('}', TokenKind::r_brace);
  ------------------
  |  |  122|   171k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 171k, False: 11.3M]
  |  |  ------------------
  |  |  123|   171k|    token_.setStart(curCharPtr_); \
  |  |  124|   171k|    token_.setPunctuator(tok);    \
  |  |  125|   171k|    ++curCharPtr_;                \
  |  |  126|   171k|    break
  ------------------
  189|  8.14k|      PUNC_L1_1('(', TokenKind::l_paren);
  ------------------
  |  |  122|  8.14k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 8.14k, False: 11.5M]
  |  |  ------------------
  |  |  123|  8.14k|    token_.setStart(curCharPtr_); \
  |  |  124|  8.14k|    token_.setPunctuator(tok);    \
  |  |  125|  8.14k|    ++curCharPtr_;                \
  |  |  126|  8.14k|    break
  ------------------
  190|  7.12k|      PUNC_L1_1(')', TokenKind::r_paren);
  ------------------
  |  |  122|  7.12k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 7.12k, False: 11.5M]
  |  |  ------------------
  |  |  123|  7.12k|    token_.setStart(curCharPtr_); \
  |  |  124|  7.12k|    token_.setPunctuator(tok);    \
  |  |  125|  7.12k|    ++curCharPtr_;                \
  |  |  126|  7.12k|    break
  ------------------
  191|  69.2k|      PUNC_L1_1('[', TokenKind::l_square);
  ------------------
  |  |  122|  69.2k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 69.2k, False: 11.4M]
  |  |  ------------------
  |  |  123|  69.2k|    token_.setStart(curCharPtr_); \
  |  |  124|  69.2k|    token_.setPunctuator(tok);    \
  |  |  125|  69.2k|    ++curCharPtr_;                \
  |  |  126|  69.2k|    break
  ------------------
  192|  67.2k|      PUNC_L1_1(']', TokenKind::r_square);
  ------------------
  |  |  122|  67.2k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 67.2k, False: 11.4M]
  |  |  ------------------
  |  |  123|  67.2k|    token_.setStart(curCharPtr_); \
  |  |  124|  67.2k|    token_.setPunctuator(tok);    \
  |  |  125|  67.2k|    ++curCharPtr_;                \
  |  |  126|  67.2k|    break
  ------------------
  193|   458k|      PUNC_L1_1(';', TokenKind::semi);
  ------------------
  |  |  122|   458k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 458k, False: 11.0M]
  |  |  ------------------
  |  |  123|   458k|    token_.setStart(curCharPtr_); \
  |  |  124|   458k|    token_.setPunctuator(tok);    \
  |  |  125|   458k|    ++curCharPtr_;                \
  |  |  126|   458k|    break
  ------------------
  194|  1.67M|      PUNC_L1_1(',', TokenKind::comma);
  ------------------
  |  |  122|  1.67M|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 1.67M, False: 9.85M]
  |  |  ------------------
  |  |  123|  1.67M|    token_.setStart(curCharPtr_); \
  |  |  124|  1.67M|    token_.setPunctuator(tok);    \
  |  |  125|  1.67M|    ++curCharPtr_;                \
  |  |  126|  1.67M|    break
  ------------------
  195|    647|      PUNC_L1_1('~', TokenKind::tilde);
  ------------------
  |  |  122|    647|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 647, False: 11.5M]
  |  |  ------------------
  |  |  123|    647|    token_.setStart(curCharPtr_); \
  |  |  124|    647|    token_.setPunctuator(tok);    \
  |  |  125|    647|    ++curCharPtr_;                \
  |  |  126|    647|    break
  ------------------
  196|  97.9k|      PUNC_L1_1(':', TokenKind::colon);
  ------------------
  |  |  122|  97.9k|  case ch:                        \
  |  |  ------------------
  |  |  |  Branch (122:3): [True: 97.9k, False: 11.4M]
  |  |  ------------------
  |  |  123|  97.9k|    token_.setStart(curCharPtr_); \
  |  |  124|  97.9k|    token_.setPunctuator(tok);    \
  |  |  125|  97.9k|    ++curCharPtr_;                \
  |  |  126|  97.9k|    break
  ------------------
  197|       |
  198|       |      // { {|
  199|  16.7k|      case '{':
  ------------------
  |  Branch (199:7): [True: 16.7k, False: 11.5M]
  ------------------
  200|  16.7k|        token_.setStart(curCharPtr_);
  201|  16.7k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  33.5k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  202|  16.7k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|  33.5k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 16.7k]
  |  |  ------------------
  ------------------
  203|  16.7k|            curCharPtr_[1] == '|') {
  ------------------
  |  Branch (203:13): [True: 0, False: 0]
  ------------------
  204|      0|          token_.setPunctuator(TokenKind::l_bracepipe);
  205|      0|          curCharPtr_ += 2;
  206|  16.7k|        } else {
  207|  16.7k|          token_.setPunctuator(TokenKind::l_brace);
  208|  16.7k|          curCharPtr_ += 1;
  209|  16.7k|        }
  210|  16.7k|        break;
  211|       |
  212|       |      // = => == ===
  213|   237k|      case '=':
  ------------------
  |  Branch (213:7): [True: 237k, False: 11.2M]
  ------------------
  214|   237k|        token_.setStart(curCharPtr_);
  215|   237k|        if (curCharPtr_[1] == '>') {
  ------------------
  |  Branch (215:13): [True: 228k, False: 8.90k]
  ------------------
  216|   228k|          token_.setPunctuator(TokenKind::equalgreater);
  217|   228k|          curCharPtr_ += 2;
  218|   228k|        } else if (curCharPtr_[1] != '=') {
  ------------------
  |  Branch (218:20): [True: 8.89k, False: 16]
  ------------------
  219|  8.89k|          token_.setPunctuator(TokenKind::equal);
  220|  8.89k|          curCharPtr_ += 1;
  221|  8.89k|        } else if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (221:20): [True: 0, False: 16]
  ------------------
  222|      0|          token_.setPunctuator(TokenKind::equalequalequal);
  223|      0|          curCharPtr_ += 3;
  224|     16|        } else {
  225|     16|          token_.setPunctuator(TokenKind::equalequal);
  226|     16|          curCharPtr_ += 2;
  227|     16|        }
  228|   237k|        break;
  229|       |
  230|       |      // ! != !==
  231|    262|      PUNC_L3_3('!', TokenKind::exclaim, '=', TokenKind::exclaimequal, '=', TokenKind::exclaimequalequal);
  ------------------
  |  |  156|     26|  case ch1:                                        \
  |  |  ------------------
  |  |  |  Branch (156:3): [True: 26, False: 11.5M]
  |  |  ------------------
  |  |  157|     26|    token_.setStart(curCharPtr_);                  \
  |  |  158|     26|    if (curCharPtr_[1] != (ch2)) {                 \
  |  |  ------------------
  |  |  |  Branch (158:9): [True: 26, False: 0]
  |  |  ------------------
  |  |  159|     26|      token_.setPunctuator(tok1);                  \
  |  |  160|     26|      curCharPtr_ += 1;                            \
  |  |  161|     26|    } else if (curCharPtr_[2] == (ch3)) {          \
  |  |  ------------------
  |  |  |  Branch (161:16): [True: 0, False: 0]
  |  |  ------------------
  |  |  162|      0|      token_.setPunctuator(tok3);                  \
  |  |  163|      0|      curCharPtr_ += 3;                            \
  |  |  164|      0|    } else {                                       \
  |  |  165|      0|      token_.setPunctuator(tok2);                  \
  |  |  166|      0|      curCharPtr_ += 2;                            \
  |  |  167|      0|    }                                              \
  |  |  168|     26|    break
  ------------------
  232|       |
  233|       |      // + ++ +=
  234|       |      // - -- -=
  235|       |      // & && &=
  236|       |      // | || |=
  237|   743k|      PUNC_L2_3('+', TokenKind::plus,  '+', TokenKind::plusplus,   '=', TokenKind::plusequal);
  ------------------
  |  |  129|   743k|  case ch1:                                            \
  |  |  ------------------
  |  |  |  Branch (129:3): [True: 743k, False: 10.7M]
  |  |  ------------------
  |  |  130|   743k|    token_.setStart(curCharPtr_);                      \
  |  |  131|   743k|    if (curCharPtr_[1] == ch2a) {                      \
  |  |  ------------------
  |  |  |  Branch (131:9): [True: 44, False: 743k]
  |  |  ------------------
  |  |  132|     44|      token_.setPunctuator(tok2a);                     \
  |  |  133|     44|      curCharPtr_ += 2;                                \
  |  |  134|   743k|    } else if (curCharPtr_[1] == ch2b) {               \
  |  |  ------------------
  |  |  |  Branch (134:16): [True: 12, False: 743k]
  |  |  ------------------
  |  |  135|     12|      token_.setPunctuator(tok2b);                     \
  |  |  136|     12|      curCharPtr_ += 2;                                \
  |  |  137|   743k|    } else {                                           \
  |  |  138|   743k|      token_.setPunctuator(tok1);                      \
  |  |  139|   743k|      curCharPtr_ += 1;                                \
  |  |  140|   743k|    }                                                  \
  |  |  141|   743k|    break
  ------------------
  238|  10.3k|      PUNC_L2_3('-', TokenKind::minus, '-', TokenKind::minusminus, '=', TokenKind::minusequal);
  ------------------
  |  |  129|  10.3k|  case ch1:                                            \
  |  |  ------------------
  |  |  |  Branch (129:3): [True: 10.3k, False: 11.5M]
  |  |  ------------------
  |  |  130|  10.3k|    token_.setStart(curCharPtr_);                      \
  |  |  131|  10.3k|    if (curCharPtr_[1] == ch2a) {                      \
  |  |  ------------------
  |  |  |  Branch (131:9): [True: 14, False: 10.3k]
  |  |  ------------------
  |  |  132|     14|      token_.setPunctuator(tok2a);                     \
  |  |  133|     14|      curCharPtr_ += 2;                                \
  |  |  134|  10.3k|    } else if (curCharPtr_[1] == ch2b) {               \
  |  |  ------------------
  |  |  |  Branch (134:16): [True: 0, False: 10.3k]
  |  |  ------------------
  |  |  135|      0|      token_.setPunctuator(tok2b);                     \
  |  |  136|      0|      curCharPtr_ += 2;                                \
  |  |  137|  10.3k|    } else {                                           \
  |  |  138|  10.3k|      token_.setPunctuator(tok1);                      \
  |  |  139|  10.3k|      curCharPtr_ += 1;                                \
  |  |  140|  10.3k|    }                                                  \
  |  |  141|  10.3k|    break
  ------------------
  239|       |
  240|    151|      case '&':
  ------------------
  |  Branch (240:7): [True: 151, False: 11.5M]
  ------------------
  241|    151|        token_.setStart(curCharPtr_);
  242|    151|        if (curCharPtr_[1] == '&') {
  ------------------
  |  Branch (242:13): [True: 56, False: 95]
  ------------------
  243|     56|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (243:15): [True: 0, False: 56]
  ------------------
  244|      0|            token_.setPunctuator(TokenKind::ampampequal);
  245|      0|            curCharPtr_ += 3;
  246|     56|          } else {
  247|     56|            token_.setPunctuator(TokenKind::ampamp);
  248|     56|            curCharPtr_ += 2;
  249|     56|          }
  250|     95|        } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (250:20): [True: 0, False: 95]
  ------------------
  251|      0|          token_.setPunctuator(TokenKind::ampequal);
  252|      0|          curCharPtr_ += 2;
  253|     95|        } else {
  254|     95|          token_.setPunctuator(TokenKind::amp);
  255|     95|          curCharPtr_ += 1;
  256|     95|        }
  257|    151|        break;
  258|       |
  259|   586k|      case '|':
  ------------------
  |  Branch (259:7): [True: 586k, False: 10.9M]
  ------------------
  260|   586k|        token_.setStart(curCharPtr_);
  261|   586k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  1.17M|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  262|   586k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|  1.17M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 586k]
  |  |  ------------------
  ------------------
  263|   586k|            curCharPtr_[1] == '}') {
  ------------------
  |  Branch (263:13): [True: 0, False: 0]
  ------------------
  264|      0|          token_.setPunctuator(TokenKind::piper_brace);
  265|      0|          curCharPtr_ += 2;
  266|   586k|        } else {
  267|   586k|          if (curCharPtr_[1] == '|') {
  ------------------
  |  Branch (267:15): [True: 90.3k, False: 496k]
  ------------------
  268|  90.3k|            if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (268:17): [True: 294, False: 90.0k]
  ------------------
  269|    294|              token_.setPunctuator(TokenKind::pipepipeequal);
  270|    294|              curCharPtr_ += 3;
  271|  90.0k|            } else {
  272|  90.0k|              token_.setPunctuator(TokenKind::pipepipe);
  273|  90.0k|              curCharPtr_ += 2;
  274|  90.0k|            }
  275|   496k|          } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (275:22): [True: 0, False: 496k]
  ------------------
  276|      0|            token_.setPunctuator(TokenKind::pipeequal);
  277|      0|            curCharPtr_ += 2;
  278|   496k|          } else {
  279|   496k|            token_.setPunctuator(TokenKind::pipe);
  280|   496k|            curCharPtr_ += 1;
  281|   496k|          }
  282|   586k|        }
  283|   586k|        break;
  284|       |
  285|       |      // ? ?? ?.
  286|    320|      case '?':
  ------------------
  |  Branch (286:7): [True: 320, False: 11.5M]
  ------------------
  287|    320|        token_.setStart(curCharPtr_);
  288|    320|        if (curCharPtr_[1] == '.' && !isdigit(curCharPtr_[2])) {
  ------------------
  |  Branch (288:13): [True: 139, False: 181]
  |  Branch (288:38): [True: 139, False: 0]
  ------------------
  289|       |          // OptionalChainingPunctuator ::
  290|       |          // ?. [lookahead does not contain DecimalDigit]
  291|       |          // This is done to prevent `x?.3:y` from being recognized
  292|       |          // as `x ?. 3 : y` instead of `x ? .3 : y`.
  293|    139|          token_.setPunctuator(TokenKind::questiondot);
  294|    139|          curCharPtr_ += 2;
  295|    181|        } else if (
  296|    181|            curCharPtr_[1] == '?' &&
  ------------------
  |  Branch (296:13): [True: 0, False: 181]
  ------------------
  297|    181|            LLVM_LIKELY(grammarContext != GrammarContext::Type)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  298|      0|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (298:15): [True: 0, False: 0]
  ------------------
  299|      0|            token_.setPunctuator(TokenKind::questionquestionequal);
  300|      0|            curCharPtr_ += 3;
  301|      0|          } else {
  302|      0|            token_.setPunctuator(TokenKind::questionquestion);
  303|      0|            curCharPtr_ += 2;
  304|      0|          }
  305|    181|        } else {
  306|    181|          token_.setPunctuator(TokenKind::question);
  307|    181|          curCharPtr_ += 1;
  308|    181|        }
  309|    320|        break;
  310|       |
  311|       |      // * *= ** **=
  312|    728|      case '*':
  ------------------
  |  Branch (312:7): [True: 728, False: 11.5M]
  ------------------
  313|    728|        token_.setStart(curCharPtr_);
  314|    728|        if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (314:13): [True: 0, False: 728]
  ------------------
  315|      0|          token_.setPunctuator(TokenKind::starequal);
  316|      0|          curCharPtr_ += 2;
  317|    728|        } else if (curCharPtr_[1] != '*') {
  ------------------
  |  Branch (317:20): [True: 690, False: 38]
  ------------------
  318|    690|          token_.setPunctuator(TokenKind::star);
  319|    690|          curCharPtr_ += 1;
  320|    690|        } else if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (320:20): [True: 0, False: 38]
  ------------------
  321|      0|          token_.setPunctuator(TokenKind::starstarequal);
  322|      0|          curCharPtr_ += 3;
  323|     38|        } else {
  324|     38|          token_.setPunctuator(TokenKind::starstar);
  325|     38|          curCharPtr_ += 2;
  326|     38|        }
  327|    728|        break;
  328|       |
  329|       |        // * *=
  330|       |        // ^ ^=
  331|       |        // / /=
  332|  1.36k|        PUNC_L2_2('^', TokenKind::caret, '=', TokenKind::caretequal);
  ------------------
  |  |  144|  1.36k|  case ch1:                             \
  |  |  ------------------
  |  |  |  Branch (144:3): [True: 1.36k, False: 11.5M]
  |  |  ------------------
  |  |  145|  1.36k|    token_.setStart(curCharPtr_);       \
  |  |  146|  1.36k|    if (curCharPtr_[1] == (ch2)) {      \
  |  |  ------------------
  |  |  |  Branch (146:9): [True: 0, False: 1.36k]
  |  |  ------------------
  |  |  147|      0|      token_.setPunctuator(tok2);       \
  |  |  148|      0|      curCharPtr_ += 2;                 \
  |  |  149|  1.36k|    } else {                            \
  |  |  150|  1.36k|      token_.setPunctuator(tok1);       \
  |  |  151|  1.36k|      curCharPtr_ += 1;                 \
  |  |  152|  1.36k|    }                                   \
  |  |  153|  1.36k|    break
  ------------------
  333|       |
  334|       |      // % %=
  335|  14.1k|      case '%':
  ------------------
  |  Branch (335:7): [True: 14.1k, False: 11.5M]
  ------------------
  336|  14.1k|        token_.setStart(curCharPtr_);
  337|  14.1k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  28.2k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  338|  14.1k|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type) &&
  ------------------
  |  |  189|  28.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14.1k]
  |  |  ------------------
  ------------------
  339|  14.1k|            curCharPtr_ + 7 <= bufferEnd_ &&
  ------------------
  |  Branch (339:13): [True: 0, False: 0]
  ------------------
  340|  14.1k|            llvh::StringRef(curCharPtr_, 7) == "%checks") {
  ------------------
  |  Branch (340:13): [True: 0, False: 0]
  ------------------
  341|      0|          token_.setIdentifier(getStringLiteral("%checks"));
  342|      0|          curCharPtr_ += 7;
  343|  14.1k|        } else if (curCharPtr_[1] == ('=')) {
  ------------------
  |  Branch (343:20): [True: 0, False: 14.1k]
  ------------------
  344|      0|          token_.setPunctuator(TokenKind::percentequal);
  345|      0|          curCharPtr_ += 2;
  346|  14.1k|        } else {
  347|  14.1k|          token_.setPunctuator(TokenKind::percent);
  348|  14.1k|          curCharPtr_ += 1;
  349|  14.1k|        }
  350|  14.1k|        break;
  351|       |
  352|       |        // clang-format on
  353|       |
  354|      3|      case '\r':
  ------------------
  |  Branch (354:7): [True: 3, False: 11.5M]
  ------------------
  355|  3.39M|      case '\n':
  ------------------
  |  Branch (355:7): [True: 3.39M, False: 8.14M]
  ------------------
  356|  3.39M|        ++curCharPtr_;
  357|  3.39M|        newLineBeforeCurrentToken_ = true;
  358|  3.39M|        continue;
  359|       |
  360|       |      // Line separator \u2028 UTF8 encoded is      : e2 80 a8
  361|       |      // Paragraph separator \u2029 UTF8 encoded is : e2 80 a9
  362|     64|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (362:7): [True: 64, False: 11.5M]
  ------------------
  363|     64|        if (matchUnicodeLineTerminatorOffset1(curCharPtr_)) {
  ------------------
  |  Branch (363:13): [True: 0, False: 64]
  ------------------
  364|      0|          curCharPtr_ += 3;
  365|      0|          newLineBeforeCurrentToken_ = true;
  366|      0|          continue;
  367|     64|        } else {
  368|     64|          goto default_label;
  369|     64|        }
  370|       |
  371|      0|      case '\v':
  ------------------
  |  Branch (371:7): [True: 0, False: 11.5M]
  ------------------
  372|     24|      case '\f':
  ------------------
  |  Branch (372:7): [True: 24, False: 11.5M]
  ------------------
  373|     24|        ++curCharPtr_;
  374|     24|        continue;
  375|       |
  376|  1.56k|      case '\t':
  ------------------
  |  Branch (376:7): [True: 1.56k, False: 11.5M]
  ------------------
  377|  10.6k|      case ' ':
  ------------------
  |  Branch (377:7): [True: 9.12k, False: 11.5M]
  ------------------
  378|       |        // Spaces frequently come in groups, so use a tight inner loop to skip.
  379|  10.6k|        do
  380|  12.4k|          ++curCharPtr_;
  381|  12.4k|        while (*curCharPtr_ == '\t' || *curCharPtr_ == ' ');
  ------------------
  |  Branch (381:16): [True: 1.55k, False: 10.8k]
  |  Branch (381:40): [True: 199, False: 10.6k]
  ------------------
  382|  10.6k|        continue;
  383|       |
  384|       |      // No-break space \u00A0 is UTF8 encoded as: c2 a0
  385|      0|      case 0xc2:
  ------------------
  |  Branch (385:7): [True: 0, False: 11.5M]
  ------------------
  386|      0|        if ((unsigned char)curCharPtr_[1] == 0xa0) {
  ------------------
  |  Branch (386:13): [True: 0, False: 0]
  ------------------
  387|      0|          curCharPtr_ += 2;
  388|      0|          continue;
  389|      0|        } else {
  390|      0|          goto default_label;
  391|      0|        }
  392|       |
  393|       |      // Byte-order mark \uFEFF is encoded as: ef bb bf
  394|      0|      case 0xef:
  ------------------
  |  Branch (394:7): [True: 0, False: 11.5M]
  ------------------
  395|      0|        if ((unsigned char)curCharPtr_[1] == 0xbb &&
  ------------------
  |  Branch (395:13): [True: 0, False: 0]
  ------------------
  396|      0|            (unsigned char)curCharPtr_[2] == 0xbf) {
  ------------------
  |  Branch (396:13): [True: 0, False: 0]
  ------------------
  397|      0|          curCharPtr_ += 3;
  398|      0|          continue;
  399|      0|        } else {
  400|      0|          goto default_label;
  401|      0|        }
  402|       |
  403|  57.1k|      case '/':
  ------------------
  |  Branch (403:7): [True: 57.1k, False: 11.4M]
  ------------------
  404|  57.1k|        if (curCharPtr_[1] == '/') { // Line comment?
  ------------------
  |  Branch (404:13): [True: 3, False: 57.1k]
  ------------------
  405|      3|          scanLineComment(curCharPtr_);
  406|      3|          continue;
  407|  57.1k|        } else if (curCharPtr_[1] == '*') { // Block comment?
  ------------------
  |  Branch (407:20): [True: 0, False: 57.1k]
  ------------------
  408|      0|          curCharPtr_ = skipBlockComment(curCharPtr_);
  409|      0|          continue;
  410|  57.1k|        } else {
  411|  57.1k|          token_.setStart(curCharPtr_);
  412|  57.1k|          if (grammarContext == AllowRegExp) {
  ------------------
  |  Branch (412:15): [True: 34.1k, False: 23.0k]
  ------------------
  413|  34.1k|            scanRegExp();
  414|  34.1k|          } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (414:22): [True: 0, False: 23.0k]
  ------------------
  415|      0|            token_.setPunctuator(TokenKind::slashequal);
  416|      0|            curCharPtr_ += 2;
  417|  23.0k|          } else {
  418|  23.0k|            token_.setPunctuator(TokenKind::slash);
  419|  23.0k|            curCharPtr_ += 1;
  420|  23.0k|          }
  421|  57.1k|        }
  422|  57.1k|        break;
  423|       |
  424|  57.1k|      case '#':
  ------------------
  |  Branch (424:7): [True: 0, False: 11.5M]
  ------------------
  425|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  426|      0|                curCharPtr_ == bufferStart_ && curCharPtr_[1] == '!')) {
  427|       |          // #! (hashbang) at the very start of the buffer.
  428|      0|          scanLineComment(curCharPtr_);
  429|      0|          continue;
  430|      0|        }
  431|      0|        if (!scanPrivateIdentifier()) {
  ------------------
  |  Branch (431:13): [True: 0, False: 0]
  ------------------
  432|      0|          continue;
  433|      0|        }
  434|      0|        break;
  435|       |
  436|       |      // <  <= << <<=
  437|  11.3k|      case '<':
  ------------------
  |  Branch (437:7): [True: 11.3k, False: 11.5M]
  ------------------
  438|  11.3k|        token_.setStart(curCharPtr_);
  439|  11.3k|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  22.7k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  440|  11.3k|            LLVM_UNLIKELY(grammarContext == JSLexer::GrammarContext::Type)) {
  ------------------
  |  |  189|  11.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 11.3k]
  |  |  ------------------
  ------------------
  441|      0|          token_.setPunctuator(TokenKind::less);
  442|      0|          curCharPtr_ += 1;
  443|  11.3k|        } else if (curCharPtr_[1] == '=') {
  ------------------
  |  Branch (443:20): [True: 0, False: 11.3k]
  ------------------
  444|      0|          token_.setPunctuator(TokenKind::lessequal);
  445|      0|          curCharPtr_ += 2;
  446|  11.3k|        } else if (curCharPtr_[1] == '<') {
  ------------------
  |  Branch (446:20): [True: 0, False: 11.3k]
  ------------------
  447|      0|          if (curCharPtr_[2] == '=') {
  ------------------
  |  Branch (447:15): [True: 0, False: 0]
  ------------------
  448|      0|            token_.setPunctuator(TokenKind::lesslessequal);
  449|      0|            curCharPtr_ += 3;
  450|      0|          } else {
  451|      0|            token_.setPunctuator(TokenKind::lessless);
  452|      0|            curCharPtr_ += 2;
  453|      0|          }
  454|  11.3k|        } else {
  455|  11.3k|          token_.setPunctuator(TokenKind::less);
  456|  11.3k|          curCharPtr_ += 1;
  457|  11.3k|        }
  458|  11.3k|        break;
  459|       |
  460|       |      // > >= >> >>> >>= >>>=
  461|  10.4k|      case '>':
  ------------------
  |  Branch (461:7): [True: 10.4k, False: 11.5M]
  ------------------
  462|  10.4k|        token_.setStart(curCharPtr_);
  463|  10.4k|        if ((HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|  20.8k|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  464|  10.4k|             LLVM_UNLIKELY(grammarContext == JSLexer::GrammarContext::Type)) ||
  ------------------
  |  |  189|  10.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.4k]
  |  |  ------------------
  ------------------
  465|  10.4k|            (HERMES_PARSE_JSX &&
  ------------------
  |  |   15|  20.8k|#define HERMES_PARSE_JSX 1
  |  |  ------------------
  |  |  |  Branch (15:26): [Folded - Ignored]
  |  |  ------------------
  ------------------
  466|  10.4k|             LLVM_UNLIKELY(
  ------------------
  |  |  189|  10.4k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.4k]
  |  |  ------------------
  ------------------
  467|  10.4k|                 grammarContext ==
  468|  10.4k|                 JSLexer::GrammarContext::AllowJSXIdentifier))) {
  469|      0|          token_.setPunctuator(TokenKind::greater);
  470|      0|          curCharPtr_ += 1;
  471|  10.4k|        } else if (curCharPtr_[1] == '=') { // >=
  ------------------
  |  Branch (471:20): [True: 2, False: 10.4k]
  ------------------
  472|      2|          token_.setPunctuator(TokenKind::greaterequal);
  473|      2|          curCharPtr_ += 2;
  474|  10.4k|        } else if (curCharPtr_[1] == '>') { // >>
  ------------------
  |  Branch (474:20): [True: 4, False: 10.4k]
  ------------------
  475|      4|          if (curCharPtr_[2] == '=') { // >>=
  ------------------
  |  Branch (475:15): [True: 0, False: 4]
  ------------------
  476|      0|            token_.setPunctuator(TokenKind::greatergreaterequal);
  477|      0|            curCharPtr_ += 3;
  478|      4|          } else if (curCharPtr_[2] == '>') { // >>>
  ------------------
  |  Branch (478:22): [True: 0, False: 4]
  ------------------
  479|      0|            if (curCharPtr_[3] == '=') { // >>>=
  ------------------
  |  Branch (479:17): [True: 0, False: 0]
  ------------------
  480|      0|              token_.setPunctuator(TokenKind::greatergreatergreaterequal);
  481|      0|              curCharPtr_ += 4;
  482|      0|            } else {
  483|      0|              token_.setPunctuator(TokenKind::greatergreatergreater);
  484|      0|              curCharPtr_ += 3;
  485|      0|            }
  486|      4|          } else {
  487|      4|            token_.setPunctuator(TokenKind::greatergreater);
  488|      4|            curCharPtr_ += 2;
  489|      4|          }
  490|  10.4k|        } else {
  491|  10.4k|          token_.setPunctuator(TokenKind::greater);
  492|  10.4k|          curCharPtr_ += 1;
  493|  10.4k|        }
  494|  10.4k|        break;
  495|       |
  496|  6.63k|      case '.':
  ------------------
  |  Branch (496:7): [True: 6.63k, False: 11.5M]
  ------------------
  497|  6.63k|        token_.setStart(curCharPtr_);
  498|  6.63k|        if (curCharPtr_[1] >= '0' && curCharPtr_[1] <= '9') {
  ------------------
  |  Branch (498:13): [True: 6.63k, False: 1]
  |  Branch (498:38): [True: 0, False: 6.63k]
  ------------------
  499|      0|          scanNumber(grammarContext);
  500|  6.63k|        } else if (curCharPtr_[1] == '.' && curCharPtr_[2] == '.') {
  ------------------
  |  Branch (500:20): [True: 0, False: 6.63k]
  |  Branch (500:45): [True: 0, False: 0]
  ------------------
  501|      0|          token_.setPunctuator(TokenKind::dotdotdot);
  502|      0|          curCharPtr_ += 3;
  503|  6.63k|        } else {
  504|  6.63k|          token_.setPunctuator(TokenKind::period);
  505|  6.63k|          ++curCharPtr_;
  506|  6.63k|        }
  507|  6.63k|        break;
  508|       |
  509|       |        // clang-format off
  510|  1.24M|      case '0': case '1': case '2': case '3': case '4':
  ------------------
  |  Branch (510:7): [True: 1.07M, False: 10.4M]
  |  Branch (510:17): [True: 104k, False: 11.4M]
  |  Branch (510:27): [True: 28.3k, False: 11.5M]
  |  Branch (510:37): [True: 15.0k, False: 11.5M]
  |  Branch (510:47): [True: 17.1k, False: 11.5M]
  ------------------
  511|  1.79M|      case '5': case '6': case '7': case '8': case '9':
  ------------------
  |  Branch (511:7): [True: 242k, False: 11.2M]
  |  Branch (511:17): [True: 10.6k, False: 11.5M]
  |  Branch (511:27): [True: 25.4k, False: 11.5M]
  |  Branch (511:37): [True: 253k, False: 11.2M]
  |  Branch (511:47): [True: 15.6k, False: 11.5M]
  ------------------
  512|       |        // clang-format on
  513|  1.79M|        token_.setStart(curCharPtr_);
  514|  1.79M|        scanNumber(grammarContext);
  515|  1.79M|        break;
  516|       |
  517|       |        // clang-format off
  518|  2.25k|      case '_': case '$':
  ------------------
  |  Branch (518:7): [True: 0, False: 11.5M]
  |  Branch (518:17): [True: 2.25k, False: 11.5M]
  ------------------
  519|   265k|      case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g':
  ------------------
  |  Branch (519:7): [True: 88.6k, False: 11.4M]
  |  Branch (519:17): [True: 85.9k, False: 11.4M]
  |  Branch (519:27): [True: 9.22k, False: 11.5M]
  |  Branch (519:37): [True: 296, False: 11.5M]
  |  Branch (519:47): [True: 68.3k, False: 11.4M]
  |  Branch (519:57): [True: 9.96k, False: 11.5M]
  |  Branch (519:67): [True: 621, False: 11.5M]
  ------------------
  520|   890k|      case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n':
  ------------------
  |  Branch (520:7): [True: 1.56k, False: 11.5M]
  |  Branch (520:17): [True: 6.03k, False: 11.5M]
  |  Branch (520:27): [True: 312, False: 11.5M]
  |  Branch (520:37): [True: 112, False: 11.5M]
  |  Branch (520:47): [True: 336, False: 11.5M]
  |  Branch (520:57): [True: 11.4k, False: 11.5M]
  |  Branch (520:67): [True: 606k, False: 10.9M]
  ------------------
  521|   946k|      case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u':
  ------------------
  |  Branch (521:7): [True: 38.0k, False: 11.4M]
  |  Branch (521:17): [True: 2.45k, False: 11.5M]
  |  Branch (521:27): [True: 155, False: 11.5M]
  |  Branch (521:37): [True: 14.7k, False: 11.5M]
  |  Branch (521:47): [True: 135, False: 11.5M]
  |  Branch (521:57): [True: 20, False: 11.5M]
  |  Branch (521:67): [True: 220, False: 11.5M]
  ------------------
  522|  1.12M|      case 'v': case 'w': case 'x': case 'y': case 'z':
  ------------------
  |  Branch (522:7): [True: 5.05k, False: 11.5M]
  |  Branch (522:17): [True: 28, False: 11.5M]
  |  Branch (522:27): [True: 1.57k, False: 11.5M]
  |  Branch (522:37): [True: 2.10k, False: 11.5M]
  |  Branch (522:47): [True: 168k, False: 11.3M]
  ------------------
  523|  1.22M|      case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G':
  ------------------
  |  Branch (523:7): [True: 14.1k, False: 11.5M]
  |  Branch (523:17): [True: 515, False: 11.5M]
  |  Branch (523:27): [True: 85.2k, False: 11.4M]
  |  Branch (523:37): [True: 731, False: 11.5M]
  |  Branch (523:47): [True: 353, False: 11.5M]
  |  Branch (523:57): [True: 353, False: 11.5M]
  |  Branch (523:67): [True: 24, False: 11.5M]
  ------------------
  524|  1.32M|      case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N':
  ------------------
  |  Branch (524:7): [True: 212, False: 11.5M]
  |  Branch (524:17): [True: 446, False: 11.5M]
  |  Branch (524:27): [True: 579, False: 11.5M]
  |  Branch (524:37): [True: 903, False: 11.5M]
  |  Branch (524:47): [True: 94.2k, False: 11.4M]
  |  Branch (524:57): [True: 326, False: 11.5M]
  |  Branch (524:67): [True: 244, False: 11.5M]
  ------------------
  525|  1.32M|      case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U':
  ------------------
  |  Branch (525:7): [True: 161, False: 11.5M]
  |  Branch (525:17): [True: 101, False: 11.5M]
  |  Branch (525:27): [True: 10, False: 11.5M]
  |  Branch (525:37): [True: 405, False: 11.5M]
  |  Branch (525:47): [True: 467, False: 11.5M]
  |  Branch (525:57): [True: 221, False: 11.5M]
  |  Branch (525:67): [True: 495, False: 11.5M]
  ------------------
  526|  1.32M|      case 'V': case 'W': case 'X': case 'Y': case 'Z':
  ------------------
  |  Branch (526:7): [True: 0, False: 11.5M]
  |  Branch (526:17): [True: 199, False: 11.5M]
  |  Branch (526:27): [True: 852, False: 11.5M]
  |  Branch (526:37): [True: 86, False: 11.5M]
  |  Branch (526:47): [True: 0, False: 11.5M]
  ------------------
  527|       |        // clang-format on
  528|  1.32M|        token_.setStart(curCharPtr_);
  529|  1.32M|        scanIdentifierFastPathInContext(curCharPtr_, grammarContext);
  530|  1.32M|        break;
  531|       |
  532|      0|      case '@':
  ------------------
  |  Branch (532:7): [True: 0, False: 11.5M]
  ------------------
  533|      0|        token_.setStart(curCharPtr_);
  534|      0|        if (HERMES_PARSE_FLOW &&
  ------------------
  |  |   23|      0|#define HERMES_PARSE_FLOW 1
  |  |  ------------------
  |  |  |  Branch (23:27): [Folded - Ignored]
  |  |  ------------------
  ------------------
  535|      0|            LLVM_UNLIKELY(grammarContext == GrammarContext::Type)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  536|      0|          scanIdentifierFastPathInContext(curCharPtr_, grammarContext);
  537|      0|        } else {
  538|      0|          curCharPtr_ += 1;
  539|      0|          errorRange(token_.getStartLoc(), "unrecognized character '@'");
  540|      0|          continue;
  541|      0|        }
  542|      0|        break;
  543|       |
  544|      1|      case '\\': {
  ------------------
  |  Branch (544:7): [True: 1, False: 11.5M]
  ------------------
  545|      1|        token_.setStart(curCharPtr_);
  546|      1|        tmpStorage_.clear();
  547|      1|        uint32_t cp = consumeUnicodeEscape();
  548|      1|        if (!isUnicodeIDStart(cp)) {
  ------------------
  |  Branch (548:13): [True: 1, False: 0]
  ------------------
  549|      1|          errorRange(
  550|      1|              token_.getStartLoc(),
  551|      1|              "Unicode escape \\u" + Twine::utohexstr(cp) +
  552|      1|                  " is not a valid identifier start");
  553|      1|          continue;
  554|      1|        } else {
  555|      0|          appendUnicodeToStorage(cp);
  556|      0|        }
  557|      0|        scanIdentifierPartsInContext(grammarContext);
  558|      0|        break;
  559|      1|      }
  560|       |
  561|      2|      case '\'':
  ------------------
  |  Branch (561:7): [True: 2, False: 11.5M]
  ------------------
  562|  15.5k|      case '"':
  ------------------
  |  Branch (562:7): [True: 15.5k, False: 11.5M]
  ------------------
  563|  15.5k|        token_.setStart(curCharPtr_);
  564|  15.5k|        scanStringInContext(grammarContext);
  565|  15.5k|        break;
  566|       |
  567|   743k|      case '`':
  ------------------
  |  Branch (567:7): [True: 743k, False: 10.7M]
  ------------------
  568|   743k|        token_.setStart(curCharPtr_);
  569|   743k|        scanTemplateLiteral();
  570|   743k|        break;
  571|       |
  572|     64|      default_label:
  573|    107|      default: {
  ------------------
  |  Branch (573:7): [True: 43, False: 11.5M]
  ------------------
  574|    107|        token_.setStart(curCharPtr_);
  575|    107|        uint32_t ch = decodeUTF8();
  576|       |
  577|    107|        if (isUnicodeOnlyLetter(ch)) {
  ------------------
  |  Branch (577:13): [True: 18, False: 89]
  ------------------
  578|     18|          tmpStorage_.clear();
  579|     18|          appendUnicodeToStorage(ch);
  580|     18|          scanIdentifierPartsInContext(grammarContext);
  581|     89|        } else if (isUnicodeOnlySpace(ch)) {
  ------------------
  |  Branch (581:20): [True: 64, False: 25]
  ------------------
  582|     64|          continue;
  583|     64|        } else {
  584|     25|          if (ch > 31 && ch < 127)
  ------------------
  |  Branch (584:15): [True: 21, False: 4]
  |  Branch (584:26): [True: 0, False: 21]
  ------------------
  585|      0|            errorRange(
  586|      0|                token_.getStartLoc(),
  587|      0|                "unrecognized character '" + Twine((char)ch) + "'");
  588|     25|          else
  589|     25|            errorRange(
  590|     25|                token_.getStartLoc(),
  591|     25|                "unrecognized Unicode character \\u" + Twine::utohexstr(ch));
  592|     25|          continue;
  593|     25|        }
  594|       |
  595|     18|        break;
  596|    107|      }
  597|  11.5M|    }
  598|       |
  599|       |    // Always terminate the loop unless "continue" was used.
  600|  8.13M|    break;
  601|  11.5M|  } // for(;;)
  602|       |
  603|  8.13M|  finishToken(curCharPtr_);
  604|       |
  605|  8.13M|  return &token_;
  606|  8.13M|}
_ZN6hermes6parser7JSLexer24isCurrentTokenADirectiveEv:
  772|      1|bool JSLexer::isCurrentTokenADirective() {
  773|       |  // The current token must be a string literal without escapes.
  774|      1|  if (token_.getKind() != TokenKind::string_literal ||
  ------------------
  |  Branch (774:7): [True: 0, False: 1]
  ------------------
  775|      1|      token_.getStringLiteralContainsEscapes()) {
  ------------------
  |  Branch (775:7): [True: 0, False: 1]
  ------------------
  776|      0|    return false;
  777|      0|  }
  778|       |
  779|      1|  const char *ptr = curCharPtr_;
  780|       |
  781|       |  // A directive is a string literal (the current token, directly behind
  782|       |  // curCharPtr_), followed by a semicolon, new line, or eof that we will now
  783|       |  // try to find. There can also be comments. So, we loop, consuming whitespace
  784|       |  // until we encounter:
  785|       |  // - EOF. Don't consume it and succeed.
  786|       |  // - Semicolon. Don't consume it and succeed.
  787|       |  // - Right brace. Don't consume it and succeed.
  788|       |  // - A new line. Don't consume it and succeed.
  789|       |  // - A line comment. It implies a new line. Don't consume it and succeed.
  790|       |  // - A block comment. Consume it and continue.
  791|       |  // - Anything else. We consume nothing and fail.
  792|       |
  793|      1|  for (;;) {
  794|      1|    assert(ptr <= bufferEnd_ && "lexing past end of input");
  795|       |
  796|      0|    switch (*((const unsigned char *)ptr)) {
  797|      0|      case 0:
  ------------------
  |  Branch (797:7): [True: 0, False: 1]
  ------------------
  798|       |        // EOF?
  799|      0|        if (ptr == bufferEnd_)
  ------------------
  |  Branch (799:13): [True: 0, False: 0]
  ------------------
  800|      0|          return true;
  801|       |        // We encountered a stray 0 character.
  802|      0|        return false;
  803|       |
  804|      1|      case ';':
  ------------------
  |  Branch (804:7): [True: 1, False: 0]
  ------------------
  805|      1|      case '}':
  ------------------
  |  Branch (805:7): [True: 0, False: 1]
  ------------------
  806|      1|        return true;
  807|       |
  808|      0|      case '\r':
  ------------------
  |  Branch (808:7): [True: 0, False: 1]
  ------------------
  809|      0|      case '\n':
  ------------------
  |  Branch (809:7): [True: 0, False: 1]
  ------------------
  810|      0|        return true;
  811|       |
  812|       |      // Line separator \u2028 UTF8 encoded is      : e2 80 a8
  813|       |      // Paragraph separator \u2029 UTF8 encoded is : e2 80 a9
  814|      0|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (814:7): [True: 0, False: 1]
  ------------------
  815|      0|        if (matchUnicodeLineTerminatorOffset1(ptr))
  ------------------
  |  Branch (815:13): [True: 0, False: 0]
  ------------------
  816|      0|          return true;
  817|      0|        return false;
  818|       |
  819|      0|      case '\v':
  ------------------
  |  Branch (819:7): [True: 0, False: 1]
  ------------------
  820|      0|      case '\f':
  ------------------
  |  Branch (820:7): [True: 0, False: 1]
  ------------------
  821|       |        // Skip whitespace.
  822|      0|        ++ptr;
  823|      0|        continue;
  824|       |
  825|      0|      case '\t':
  ------------------
  |  Branch (825:7): [True: 0, False: 1]
  ------------------
  826|      0|      case ' ':
  ------------------
  |  Branch (826:7): [True: 0, False: 1]
  ------------------
  827|       |        // Spaces frequently come in groups, so use a tight inner loop to skip.
  828|      0|        do
  829|      0|          ++ptr;
  830|      0|        while (*ptr == '\t' || *ptr == ' ');
  ------------------
  |  Branch (830:16): [True: 0, False: 0]
  |  Branch (830:32): [True: 0, False: 0]
  ------------------
  831|      0|        continue;
  832|       |
  833|       |      // No-break space \u00A0 is UTF8 encoded as: c2 a0
  834|      0|      case 0xc2:
  ------------------
  |  Branch (834:7): [True: 0, False: 1]
  ------------------
  835|      0|        if ((unsigned char)ptr[1] == 0xa0) {
  ------------------
  |  Branch (835:13): [True: 0, False: 0]
  ------------------
  836|      0|          ptr += 2;
  837|      0|          continue;
  838|      0|        } else {
  839|      0|          goto default_label;
  840|      0|        }
  841|       |
  842|       |      // Byte-order mark \uFEFF is encoded as: ef bb bf
  843|      0|      case 0xef:
  ------------------
  |  Branch (843:7): [True: 0, False: 1]
  ------------------
  844|      0|        if ((unsigned char)ptr[1] == 0xbb && (unsigned char)ptr[2] == 0xbf) {
  ------------------
  |  Branch (844:13): [True: 0, False: 0]
  |  Branch (844:46): [True: 0, False: 0]
  ------------------
  845|      0|          ptr += 3;
  846|      0|          continue;
  847|      0|        } else {
  848|      0|          goto default_label;
  849|      0|        }
  850|       |
  851|      0|      case '/':
  ------------------
  |  Branch (851:7): [True: 0, False: 1]
  ------------------
  852|      0|        if (ptr[1] == '/') { // Line comment?
  ------------------
  |  Branch (852:13): [True: 0, False: 0]
  ------------------
  853|       |          // It implies a new line, so we are good.
  854|      0|          return true;
  855|      0|        } else if (ptr[1] == '*') { // Block comment?
  ------------------
  |  Branch (855:20): [True: 0, False: 0]
  ------------------
  856|      0|          auto savedCommentStorageSize = commentStorage_.size();
  857|      0|          auto commentScope = llvh::make_scope_exit([&] {
  858|      0|            if (storeComments_)
  859|      0|              commentStorage_.erase(
  860|      0|                  commentStorage_.begin() + savedCommentStorageSize,
  861|      0|                  commentStorage_.end());
  862|      0|          });
  863|      0|          SourceErrorManager::SaveAndSuppressMessages suppress(&sm_);
  864|      0|          ptr = skipBlockComment(ptr);
  865|      0|          continue;
  866|      0|        } else {
  867|      0|          return false;
  868|      0|        }
  869|       |
  870|       |      // Handle all other characters: if it is a unicode space, skip it.
  871|       |      // Otherwise we have failed.
  872|      0|      default_label:
  873|      0|      default: {
  ------------------
  |  Branch (873:7): [True: 0, False: 1]
  ------------------
  874|      0|        if (hermes::isUTF8Start(*ptr)) {
  ------------------
  |  Branch (874:13): [True: 0, False: 0]
  ------------------
  875|      0|          auto peeked = _peekUTF8(ptr);
  876|      0|          if (isUnicodeOnlySpace(peeked.first)) {
  ------------------
  |  Branch (876:15): [True: 0, False: 0]
  ------------------
  877|      0|            ptr = peeked.second;
  878|      0|            continue;
  879|      0|          }
  880|      0|        }
  881|      0|        return false;
  882|      0|      }
  883|      1|    }
  884|      1|  }
  885|       |
  886|       |  // We arrive here if we matched a directive. 'ptr' is the final character.
  887|      0|  return true;
  888|      1|}
_ZN6hermes6parser7JSLexer29rescanRBraceInTemplateLiteralEv:
  890|   155k|const Token *JSLexer::rescanRBraceInTemplateLiteral() {
  891|   155k|  assert(token_.getKind() == TokenKind::r_brace && "need } to rescan");
  892|      0|  --curCharPtr_;
  893|       |  // Undo the storage for the '}'.
  894|   155k|  if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|   155k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155k]
  |  |  ------------------
  ------------------
  895|      0|    tokenStorage_.pop_back();
  896|      0|  }
  897|   155k|  assert(*curCharPtr_ == '}' && "non-} was scanned as r_brace");
  898|      0|  token_.setStart(curCharPtr_);
  899|   155k|  scanTemplateLiteral();
  900|   155k|  finishToken(curCharPtr_);
  901|   155k|  return &token_;
  902|   155k|}
_ZN6hermes6parser7JSLexer10lookahead1ENS_8OptValueINS0_9TokenKindEEE:
  904|     18|OptValue<TokenKind> JSLexer::lookahead1(OptValue<TokenKind> expectedToken) {
  905|     18|  assert(
  906|     18|      (token_.getKind() == TokenKind::identifier || token_.isResWord()) &&
  907|     18|      "unsupported current token");
  908|      0|  UniqueString *savedIdent = token_.getResWordOrIdentifier();
  909|     18|  TokenKind savedKind = token_.getKind();
  910|     18|  SMLoc start = token_.getStartLoc();
  911|     18|  SMLoc end = token_.getEndLoc();
  912|     18|  const char *cur = curCharPtr_;
  913|     18|  SourceErrorManager::SaveAndSuppressMessages suppress(&sm_);
  914|       |
  915|       |  // Remove any comments that were stored during the lookahead
  916|     18|  auto savedCommentStorageSize = commentStorage_.size();
  917|     18|  auto commentScope = llvh::make_scope_exit([&] {
  918|     18|    if (storeComments_)
  919|     18|      commentStorage_.erase(
  920|     18|          commentStorage_.begin() + savedCommentStorageSize,
  921|     18|          commentStorage_.end());
  922|     18|  });
  923|       |
  924|     18|  advance();
  925|     18|  OptValue<TokenKind> kind = token_.getKind();
  926|     18|  if (isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (926:7): [True: 12, False: 6]
  ------------------
  927|       |    // Disregard anything after LineTerminator.
  928|     12|    kind = llvh::None;
  929|     12|  } else if (expectedToken == kind) {
  ------------------
  |  Branch (929:14): [True: 0, False: 6]
  ------------------
  930|       |    // Do not move the cursor back.
  931|      0|    return kind;
  932|      0|  }
  933|       |
  934|     18|  token_.setStart(start.getPointer());
  935|     18|  token_.setEnd(end.getPointer());
  936|     18|  if (savedKind == TokenKind::identifier) {
  ------------------
  |  Branch (936:7): [True: 18, False: 0]
  ------------------
  937|     18|    token_.setIdentifier(savedIdent);
  938|     18|  } else {
  939|      0|    token_.setResWord(savedKind, savedIdent);
  940|      0|  }
  941|     18|  seek(SMLoc::getFromPointer(cur));
  942|       |
  943|       |  // Undo the storage for the token we just advanced to.
  944|     18|  if (LLVM_UNLIKELY(storeTokens_)) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  945|      0|    tokenStorage_.pop_back();
  946|      0|  }
  947|       |
  948|     18|  return kind;
  949|     18|}
_ZN6hermes6parser7JSLexer20consumeUnicodeEscapeEv:
  951|  1.86k|uint32_t JSLexer::consumeUnicodeEscape() {
  952|  1.86k|  assert(*curCharPtr_ == '\\');
  953|      0|  ++curCharPtr_;
  954|       |
  955|  1.86k|  if (*curCharPtr_ != 'u') {
  ------------------
  |  Branch (955:7): [True: 1, False: 1.86k]
  ------------------
  956|      1|    error(
  957|      1|        {SMLoc::getFromPointer(curCharPtr_ - 1),
  958|      1|         SMLoc::getFromPointer(curCharPtr_ + 1)},
  959|      1|        "invalid Unicode escape");
  960|      1|    return UNICODE_REPLACEMENT_CHARACTER;
  961|      1|  }
  962|  1.86k|  ++curCharPtr_;
  963|       |
  964|  1.86k|  if (*curCharPtr_ == '{') {
  ------------------
  |  Branch (964:7): [True: 0, False: 1.86k]
  ------------------
  965|      0|    auto cp = consumeBracedCodePoint();
  966|      0|    if (!cp.hasValue()) {
  ------------------
  |  Branch (966:9): [True: 0, False: 0]
  ------------------
  967|       |      // consumeBracedCodePoint has reported an error.
  968|      0|      return UNICODE_REPLACEMENT_CHARACTER;
  969|      0|    }
  970|      0|    return *cp;
  971|      0|  }
  972|       |
  973|  1.86k|  auto cp = consumeHex(4);
  974|  1.86k|  if (!cp)
  ------------------
  |  Branch (974:7): [True: 2, False: 1.86k]
  ------------------
  975|      2|    return UNICODE_REPLACEMENT_CHARACTER;
  976|       |
  977|       |  // We don't need t check for valid UTF-16. JavaScript allows invalid surrogate
  978|       |  // pairs, so we just encode every UTF-16 code into a UTF-8 sequence, even
  979|       |  // though theoretically it is not a valid UTF-8. (UTF-8 would be "valid" if we
  980|       |  // collected the surrogate pair, decoded it into UTF-32 and encoded that into
  981|       |  // UTF-16).
  982|  1.86k|  return cp.getValue();
  983|  1.86k|}
_ZN6hermes6parser7JSLexer22consumeIdentifierStartEv:
 1020|  1.79M|bool JSLexer::consumeIdentifierStart() {
 1021|  1.79M|  if (*curCharPtr_ == '_' || *curCharPtr_ == '$' ||
  ------------------
  |  Branch (1021:7): [True: 0, False: 1.79M]
  |  Branch (1021:30): [True: 0, False: 1.79M]
  ------------------
 1022|  1.79M|      ((*curCharPtr_ | 32) >= 'a' && (*curCharPtr_ | 32) <= 'z')) {
  ------------------
  |  Branch (1022:8): [True: 203k, False: 1.58M]
  |  Branch (1022:38): [True: 24, False: 203k]
  ------------------
 1023|     24|    tmpStorage_.clear();
 1024|     24|    tmpStorage_.push_back(*curCharPtr_++);
 1025|     24|    return true;
 1026|     24|  }
 1027|       |
 1028|  1.79M|  if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (1028:7): [True: 0, False: 1.79M]
  ------------------
 1029|      0|    SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 1030|      0|    tmpStorage_.clear();
 1031|      0|    uint32_t cp = consumeUnicodeEscape();
 1032|      0|    if (!isUnicodeIDStart(cp)) {
  ------------------
  |  Branch (1032:9): [True: 0, False: 0]
  ------------------
 1033|      0|      errorRange(
 1034|      0|          startLoc,
 1035|      0|          "Unicode escape \\u" + Twine::utohexstr(cp) +
 1036|      0|              "is not a valid identifier start");
 1037|      0|    } else {
 1038|      0|      appendUnicodeToStorage(cp);
 1039|      0|    }
 1040|      0|    return true;
 1041|      0|  }
 1042|       |
 1043|  1.79M|  if (LLVM_LIKELY(!isUTF8Start(*curCharPtr_)))
  ------------------
  |  |  188|  1.79M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.79M, False: 3]
  |  |  ------------------
  ------------------
 1044|  1.79M|    return false;
 1045|       |
 1046|      3|  auto decoded = _peekUTF8();
 1047|      3|  if (isUnicodeIDStart(decoded.first)) {
  ------------------
  |  Branch (1047:7): [True: 1, False: 2]
  ------------------
 1048|      1|    tmpStorage_.clear();
 1049|      1|    appendUnicodeToStorage(decoded.first);
 1050|      1|    curCharPtr_ = decoded.second;
 1051|      1|    return true;
 1052|      1|  }
 1053|       |
 1054|      2|  return false;
 1055|      3|}
_ZN6hermes6parser7JSLexer12consumeOctalEj:
 1103|    278|unsigned char JSLexer::consumeOctal(unsigned maxLen) {
 1104|    278|  assert(*curCharPtr_ >= '0' && *curCharPtr_ <= '7');
 1105|       |
 1106|    278|  if (strictMode_) {
  ------------------
  |  Branch (1106:7): [True: 0, False: 278]
  ------------------
 1107|      0|    if (!error(
  ------------------
  |  Branch (1107:9): [True: 0, False: 0]
  ------------------
 1108|      0|            SMLoc::getFromPointer(curCharPtr_ - 1),
 1109|      0|            "octals not allowed in strict mode")) {
 1110|      0|      return 0;
 1111|      0|    }
 1112|      0|  }
 1113|       |
 1114|    278|  auto res = (unsigned char)(*curCharPtr_++ - '0');
 1115|    508|  while (--maxLen && *curCharPtr_ >= '0' && *curCharPtr_ <= '7')
  ------------------
  |  Branch (1115:10): [True: 390, False: 118]
  |  Branch (1115:22): [True: 390, False: 0]
  |  Branch (1115:45): [True: 230, False: 160]
  ------------------
 1116|    230|    res = (res << 3) + *curCharPtr_++ - '0';
 1117|       |
 1118|    278|  return res;
 1119|    278|}
_ZN6hermes6parser7JSLexer10consumeHexEjb:
 1123|  1.86k|    bool errorOnFail) {
 1124|  1.86k|  uint32_t cp = 0;
 1125|  9.32k|  for (unsigned i = 0; i != requiredLen; ++i) {
  ------------------
  |  Branch (1125:24): [True: 7.45k, False: 1.86k]
  ------------------
 1126|  7.45k|    unsigned ch = *curCharPtr_;
 1127|  7.45k|    if (ch >= '0' && ch <= '9') {
  ------------------
  |  Branch (1127:9): [True: 7.45k, False: 0]
  |  Branch (1127:22): [True: 7.43k, False: 26]
  ------------------
 1128|  7.43k|      ch -= '0';
 1129|  7.43k|    } else {
 1130|       |      // Now that we know it is not a digit, it is safe to lowercase.
 1131|     26|      ch |= 32;
 1132|     26|      if (ch >= 'a' && ch <= 'f') {
  ------------------
  |  Branch (1132:11): [True: 26, False: 0]
  |  Branch (1132:24): [True: 24, False: 2]
  ------------------
 1133|     24|        ch -= 'a' - 10;
 1134|     24|      } else {
 1135|      2|        if (errorOnFail) {
  ------------------
  |  Branch (1135:13): [True: 2, False: 0]
  ------------------
 1136|      2|          error(SMLoc::getFromPointer(curCharPtr_), "invalid hex number");
 1137|      2|        }
 1138|      2|        return llvh::None;
 1139|      2|      }
 1140|     26|    }
 1141|  7.45k|    cp = (cp << 4) + ch;
 1142|  7.45k|    ++curCharPtr_;
 1143|  7.45k|  }
 1144|       |
 1145|  1.86k|  return cp;
 1146|  1.86k|}
_ZN6hermes6parser7JSLexer17lineCommentHelperEPKc:
 1222|      3|llvh::StringRef JSLexer::lineCommentHelper(const char *start) {
 1223|      3|  assert(
 1224|      3|      (start[0] == '/' && start[1] == '/') ||
 1225|      3|      (start[0] == '#' && start[1] == '!'));
 1226|      0|  const char *lineCommentEnd;
 1227|      3|  const char *cur = start + 2;
 1228|       |
 1229|   190k|  for (;;) {
 1230|   190k|    switch ((unsigned char)*cur) {
 1231|      9|      case 0:
  ------------------
  |  Branch (1231:7): [True: 9, False: 190k]
  ------------------
 1232|      9|        if (cur == bufferEnd_) {
  ------------------
  |  Branch (1232:13): [True: 3, False: 6]
  ------------------
 1233|      3|          lineCommentEnd = cur;
 1234|      3|          goto endLoop;
 1235|      6|        } else {
 1236|      6|          ++cur;
 1237|      6|        }
 1238|      6|        break;
 1239|       |
 1240|      6|      case '\r':
  ------------------
  |  Branch (1240:7): [True: 0, False: 190k]
  ------------------
 1241|      0|      case '\n':
  ------------------
  |  Branch (1241:7): [True: 0, False: 190k]
  ------------------
 1242|      0|        lineCommentEnd = cur;
 1243|      0|        ++cur;
 1244|      0|        newLineBeforeCurrentToken_ = true;
 1245|      0|        goto endLoop;
 1246|       |
 1247|       |        // Line separator \u2028 UTF8 encoded is      : e2 80 a8
 1248|       |        // Paragraph separator \u2029 UTF8 encoded is: e2 80 a9
 1249|      0|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (1249:7): [True: 0, False: 190k]
  ------------------
 1250|      0|        if (matchUnicodeLineTerminatorOffset1(cur)) {
  ------------------
  |  Branch (1250:13): [True: 0, False: 0]
  ------------------
 1251|      0|          lineCommentEnd = cur;
 1252|      0|          cur += 3;
 1253|      0|          newLineBeforeCurrentToken_ = true;
 1254|      0|          goto endLoop;
 1255|      0|        } else {
 1256|      0|          _decodeUTF8SlowPath(cur);
 1257|      0|        }
 1258|      0|        break;
 1259|       |
 1260|   190k|      default:
  ------------------
  |  Branch (1260:7): [True: 190k, False: 9]
  ------------------
 1261|   190k|        if (LLVM_UNLIKELY(isUTF8Start(*cur)))
  ------------------
  |  |  189|   190k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 8, False: 190k]
  |  |  ------------------
  ------------------
 1262|      8|          _decodeUTF8SlowPath(cur);
 1263|   190k|        else
 1264|   190k|          ++cur;
 1265|   190k|        break;
 1266|   190k|    }
 1267|   190k|  }
 1268|      3|endLoop:
 1269|       |
 1270|      3|  curCharPtr_ = cur;
 1271|      3|  return llvh::StringRef(start, lineCommentEnd - start);
 1272|      3|}
_ZN6hermes6parser7JSLexer15scanLineCommentEPKc:
 1274|      3|void JSLexer::scanLineComment(const char *start) {
 1275|      3|  llvh::StringRef comment = lineCommentHelper(start);
 1276|       |
 1277|      3|  if (storeComments_) {
  ------------------
  |  Branch (1277:7): [True: 0, False: 3]
  ------------------
 1278|      0|    commentStorage_.emplace_back(
 1279|      0|        start[0] == '/' ? StoredComment::Kind::Line
  ------------------
  |  Branch (1279:9): [True: 0, False: 0]
  ------------------
 1280|      0|                        : StoredComment::Kind::Hashbang,
 1281|      0|        SMRange{
 1282|      0|            SMLoc::getFromPointer(comment.begin()),
 1283|      0|            SMLoc::getFromPointer(comment.end())});
 1284|      0|  }
 1285|       |
 1286|       |  // Check for magic comments, which excludes #!.
 1287|       |  // Syntax is //# name=value
 1288|      3|  if (!comment.consume_front(llvh::StringLiteral("//# ")))
  ------------------
  |  Branch (1288:7): [True: 3, False: 0]
  ------------------
 1289|      3|    return;
 1290|       |
 1291|      0|  if (comment.consume_front(llvh::StringLiteral("sourceURL=")))
  ------------------
  |  Branch (1291:7): [True: 0, False: 0]
  ------------------
 1292|      0|    sm_.setSourceUrl(bufId_, comment);
 1293|      0|  else if (comment.consume_front(llvh::StringLiteral("sourceMappingURL=")))
  ------------------
  |  Branch (1293:12): [True: 0, False: 0]
  ------------------
 1294|      0|    sm_.setSourceMappingUrl(bufId_, comment);
 1295|      0|}
_ZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextE:
 1358|  1.79M|void JSLexer::scanNumber(GrammarContext grammarContext) {
 1359|       |  // A somewhat ugly state machine for scanning a number
 1360|       |
 1361|  1.79M|  unsigned radix = 10;
 1362|  1.79M|  bool real = false;
 1363|  1.79M|  bool ok = true;
 1364|  1.79M|  const char *rawStart = curCharPtr_;
 1365|  1.79M|  const char *start = curCharPtr_;
 1366|       |
 1367|       |  // True when we encounter the numeric literal separator: '_'.
 1368|  1.79M|  bool seenSeparator = false;
 1369|       |
 1370|       |  // True when we encounter a legacy octal number (starts with '0').
 1371|  1.79M|  bool legacyOctal = false;
 1372|       |
 1373|       |  // Detect the radix
 1374|  1.79M|  if (*curCharPtr_ == '0') {
  ------------------
  |  Branch (1374:7): [True: 1.07M, False: 713k]
  ------------------
 1375|  1.07M|    if ((curCharPtr_[1] | 32) == 'x') {
  ------------------
  |  Branch (1375:9): [True: 0, False: 1.07M]
  ------------------
 1376|      0|      radix = 16;
 1377|      0|      curCharPtr_ += 2;
 1378|      0|      start += 2;
 1379|  1.07M|    } else if ((curCharPtr_[1] | 32) == 'o') {
  ------------------
  |  Branch (1379:16): [True: 0, False: 1.07M]
  ------------------
 1380|      0|      radix = 8;
 1381|      0|      curCharPtr_ += 2;
 1382|      0|      start += 2;
 1383|  1.07M|    } else if ((curCharPtr_[1] | 32) == 'b') {
  ------------------
  |  Branch (1383:16): [True: 0, False: 1.07M]
  ------------------
 1384|      0|      radix = 2;
 1385|      0|      curCharPtr_ += 2;
 1386|      0|      start += 2;
 1387|  1.07M|    } else if (curCharPtr_[1] == '.') {
  ------------------
  |  Branch (1387:16): [True: 118, False: 1.07M]
  ------------------
 1388|    118|      curCharPtr_ += 2;
 1389|    118|      goto fraction;
 1390|  1.07M|    } else if ((curCharPtr_[1] | 32) == 'e') {
  ------------------
  |  Branch (1390:16): [True: 192, False: 1.07M]
  ------------------
 1391|    192|      curCharPtr_ += 2;
 1392|    192|      goto exponent;
 1393|  1.07M|    } else {
 1394|  1.07M|      radix = 8;
 1395|  1.07M|      legacyOctal = true;
 1396|  1.07M|      ++curCharPtr_;
 1397|  1.07M|    }
 1398|  1.07M|  }
 1399|       |
 1400|  2.78M|  while (isdigit(*curCharPtr_) ||
  ------------------
  |  Branch (1400:10): [True: 996k, False: 1.79M]
  ------------------
 1401|  2.78M|         (radix == 16 && (*curCharPtr_ | 32) >= 'a' &&
  ------------------
  |  Branch (1401:11): [True: 0, False: 1.79M]
  |  Branch (1401:26): [True: 0, False: 0]
  ------------------
 1402|  1.79M|          (*curCharPtr_ | 32) <= 'f') ||
  ------------------
  |  Branch (1402:11): [True: 0, False: 0]
  ------------------
 1403|  2.78M|         (*curCharPtr_ == '_')) {
  ------------------
  |  Branch (1403:10): [True: 0, False: 1.79M]
  ------------------
 1404|   996k|    seenSeparator |= *curCharPtr_ == '_';
 1405|   996k|    ++curCharPtr_;
 1406|   996k|  }
 1407|       |
 1408|  1.79M|  if (radix == 10 || legacyOctal) {
  ------------------
  |  Branch (1408:7): [True: 713k, False: 1.07M]
  |  Branch (1408:22): [True: 1.07M, False: 0]
  ------------------
 1409|       |    // It is not necessarily an integer.
 1410|       |    // We could have interpreted as legacyOctal initially but will have to
 1411|       |    // change to decimal later.
 1412|  1.79M|    if (*curCharPtr_ == '.') {
  ------------------
  |  Branch (1412:9): [True: 1.09k, False: 1.79M]
  ------------------
 1413|  1.09k|      ++curCharPtr_;
 1414|  1.09k|      goto fraction;
 1415|  1.09k|    }
 1416|       |
 1417|  1.79M|    if ((*curCharPtr_ | 32) == 'e') {
  ------------------
  |  Branch (1417:9): [True: 1.32k, False: 1.78M]
  ------------------
 1418|  1.32k|      ++curCharPtr_;
 1419|  1.32k|      goto exponent;
 1420|  1.32k|    }
 1421|  1.79M|  }
 1422|       |
 1423|  1.78M|  goto end;
 1424|       |
 1425|  1.78M|fraction:
 1426|       |  // We arrive here after we have consumed the decimal dot ".".
 1427|       |  //
 1428|  1.21k|  real = true;
 1429|  1.97M|  while (isdigit(*curCharPtr_) || *curCharPtr_ == '_') {
  ------------------
  |  Branch (1429:10): [True: 1.97M, False: 1.21k]
  |  Branch (1429:35): [True: 0, False: 1.21k]
  ------------------
 1430|  1.97M|    seenSeparator |= *curCharPtr_ == '_';
 1431|  1.97M|    ++curCharPtr_;
 1432|  1.97M|  }
 1433|       |
 1434|  1.21k|  if ((*curCharPtr_ | 32) == 'e') {
  ------------------
  |  Branch (1434:7): [True: 8, False: 1.20k]
  ------------------
 1435|      8|    ++curCharPtr_;
 1436|      8|    goto exponent;
 1437|  1.20k|  } else {
 1438|  1.20k|    goto end;
 1439|  1.20k|  }
 1440|       |
 1441|  1.52k|exponent:
 1442|       |  // We arrive here after we have consumed the exponent character 'e' or 'E'.
 1443|       |  //
 1444|  1.52k|  real = true;
 1445|  1.52k|  if (*curCharPtr_ == '+' || *curCharPtr_ == '-')
  ------------------
  |  Branch (1445:7): [True: 4, False: 1.52k]
  |  Branch (1445:30): [True: 4, False: 1.52k]
  ------------------
 1446|      8|    ++curCharPtr_;
 1447|  1.52k|  if (isdigit(*curCharPtr_)) {
  ------------------
  |  Branch (1447:7): [True: 1.52k, False: 0]
  ------------------
 1448|  4.14k|    do {
 1449|  4.14k|      seenSeparator |= *curCharPtr_ == '_';
 1450|  4.14k|      ++curCharPtr_;
 1451|  4.14k|    } while (isdigit(*curCharPtr_) || *curCharPtr_ == '_');
  ------------------
  |  Branch (1451:14): [True: 2.61k, False: 1.52k]
  |  Branch (1451:39): [True: 0, False: 1.52k]
  ------------------
 1452|  1.52k|  } else {
 1453|      0|    ok = false;
 1454|      0|  }
 1455|       |
 1456|  1.79M|end:
 1457|       |  // We arrive here after we have consumed all we can from the number. Now,
 1458|       |  // as per the spec, we consume a sequence of identifier characters if they
 1459|       |  // follow directly, which means the number is invalid if it's not BigInt.
 1460|  1.79M|  if (consumeIdentifierStart()) {
  ------------------
  |  Branch (1460:7): [True: 25, False: 1.79M]
  ------------------
 1461|     25|    consumeIdentifierParts<IdentifierMode::JS>();
 1462|       |
 1463|     25|    llvh::StringRef raw{rawStart, (size_t)(curCharPtr_ - rawStart)};
 1464|     25|    if (ok && !real && (!legacyOctal || raw == "0n") && tmpStorage_ == "n") {
  ------------------
  |  Branch (1464:9): [True: 25, False: 0]
  |  Branch (1464:15): [True: 25, False: 0]
  |  Branch (1464:25): [True: 25, False: 0]
  |  Branch (1464:41): [True: 0, False: 0]
  |  Branch (1464:57): [True: 24, False: 1]
  ------------------
 1465|     24|      assert(curCharPtr_ > start && "Must consume at least the trailing n.");
 1466|      0|      llvh::ArrayRef<char> digits{start, curCharPtr_ - 1};
 1467|       |      // Use parseIntWithRadixDigits to validate the bigint literal's digits.
 1468|       |      // The digits themselves can be ignored, since we're only interested in
 1469|       |      // whether the string was parsed correctly.
 1470|     24|      if (digits.size() &&
  ------------------
  |  Branch (1470:11): [True: 24, False: 0]
  ------------------
 1471|     24|          parseIntWithRadixDigits</* AllowNumericSeparator */ true>(
  ------------------
  |  Branch (1471:11): [True: 24, False: 0]
  ------------------
 1472|     24|              digits, radix, [](uint8_t) {})) {
 1473|       |        // This is a BigInt.
 1474|     24|        rawStorage_.clear();
 1475|     24|        rawStorage_.append(raw);
 1476|     24|        token_.setBigIntLiteral(getStringLiteral(rawStorage_));
 1477|     24|        return;
 1478|     24|      }
 1479|       |
 1480|       |      // This is a BigInt with invalid digits; fail.
 1481|     24|    }
 1482|       |
 1483|      1|    ok = false;
 1484|      1|  }
 1485|       |
 1486|  1.79M|  double val;
 1487|       |
 1488|       |  /// ES6.0 B.1.1
 1489|       |  /// If we encounter a "legacy" octal number (starting with a '0') but if
 1490|       |  /// the integer contains '8' or '9' we interpret it as decimal.
 1491|  1.79M|  const auto updateLegacyOctalRadix =
 1492|  1.79M|      [this, &radix, start, &legacyOctal]() -> void {
 1493|  1.79M|    assert(
 1494|  1.79M|        legacyOctal &&
 1495|  1.79M|        "updateLegacyOctalRadix can only be called in legacyOctal mode");
 1496|  1.79M|    (void)legacyOctal;
 1497|  1.79M|    for (auto *scanPtr = start; scanPtr != curCharPtr_; ++scanPtr) {
 1498|  1.79M|      if (*scanPtr == '.' || *scanPtr == 'e') {
 1499|  1.79M|        break;
 1500|  1.79M|      }
 1501|  1.79M|      if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
 1502|  1.79M|        sm_.warning(
 1503|  1.79M|            SMRange(token_.getStartLoc(), SMLoc::getFromPointer(curCharPtr_)),
 1504|  1.79M|            "Numeric literal starts with 0 but contains an 8 or 9 digit. "
 1505|  1.79M|            "Interpreting as decimal (not octal).");
 1506|  1.79M|        radix = 10;
 1507|  1.79M|        break;
 1508|  1.79M|      }
 1509|  1.79M|    }
 1510|  1.79M|  };
 1511|       |
 1512|  1.79M|  if (!ok) {
  ------------------
  |  Branch (1512:7): [True: 1, False: 1.79M]
  ------------------
 1513|      1|    errorRange(token_.getStartLoc(), "invalid numeric literal");
 1514|      1|    val = std::numeric_limits<double>::quiet_NaN();
 1515|  1.79M|  } else if (
 1516|  1.79M|      !real && radix == 10 && curCharPtr_ - start <= 9 &&
  ------------------
  |  Branch (1516:7): [True: 1.78M, False: 2.73k]
  |  Branch (1516:16): [True: 710k, False: 1.07M]
  |  Branch (1516:31): [True: 701k, False: 9.57k]
  ------------------
 1517|  1.79M|      LLVM_LIKELY(!seenSeparator)) {
  ------------------
  |  |  188|   701k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 701k, False: 0]
  |  |  ------------------
  ------------------
 1518|       |    // If this is a decimal integer of at most 9 digits (log10(2**31-1), it
 1519|       |    // can fit in a 32-bit integer. Use a faster conversion.
 1520|   701k|    int32_t ival = *start - '0';
 1521|   810k|    while (++start != curCharPtr_)
  ------------------
  |  Branch (1521:12): [True: 109k, False: 701k]
  ------------------
 1522|   109k|      ival = ival * 10 + (*start - '0');
 1523|   701k|    val = ival;
 1524|  1.09M|  } else if (real || radix == 10) {
  ------------------
  |  Branch (1524:14): [True: 2.73k, False: 1.08M]
  |  Branch (1524:22): [True: 9.57k, False: 1.07M]
  ------------------
 1525|  12.3k|    if (legacyOctal) {
  ------------------
  |  Branch (1525:9): [True: 0, False: 12.3k]
  ------------------
 1526|      0|      if (strictMode_ || grammarContext == GrammarContext::Type) {
  ------------------
  |  Branch (1526:11): [True: 0, False: 0]
  |  Branch (1526:26): [True: 0, False: 0]
  ------------------
 1527|      0|        if (!errorRange(
  ------------------
  |  Branch (1527:13): [True: 0, False: 0]
  ------------------
 1528|      0|                token_.getStartLoc(),
 1529|      0|                "Decimals with leading zeros are not allowed in strict mode")) {
 1530|      0|          val = std::numeric_limits<double>::quiet_NaN();
 1531|      0|          goto done;
 1532|      0|        }
 1533|      0|      } else {
 1534|       |        // Check to see if we can actually scan this as radix 10.
 1535|       |        // Non-integer numbers must be in base 10, otherwise we error.
 1536|      0|        updateLegacyOctalRadix();
 1537|      0|        if (LLVM_LIKELY(radix != 10)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1538|      0|          if (!errorRange(
  ------------------
  |  Branch (1538:15): [True: 0, False: 0]
  ------------------
 1539|      0|                  token_.getStartLoc(),
 1540|      0|                  "Octal numeric literals must be integers")) {
 1541|      0|            val = std::numeric_limits<double>::quiet_NaN();
 1542|      0|            goto done;
 1543|      0|          }
 1544|      0|        }
 1545|      0|      }
 1546|      0|    }
 1547|       |
 1548|       |    // We need a zero-terminated buffer for hermes_g_strtod().
 1549|  12.3k|    llvh::SmallString<32> buf;
 1550|  12.3k|    buf.reserve(curCharPtr_ - start + 1);
 1551|  12.3k|    if (LLVM_UNLIKELY(seenSeparator)) {
  ------------------
  |  |  189|  12.3k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 12.3k]
  |  |  ------------------
  ------------------
 1552|      0|      for (const char *it = start; it != curCharPtr_; ++it) {
  ------------------
  |  Branch (1552:36): [True: 0, False: 0]
  ------------------
 1553|      0|        if (LLVM_LIKELY(*it != '_')) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1554|      0|          buf.push_back(*it);
 1555|      0|        } else {
 1556|       |          // Check to ensure that '_' is surrounded by digits.
 1557|       |          // This is safe because the source buffer is zero-terminated and
 1558|       |          // we know that the numeric literal didn't start with '_'.
 1559|       |          // Note that we could have a 0b_11 literal, but we'd still fail
 1560|       |          // properly because of the radix==16 check.
 1561|      0|          char prev = *(it - 1);
 1562|      0|          char next = *(it + 1);
 1563|      0|          if (!isdigit(prev) &&
  ------------------
  |  Branch (1563:15): [True: 0, False: 0]
  ------------------
 1564|      0|              !(radix == 16 && 'a' <= (prev | 32) && (prev | 32) <= 'f')) {
  ------------------
  |  Branch (1564:17): [True: 0, False: 0]
  |  Branch (1564:32): [True: 0, False: 0]
  |  Branch (1564:54): [True: 0, False: 0]
  ------------------
 1565|      0|            errorRange(
 1566|      0|                token_.getStartLoc(),
 1567|      0|                "numeric separator must come after a digit");
 1568|      0|          } else if (
 1569|      0|              !isdigit(next) &&
  ------------------
  |  Branch (1569:15): [True: 0, False: 0]
  ------------------
 1570|      0|              !(radix == 16 && 'a' <= (next | 32) && (next | 32) <= 'f')) {
  ------------------
  |  Branch (1570:17): [True: 0, False: 0]
  |  Branch (1570:32): [True: 0, False: 0]
  |  Branch (1570:54): [True: 0, False: 0]
  ------------------
 1571|      0|            errorRange(
 1572|      0|                token_.getStartLoc(),
 1573|      0|                "numeric separator must come before a digit");
 1574|      0|          }
 1575|      0|        }
 1576|      0|      }
 1577|  12.3k|    } else {
 1578|  12.3k|      buf.append(start, curCharPtr_);
 1579|  12.3k|    }
 1580|  12.3k|    buf.push_back(0);
 1581|  12.3k|    char *endPtr;
 1582|  12.3k|    val = ::hermes_g_strtod(buf.data(), &endPtr);
 1583|  12.3k|    if (endPtr != &buf.back()) {
  ------------------
  |  Branch (1583:9): [True: 0, False: 12.3k]
  ------------------
 1584|      0|      errorRange(token_.getStartLoc(), "invalid numeric literal");
 1585|      0|      val = std::numeric_limits<double>::quiet_NaN();
 1586|      0|    }
 1587|  1.07M|  } else {
 1588|  1.07M|    if (legacyOctal &&
  ------------------
  |  Branch (1588:9): [True: 1.07M, False: 0]
  ------------------
 1589|  1.07M|        (strictMode_ || grammarContext == GrammarContext::Type) &&
  ------------------
  |  Branch (1589:10): [True: 0, False: 1.07M]
  |  Branch (1589:25): [True: 0, False: 1.07M]
  ------------------
 1590|  1.07M|        curCharPtr_ - start > 1) {
  ------------------
  |  Branch (1590:9): [True: 0, False: 0]
  ------------------
 1591|      0|      if (!errorRange(
  ------------------
  |  Branch (1591:11): [True: 0, False: 0]
  ------------------
 1592|      0|              token_.getStartLoc(),
 1593|      0|              "Octal literals must use '0o' in strict mode")) {
 1594|      0|        val = std::numeric_limits<double>::quiet_NaN();
 1595|      0|        goto done;
 1596|      0|      }
 1597|      0|    }
 1598|       |
 1599|       |    // Handle the zero-radix case. This could only happen with radix 16
 1600|       |    // because otherwise start wouldn't have been changed.
 1601|  1.07M|    if (curCharPtr_ == start) {
  ------------------
  |  Branch (1601:9): [True: 0, False: 1.07M]
  ------------------
 1602|      0|      errorRange(
 1603|      0|          token_.getStartLoc(),
 1604|      0|          llvh::Twine("No digits after ") + llvh::StringRef(start - 2, 2));
 1605|      0|      val = std::numeric_limits<double>::quiet_NaN();
 1606|  1.07M|    } else {
 1607|       |      // Parse the rest of the number:
 1608|  1.07M|      if (legacyOctal) {
  ------------------
  |  Branch (1608:11): [True: 1.07M, False: 0]
  ------------------
 1609|  1.07M|        updateLegacyOctalRadix();
 1610|       |        // LegacyOctalLikeDecimalIntegerLiteral cannot contain separators.
 1611|  1.07M|        if (LLVM_UNLIKELY(seenSeparator)) {
  ------------------
  |  |  189|  1.07M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.07M]
  |  |  ------------------
  ------------------
 1612|      0|          errorRange(
 1613|      0|              token_.getStartLoc(),
 1614|      0|              "Numeric separator cannot be used in literal after leading 0");
 1615|      0|        }
 1616|  1.07M|      }
 1617|  1.07M|      auto parsedInt = parseIntWithRadix</* AllowNumericSeparator */ true>(
 1618|  1.07M|          llvh::ArrayRef<char>{start, (size_t)(curCharPtr_ - start)}, radix);
 1619|  1.07M|      if (!parsedInt) {
  ------------------
  |  Branch (1619:11): [True: 0, False: 1.07M]
  ------------------
 1620|      0|        errorRange(token_.getStartLoc(), "invalid integer literal");
 1621|      0|        val = std::numeric_limits<double>::quiet_NaN();
 1622|  1.07M|      } else {
 1623|  1.07M|        val = parsedInt.getValue();
 1624|  1.07M|      }
 1625|  1.07M|    }
 1626|  1.07M|  }
 1627|       |
 1628|  1.79M|done:
 1629|  1.79M|  token_.setNumericLiteral(val);
 1630|  1.79M|}
_ZN6hermes6parser7JSLexer16scanReservedWordEPKcj:
 1639|  1.32M|TokenKind JSLexer::scanReservedWord(const char *start, unsigned length) {
 1640|  1.32M|  TokenKind rw = matchReservedWord(start, length);
 1641|       |
 1642|       |  // Check for "Future reserved words" which should not be recognised in non-
 1643|       |  // strict mode.
 1644|  1.32M|  if (!strictMode_ && rw != TokenKind::identifier) {
  ------------------
  |  Branch (1644:7): [True: 1.32M, False: 0]
  |  Branch (1644:23): [True: 12.1k, False: 1.31M]
  ------------------
 1645|  12.1k|    switch (rw) {
 1646|      0|      case TokenKind::rw_implements:
  ------------------
  |  Branch (1646:7): [True: 0, False: 12.1k]
  ------------------
 1647|      0|      case TokenKind::rw_interface:
  ------------------
  |  Branch (1647:7): [True: 0, False: 12.1k]
  ------------------
 1648|      0|      case TokenKind::rw_package:
  ------------------
  |  Branch (1648:7): [True: 0, False: 12.1k]
  ------------------
 1649|      0|      case TokenKind::rw_private:
  ------------------
  |  Branch (1649:7): [True: 0, False: 12.1k]
  ------------------
 1650|      0|      case TokenKind::rw_protected:
  ------------------
  |  Branch (1650:7): [True: 0, False: 12.1k]
  ------------------
 1651|      0|      case TokenKind::rw_public:
  ------------------
  |  Branch (1651:7): [True: 0, False: 12.1k]
  ------------------
 1652|      0|      case TokenKind::rw_static:
  ------------------
  |  Branch (1652:7): [True: 0, False: 12.1k]
  ------------------
 1653|      0|      case TokenKind::rw_yield:
  ------------------
  |  Branch (1653:7): [True: 0, False: 12.1k]
  ------------------
 1654|      0|        rw = TokenKind::identifier;
 1655|  12.1k|      default:
  ------------------
  |  Branch (1655:7): [True: 12.1k, False: 0]
  ------------------
 1656|  12.1k|        break;
 1657|  12.1k|    }
 1658|  12.1k|  }
 1659|  1.32M|  return rw;
 1660|  1.32M|}
_ZN6hermes6parser7JSLexer19scanTemplateLiteralEv:
 1894|   898k|void JSLexer::scanTemplateLiteral() {
 1895|   898k|  assert(*curCharPtr_ == '`' || *curCharPtr_ == '}');
 1896|       |
 1897|       |  // Whether the token will result in TemplateHead upon encountering ${.
 1898|       |  // If we end the literal with `, then the result is NoSubstitutionTemplate,
 1899|       |  // so this will be ignored.
 1900|      0|  bool isHead = *curCharPtr_ == '`';
 1901|       |
 1902|       |  // If the token ended with a ` then it's a tail (or NoSubstitutionTemplate),
 1903|       |  // and if it ended with a ${ then it's not a tail.
 1904|   898k|  bool isTail = false;
 1905|       |
 1906|       |  // Advance past the initial `.
 1907|   898k|  ++curCharPtr_;
 1908|       |
 1909|       |  // Track whether we encounter any NotEscapeSequence instances,
 1910|       |  // which will be used to error out on non-tagged sequences.
 1911|   898k|  bool foundNotEscapeSequence = false;
 1912|       |
 1913|       |  // Store the Template Value (TV) in the tmpStorage_.
 1914|   898k|  tmpStorage_.clear();
 1915|       |
 1916|       |  // Store the Template Raw Value (TRV) in the rawStorage_.
 1917|   898k|  rawStorage_.clear();
 1918|       |
 1919|       |  /// Return the Template Raw Value (TRV) of character \p c.
 1920|       |  /// The only time the TRV is different from c is when c is a <CR>.
 1921|       |  /// In that case, this function will return 0x0a (LINE FEED).
 1922|   898k|  const auto trv = [](char c) -> char {
 1923|   898k|    if (c == '\r') {
 1924|       |      // This case takes \r and \r\n into account.
 1925|       |      // The code below which consumes line separators will skip the following
 1926|       |      // \n if there is a \r\n.
 1927|       |      // For the purposes of finding the TRV it doesn't matter.
 1928|   898k|      return 0x0a;
 1929|   898k|    }
 1930|   898k|    return c;
 1931|   898k|  };
 1932|       |
 1933|  5.44M|  for (;;) {
 1934|  5.44M|    if (*curCharPtr_ == '`') {
  ------------------
  |  Branch (1934:9): [True: 743k, False: 4.69M]
  ------------------
 1935|   743k|      isTail = true;
 1936|   743k|      ++curCharPtr_;
 1937|   743k|      break;
 1938|  4.69M|    } else if (*curCharPtr_ == '$' && curCharPtr_[1] == '{') {
  ------------------
  |  Branch (1938:16): [True: 183k, False: 4.51M]
  |  Branch (1938:39): [True: 155k, False: 27.6k]
  ------------------
 1939|       |      // End of the TemplateCharacters.
 1940|   155k|      isTail = false;
 1941|   155k|      curCharPtr_ += 2;
 1942|   155k|      break;
 1943|  4.54M|    } else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (1943:16): [True: 18, False: 4.54M]
  ------------------
 1944|     18|      rawStorage_.push_back(*curCharPtr_);
 1945|     18|      ++curCharPtr_;
 1946|     18|      rawStorage_.push_back(trv(*curCharPtr_));
 1947|     18|      switch ((unsigned char)*curCharPtr_) {
 1948|      0|        case '\'':
  ------------------
  |  Branch (1948:9): [True: 0, False: 18]
  ------------------
 1949|      0|        case '"':
  ------------------
  |  Branch (1949:9): [True: 0, False: 18]
  ------------------
 1950|      0|        case '\\':
  ------------------
  |  Branch (1950:9): [True: 0, False: 18]
  ------------------
 1951|      0|          tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1952|      0|          break;
 1953|       |
 1954|      0|        case 'b':
  ------------------
  |  Branch (1954:9): [True: 0, False: 18]
  ------------------
 1955|      0|          ++curCharPtr_;
 1956|      0|          tmpStorage_.push_back(8);
 1957|      0|          break;
 1958|      0|        case 'f':
  ------------------
  |  Branch (1958:9): [True: 0, False: 18]
  ------------------
 1959|      0|          ++curCharPtr_;
 1960|      0|          tmpStorage_.push_back(12);
 1961|      0|          break;
 1962|      0|        case 'n':
  ------------------
  |  Branch (1962:9): [True: 0, False: 18]
  ------------------
 1963|      0|          ++curCharPtr_;
 1964|      0|          tmpStorage_.push_back(10);
 1965|      0|          break;
 1966|      0|        case 'r':
  ------------------
  |  Branch (1966:9): [True: 0, False: 18]
  ------------------
 1967|      0|          ++curCharPtr_;
 1968|      0|          tmpStorage_.push_back(13);
 1969|      0|          break;
 1970|      0|        case 't':
  ------------------
  |  Branch (1970:9): [True: 0, False: 18]
  ------------------
 1971|      0|          ++curCharPtr_;
 1972|      0|          tmpStorage_.push_back(9);
 1973|      0|          break;
 1974|      0|        case 'v':
  ------------------
  |  Branch (1974:9): [True: 0, False: 18]
  ------------------
 1975|      0|          ++curCharPtr_;
 1976|      0|          tmpStorage_.push_back(11);
 1977|      0|          break;
 1978|       |
 1979|      0|        case '\0': // EOF?
  ------------------
  |  Branch (1979:9): [True: 0, False: 18]
  ------------------
 1980|      0|          if (curCharPtr_ == bufferEnd_) { // eof?
  ------------------
  |  Branch (1980:15): [True: 0, False: 0]
  ------------------
 1981|      0|            error(
 1982|      0|                SMLoc::getFromPointer(curCharPtr_),
 1983|      0|                "non-terminated template literal");
 1984|      0|            sm_.note(token_.getStartLoc(), "template literal started here");
 1985|      0|            goto breakLoop;
 1986|      0|          } else {
 1987|      0|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1988|      0|          }
 1989|      0|          break;
 1990|       |
 1991|      0|        case '0':
  ------------------
  |  Branch (1991:9): [True: 0, False: 18]
  ------------------
 1992|       |          // '\0' is only a valid escape sequence if not followed by a
 1993|       |          // DecimalDigit.
 1994|      0|          if (!(curCharPtr_[1] >= '0' && curCharPtr_[1] <= '9')) {
  ------------------
  |  Branch (1994:17): [True: 0, False: 0]
  |  Branch (1994:42): [True: 0, False: 0]
  ------------------
 1995|      0|            ++curCharPtr_;
 1996|      0|            appendUnicodeToStorage(0);
 1997|      0|            break;
 1998|      0|          }
 1999|       |          // fall-through
 2000|       |
 2001|      0|        case '1':
  ------------------
  |  Branch (2001:9): [True: 0, False: 18]
  ------------------
 2002|      0|        case '2':
  ------------------
  |  Branch (2002:9): [True: 0, False: 18]
  ------------------
 2003|      0|        case '3':
  ------------------
  |  Branch (2003:9): [True: 0, False: 18]
  ------------------
 2004|      0|        case '4':
  ------------------
  |  Branch (2004:9): [True: 0, False: 18]
  ------------------
 2005|      0|        case '5':
  ------------------
  |  Branch (2005:9): [True: 0, False: 18]
  ------------------
 2006|      0|        case '6':
  ------------------
  |  Branch (2006:9): [True: 0, False: 18]
  ------------------
 2007|      0|        case '7':
  ------------------
  |  Branch (2007:9): [True: 0, False: 18]
  ------------------
 2008|      0|        case '8':
  ------------------
  |  Branch (2008:9): [True: 0, False: 18]
  ------------------
 2009|      0|        case '9':
  ------------------
  |  Branch (2009:9): [True: 0, False: 18]
  ------------------
 2010|       |          // NotEscapeSequence :: DecimalDigit but not 0
 2011|       |          // NotEscapeSequence :: 0 DecimalDigit
 2012|       |          // Octal numbers are not supported in template strings,
 2013|       |          // so leave the number in the raw storage (done above) and move on.
 2014|      0|          ++curCharPtr_;
 2015|      0|          foundNotEscapeSequence = true;
 2016|      0|          break;
 2017|       |
 2018|      0|        case 'x': {
  ------------------
  |  Branch (2018:9): [True: 0, False: 18]
  ------------------
 2019|      0|          ++curCharPtr_;
 2020|      0|          const char *start = curCharPtr_;
 2021|      0|          auto v = consumeHex(2, false);
 2022|      0|          if (!v) {
  ------------------
  |  Branch (2022:15): [True: 0, False: 0]
  ------------------
 2023|      0|            foundNotEscapeSequence = true;
 2024|      0|          }
 2025|      0|          appendUnicodeToStorage(v ? *v : 0);
  ------------------
  |  Branch (2025:34): [True: 0, False: 0]
  ------------------
 2026|      0|          rawStorage_.append({start, (size_t)(curCharPtr_ - start)});
 2027|      0|          break;
 2028|      0|        }
 2029|       |
 2030|      0|        case 'u': {
  ------------------
  |  Branch (2030:9): [True: 0, False: 18]
  ------------------
 2031|       |          // Pointer to the first character after the 'u', which is where we
 2032|       |          // can continue scanning from if we fail to decode an escape.
 2033|      0|          const char *start = curCharPtr_ + 1;
 2034|       |          // Reset the pointer to the '\' to scan the unicode escape.
 2035|      0|          --curCharPtr_;
 2036|      0|          assert(*curCharPtr_ == '\\' && "must have started with \\");
 2037|      0|          auto codepoint = consumeUnicodeEscapeOptional();
 2038|      0|          if (!codepoint) {
  ------------------
  |  Branch (2038:15): [True: 0, False: 0]
  ------------------
 2039|      0|            foundNotEscapeSequence = true;
 2040|      0|            curCharPtr_ = start;
 2041|      0|            break;
 2042|      0|          }
 2043|      0|          appendUnicodeToStorage(*codepoint);
 2044|      0|          rawStorage_.append({start, (size_t)(curCharPtr_ - start)});
 2045|      0|          break;
 2046|      0|        }
 2047|       |
 2048|       |        // Escaped line terminator. We just need to skip it, because it was
 2049|       |        // added to the raw storage at the start of the switch statement.
 2050|     14|        case '\n':
  ------------------
  |  Branch (2050:9): [True: 14, False: 4]
  ------------------
 2051|     14|          ++curCharPtr_;
 2052|     14|          break;
 2053|      0|        case '\r':
  ------------------
  |  Branch (2053:9): [True: 0, False: 18]
  ------------------
 2054|      0|          ++curCharPtr_;
 2055|      0|          if (*curCharPtr_ == '\n') // skip CR LF
  ------------------
  |  Branch (2055:15): [True: 0, False: 0]
  ------------------
 2056|      0|            ++curCharPtr_;
 2057|      0|          break;
 2058|      0|        case UTF8_LINE_TERMINATOR_CHAR0: {
  ------------------
  |  Branch (2058:9): [True: 0, False: 18]
  ------------------
 2059|      0|          bool isLineTerminator =
 2060|      0|              matchUnicodeLineTerminatorOffset1(curCharPtr_);
 2061|      0|          uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2062|       |          // Needs to be added to the rawStorage_ regardless,
 2063|       |          // but we first need to pop off the byte that was added prior to the
 2064|       |          // switch statement.
 2065|      0|          rawStorage_.pop_back();
 2066|      0|          appendUnicodeToStorage(codepoint, rawStorage_);
 2067|      0|          if (!isLineTerminator) {
  ------------------
  |  Branch (2067:15): [True: 0, False: 0]
  ------------------
 2068|       |            // Only add the codepoint to the tmpStorage if it wasn't a line
 2069|       |            // terminator.
 2070|      0|            appendUnicodeToStorage(codepoint);
 2071|      0|          }
 2072|      0|          break;
 2073|      0|        }
 2074|       |
 2075|      4|        default:
  ------------------
  |  Branch (2075:9): [True: 4, False: 14]
  ------------------
 2076|      4|          if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 2077|      0|            uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2078|      0|            appendUnicodeToStorage(codepoint);
 2079|       |            // Remove the last byte from rawStorage_ and then append the
 2080|       |            // unicode codepoint to it. The already inserted byte will change
 2081|       |            // if this codepoint is in Supplementary Planes.
 2082|      0|            rawStorage_.pop_back();
 2083|      0|            appendUnicodeToStorage(codepoint, rawStorage_);
 2084|      4|          } else {
 2085|       |            // The TV of EscapeSequence is the SV of EscapeSequence.
 2086|      4|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2087|      4|          }
 2088|      4|          break;
 2089|     18|      }
 2090|  4.54M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == 0 && curCharPtr_ == bufferEnd_)) {
  ------------------
  |  |  189|  5.29M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 7, False: 4.54M]
  |  |  |  Branch (189:53): [True: 753k, False: 3.79M]
  |  |  |  Branch (189:53): [True: 7, False: 753k]
  |  |  ------------------
  ------------------
 2091|      7|      error(
 2092|      7|          SMLoc::getFromPointer(curCharPtr_),
 2093|      7|          "non-terminated template literal");
 2094|      7|      sm_.note(token_.getStartLoc(), "template literal started here");
 2095|      7|      break;
 2096|  4.54M|    } else if (*curCharPtr_ == '\r') {
  ------------------
  |  Branch (2096:16): [True: 22, False: 4.54M]
  ------------------
 2097|       |      // The TV of LineTerminatorSequence is the TRV of
 2098|       |      // LineTerminatorSequence. The only time this differs from the same
 2099|       |      // characters as the bytes in the file is when the sequence begins with
 2100|       |      // a <CR>.
 2101|     22|      tmpStorage_.push_back(trv(*curCharPtr_));
 2102|     22|      rawStorage_.push_back(trv(*curCharPtr_));
 2103|     22|      curCharPtr_++;
 2104|     22|      if (*curCharPtr_ == '\n') {
  ------------------
  |  Branch (2104:11): [True: 0, False: 22]
  ------------------
 2105|       |        // Skip the <CR> <LF>
 2106|      0|        curCharPtr_++;
 2107|      0|      }
 2108|  4.54M|    } else {
 2109|  4.54M|      if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|  4.54M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 16.1k, False: 4.52M]
  |  |  ------------------
  ------------------
 2110|       |        // Decode and re-encode the character and append it to the string
 2111|       |        // storage
 2112|  16.1k|        uint32_t codepoint = _decodeUTF8SlowPath(curCharPtr_);
 2113|  16.1k|        appendUnicodeToStorage(codepoint);
 2114|  16.1k|        appendUnicodeToStorage(codepoint, rawStorage_);
 2115|  4.52M|      } else {
 2116|  4.52M|        rawStorage_.push_back(*curCharPtr_);
 2117|  4.52M|        tmpStorage_.push_back(*curCharPtr_++);
 2118|  4.52M|      }
 2119|  4.54M|    }
 2120|  5.44M|  }
 2121|   898k|breakLoop:
 2122|       |  // If the template literal is tagged and contains invalid escapes, then
 2123|       |  // cooked should be null because there is no way to cook it, per the ESTree
 2124|       |  // 2018 spec. The parser will error when encountering an untagged literal
 2125|       |  // with invalid escapes, so we place nullptr here.
 2126|   898k|  UniqueString *cookedStr =
 2127|   898k|      foundNotEscapeSequence ? nullptr : getStringLiteral(tmpStorage_.str());
  ------------------
  |  Branch (2127:7): [True: 0, False: 898k]
  ------------------
 2128|   898k|  UniqueString *rawStr = getStringLiteral(rawStorage_.str());
 2129|   898k|  if (isHead) {
  ------------------
  |  Branch (2129:7): [True: 743k, False: 155k]
  ------------------
 2130|   743k|    if (isTail) {
  ------------------
  |  Branch (2130:9): [True: 743k, False: 18]
  ------------------
 2131|       |      // ` characters `
 2132|   743k|      token_.setTemplateLiteral(
 2133|   743k|          TokenKind::no_substitution_template, cookedStr, rawStr);
 2134|   743k|    } else {
 2135|       |      // ` characters ${
 2136|     18|      token_.setTemplateLiteral(TokenKind::template_head, cookedStr, rawStr);
 2137|     18|    }
 2138|   743k|  } else {
 2139|   155k|    if (isTail) {
  ------------------
  |  Branch (2139:9): [True: 10, False: 155k]
  ------------------
 2140|       |      // } characters `
 2141|     10|      token_.setTemplateLiteral(TokenKind::template_tail, cookedStr, rawStr);
 2142|   155k|    } else {
 2143|       |      // } characters ${
 2144|   155k|      token_.setTemplateLiteral(TokenKind::template_middle, cookedStr, rawStr);
 2145|   155k|    }
 2146|   155k|  }
 2147|   898k|}
_ZN6hermes6parser7JSLexer10scanRegExpEv:
 2150|  34.1k|void JSLexer::scanRegExp() {
 2151|  34.1k|  SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 2152|  34.1k|  assert(*curCharPtr_ == '/');
 2153|      0|  ++curCharPtr_;
 2154|       |
 2155|  34.1k|  tmpStorage_.clear();
 2156|  34.1k|  bool inClass = false;
 2157|       |
 2158|  2.07M|  for (;;) {
 2159|  2.07M|    switch ((unsigned char)*curCharPtr_) {
  ------------------
  |  Branch (2159:13): [True: 2.03M, False: 34.2k]
  ------------------
 2160|  34.1k|      case '/':
  ------------------
  |  Branch (2160:7): [True: 34.1k, False: 2.03M]
  ------------------
 2161|  34.1k|        if (!inClass) {
  ------------------
  |  Branch (2161:13): [True: 34.1k, False: 0]
  ------------------
 2162|  34.1k|          ++curCharPtr_;
 2163|  34.1k|          goto exitLoop;
 2164|  34.1k|        }
 2165|      0|        break;
 2166|       |
 2167|      2|      case '[':
  ------------------
  |  Branch (2167:7): [True: 2, False: 2.07M]
  ------------------
 2168|      2|        inClass = true; // It may be true already, but so what.
 2169|      2|        break;
 2170|       |
 2171|      2|      case ']':
  ------------------
  |  Branch (2171:7): [True: 2, False: 2.07M]
  ------------------
 2172|      2|        inClass = false; // It may be false already, but so what.
 2173|      2|        break;
 2174|       |
 2175|      0|      case '\\': // an escape
  ------------------
  |  Branch (2175:7): [True: 0, False: 2.07M]
  ------------------
 2176|      0|        tmpStorage_.push_back((unsigned char)*curCharPtr_);
 2177|      0|        ++curCharPtr_;
 2178|      0|        switch ((unsigned char)*curCharPtr_) {
  ------------------
  |  Branch (2178:17): [True: 0, False: 0]
  ------------------
 2179|      0|          case '\0':
  ------------------
  |  Branch (2179:11): [True: 0, False: 0]
  ------------------
 2180|      0|            if (curCharPtr_ == bufferEnd_)
  ------------------
  |  Branch (2180:17): [True: 0, False: 0]
  ------------------
 2181|      0|              goto unterminated;
 2182|      0|            break;
 2183|      0|          case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (2183:11): [True: 0, False: 0]
  ------------------
 2184|      0|            if (matchUnicodeLineTerminatorOffset1(curCharPtr_))
  ------------------
  |  Branch (2184:17): [True: 0, False: 0]
  ------------------
 2185|      0|              goto unterminated;
 2186|      0|            break;
 2187|      0|          case '\n':
  ------------------
  |  Branch (2187:11): [True: 0, False: 0]
  ------------------
 2188|      0|          case '\r':
  ------------------
  |  Branch (2188:11): [True: 0, False: 0]
  ------------------
 2189|      0|            goto unterminated;
 2190|      0|        }
 2191|      0|        break;
 2192|       |
 2193|     58|      case '\0':
  ------------------
  |  Branch (2193:7): [True: 58, False: 2.07M]
  ------------------
 2194|     58|        if (curCharPtr_ == bufferEnd_)
  ------------------
  |  Branch (2194:13): [True: 1, False: 57]
  ------------------
 2195|      1|          goto unterminated;
 2196|     57|        break;
 2197|     57|      case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (2197:7): [True: 7, False: 2.07M]
  ------------------
 2198|      7|        if (matchUnicodeLineTerminatorOffset1(curCharPtr_))
  ------------------
  |  Branch (2198:13): [True: 0, False: 7]
  ------------------
 2199|      0|          goto unterminated;
 2200|      7|        break;
 2201|       |
 2202|      7|      case '\n':
  ------------------
  |  Branch (2202:7): [True: 0, False: 2.07M]
  ------------------
 2203|      0|      case '\r':
  ------------------
  |  Branch (2203:7): [True: 0, False: 2.07M]
  ------------------
 2204|      1|      unterminated:
 2205|      1|        error(
 2206|      1|            SMLoc::getFromPointer(curCharPtr_),
 2207|      1|            "non-terminated regular expression literal");
 2208|      1|        sm_.note(startLoc, "regular expression started here");
 2209|      1|        goto exitLoop;
 2210|  2.07M|    }
 2211|       |
 2212|  2.03M|    if (LLVM_UNLIKELY(isUTF8Start((unsigned char)*curCharPtr_)))
  ------------------
  |  |  189|  2.03M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 22, False: 2.03M]
  |  |  ------------------
  ------------------
 2213|     22|      appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 2214|  2.03M|    else
 2215|  2.03M|      tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 2216|  2.03M|  }
 2217|  34.1k|exitLoop:
 2218|  34.1k|  UniqueString *body = getStringLiteral(tmpStorage_.str());
 2219|       |
 2220|       |  // Scan the flags. We must not interpret escape sequences.
 2221|       |  // E6 5.1 7.8.5: "The Strings of characters comprising the
 2222|       |  // RegularExpressionBody and the RegularExpressionFlags are passed
 2223|       |  // uninterpreted to the regular expression constructor"
 2224|  34.1k|  tmpStorage_.clear();
 2225|  34.1k|  bool escapingBackslash = false;
 2226|  56.5k|  for (;;) {
 2227|  56.5k|    if (consumeOneIdentifierPartNoEscape<IdentifierMode::JS>()) {
  ------------------
  |  Branch (2227:9): [True: 22.4k, False: 34.1k]
  ------------------
 2228|  22.4k|      escapingBackslash = false;
 2229|  22.4k|      continue;
 2230|  34.1k|    } else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (2230:16): [True: 0, False: 34.1k]
  ------------------
 2231|      0|      tmpStorage_.push_back(*curCharPtr_++);
 2232|       |
 2233|       |      // ES6 11.8.5.1: It is a Syntax Error if IdentifierPart contains a
 2234|       |      // Unicode escape sequence.
 2235|      0|      escapingBackslash = !escapingBackslash;
 2236|      0|      if (escapingBackslash && *curCharPtr_ == 'u') {
  ------------------
  |  Branch (2236:11): [True: 0, False: 0]
  |  Branch (2236:32): [True: 0, False: 0]
  ------------------
 2237|      0|        error(
 2238|      0|            SMLoc::getFromPointer(curCharPtr_),
 2239|      0|            "Unicode escape sequences are not allowed in regular expression flags");
 2240|      0|      }
 2241|  34.1k|    } else {
 2242|  34.1k|      break;
 2243|  34.1k|    }
 2244|  56.5k|  }
 2245|       |
 2246|  34.1k|  UniqueString *flags = getStringLiteral(tmpStorage_.str());
 2247|       |
 2248|  34.1k|  token_.setRegExpLiteral(new (allocator_.Allocate<RegExpLiteral>(1))
 2249|  34.1k|                              RegExpLiteral(body, flags));
 2250|  34.1k|}
_ZN6hermes6parser7JSLexer5errorEN4llvh5SMLocERKNS2_5TwineE:
 2258|  1.03k|bool JSLexer::error(llvh::SMLoc loc, const llvh::Twine &msg) {
 2259|  1.03k|  sm_.error(loc, msg, Subsystem::Lexer);
 2260|  1.03k|  if (!sm_.isErrorLimitReached())
  ------------------
  |  Branch (2260:7): [True: 1.00k, False: 26]
  ------------------
 2261|  1.00k|    return true;
 2262|     26|  forceEOF();
 2263|     26|  return false;
 2264|  1.03k|}
_ZN6hermes6parser7JSLexer5errorEN4llvh7SMRangeERKNS2_5TwineE:
 2266|     28|bool JSLexer::error(llvh::SMRange range, const llvh::Twine &msg) {
 2267|     28|  sm_.error(range, msg, Subsystem::Lexer);
 2268|     28|  if (!sm_.isErrorLimitReached())
  ------------------
  |  Branch (2268:7): [True: 18, False: 10]
  ------------------
 2269|     18|    return true;
 2270|     10|  forceEOF();
 2271|     10|  return false;
 2272|     28|}
JSLexer.cpp:_ZN6hermes6parserL15getHTMLEntitiesEv:
   54|    263|static const llvh::DenseMap<llvh::StringRef, uint32_t> &getHTMLEntities() {
   55|    263|  static const auto entities = initializeHTMLEntities();
   56|    263|  return entities;
   57|    263|}
JSLexer.cpp:_ZN6hermes6parserL22initializeHTMLEntitiesEv:
   44|      1|static llvh::DenseMap<llvh::StringRef, uint32_t> initializeHTMLEntities() {
   45|      1|  llvh::DenseMap<llvh::StringRef, uint32_t> entities{};
   46|       |
   47|      1|#define HTML_ENTITY(NAME, VALUE) \
   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
   49|      1|#include "hermes/Parser/HTMLEntities.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef HTML_ENTITY
  |  |    9|       |#define HTML_ENTITY(NAME, BASE)
  |  |   10|       |#endif
  |  |   11|       |
  |  |   12|      1|HTML_ENTITY(quot, 0x0022)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   13|      1|HTML_ENTITY(amp, 0x0026)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   14|      1|HTML_ENTITY(apos, 0x0027)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   15|      1|HTML_ENTITY(lt, 0x003C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   16|      1|HTML_ENTITY(gt, 0x003E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   17|      1|HTML_ENTITY(nbsp, 0x00A0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   18|      1|HTML_ENTITY(iexcl, 0x00A1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   19|      1|HTML_ENTITY(cent, 0x00A2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   20|      1|HTML_ENTITY(pound, 0x00A3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   21|      1|HTML_ENTITY(curren, 0x00A4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   22|      1|HTML_ENTITY(yen, 0x00A5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   23|      1|HTML_ENTITY(brvbar, 0x00A6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   24|      1|HTML_ENTITY(sect, 0x00A7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   25|      1|HTML_ENTITY(uml, 0x00A8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   26|      1|HTML_ENTITY(copy, 0x00A9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   27|      1|HTML_ENTITY(ordf, 0x00AA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   28|      1|HTML_ENTITY(laquo, 0x00AB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   29|      1|HTML_ENTITY(not, 0x00AC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   30|      1|HTML_ENTITY(shy, 0x00AD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   31|      1|HTML_ENTITY(reg, 0x00AE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   32|      1|HTML_ENTITY(macr, 0x00AF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   33|      1|HTML_ENTITY(deg, 0x00B0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   34|      1|HTML_ENTITY(plusmn, 0x00B1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   35|      1|HTML_ENTITY(sup2, 0x00B2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   36|      1|HTML_ENTITY(sup3, 0x00B3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   37|      1|HTML_ENTITY(acute, 0x00B4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   38|      1|HTML_ENTITY(micro, 0x00B5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   39|      1|HTML_ENTITY(para, 0x00B6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   40|      1|HTML_ENTITY(middot, 0x00B7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   41|      1|HTML_ENTITY(cedil, 0x00B8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   42|      1|HTML_ENTITY(sup1, 0x00B9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   43|      1|HTML_ENTITY(ordm, 0x00BA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   44|      1|HTML_ENTITY(raquo, 0x00BB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   45|      1|HTML_ENTITY(frac14, 0x00BC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   46|      1|HTML_ENTITY(frac12, 0x00BD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   47|      1|HTML_ENTITY(frac34, 0x00BE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   48|      1|HTML_ENTITY(iquest, 0x00BF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   49|      1|HTML_ENTITY(Agrave, 0x00C0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   50|      1|HTML_ENTITY(Aacute, 0x00C1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   51|      1|HTML_ENTITY(Acirc, 0x00C2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   52|      1|HTML_ENTITY(Atilde, 0x00C3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   53|      1|HTML_ENTITY(Auml, 0x00C4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   54|      1|HTML_ENTITY(Aring, 0x00C5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   55|      1|HTML_ENTITY(AElig, 0x00C6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   56|      1|HTML_ENTITY(Ccedil, 0x00C7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   57|      1|HTML_ENTITY(Egrave, 0x00C8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   58|      1|HTML_ENTITY(Eacute, 0x00C9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   59|      1|HTML_ENTITY(Ecirc, 0x00CA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   60|      1|HTML_ENTITY(Euml, 0x00CB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   61|      1|HTML_ENTITY(Igrave, 0x00CC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   62|      1|HTML_ENTITY(Iacute, 0x00CD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   63|      1|HTML_ENTITY(Icirc, 0x00CE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   64|      1|HTML_ENTITY(Iuml, 0x00CF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   65|      1|HTML_ENTITY(ETH, 0x00D0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   66|      1|HTML_ENTITY(Ntilde, 0x00D1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   67|      1|HTML_ENTITY(Ograve, 0x00D2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   68|      1|HTML_ENTITY(Oacute, 0x00D3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   69|      1|HTML_ENTITY(Ocirc, 0x00D4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   70|      1|HTML_ENTITY(Otilde, 0x00D5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   71|      1|HTML_ENTITY(Ouml, 0x00D6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   72|      1|HTML_ENTITY(times, 0x00D7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   73|      1|HTML_ENTITY(Oslash, 0x00D8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   74|      1|HTML_ENTITY(Ugrave, 0x00D9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   75|      1|HTML_ENTITY(Uacute, 0x00DA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   76|      1|HTML_ENTITY(Ucirc, 0x00DB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   77|      1|HTML_ENTITY(Uuml, 0x00DC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   78|      1|HTML_ENTITY(Yacute, 0x00DD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   79|      1|HTML_ENTITY(THORN, 0x00DE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   80|      1|HTML_ENTITY(szlig, 0x00DF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   81|      1|HTML_ENTITY(agrave, 0x00E0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   82|      1|HTML_ENTITY(aacute, 0x00E1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   83|      1|HTML_ENTITY(acirc, 0x00E2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   84|      1|HTML_ENTITY(atilde, 0x00E3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   85|      1|HTML_ENTITY(auml, 0x00E4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   86|      1|HTML_ENTITY(aring, 0x00E5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   87|      1|HTML_ENTITY(aelig, 0x00E6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   88|      1|HTML_ENTITY(ccedil, 0x00E7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   89|      1|HTML_ENTITY(egrave, 0x00E8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   90|      1|HTML_ENTITY(eacute, 0x00E9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   91|      1|HTML_ENTITY(ecirc, 0x00EA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   92|      1|HTML_ENTITY(euml, 0x00EB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   93|      1|HTML_ENTITY(igrave, 0x00EC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   94|      1|HTML_ENTITY(iacute, 0x00ED)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   95|      1|HTML_ENTITY(icirc, 0x00EE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   96|      1|HTML_ENTITY(iuml, 0x00EF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   97|      1|HTML_ENTITY(eth, 0x00F0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   98|      1|HTML_ENTITY(ntilde, 0x00F1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |   99|      1|HTML_ENTITY(ograve, 0x00F2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  100|      1|HTML_ENTITY(oacute, 0x00F3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  101|      1|HTML_ENTITY(ocirc, 0x00F4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  102|      1|HTML_ENTITY(otilde, 0x00F5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  103|      1|HTML_ENTITY(ouml, 0x00F6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  104|      1|HTML_ENTITY(divide, 0x00F7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  105|      1|HTML_ENTITY(oslash, 0x00F8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  106|      1|HTML_ENTITY(ugrave, 0x00F9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  107|      1|HTML_ENTITY(uacute, 0x00FA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  108|      1|HTML_ENTITY(ucirc, 0x00FB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  109|      1|HTML_ENTITY(uuml, 0x00FC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  110|      1|HTML_ENTITY(yacute, 0x00FD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  111|      1|HTML_ENTITY(thorn, 0x00FE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  112|      1|HTML_ENTITY(yuml, 0x00FF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  113|      1|HTML_ENTITY(OElig, 0x0152)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  114|      1|HTML_ENTITY(oelig, 0x0153)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  115|      1|HTML_ENTITY(Scaron, 0x0160)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  116|      1|HTML_ENTITY(scaron, 0x0161)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  117|      1|HTML_ENTITY(Yuml, 0x0178)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  118|      1|HTML_ENTITY(fnof, 0x0192)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  119|      1|HTML_ENTITY(circ, 0x02C6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  120|      1|HTML_ENTITY(tilde, 0x02DC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  121|      1|HTML_ENTITY(Alpha, 0x0391)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  122|      1|HTML_ENTITY(Beta, 0x0392)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  123|      1|HTML_ENTITY(Gamma, 0x0393)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  124|      1|HTML_ENTITY(Delta, 0x0394)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  125|      1|HTML_ENTITY(Epsilon, 0x0395)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  126|      1|HTML_ENTITY(Zeta, 0x0396)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  127|      1|HTML_ENTITY(Eta, 0x0397)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  128|      1|HTML_ENTITY(Theta, 0x0398)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  129|      1|HTML_ENTITY(Iota, 0x0399)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  130|      1|HTML_ENTITY(Kappa, 0x039A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  131|      1|HTML_ENTITY(Lambda, 0x039B)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  132|      1|HTML_ENTITY(Mu, 0x039C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  133|      1|HTML_ENTITY(Nu, 0x039D)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  134|      1|HTML_ENTITY(Xi, 0x039E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  135|      1|HTML_ENTITY(Omicron, 0x039F)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  136|      1|HTML_ENTITY(Pi, 0x03A0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  137|      1|HTML_ENTITY(Rho, 0x03A1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  138|      1|HTML_ENTITY(Sigma, 0x03A3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  139|      1|HTML_ENTITY(Tau, 0x03A4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  140|      1|HTML_ENTITY(Upsilon, 0x03A5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  141|      1|HTML_ENTITY(Phi, 0x03A6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  142|      1|HTML_ENTITY(Chi, 0x03A7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  143|      1|HTML_ENTITY(Psi, 0x03A8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  144|      1|HTML_ENTITY(Omega, 0x03A9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  145|      1|HTML_ENTITY(alpha, 0x03B1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  146|      1|HTML_ENTITY(beta, 0x03B2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  147|      1|HTML_ENTITY(gamma, 0x03B3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  148|      1|HTML_ENTITY(delta, 0x03B4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  149|      1|HTML_ENTITY(epsilon, 0x03B5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  150|      1|HTML_ENTITY(zeta, 0x03B6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  151|      1|HTML_ENTITY(eta, 0x03B7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  152|      1|HTML_ENTITY(theta, 0x03B8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  153|      1|HTML_ENTITY(iota, 0x03B9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  154|      1|HTML_ENTITY(kappa, 0x03BA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  155|      1|HTML_ENTITY(lambda, 0x03BB)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  156|      1|HTML_ENTITY(mu, 0x03BC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  157|      1|HTML_ENTITY(nu, 0x03BD)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  158|      1|HTML_ENTITY(xi, 0x03BE)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  159|      1|HTML_ENTITY(omicron, 0x03BF)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  160|      1|HTML_ENTITY(pi, 0x03C0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  161|      1|HTML_ENTITY(rho, 0x03C1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  162|      1|HTML_ENTITY(sigmaf, 0x03C2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  163|      1|HTML_ENTITY(sigma, 0x03C3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  164|      1|HTML_ENTITY(tau, 0x03C4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  165|      1|HTML_ENTITY(upsilon, 0x03C5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  166|      1|HTML_ENTITY(phi, 0x03C6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  167|      1|HTML_ENTITY(chi, 0x03C7)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  168|      1|HTML_ENTITY(psi, 0x03C8)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  169|      1|HTML_ENTITY(omega, 0x03C9)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  170|      1|HTML_ENTITY(thetasym, 0x03D1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  171|      1|HTML_ENTITY(upsih, 0x03D2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  172|      1|HTML_ENTITY(piv, 0x03D6)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  173|      1|HTML_ENTITY(ensp, 0x2002)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  174|      1|HTML_ENTITY(emsp, 0x2003)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  175|      1|HTML_ENTITY(thinsp, 0x2009)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  176|      1|HTML_ENTITY(zwnj, 0x200C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  177|      1|HTML_ENTITY(zwj, 0x200D)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  178|      1|HTML_ENTITY(lrm, 0x200E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  179|      1|HTML_ENTITY(rlm, 0x200F)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  180|      1|HTML_ENTITY(ndash, 0x2013)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  181|      1|HTML_ENTITY(mdash, 0x2014)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  182|      1|HTML_ENTITY(lsquo, 0x2018)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  183|      1|HTML_ENTITY(rsquo, 0x2019)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  184|      1|HTML_ENTITY(sbquo, 0x201A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  185|      1|HTML_ENTITY(ldquo, 0x201C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  186|      1|HTML_ENTITY(rdquo, 0x201D)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  187|      1|HTML_ENTITY(bdquo, 0x201E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  188|      1|HTML_ENTITY(dagger, 0x2020)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  189|      1|HTML_ENTITY(Dagger, 0x2021)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  190|      1|HTML_ENTITY(bull, 0x2022)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  191|      1|HTML_ENTITY(hellip, 0x2026)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  192|      1|HTML_ENTITY(permil, 0x2030)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  193|      1|HTML_ENTITY(prime, 0x2032)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  194|      1|HTML_ENTITY(Prime, 0x2033)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  195|      1|HTML_ENTITY(lsaquo, 0x2039)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  196|      1|HTML_ENTITY(rsaquo, 0x203A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  197|      1|HTML_ENTITY(oline, 0x203E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  198|      1|HTML_ENTITY(frasl, 0x2044)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  199|      1|HTML_ENTITY(euro, 0x20AC)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  200|      1|HTML_ENTITY(image, 0x2111)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  201|      1|HTML_ENTITY(weierp, 0x2118)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  202|      1|HTML_ENTITY(real, 0x211C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  203|      1|HTML_ENTITY(trade, 0x2122)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  204|      1|HTML_ENTITY(alefsym, 0x2135)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  205|      1|HTML_ENTITY(larr, 0x2190)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  206|      1|HTML_ENTITY(uarr, 0x2191)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  207|      1|HTML_ENTITY(rarr, 0x2192)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  208|      1|HTML_ENTITY(darr, 0x2193)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  209|      1|HTML_ENTITY(harr, 0x2194)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  210|      1|HTML_ENTITY(crarr, 0x21B5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  211|      1|HTML_ENTITY(lArr, 0x21D0)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  212|      1|HTML_ENTITY(uArr, 0x21D1)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  213|      1|HTML_ENTITY(rArr, 0x21D2)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  214|      1|HTML_ENTITY(dArr, 0x21D3)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  215|      1|HTML_ENTITY(hArr, 0x21D4)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  216|      1|HTML_ENTITY(forall, 0x2200)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  217|      1|HTML_ENTITY(part, 0x2202)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  218|      1|HTML_ENTITY(exist, 0x2203)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  219|      1|HTML_ENTITY(empty, 0x2205)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  220|      1|HTML_ENTITY(nabla, 0x2207)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  221|      1|HTML_ENTITY(isin, 0x2208)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  222|      1|HTML_ENTITY(notin, 0x2209)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  223|      1|HTML_ENTITY(ni, 0x220B)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  224|      1|HTML_ENTITY(prod, 0x220F)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  225|      1|HTML_ENTITY(sum, 0x2211)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  226|      1|HTML_ENTITY(minus, 0x2212)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  227|      1|HTML_ENTITY(lowast, 0x2217)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  228|      1|HTML_ENTITY(radic, 0x221A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  229|      1|HTML_ENTITY(prop, 0x221D)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  230|      1|HTML_ENTITY(infin, 0x221E)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  231|      1|HTML_ENTITY(ang, 0x2220)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  232|      1|HTML_ENTITY(and, 0x2227)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  233|      1|HTML_ENTITY(or, 0x2228)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  234|      1|HTML_ENTITY(cap, 0x2229)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  235|      1|HTML_ENTITY(cup, 0x222A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  236|      1|HTML_ENTITY(int, 0x222B)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  237|      1|HTML_ENTITY(there4, 0x2234)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  238|      1|HTML_ENTITY(sim, 0x223C)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  239|      1|HTML_ENTITY(cong, 0x2245)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  240|      1|HTML_ENTITY(asymp, 0x2248)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  241|      1|HTML_ENTITY(ne, 0x2260)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  242|      1|HTML_ENTITY(equiv, 0x2261)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  243|      1|HTML_ENTITY(le, 0x2264)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  244|      1|HTML_ENTITY(ge, 0x2265)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  245|      1|HTML_ENTITY(sub, 0x2282)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  246|      1|HTML_ENTITY(sup, 0x2283)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  247|      1|HTML_ENTITY(nsub, 0x2284)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  248|      1|HTML_ENTITY(sube, 0x2286)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  249|      1|HTML_ENTITY(supe, 0x2287)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  250|      1|HTML_ENTITY(oplus, 0x2295)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  251|      1|HTML_ENTITY(otimes, 0x2297)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  252|      1|HTML_ENTITY(perp, 0x22A5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  253|      1|HTML_ENTITY(sdot, 0x22C5)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  254|      1|HTML_ENTITY(lceil, 0x2308)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  255|      1|HTML_ENTITY(rceil, 0x2309)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  256|      1|HTML_ENTITY(lfloor, 0x230A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  257|      1|HTML_ENTITY(rfloor, 0x230B)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  258|      1|HTML_ENTITY(lang, 0x2329)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  259|      1|HTML_ENTITY(rang, 0x232A)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  260|      1|HTML_ENTITY(loz, 0x25CA)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  261|      1|HTML_ENTITY(spades, 0x2660)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  262|      1|HTML_ENTITY(clubs, 0x2663)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  263|      1|HTML_ENTITY(hearts, 0x2665)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  264|      1|HTML_ENTITY(diams, 0x2666)
  |  |  ------------------
  |  |  |  |   48|      1|  entities.insert({llvh::StringLiteral(#NAME), VALUE});
  |  |  ------------------
  |  |  265|       |
  |  |  266|      1|#undef HTML_ENTITY
  ------------------
   50|       |
   51|      1|  return entities;
   52|      1|}
JSLexer.cpp:_ZN6hermes6parser12_GLOBAL__N_133matchUnicodeLineTerminatorOffset1EPKc:
   29|     71|inline bool matchUnicodeLineTerminatorOffset1(const char *curCharPtr_) {
   30|       |  // Line separator \u2028 UTF8 encoded is      : e2 80 a8
   31|       |  // Paragraph separator \u2029 UTF8 encoded is: e2 80 a9
   32|     71|  return (unsigned char)curCharPtr_[1] == 0x80 &&
  ------------------
  |  Branch (32:10): [True: 71, False: 0]
  ------------------
   33|     71|      ((unsigned char)curCharPtr_[2] == 0xa8 ||
  ------------------
  |  Branch (33:8): [True: 0, False: 71]
  ------------------
   34|     71|       (unsigned char)curCharPtr_[2] == 0xa9);
  ------------------
  |  Branch (34:8): [True: 0, False: 71]
  ------------------
   35|     71|}
_ZN6hermes6parser7JSLexer10scanStringILb0EEEvv:
 1744|  15.5k|void JSLexer::scanString() {
 1745|  15.5k|  assert(*curCharPtr_ == '\'' || *curCharPtr_ == '"');
 1746|      0|  char quoteCh = *curCharPtr_++;
 1747|       |
 1748|       |  // Track whether we encounter any escapes or new line continuations. We need
 1749|       |  // that information in order to detect directives.
 1750|  15.5k|  bool escapes = false;
 1751|       |
 1752|  15.5k|  tmpStorage_.clear();
 1753|       |
 1754|  7.69M|  for (;;) {
 1755|  7.69M|    if (*curCharPtr_ == quoteCh) {
  ------------------
  |  Branch (1755:9): [True: 15.5k, False: 7.68M]
  ------------------
 1756|  15.5k|      ++curCharPtr_;
 1757|  15.5k|      break;
 1758|  7.68M|    } else if (!JSX && *curCharPtr_ == '\\') {
  ------------------
  |  Branch (1758:16): [Folded - Ignored]
  |  Branch (1758:24): [True: 14.3k, False: 7.66M]
  ------------------
 1759|  14.3k|      escapes = true;
 1760|  14.3k|      ++curCharPtr_;
 1761|  14.3k|      switch ((unsigned char)*curCharPtr_) {
 1762|      0|        case '\'':
  ------------------
  |  Branch (1762:9): [True: 0, False: 14.3k]
  ------------------
 1763|      0|        case '"':
  ------------------
  |  Branch (1763:9): [True: 0, False: 14.3k]
  ------------------
 1764|  11.6k|        case '\\':
  ------------------
  |  Branch (1764:9): [True: 11.6k, False: 2.68k]
  ------------------
 1765|  11.6k|          tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1766|  11.6k|          break;
 1767|       |
 1768|      0|        case 'b':
  ------------------
  |  Branch (1768:9): [True: 0, False: 14.3k]
  ------------------
 1769|      0|          ++curCharPtr_;
 1770|      0|          tmpStorage_.push_back(8);
 1771|      0|          break;
 1772|      8|        case 'f':
  ------------------
  |  Branch (1772:9): [True: 8, False: 14.3k]
  ------------------
 1773|      8|          ++curCharPtr_;
 1774|      8|          tmpStorage_.push_back(12);
 1775|      8|          break;
 1776|      0|        case 'n':
  ------------------
  |  Branch (1776:9): [True: 0, False: 14.3k]
  ------------------
 1777|      0|          ++curCharPtr_;
 1778|      0|          tmpStorage_.push_back(10);
 1779|      0|          break;
 1780|      0|        case 'r':
  ------------------
  |  Branch (1780:9): [True: 0, False: 14.3k]
  ------------------
 1781|      0|          ++curCharPtr_;
 1782|      0|          tmpStorage_.push_back(13);
 1783|      0|          break;
 1784|      0|        case 't':
  ------------------
  |  Branch (1784:9): [True: 0, False: 14.3k]
  ------------------
 1785|      0|          ++curCharPtr_;
 1786|      0|          tmpStorage_.push_back(9);
 1787|      0|          break;
 1788|     54|        case 'v':
  ------------------
  |  Branch (1788:9): [True: 54, False: 14.2k]
  ------------------
 1789|     54|          ++curCharPtr_;
 1790|     54|          tmpStorage_.push_back(11);
 1791|     54|          break;
 1792|       |
 1793|     36|        case '\0': // EOF?
  ------------------
  |  Branch (1793:9): [True: 36, False: 14.2k]
  ------------------
 1794|     36|          if (curCharPtr_ == bufferEnd_) { // eof?
  ------------------
  |  Branch (1794:15): [True: 0, False: 36]
  ------------------
 1795|      0|            error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1796|      0|            sm_.note(token_.getStartLoc(), "string started here");
 1797|      0|            goto breakLoop;
 1798|     36|          } else {
 1799|     36|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1800|     36|          }
 1801|     36|          break;
 1802|       |
 1803|     56|        case '0':
  ------------------
  |  Branch (1803:9): [True: 56, False: 14.2k]
  ------------------
 1804|       |          // '\0' is not an octal so handle it separately.
 1805|     56|          if (!(curCharPtr_[1] >= '0' && curCharPtr_[1] <= '7')) {
  ------------------
  |  Branch (1805:17): [True: 56, False: 0]
  |  Branch (1805:42): [True: 0, False: 56]
  ------------------
 1806|     56|            ++curCharPtr_;
 1807|     56|            appendUnicodeToStorage(0);
 1808|     56|            break;
 1809|     56|          }
 1810|     56|          LLVM_FALLTHROUGH;
  ------------------
  |  |  245|      0|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
 1811|    160|        case '1':
  ------------------
  |  Branch (1811:9): [True: 160, False: 14.1k]
  ------------------
 1812|    216|        case '2':
  ------------------
  |  Branch (1812:9): [True: 56, False: 14.2k]
  ------------------
 1813|    272|        case '3':
  ------------------
  |  Branch (1813:9): [True: 56, False: 14.2k]
  ------------------
 1814|    272|          appendUnicodeToStorage(consumeOctal(3));
 1815|    272|          break;
 1816|      6|        case '4':
  ------------------
  |  Branch (1816:9): [True: 6, False: 14.3k]
  ------------------
 1817|      6|        case '5':
  ------------------
  |  Branch (1817:9): [True: 0, False: 14.3k]
  ------------------
 1818|      6|        case '6':
  ------------------
  |  Branch (1818:9): [True: 0, False: 14.3k]
  ------------------
 1819|      6|        case '7':
  ------------------
  |  Branch (1819:9): [True: 0, False: 14.3k]
  ------------------
 1820|      6|          appendUnicodeToStorage(consumeOctal(2));
 1821|      6|          break;
 1822|       |
 1823|      0|        case 'x': {
  ------------------
  |  Branch (1823:9): [True: 0, False: 14.3k]
  ------------------
 1824|      0|          ++curCharPtr_;
 1825|      0|          auto v = consumeHex(2);
 1826|      0|          appendUnicodeToStorage(v ? *v : 0);
  ------------------
  |  Branch (1826:34): [True: 0, False: 0]
  ------------------
 1827|      0|          break;
 1828|      6|        }
 1829|       |
 1830|  1.86k|        case 'u':
  ------------------
  |  Branch (1830:9): [True: 1.86k, False: 12.4k]
  ------------------
 1831|  1.86k|          --curCharPtr_;
 1832|  1.86k|          appendUnicodeToStorage(consumeUnicodeEscape());
 1833|  1.86k|          break;
 1834|       |
 1835|       |        // Escaped line terminator. We just need to skip it.
 1836|      0|        case '\n':
  ------------------
  |  Branch (1836:9): [True: 0, False: 14.3k]
  ------------------
 1837|      0|          ++curCharPtr_;
 1838|      0|          break;
 1839|      0|        case '\r':
  ------------------
  |  Branch (1839:9): [True: 0, False: 14.3k]
  ------------------
 1840|      0|          ++curCharPtr_;
 1841|      0|          if (*curCharPtr_ == '\n') // skip CR LF
  ------------------
  |  Branch (1841:15): [True: 0, False: 0]
  ------------------
 1842|      0|            ++curCharPtr_;
 1843|      0|          break;
 1844|      0|        case UTF8_LINE_TERMINATOR_CHAR0:
  ------------------
  |  Branch (1844:9): [True: 0, False: 14.3k]
  ------------------
 1845|      0|          if (matchUnicodeLineTerminatorOffset1(curCharPtr_)) {
  ------------------
  |  Branch (1845:15): [True: 0, False: 0]
  ------------------
 1846|      0|            curCharPtr_ += 3;
 1847|      0|            break;
 1848|      0|          }
 1849|      0|          appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1850|      0|          break;
 1851|       |
 1852|    384|        default:
  ------------------
  |  Branch (1852:9): [True: 384, False: 13.9k]
  ------------------
 1853|    384|          if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_)))
  ------------------
  |  |  189|    384|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 6, False: 378]
  |  |  ------------------
  ------------------
 1854|      6|            appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1855|    378|          else
 1856|    378|            tmpStorage_.push_back((unsigned char)*curCharPtr_++);
 1857|    384|          break;
 1858|  14.3k|      }
 1859|  7.66M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == '\n' || *curCharPtr_ == '\r')) {
  ------------------
  |  |  189|  15.3M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.66M]
  |  |  |  Branch (189:53): [True: 0, False: 7.66M]
  |  |  |  Branch (189:53): [True: 0, False: 7.66M]
  |  |  ------------------
  ------------------
 1860|      0|      if (JSX) {
  ------------------
  |  Branch (1860:11): [Folded - Ignored]
  ------------------
 1861|      0|        tmpStorage_.push_back(*curCharPtr_++);
 1862|      0|      } else {
 1863|      0|        error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1864|      0|        sm_.note(token_.getStartLoc(), "string started here");
 1865|      0|        break;
 1866|      0|      }
 1867|      0|#if HERMES_PARSE_JSX
 1868|  7.66M|    } else if (LLVM_UNLIKELY(JSX && *curCharPtr_ == '&')) {
  ------------------
  |  |  189|  7.66M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [Folded - Ignored]
  |  |  |  Branch (189:53): [Folded - Ignored]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1869|      0|      auto codePoint = consumeHTMLEntityOptional();
 1870|      0|      if (codePoint.hasValue()) {
  ------------------
  |  Branch (1870:11): [True: 0, False: 0]
  ------------------
 1871|      0|        appendUnicodeToStorage(*codePoint);
 1872|      0|      } else {
 1873|      0|        tmpStorage_.push_back(*curCharPtr_++);
 1874|      0|      }
 1875|      0|#endif
 1876|  7.66M|    } else if (LLVM_UNLIKELY(*curCharPtr_ == 0 && curCharPtr_ == bufferEnd_)) {
  ------------------
  |  |  189|  7.68M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 6, False: 7.66M]
  |  |  |  Branch (189:53): [True: 12.1k, False: 7.65M]
  |  |  |  Branch (189:53): [True: 6, False: 12.1k]
  |  |  ------------------
  ------------------
 1877|      6|      error(SMLoc::getFromPointer(curCharPtr_), "non-terminated string");
 1878|      6|      sm_.note(token_.getStartLoc(), "string started here");
 1879|      6|      break;
 1880|  7.66M|    } else {
 1881|  7.66M|      if (LLVM_UNLIKELY(isUTF8Start(*curCharPtr_))) {
  ------------------
  |  |  189|  7.66M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 2.88k, False: 7.66M]
  |  |  ------------------
  ------------------
 1882|       |        // Decode and re-encode the character and append it to the string
 1883|       |        // storage
 1884|  2.88k|        appendUnicodeToStorage(_decodeUTF8SlowPath(curCharPtr_));
 1885|  7.66M|      } else {
 1886|  7.66M|        tmpStorage_.push_back(*curCharPtr_++);
 1887|  7.66M|      }
 1888|  7.66M|    }
 1889|  7.69M|  }
 1890|  15.5k|breakLoop:
 1891|  15.5k|  token_.setStringLiteral(getStringLiteral(tmpStorage_.str()), escapes);
 1892|  15.5k|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextEENK3$_3clEv:
 1492|  1.07M|      [this, &radix, start, &legacyOctal]() -> void {
 1493|  1.07M|    assert(
 1494|  1.07M|        legacyOctal &&
 1495|  1.07M|        "updateLegacyOctalRadix can only be called in legacyOctal mode");
 1496|      0|    (void)legacyOctal;
 1497|  2.15M|    for (auto *scanPtr = start; scanPtr != curCharPtr_; ++scanPtr) {
  ------------------
  |  Branch (1497:33): [True: 1.07M, False: 1.07M]
  ------------------
 1498|  1.07M|      if (*scanPtr == '.' || *scanPtr == 'e') {
  ------------------
  |  Branch (1498:11): [True: 0, False: 1.07M]
  |  Branch (1498:30): [True: 0, False: 1.07M]
  ------------------
 1499|      0|        break;
 1500|      0|      }
 1501|  1.07M|      if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
  ------------------
  |  |  189|  2.15M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 162, False: 1.07M]
  |  |  ------------------
  ------------------
                    if (LLVM_UNLIKELY(*scanPtr >= '8') && LLVM_LIKELY(*scanPtr != '_')) {
  ------------------
  |  |  188|    162|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 162, False: 0]
  |  |  ------------------
  ------------------
 1502|    162|        sm_.warning(
 1503|    162|            SMRange(token_.getStartLoc(), SMLoc::getFromPointer(curCharPtr_)),
 1504|    162|            "Numeric literal starts with 0 but contains an 8 or 9 digit. "
 1505|    162|            "Interpreting as decimal (not octal).");
 1506|    162|        radix = 10;
 1507|    162|        break;
 1508|    162|      }
 1509|  1.07M|    }
 1510|  1.07M|  };
JSLexer.cpp:_ZN6hermes6parserL17matchReservedWordEPKcj:
 1632|  1.32M|static TokenKind matchReservedWord(const char *str, unsigned len) {
 1633|  1.32M|  return llvh::StringSwitch<TokenKind>(llvh::StringRef(str, len))
 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
 1635|  1.32M|#include "hermes/Parser/TokenKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|  1.32M|#ifndef TOK
  |  |    9|  1.32M|#define TOK(name, str)
  |  |   10|  1.32M|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RESWORD
  |  |   13|       |#define RESWORD(name) TOK(rw_##name, #name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|  1.32M|#ifndef PUNCTUATOR
  |  |   17|  1.32M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|  1.32M|#endif
  |  |   19|       |
  |  |   20|  1.32M|#ifndef PUNCTUATOR_FLOW
  |  |   21|  1.32M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|  1.32M|#endif
  |  |   23|       |
  |  |   24|  1.32M|#ifndef BINOP
  |  |   25|  1.32M|#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|  1.32M|#endif
  |  |   27|       |
  |  |   28|  1.32M|#ifndef TEMPLATE
  |  |   29|  1.32M|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|  1.32M|#endif
  |  |   31|       |
  |  |   32|  1.32M|#ifndef RANGE_MARKER
  |  |   33|  1.32M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   34|  1.32M|#endif
  |  |   35|       |
  |  |   36|       |// clang-format off
  |  |   37|       |
  |  |   38|  1.32M|TOK(none, "<none>")
  |  |   39|  1.32M|TOK(identifier, "identifier")
  |  |   40|  1.32M|TOK(private_identifier, "private identifier")
  |  |   41|       |
  |  |   42|  1.32M|RANGE_MARKER(_first_resword)
  |  |   43|  1.32M|RESWORD(function)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   44|  1.32M|RESWORD(for)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   45|  1.32M|RESWORD(if)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   46|  1.32M|RESWORD(in)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   47|  1.32M|RESWORD(var)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   48|  1.32M|RESWORD(break)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   49|  1.32M|RESWORD(continue)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   50|  1.32M|RESWORD(return)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   51|  1.32M|RESWORD(switch)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   52|  1.32M|RESWORD(this)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   53|       |
  |  |   54|  1.32M|RESWORD(true)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   55|  1.32M|RESWORD(false)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   56|  1.32M|RESWORD(null)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   57|  1.32M|RESWORD(case)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   58|  1.32M|RESWORD(catch)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   59|  1.32M|RESWORD(const)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   60|  1.32M|RESWORD(debugger)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   61|  1.32M|RESWORD(default)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   62|  1.32M|RESWORD(delete)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   63|  1.32M|RESWORD(do)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   64|  1.32M|RESWORD(else)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   65|  1.32M|RESWORD(finally)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   66|  1.32M|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   67|  1.32M|RESWORD(new)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   68|  1.32M|RESWORD(throw)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   69|  1.32M|RESWORD(try)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   70|  1.32M|RESWORD(typeof)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   71|  1.32M|RESWORD(void)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   72|  1.32M|RESWORD(while)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   73|  1.32M|RESWORD(with)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   74|       |
  |  |   75|  1.32M|RESWORD(export)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   76|  1.32M|RESWORD(import)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   77|       |
  |  |   78|  1.32M|RESWORD(class)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   79|  1.32M|RESWORD(static)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   80|  1.32M|RESWORD(extends)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   81|  1.32M|RESWORD(super)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   82|       |
  |  |   83|       |// Future reserved words
  |  |   84|  1.32M|RESWORD(enum)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   85|       |
  |  |   86|       |// Strict mode future reserved words
  |  |   87|  1.32M|RESWORD(implements)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   88|  1.32M|RESWORD(interface)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   89|  1.32M|RESWORD(package)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   90|  1.32M|RESWORD(private)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   91|  1.32M|RESWORD(protected)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   92|  1.32M|RESWORD(public)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   93|  1.32M|RESWORD(yield)
  |  |  ------------------
  |  |  |  | 1634|  1.32M|#define RESWORD(name) .Case(#name, TokenKind::rw_##name)
  |  |  ------------------
  |  |   94|  1.32M|RANGE_MARKER(_last_resword)
  |  |   95|       |
  |  |   96|  1.32M|PUNCTUATOR(l_brace,             "{")
  |  |   97|  1.32M|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |   98|  1.32M|PUNCTUATOR(r_brace,             "}")
  |  |   99|  1.32M|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  100|  1.32M|PUNCTUATOR(l_paren,             "(")
  |  |  101|  1.32M|PUNCTUATOR(r_paren,             ")")
  |  |  102|  1.32M|PUNCTUATOR(l_square,            "[")
  |  |  103|  1.32M|PUNCTUATOR(r_square,            "]")
  |  |  104|  1.32M|PUNCTUATOR(period,              ".")
  |  |  105|  1.32M|PUNCTUATOR(questiondot,         "?.")
  |  |  106|  1.32M|PUNCTUATOR(dotdotdot,           "...")
  |  |  107|  1.32M|PUNCTUATOR(semi,                ";")
  |  |  108|  1.32M|PUNCTUATOR(comma,               ",")
  |  |  109|  1.32M|PUNCTUATOR(plusplus,            "++")
  |  |  110|  1.32M|PUNCTUATOR(minusminus,          "--")
  |  |  111|  1.32M|RANGE_MARKER(_first_binary)
  |  |  112|  1.32M|BINOP(     starstar,            "**",  12)
  |  |  113|  1.32M|BINOP(     star,                "*",   11)
  |  |  114|  1.32M|BINOP(     percent,             "%",   11)
  |  |  115|  1.32M|BINOP(     slash,               "/",   11)
  |  |  116|  1.32M|BINOP(     plus,                "+",   10)
  |  |  117|  1.32M|BINOP(     minus,               "-",   10)
  |  |  118|  1.32M|BINOP(     lessless,            "<<",   9)
  |  |  119|  1.32M|BINOP(     greatergreater,      ">>",   9)
  |  |  120|  1.32M|BINOP(     greatergreatergreater,">>>", 9)
  |  |  121|  1.32M|BINOP(     less,                "<",    8)
  |  |  122|  1.32M|BINOP(     greater,             ">",    8)
  |  |  123|  1.32M|BINOP(     lessequal,           "<=",   8)
  |  |  124|  1.32M|BINOP(     greaterequal,        ">=",   8)
  |  |  125|  1.32M|BINOP(     equalequal,          "==",   7)
  |  |  126|  1.32M|BINOP(     exclaimequal,        "!=",   7)
  |  |  127|  1.32M|BINOP(     equalequalequal,     "===",  7)
  |  |  128|  1.32M|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  129|  1.32M|BINOP(     amp,                 "&",    6)
  |  |  130|  1.32M|BINOP(     caret,               "^",    5)
  |  |  131|  1.32M|BINOP(     pipe,                "|",    4)
  |  |  132|  1.32M|BINOP(     ampamp,              "&&",   3)
  |  |  133|  1.32M|BINOP(     pipepipe,            "||",   2)
  |  |  134|  1.32M|BINOP(     questionquestion,    "??",   1)
  |  |  135|  1.32M|RANGE_MARKER(_last_binary)
  |  |  136|  1.32M|PUNCTUATOR(exclaim,             "!")
  |  |  137|  1.32M|PUNCTUATOR(tilde,               "~")
  |  |  138|  1.32M|PUNCTUATOR(question,            "?")
  |  |  139|  1.32M|PUNCTUATOR(colon,               ":")
  |  |  140|  1.32M|PUNCTUATOR(equal,               "=")
  |  |  141|  1.32M|PUNCTUATOR(plusequal,           "+=")
  |  |  142|  1.32M|PUNCTUATOR(minusequal,          "-=")
  |  |  143|  1.32M|PUNCTUATOR(starequal,           "*=")
  |  |  144|  1.32M|PUNCTUATOR(starstarequal,       "**=")
  |  |  145|  1.32M|PUNCTUATOR(percentequal,        "%=")
  |  |  146|  1.32M|PUNCTUATOR(slashequal,          "/=")
  |  |  147|  1.32M|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  148|  1.32M|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  149|  1.32M|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  150|  1.32M|PUNCTUATOR(ampequal,            "&=")
  |  |  151|  1.32M|PUNCTUATOR(pipeequal,           "|=")
  |  |  152|  1.32M|PUNCTUATOR(ampampequal,         "&&=")
  |  |  153|  1.32M|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  154|  1.32M|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  155|  1.32M|PUNCTUATOR(caretequal,          "^=")
  |  |  156|  1.32M|PUNCTUATOR(equalgreater,        "=>")
  |  |  157|       |
  |  |  158|  1.32M|TOK(numeric_literal, "number")
  |  |  159|  1.32M|TOK(string_literal, "string")
  |  |  160|  1.32M|TOK(regexp_literal, "regexp")
  |  |  161|  1.32M|TOK(jsx_text, "JSX text")
  |  |  162|  1.32M|TOK(bigint_literal, "bigint")
  |  |  163|       |
  |  |  164|  1.32M|TEMPLATE(no_substitution_template, "template literal")
  |  |  165|  1.32M|TEMPLATE(template_head, "template literal start")
  |  |  166|  1.32M|TEMPLATE(template_middle, "template literal resume")
  |  |  167|  1.32M|TEMPLATE(template_tail, "template literal end")
  |  |  168|       |
  |  |  169|  1.32M|TOK(eof, "<eof>")
  |  |  170|  1.32M|RANGE_MARKER(_last_token)
  |  |  171|       |
  |  |  172|  1.32M|#undef TOK
  |  |  173|  1.32M|#undef RESWORD
  |  |  174|  1.32M|#undef PUNCTUATOR
  |  |  175|  1.32M|#undef PUNCTUATOR_FLOW
  |  |  176|  1.32M|#undef BINOP
  |  |  177|  1.32M|#undef TEMPLATE
  |  |  178|  1.32M|#undef RANGE_MARKER
  ------------------
 1636|  1.32M|      .Default(TokenKind::identifier);
 1637|  1.32M|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer19scanTemplateLiteralEvENK3$_4clEc:
 1922|     62|  const auto trv = [](char c) -> char {
 1923|     62|    if (c == '\r') {
  ------------------
  |  Branch (1923:9): [True: 44, False: 18]
  ------------------
 1924|       |      // This case takes \r and \r\n into account.
 1925|       |      // The code below which consumes line separators will skip the following
 1926|       |      // \n if there is a \r\n.
 1927|       |      // For the purposes of finding the TRV it doesn't matter.
 1928|     44|      return 0x0a;
 1929|     44|    }
 1930|     18|    return c;
 1931|     62|  };
_ZN6hermes6parser7JSLexer22scanIdentifierFastPathILNS1_14IdentifierModeE0EEEvPKc:
 1663|  1.32M|void JSLexer::scanIdentifierFastPath(const char *start) {
 1664|  1.32M|  const char *end = start;
 1665|       |
 1666|       |  // Quickly consume the ASCII identifier part.
 1667|  1.32M|  char ch;
 1668|  1.32M|  do
 1669|  10.8M|    ch = (unsigned char)*++end;
 1670|  10.8M|  while (ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z') ||
  ------------------
  |  Branch (1670:10): [True: 89, False: 10.8M]
  |  Branch (1670:23): [True: 1.21k, False: 10.8M]
  |  Branch (1670:37): [True: 5.95M, False: 4.85M]
  |  Branch (1670:57): [True: 5.36M, False: 591k]
  ------------------
 1671|  10.8M|         (ch >= '0' && ch <= '9') ||
  ------------------
  |  Branch (1671:11): [True: 5.22M, False: 216k]
  |  Branch (1671:24): [True: 4.11M, False: 1.10M]
  ------------------
 1672|  10.8M|         (Mode == IdentifierMode::JSX && ch == '-') ||
  ------------------
  |  Branch (1672:11): [Folded - Ignored]
  |  Branch (1672:42): [True: 0, False: 0]
  ------------------
 1673|  10.8M|         (Mode == IdentifierMode::Flow && ch == '@'));
  ------------------
  |  Branch (1673:11): [Folded - Ignored]
  |  Branch (1673:43): [True: 0, False: 0]
  ------------------
 1674|       |
 1675|       |  // Check whether a slow part of the identifier follows.
 1676|  1.32M|  if (LLVM_UNLIKELY(ch == '\\')) {
  ------------------
  |  |  189|  1.32M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.32M]
  |  |  ------------------
  ------------------
 1677|       |    // An escape. Pass the baton to the slow path.
 1678|      0|    initStorageWith(start, end);
 1679|      0|    curCharPtr_ = end;
 1680|      0|    scanIdentifierParts<Mode>();
 1681|      0|    return;
 1682|  1.32M|  } else if (LLVM_UNLIKELY(isUTF8Start(ch))) {
  ------------------
  |  |  189|  1.32M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 1.79k, False: 1.32M]
  |  |  ------------------
  ------------------
 1683|       |    // If we have encountered a Unicode character, we try to decode it. If it
 1684|       |    // can be a part of the identifier,
 1685|       |    // we consume it, otherwise we leave it alone.
 1686|  1.79k|    auto decoded = _peekUTF8(end);
 1687|  1.79k|    if (isUnicodeIDContinue(decoded.first)) {
  ------------------
  |  Branch (1687:9): [True: 1.79k, False: 1]
  ------------------
 1688|  1.79k|      initStorageWith(start, end);
 1689|  1.79k|      appendUnicodeToStorage(decoded.first);
 1690|  1.79k|      curCharPtr_ = decoded.second;
 1691|  1.79k|      scanIdentifierParts<Mode>();
 1692|  1.79k|      return;
 1693|  1.79k|    }
 1694|  1.79k|  }
 1695|       |
 1696|  1.32M|  curCharPtr_ = end;
 1697|       |
 1698|  1.32M|  size_t length = end - start;
 1699|       |
 1700|  1.32M|  auto rw = scanReservedWord(start, (unsigned)length);
 1701|  1.32M|  if (rw != TokenKind::identifier) {
  ------------------
  |  Branch (1701:7): [True: 12.1k, False: 1.31M]
  ------------------
 1702|  12.1k|    token_.setResWord(rw, resWordIdent(rw));
 1703|  1.31M|  } else {
 1704|  1.31M|    token_.setIdentifier(getIdentifier(llvh::StringRef(start, length)));
 1705|  1.31M|  }
 1706|  1.32M|}
_ZN6hermes6parser7JSLexer19scanIdentifierPartsILNS1_14IdentifierModeE0EEEvv:
 1709|  1.81k|void JSLexer::scanIdentifierParts() {
 1710|  1.81k|  consumeIdentifierParts<Mode>();
 1711|  1.81k|  token_.setIdentifier(getIdentifier(tmpStorage_.str()));
 1712|  1.81k|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer10lookahead1ENS_8OptValueINS0_9TokenKindEEEENK3$_1clEv:
  917|     18|  auto commentScope = llvh::make_scope_exit([&] {
  918|     18|    if (storeComments_)
  ------------------
  |  Branch (918:9): [True: 0, False: 18]
  ------------------
  919|      0|      commentStorage_.erase(
  920|      0|          commentStorage_.begin() + savedCommentStorageSize,
  921|      0|          commentStorage_.end());
  922|     18|  });
_ZN6hermes6parser7JSLexer22consumeIdentifierPartsILNS1_14IdentifierModeE0EEEvv:
 1080|  1.84k|void JSLexer::consumeIdentifierParts() {
 1081|  13.9k|  for (;;) {
 1082|       |    // Try consuming an non-escaped identifier part. Failing that, check for an
 1083|       |    // escape.
 1084|  13.9k|    if (consumeOneIdentifierPartNoEscape<Mode>())
  ------------------
  |  Branch (1084:9): [True: 12.1k, False: 1.84k]
  ------------------
 1085|  12.1k|      continue;
 1086|  1.84k|    else if (*curCharPtr_ == '\\') {
  ------------------
  |  Branch (1086:14): [True: 0, False: 1.84k]
  ------------------
 1087|       |      // Decode the escape.
 1088|      0|      SMLoc startLoc = SMLoc::getFromPointer(curCharPtr_);
 1089|      0|      uint32_t cp = consumeUnicodeEscape();
 1090|      0|      if (!isUnicodeIDContinue(cp)) {
  ------------------
  |  Branch (1090:11): [True: 0, False: 0]
  ------------------
 1091|      0|        errorRange(
 1092|      0|            startLoc,
 1093|      0|            "Unicode escape \\u" + Twine::utohexstr(cp) +
 1094|      0|                "is not a valid identifier codepoint");
 1095|      0|      } else {
 1096|      0|        appendUnicodeToStorage(cp);
 1097|      0|      }
 1098|      0|    } else
 1099|  1.84k|      break;
 1100|  13.9k|  }
 1101|  1.84k|}
JSLexer.cpp:_ZZN6hermes6parser7JSLexer10scanNumberENS1_14GrammarContextEENK3$_2clEh:
 1472|     38|              digits, radix, [](uint8_t) {})) {
_ZN6hermes6parser7JSLexer32consumeOneIdentifierPartNoEscapeILNS1_14IdentifierModeE0EEEbv:
 1058|  70.5k|bool JSLexer::consumeOneIdentifierPartNoEscape() {
 1059|  70.5k|  char ch = *curCharPtr_;
 1060|  70.5k|  if (ch == '_' || ch == '$' || ((ch | 32) >= 'a' && (ch | 32) <= 'z') ||
  ------------------
  |  Branch (1060:7): [True: 0, False: 70.5k]
  |  Branch (1060:20): [True: 0, False: 70.5k]
  |  Branch (1060:34): [True: 30.4k, False: 40.0k]
  |  Branch (1060:54): [True: 29.9k, False: 535]
  ------------------
 1061|  70.5k|      (ch >= '0' && ch <= '9') || (Mode == IdentifierMode::JSX && ch == '-') ||
  ------------------
  |  Branch (1061:8): [True: 24.2k, False: 16.4k]
  |  Branch (1061:21): [True: 771, False: 23.4k]
  |  Branch (1061:36): [Folded - Ignored]
  |  Branch (1061:67): [True: 0, False: 0]
  ------------------
 1062|  70.5k|      (Mode == IdentifierMode::Flow && ch == '@')) {
  ------------------
  |  Branch (1062:8): [Folded - Ignored]
  |  Branch (1062:40): [True: 0, False: 0]
  ------------------
 1063|  30.7k|    tmpStorage_.push_back(*curCharPtr_++);
 1064|  30.7k|    return true;
 1065|  39.8k|  } else if (LLVM_UNLIKELY(isUTF8Start(ch))) {
  ------------------
  |  |  189|  39.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 3.84k, False: 36.0k]
  |  |  ------------------
  ------------------
 1066|       |    // If we have encountered a Unicode character, we try to decode it. If it
 1067|       |    // can be a part of the identifier, we consume it, otherwise we leave it
 1068|       |    // alone.
 1069|  3.84k|    auto decoded = _peekUTF8();
 1070|  3.84k|    if (isUnicodeIDContinue(decoded.first)) {
  ------------------
  |  Branch (1070:9): [True: 3.84k, False: 0]
  ------------------
 1071|  3.84k|      appendUnicodeToStorage(decoded.first);
 1072|  3.84k|      curCharPtr_ = decoded.second;
 1073|  3.84k|      return true;
 1074|  3.84k|    }
 1075|  3.84k|  }
 1076|  36.0k|  return false;
 1077|  70.5k|}

_ZN6hermes6parser8JSParserC2ERNS_7ContextENSt3__110unique_ptrIN4llvh12MemoryBufferENS4_14default_deleteIS7_EEEE:
   16|     99|    : impl_(new detail::JSParserImpl(context, std::move(input))) {}
_ZN6hermes6parser8JSParserC2ERNS_7ContextEjNS0_10ParserPassE:
   19|     65|    : impl_(new detail::JSParserImpl(context, bufferId, pass)) {}
_ZN6hermes6parser8JSParserD2Ev:
   21|    164|JSParser::~JSParser() = default;
_ZN6hermes6parser8JSParser5parseEv:
   55|    164|llvh::Optional<ESTree::ProgramNode *> JSParser::parse() {
   56|    164|  return impl_->parse();
   57|    164|}
_ZN6hermes6parser8JSParser14preParseBufferERNS_7ContextEjRb:
   66|     99|    bool &useStaticBuiltinDetected) {
   67|     99|  return detail::JSParserImpl::preParseBuffer(
   68|     99|      context, bufferId, useStaticBuiltinDetected);
   69|     99|}

_ZN6hermes6parser6detail12JSParserImplC2ERNS_7ContextENSt3__110unique_ptrIN4llvh12MemoryBufferENS5_14default_deleteIS8_EEEE:
   34|     99|      pass_(FullParse) {
   35|     99|  initializeIdentifiers();
   36|     99|}
_ZN6hermes6parser6detail12JSParserImplC2ERNS_7ContextEjNS0_10ParserPassE:
   47|    164|      pass_(pass) {
   48|    164|  preParsed_ = context.getPreParsedBufferInfo(bufferId);
   49|    164|  initializeIdentifiers();
   50|    164|}
_ZN6hermes6parser6detail12JSParserImpl21initializeIdentifiersEv:
   52|    263|void JSParserImpl::initializeIdentifiers() {
   53|    263|  getIdent_ = lexer_.getIdentifier("get");
   54|    263|  setIdent_ = lexer_.getIdentifier("set");
   55|    263|  initIdent_ = lexer_.getIdentifier("init");
   56|    263|  useStrictIdent_ = lexer_.getIdentifier("use strict");
   57|    263|  showSourceIdent_ = lexer_.getIdentifier("show source");
   58|    263|  hideSourceIdent_ = lexer_.getIdentifier("hide source");
   59|    263|  sensitiveIdent_ = lexer_.getIdentifier("sensitive");
   60|    263|  useStaticBuiltinIdent_ = lexer_.getIdentifier("use static builtin");
   61|    263|  letIdent_ = lexer_.getIdentifier("let");
   62|    263|  ofIdent_ = lexer_.getIdentifier("of");
   63|    263|  fromIdent_ = lexer_.getIdentifier("from");
   64|    263|  asIdent_ = lexer_.getIdentifier("as");
   65|    263|  implementsIdent_ = lexer_.getIdentifier("implements");
   66|    263|  interfaceIdent_ = lexer_.getIdentifier("interface");
   67|    263|  packageIdent_ = lexer_.getIdentifier("package");
   68|    263|  privateIdent_ = lexer_.getIdentifier("private");
   69|    263|  protectedIdent_ = lexer_.getIdentifier("protected");
   70|    263|  publicIdent_ = lexer_.getIdentifier("public");
   71|    263|  staticIdent_ = lexer_.getIdentifier("static");
   72|    263|  methodIdent_ = lexer_.getIdentifier("method");
   73|    263|  constructorIdent_ = lexer_.getIdentifier("constructor");
   74|    263|  yieldIdent_ = lexer_.getIdentifier("yield");
   75|    263|  newIdent_ = lexer_.getIdentifier("new");
   76|    263|  targetIdent_ = lexer_.getIdentifier("target");
   77|    263|  importIdent_ = lexer_.getIdentifier("import");
   78|    263|  metaIdent_ = lexer_.getIdentifier("meta");
   79|    263|  valueIdent_ = lexer_.getIdentifier("value");
   80|    263|  typeIdent_ = lexer_.getIdentifier("type");
   81|    263|  asyncIdent_ = lexer_.getIdentifier("async");
   82|    263|  awaitIdent_ = lexer_.getIdentifier("await");
   83|    263|  assertIdent_ = lexer_.getIdentifier("assert");
   84|       |
   85|    263|#if HERMES_PARSE_FLOW
   86|       |
   87|    263|  typeofIdent_ = lexer_.getIdentifier("typeof");
   88|    263|  declareIdent_ = lexer_.getIdentifier("declare");
   89|    263|  protoIdent_ = lexer_.getIdentifier("proto");
   90|    263|  opaqueIdent_ = lexer_.getIdentifier("opaque");
   91|    263|  plusIdent_ = lexer_.getIdentifier("plus");
   92|    263|  minusIdent_ = lexer_.getIdentifier("minus");
   93|    263|  moduleIdent_ = lexer_.getIdentifier("module");
   94|    263|  exportsIdent_ = lexer_.getIdentifier("exports");
   95|    263|  esIdent_ = lexer_.getIdentifier("ES");
   96|    263|  commonJSIdent_ = lexer_.getIdentifier("CommonJS");
   97|    263|  mixinsIdent_ = lexer_.getIdentifier("mixins");
   98|    263|  thisIdent_ = lexer_.getIdentifier("this");
   99|       |
  100|    263|  anyIdent_ = lexer_.getIdentifier("any");
  101|    263|  mixedIdent_ = lexer_.getIdentifier("mixed");
  102|    263|  emptyIdent_ = lexer_.getIdentifier("empty");
  103|    263|  booleanIdent_ = lexer_.getIdentifier("boolean");
  104|    263|  boolIdent_ = lexer_.getIdentifier("bool");
  105|    263|  numberIdent_ = lexer_.getIdentifier("number");
  106|    263|  stringIdent_ = lexer_.getIdentifier("string");
  107|    263|  voidIdent_ = lexer_.getIdentifier("void");
  108|    263|  nullIdent_ = lexer_.getIdentifier("null");
  109|    263|  symbolIdent_ = lexer_.getIdentifier("symbol");
  110|    263|  bigintIdent_ = lexer_.getIdentifier("bigint");
  111|       |
  112|    263|  checksIdent_ = lexer_.getIdentifier("%checks");
  113|       |
  114|    263|#endif
  115|       |
  116|    263|#if HERMES_PARSE_TS
  117|       |
  118|    263|  namespaceIdent_ = lexer_.getIdentifier("namespace");
  119|    263|  readonlyIdent_ = lexer_.getIdentifier("readonly");
  120|    263|  isIdent_ = lexer_.getIdentifier("is");
  121|       |
  122|    263|#endif
  123|       |
  124|       |  // Generate the string representation of all tokens.
  125|  32.0k|  for (unsigned i = 0; i != NUM_JS_TOKENS; ++i)
  ------------------
  |  Branch (125:24): [True: 31.8k, False: 263]
  ------------------
  126|  31.8k|    tokenIdent_[i] = lexer_.getIdentifier(tokenKindStr((TokenKind)i));
  127|    263|}
_ZN6hermes6parser6detail12JSParserImpl5parseEv:
  129|    263|Optional<ESTree::ProgramNode *> JSParserImpl::parse() {
  130|    263|  PerfSection parsing("Parsing JavaScript");
  131|    263|  tok_ = lexer_.advance();
  132|    263|  auto res = parseProgram();
  133|    263|  if (!res)
  ------------------
  |  Branch (133:7): [True: 20, False: 243]
  ------------------
  134|     20|    return None;
  135|    243|  if (lexer_.getSourceMgr().getErrorCount() != 0)
  ------------------
  |  Branch (135:7): [True: 14, False: 229]
  ------------------
  136|     14|    return None;
  137|    229|  return res.getValue();
  138|    243|}
_ZN6hermes6parser6detail12JSParserImpl13errorExpectedEN4llvh8ArrayRefINS0_9TokenKindEEEPKcS8_NS3_5SMLocE:
  144|      7|    SMLoc whatLoc) {
  145|      7|  llvh::SmallString<4> str;
  146|      7|  llvh::raw_svector_ostream ss{str};
  147|       |
  148|     14|  for (unsigned i = 0; i < toks.size(); ++i) {
  ------------------
  |  Branch (148:24): [True: 7, False: 7]
  ------------------
  149|       |    // Insert a separator after the first token.
  150|      7|    if (i > 0) {
  ------------------
  |  Branch (150:9): [True: 0, False: 7]
  ------------------
  151|       |      // Use " or " instead of ", " before the last token.
  152|      0|      if (i == toks.size() - 1)
  ------------------
  |  Branch (152:11): [True: 0, False: 0]
  ------------------
  153|      0|        ss << " or ";
  154|      0|      else
  155|      0|        ss << ", ";
  156|      0|    }
  157|      7|    ss << "'" << tokenKindStr(toks[i]) << "'";
  158|      7|  }
  159|       |
  160|      7|  ss << " expected";
  161|       |
  162|       |  // Optionally append the 'where' description.
  163|      7|  if (where)
  ------------------
  |  Branch (163:7): [True: 7, False: 0]
  ------------------
  164|      7|    ss << " " << where;
  165|       |
  166|      7|  SMLoc errorLoc = tok_->getStartLoc();
  167|      7|  SourceErrorManager::SourceCoords curCoords;
  168|      7|  SourceErrorManager::SourceCoords whatCoords;
  169|       |
  170|       |  // If the location of 'what' is provided, find its and the error's source
  171|       |  // coordinates.
  172|      7|  if (whatLoc.isValid()) {
  ------------------
  |  Branch (172:7): [True: 7, False: 0]
  ------------------
  173|      7|    sm_.findBufferLineAndLoc(errorLoc, curCoords);
  174|      7|    sm_.findBufferLineAndLoc(whatLoc, whatCoords);
  175|      7|  }
  176|       |
  177|      7|  if (whatCoords.isSameSourceLineAs(curCoords)) {
  ------------------
  |  Branch (177:7): [True: 5, False: 2]
  ------------------
  178|       |    // If the what source coordinates are on the same line as the error, show
  179|       |    // them both.
  180|      5|    sm_.error(
  181|      5|        errorLoc,
  182|      5|        SourceErrorManager::combineIntoRange(whatLoc, errorLoc),
  183|      5|        ss.str(),
  184|      5|        Subsystem::Parser);
  185|      5|  } else {
  186|      2|    sm_.error(errorLoc, ss.str(), Subsystem::Parser);
  187|       |
  188|      2|    if (what && whatCoords.isValid())
  ------------------
  |  Branch (188:9): [True: 2, False: 0]
  |  Branch (188:17): [True: 2, False: 0]
  ------------------
  189|      2|      sm_.note(whatLoc, what, Subsystem::Parser);
  190|      2|  }
  191|      7|}
_ZN6hermes6parser6detail12JSParserImpl4needENS0_9TokenKindEPKcS5_N4llvh5SMLocE:
  197|   340k|    SMLoc whatLoc) {
  198|   340k|  if (tok_->getKind() == kind) {
  ------------------
  |  Branch (198:7): [True: 340k, False: 6]
  ------------------
  199|   340k|    return true;
  200|   340k|  }
  201|      6|  errorExpected(kind, where, what, whatLoc);
  202|      6|  return false;
  203|   340k|}
_ZN6hermes6parser6detail12JSParserImpl3eatENS0_9TokenKindENS0_7JSLexer14GrammarContextEPKcS7_N4llvh5SMLocE:
  210|   330k|    SMLoc whatLoc) {
  211|   330k|  if (need(kind, where, what, whatLoc)) {
  ------------------
  |  Branch (211:7): [True: 330k, False: 6]
  ------------------
  212|   330k|    advance(grammarContext);
  213|   330k|    return true;
  214|   330k|  }
  215|      6|  return false;
  216|   330k|}
_ZN6hermes6parser6detail12JSParserImpl11checkAndEatENS0_9TokenKindENS0_7JSLexer14GrammarContextE:
  220|  5.97M|    JSLexer::GrammarContext grammarContext) {
  221|  5.97M|  if (tok_->getKind() == kind) {
  ------------------
  |  Branch (221:7): [True: 1.76M, False: 4.21M]
  ------------------
  222|  1.76M|    advance(grammarContext);
  223|  1.76M|    return true;
  224|  1.76M|  }
  225|  4.21M|  return false;
  226|  5.97M|}
_ZNK6hermes6parser6detail12JSParserImpl11checkAssignEv:
  238|  2.32M|bool JSParserImpl::checkAssign() const {
  239|  2.32M|  return checkN(
  240|  2.32M|      TokenKind::equal,
  241|  2.32M|      TokenKind::starequal,
  242|  2.32M|      TokenKind::slashequal,
  243|  2.32M|      TokenKind::percentequal,
  244|  2.32M|      TokenKind::plusequal,
  245|  2.32M|      TokenKind::minusequal,
  246|  2.32M|      TokenKind::lesslessequal,
  247|  2.32M|      TokenKind::greatergreaterequal,
  248|  2.32M|      TokenKind::greatergreatergreaterequal,
  249|  2.32M|      TokenKind::starstarequal,
  250|  2.32M|      TokenKind::pipepipeequal,
  251|  2.32M|      TokenKind::ampampequal,
  252|  2.32M|      TokenKind::questionquestionequal,
  253|  2.32M|      TokenKind::ampequal,
  254|  2.32M|      TokenKind::caretequal,
  255|  2.32M|      TokenKind::pipeequal);
  256|  2.32M|}
_ZNK6hermes6parser6detail12JSParserImpl28checkEndAssignmentExpressionEv:
  258|  9.19k|bool JSParserImpl::checkEndAssignmentExpression() const {
  259|  9.19k|  return checkN(
  ------------------
  |  Branch (259:10): [True: 5.43k, False: 3.75k]
  ------------------
  260|  9.19k|             TokenKind::rw_in,
  261|  9.19k|             ofIdent_,
  262|  9.19k|             TokenKind::r_paren,
  263|  9.19k|             TokenKind::r_brace,
  264|  9.19k|             TokenKind::r_square,
  265|  9.19k|             TokenKind::comma,
  266|  9.19k|             TokenKind::semi,
  267|  9.19k|             TokenKind::colon,
  268|  9.19k|             TokenKind::eof) ||
  269|  9.19k|      lexer_.isNewLineBeforeCurrentToken();
  ------------------
  |  Branch (269:7): [True: 3.75k, False: 0]
  ------------------
  270|  9.19k|}
_ZN6hermes6parser6detail12JSParserImpl18checkAsyncFunctionEv:
  272|     10|bool JSParserImpl::checkAsyncFunction() {
  273|       |  // async [no LineTerminator here] function
  274|       |  // ^
  275|     10|  assert(
  276|     10|      check(asyncIdent_) && "check for async function must occur at 'async'");
  277|       |  // Avoid passing TokenKind::rw_function here, because parseFunctionHelper
  278|       |  // relies on seeing `async` in order to construct its AST node.
  279|       |  // This function must also be idempotent to allow for branching based on its
  280|       |  // result in parseStatementListItem without having to store another flag,
  281|       |  // for example.
  282|      0|  OptValue<TokenKind> optNext = lexer_.lookahead1(llvh::None);
  283|     10|  return optNext.hasValue() && *optNext == TokenKind::rw_function;
  ------------------
  |  Branch (283:10): [True: 4, False: 6]
  |  Branch (283:32): [True: 0, False: 4]
  ------------------
  284|     10|}
_ZN6hermes6parser6detail12JSParserImpl7eatSemiEb:
  286|   354k|bool JSParserImpl::eatSemi(bool optional) {
  287|   354k|  if (tok_->getKind() == TokenKind::semi) {
  ------------------
  |  Branch (287:7): [True: 195k, False: 159k]
  ------------------
  288|   195k|    advance();
  289|   195k|    return true;
  290|   195k|  }
  291|       |
  292|   159k|  if (tok_->getKind() == TokenKind::r_brace ||
  ------------------
  |  Branch (292:7): [True: 2.43k, False: 156k]
  ------------------
  293|   159k|      tok_->getKind() == TokenKind::eof ||
  ------------------
  |  Branch (293:7): [True: 138, False: 156k]
  ------------------
  294|   159k|      lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (294:7): [True: 156k, False: 0]
  ------------------
  295|   159k|    return true;
  296|   159k|  }
  297|       |
  298|      0|  if (!optional)
  ------------------
  |  Branch (298:7): [True: 0, False: 0]
  ------------------
  299|      0|    error(tok_->getStartLoc(), "';' expected");
  300|      0|  return false;
  301|   159k|}
_ZN6hermes6parser6detail12JSParserImpl16processDirectiveEPNS_12UniqueStringE:
  303|      1|void JSParserImpl::processDirective(UniqueString *directive) {
  304|      1|  seenDirectives_.push_back(directive);
  305|      1|  if (directive == useStrictIdent_)
  ------------------
  |  Branch (305:7): [True: 0, False: 1]
  ------------------
  306|      0|    setStrictMode(true);
  307|      1|  if (directive == useStaticBuiltinIdent_)
  ------------------
  |  Branch (307:7): [True: 0, False: 1]
  ------------------
  308|      0|    setUseStaticBuiltin();
  309|      1|}
_ZN6hermes6parser6detail12JSParserImpl22recursionDepthExceededEv:
  311|      3|bool JSParserImpl::recursionDepthExceeded() {
  312|      3|  error(
  313|      3|      tok_->getStartLoc(),
  314|      3|      "Too many nested expressions/statements/declarations");
  315|      3|  return true;
  316|      3|}
_ZN6hermes6parser6detail12JSParserImpl12parseProgramEv:
  318|    263|Optional<ESTree::ProgramNode *> JSParserImpl::parseProgram() {
  319|    263|  SMLoc startLoc = tok_->getStartLoc();
  320|    263|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
  321|    263|  ESTree::NodeList stmtList;
  322|       |
  323|    263|  if (!parseStatementList(
  ------------------
  |  Branch (323:7): [True: 20, False: 243]
  ------------------
  324|    263|          Param{}, TokenKind::eof, true, AllowImportExport::Yes, stmtList))
  325|     20|    return None;
  326|       |
  327|    243|  SMLoc endLoc = startLoc;
  328|    243|  if (!stmtList.empty()) {
  ------------------
  |  Branch (328:7): [True: 240, False: 3]
  ------------------
  329|    240|    endLoc = stmtList.back().getEndLoc();
  330|    240|  }
  331|    243|  auto *program = setLocation(
  332|    243|      startLoc,
  333|    243|      endLoc,
  334|    243|      new (context_) ESTree::ProgramNode(std::move(stmtList)));
  335|    243|  return program;
  336|    263|}
_ZN6hermes6parser6detail12JSParserImpl24parseFunctionDeclarationENS1_5ParamEb:
  339|  4.91k|JSParserImpl::parseFunctionDeclaration(Param param, bool forceEagerly) {
  340|  4.91k|  auto optRes = parseFunctionHelper(param, true, forceEagerly);
  341|  4.91k|  if (!optRes)
  ------------------
  |  Branch (341:7): [True: 2, False: 4.91k]
  ------------------
  342|      2|    return None;
  343|  4.91k|  return cast<ESTree::FunctionDeclarationNode>(*optRes);
  344|  4.91k|}
_ZN6hermes6parser6detail12JSParserImpl19parseFunctionHelperENS1_5ParamEbb:
  349|  4.91k|    bool forceEagerly) {
  350|       |  // function or async function
  351|  4.91k|  assert(check(TokenKind::rw_function) || check(asyncIdent_));
  352|      0|  bool isAsync = check(asyncIdent_);
  353|       |
  354|  4.91k|  SMLoc startLoc = advance().Start;
  355|       |
  356|  4.91k|  if (isAsync) {
  ------------------
  |  Branch (356:7): [True: 0, False: 4.91k]
  ------------------
  357|       |    // async function
  358|       |    //       ^
  359|      0|    advance();
  360|      0|  }
  361|       |
  362|  4.91k|  bool isGenerator = checkAndEat(TokenKind::star);
  363|       |
  364|       |  // newParamYield setting per the grammar:
  365|       |  // FunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  366|       |  // FunctionExpression: BindingIdentifier[~Yield, ~Await]
  367|       |  // GeneratorFunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  368|       |  // GeneratorFunctionExpression: BindingIdentifier[+Yield, ~Await]
  369|       |  // AsyncFunctionDeclaration: BindingIdentifier[?Yield, ?Await]
  370|       |  // AsyncFunctionExpression: BindingIdentifier[+Yield, +Await]
  371|       |  // AsyncGeneratorDeclaration: BindingIdentifier[?Yield, ?Await]
  372|       |  // AsyncGeneratorExpression: BindingIdentifier[+Yield, +Await]
  373|  4.91k|  bool nameParamYield = isDeclaration ? paramYield_ : isGenerator;
  ------------------
  |  Branch (373:25): [True: 4.91k, False: 0]
  ------------------
  374|  4.91k|  llvh::SaveAndRestore<bool> saveNameParamYield(paramYield_, nameParamYield);
  375|  4.91k|  bool nameParamAwait = isDeclaration ? paramAwait_ : isAsync;
  ------------------
  |  Branch (375:25): [True: 4.91k, False: 0]
  ------------------
  376|  4.91k|  llvh::SaveAndRestore<bool> saveNameParamAwait(paramAwait_, nameParamAwait);
  377|       |
  378|       |  // identifier
  379|  4.91k|  auto optId = parseBindingIdentifier(Param{});
  380|       |  // If this is a default function declaration, then we can match
  381|       |  // [+Default] function ( FormalParameters ) { FunctionBody }
  382|       |  // so the identifier is optional and we can make it nullptr.
  383|  4.91k|  if (isDeclaration && !param.has(ParamDefault) && !optId) {
  ------------------
  |  Branch (383:7): [True: 4.91k, False: 0]
  |  Branch (383:24): [True: 4.91k, False: 0]
  |  Branch (383:52): [True: 0, False: 4.91k]
  ------------------
  384|      0|    errorExpected(
  385|      0|        TokenKind::identifier,
  386|      0|        "after 'function'",
  387|      0|        "location of 'function'",
  388|      0|        startLoc);
  389|      0|    return None;
  390|      0|  }
  391|       |
  392|  4.91k|  ESTree::Node *typeParams = nullptr;
  393|       |
  394|  4.91k|#if HERMES_PARSE_FLOW
  395|  4.91k|  if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (395:7): [True: 0, False: 4.91k]
  |  Branch (395:34): [True: 0, False: 0]
  ------------------
  396|      0|    auto optTypeParams = parseTypeParamsFlow();
  397|      0|    if (!optTypeParams)
  ------------------
  |  Branch (397:9): [True: 0, False: 0]
  ------------------
  398|      0|      return None;
  399|      0|    typeParams = *optTypeParams;
  400|      0|  }
  401|  4.91k|#endif
  402|       |
  403|  4.91k|#if HERMES_PARSE_TS
  404|  4.91k|  if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (404:7): [True: 0, False: 4.91k]
  |  Branch (404:32): [True: 0, False: 0]
  ------------------
  405|      0|    auto optTypeParams = parseTSTypeParameters();
  406|      0|    if (!optTypeParams)
  ------------------
  |  Branch (406:9): [True: 0, False: 0]
  ------------------
  407|      0|      return None;
  408|      0|    typeParams = *optTypeParams;
  409|      0|  }
  410|  4.91k|#endif
  411|       |
  412|       |  // (
  413|  4.91k|  if (!need(
  ------------------
  |  Branch (413:7): [True: 0, False: 4.91k]
  ------------------
  414|  4.91k|          TokenKind::l_paren,
  415|  4.91k|          "at start of function parameter list",
  416|  4.91k|          isDeclaration ? "function declaration starts here"
  ------------------
  |  Branch (416:11): [True: 4.91k, False: 0]
  ------------------
  417|  4.91k|                        : "function expression starts here",
  418|  4.91k|          startLoc)) {
  419|      0|    return None;
  420|      0|  }
  421|       |
  422|  4.91k|  ESTree::NodeList paramList;
  423|       |
  424|  4.91k|  llvh::SaveAndRestore<bool> saveArgsAndBodyParamYield(
  425|  4.91k|      paramYield_, isGenerator);
  426|  4.91k|  llvh::SaveAndRestore<bool> saveArgsAndBodyParamAwait(paramAwait_, isAsync);
  427|       |
  428|  4.91k|  if (!parseFormalParameters(param, paramList))
  ------------------
  |  Branch (428:7): [True: 0, False: 4.91k]
  ------------------
  429|      0|    return None;
  430|       |
  431|  4.91k|  ESTree::Node *returnType = nullptr;
  432|  4.91k|  ESTree::Node *predicate = nullptr;
  433|  4.91k|#if HERMES_PARSE_FLOW
  434|  4.91k|  if (context_.getParseFlow() && check(TokenKind::colon)) {
  ------------------
  |  Branch (434:7): [True: 0, False: 4.91k]
  |  Branch (434:34): [True: 0, False: 0]
  ------------------
  435|      0|    SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
  436|      0|    if (!check(checksIdent_)) {
  ------------------
  |  Branch (436:9): [True: 0, False: 0]
  ------------------
  437|      0|      auto optRet = parseTypeAnnotationFlow(annotStart);
  438|      0|      if (!optRet)
  ------------------
  |  Branch (438:11): [True: 0, False: 0]
  ------------------
  439|      0|        return None;
  440|      0|      returnType = *optRet;
  441|      0|    }
  442|       |
  443|      0|    if (check(checksIdent_)) {
  ------------------
  |  Branch (443:9): [True: 0, False: 0]
  ------------------
  444|      0|      auto optPred = parsePredicateFlow();
  445|      0|      if (!optPred)
  ------------------
  |  Branch (445:11): [True: 0, False: 0]
  ------------------
  446|      0|        return None;
  447|      0|      predicate = *optPred;
  448|      0|    }
  449|      0|  }
  450|  4.91k|#endif
  451|  4.91k|#if HERMES_PARSE_TS
  452|  4.91k|  if (context_.getParseTS() && check(TokenKind::colon)) {
  ------------------
  |  Branch (452:7): [True: 0, False: 4.91k]
  |  Branch (452:32): [True: 0, False: 0]
  ------------------
  453|      0|    SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
  454|      0|    if (!check(checksIdent_)) {
  ------------------
  |  Branch (454:9): [True: 0, False: 0]
  ------------------
  455|      0|      auto optRet = parseTypeAnnotationTS(annotStart);
  456|      0|      if (!optRet)
  ------------------
  |  Branch (456:11): [True: 0, False: 0]
  ------------------
  457|      0|        return None;
  458|      0|      returnType = *optRet;
  459|      0|    }
  460|      0|  }
  461|  4.91k|#endif
  462|       |
  463|       |  // {
  464|  4.91k|  if (!need(
  ------------------
  |  Branch (464:7): [True: 0, False: 4.91k]
  ------------------
  465|  4.91k|          TokenKind::l_brace,
  466|  4.91k|          isDeclaration ? "in function declaration" : "in function expression",
  ------------------
  |  Branch (466:11): [True: 4.91k, False: 0]
  ------------------
  467|  4.91k|          isDeclaration ? "start of function declaration"
  ------------------
  |  Branch (467:11): [True: 4.91k, False: 0]
  ------------------
  468|  4.91k|                        : "start of function expression",
  469|  4.91k|          startLoc)) {
  470|      0|    return None;
  471|      0|  }
  472|       |
  473|  4.91k|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
  474|       |
  475|       |  // Grammar context to be used when lexing the closing brace.
  476|  4.91k|  auto grammarContext =
  477|  4.91k|      isDeclaration ? JSLexer::AllowRegExp : JSLexer::AllowDiv;
  ------------------
  |  Branch (477:7): [True: 4.91k, False: 0]
  ------------------
  478|       |
  479|  4.91k|  if (pass_ == PreParse) {
  ------------------
  |  Branch (479:7): [True: 781, False: 4.13k]
  ------------------
  480|       |    // Create the nodes we want to keep before the AllocationScope.
  481|    781|    ESTree::FunctionLikeNode *node;
  482|       |
  483|    781|    if (isDeclaration) {
  ------------------
  |  Branch (483:9): [True: 781, False: 0]
  ------------------
  484|    781|      auto *decl = new (context_) ESTree::FunctionDeclarationNode(
  485|    781|          optId ? *optId : nullptr,
  ------------------
  |  Branch (485:11): [True: 781, False: 0]
  ------------------
  486|    781|          std::move(paramList),
  487|    781|          nullptr,
  488|    781|          typeParams,
  489|    781|          returnType,
  490|    781|          predicate,
  491|    781|          isGenerator,
  492|    781|          isAsync);
  493|       |      // Initialize the node with a blank body.
  494|    781|      decl->_body = new (context_) ESTree::BlockStatementNode({});
  495|    781|      node = decl;
  496|    781|    } else {
  497|      0|      auto *expr = new (context_) ESTree::FunctionExpressionNode(
  498|      0|          optId ? *optId : nullptr,
  ------------------
  |  Branch (498:11): [True: 0, False: 0]
  ------------------
  499|      0|          std::move(paramList),
  500|      0|          nullptr,
  501|      0|          typeParams,
  502|      0|          returnType,
  503|      0|          predicate,
  504|      0|          isGenerator,
  505|      0|          isAsync);
  506|       |      // Initialize the node with a blank body.
  507|      0|      expr->_body = new (context_) ESTree::BlockStatementNode({});
  508|      0|      node = expr;
  509|      0|    }
  510|       |
  511|    781|    AllocationScope scope(context_.getAllocator());
  512|    781|    auto body = parseFunctionBody(
  513|    781|        Param{},
  514|    781|        false,
  515|    781|        saveArgsAndBodyParamYield.get(),
  516|    781|        saveArgsAndBodyParamAwait.get(),
  517|    781|        grammarContext,
  518|    781|        true);
  519|    781|    if (!body)
  ------------------
  |  Branch (519:9): [True: 2, False: 779]
  ------------------
  520|      2|      return None;
  521|       |
  522|    779|    return setLocation(startLoc, body.getValue(), node);
  523|    781|  }
  524|       |
  525|  4.13k|  auto parsedBody = parseFunctionBody(
  526|  4.13k|      Param{},
  527|  4.13k|      forceEagerly,
  528|  4.13k|      saveArgsAndBodyParamYield.get(),
  529|  4.13k|      saveArgsAndBodyParamAwait.get(),
  530|  4.13k|      grammarContext,
  531|  4.13k|      true);
  532|  4.13k|  if (!parsedBody)
  ------------------
  |  Branch (532:7): [True: 0, False: 4.13k]
  ------------------
  533|      0|    return None;
  534|  4.13k|  auto *body = parsedBody.getValue();
  535|       |
  536|  4.13k|  ESTree::FunctionLikeNode *node;
  537|  4.13k|  if (isDeclaration) {
  ------------------
  |  Branch (537:7): [True: 4.13k, False: 0]
  ------------------
  538|  4.13k|    auto *decl = new (context_) ESTree::FunctionDeclarationNode(
  539|  4.13k|        optId ? *optId : nullptr,
  ------------------
  |  Branch (539:9): [True: 4.13k, False: 0]
  ------------------
  540|  4.13k|        std::move(paramList),
  541|  4.13k|        body,
  542|  4.13k|        typeParams,
  543|  4.13k|        returnType,
  544|  4.13k|        predicate,
  545|  4.13k|        isGenerator,
  546|  4.13k|        isAsync);
  547|  4.13k|    node = decl;
  548|  4.13k|  } else {
  549|      0|    auto *expr = new (context_) ESTree::FunctionExpressionNode(
  550|      0|        optId ? *optId : nullptr,
  ------------------
  |  Branch (550:9): [True: 0, False: 0]
  ------------------
  551|      0|        std::move(paramList),
  552|      0|        body,
  553|      0|        typeParams,
  554|      0|        returnType,
  555|      0|        predicate,
  556|      0|        isGenerator,
  557|      0|        isAsync);
  558|      0|    node = expr;
  559|      0|  }
  560|  4.13k|  return setLocation(startLoc, body, node);
  561|  4.13k|}
_ZN6hermes6parser6detail12JSParserImpl21parseFormalParametersENS1_5ParamERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  565|  4.91k|    ESTree::NodeList &paramList) {
  566|  4.91k|  assert(check(TokenKind::l_paren) && "FormalParameters must start with '('");
  567|       |  // (
  568|      0|  SMLoc lparenLoc = advance().Start;
  569|       |
  570|  4.91k|#if HERMES_PARSE_FLOW
  571|       |  // The first parameter can be 'this' in Flow mode.
  572|  4.91k|  if (context_.getParseFlow() && check(TokenKind::rw_this)) {
  ------------------
  |  Branch (572:7): [True: 0, False: 4.91k]
  |  Branch (572:34): [True: 0, False: 0]
  ------------------
  573|      0|    auto *name = tok_->getResWordIdentifier();
  574|      0|    SMLoc thisParamStart = advance().Start;
  575|       |
  576|      0|    SMLoc annotStart = tok_->getStartLoc();
  577|      0|    if (!eat(
  ------------------
  |  Branch (577:9): [True: 0, False: 0]
  ------------------
  578|      0|            TokenKind::colon,
  579|      0|            JSLexer::GrammarContext::Type,
  580|      0|            "in 'this' type annotation",
  581|      0|            "start of 'this'",
  582|      0|            thisParamStart))
  583|      0|      return false;
  584|       |
  585|      0|    auto optType = parseTypeAnnotationFlow(annotStart);
  586|      0|    if (!optType)
  ------------------
  |  Branch (586:9): [True: 0, False: 0]
  ------------------
  587|      0|      return false;
  588|      0|    ESTree::Node *type = *optType;
  589|      0|    paramList.push_back(*setLocation(
  590|      0|        thisParamStart,
  591|      0|        getPrevTokenEndLoc(),
  592|      0|        new (context_) ESTree::IdentifierNode(name, type, false)));
  593|       |
  594|      0|    checkAndEat(TokenKind::comma);
  595|      0|  }
  596|  4.91k|#endif
  597|       |
  598|  4.91k|  while (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (598:10): [True: 1.54k, False: 3.36k]
  ------------------
  599|  1.54k|    if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (599:9): [True: 0, False: 1.54k]
  ------------------
  600|       |      // BindingRestElement.
  601|      0|      auto optRestElem = parseBindingRestElement(param);
  602|      0|      if (!optRestElem)
  ------------------
  |  Branch (602:11): [True: 0, False: 0]
  ------------------
  603|      0|        return false;
  604|      0|      paramList.push_back(*optRestElem.getValue());
  605|      0|      break;
  606|      0|    }
  607|       |
  608|       |    // BindingElement.
  609|  1.54k|    auto optElem = parseBindingElement(param);
  610|  1.54k|    if (!optElem)
  ------------------
  |  Branch (610:9): [True: 0, False: 1.54k]
  ------------------
  611|      0|      return false;
  612|       |
  613|  1.54k|    paramList.push_back(*optElem.getValue());
  614|       |
  615|  1.54k|    if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (615:9): [True: 1.54k, False: 0]
  ------------------
  616|  1.54k|      break;
  617|  1.54k|  }
  618|       |
  619|       |  // )
  620|  4.91k|  if (!eat(
  ------------------
  |  Branch (620:7): [True: 0, False: 4.91k]
  ------------------
  621|  4.91k|          TokenKind::r_paren,
  622|  4.91k|          JSLexer::AllowRegExp,
  623|  4.91k|          "at end of function parameter list",
  624|  4.91k|          "start of parameter list",
  625|  4.91k|          lparenLoc)) {
  626|      0|    return false;
  627|      0|  }
  628|       |
  629|  4.91k|  return true;
  630|  4.91k|}
_ZN6hermes6parser6detail12JSParserImpl14parseStatementENS1_5ParamE:
  632|   705k|Optional<ESTree::Node *> JSParserImpl::parseStatement(Param param) {
  633|   705k|  CHECK_RECURSION;
  ------------------
  |  | 1346|   705k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|   705k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 705k]
  |  |  ------------------
  |  | 1348|   705k|    return llvh::None;
  ------------------
  634|       |
  635|   705k|#define _RET(parseFunc)       \
  636|   705k|  if (auto res = (parseFunc)) \
  637|   705k|    return res.getValue();    \
  638|   705k|  else                        \
  639|   705k|    return None;
  640|       |
  641|   705k|  switch (tok_->getKind()) {
  642|  1.57k|    case TokenKind::l_brace:
  ------------------
  |  Branch (642:5): [True: 1.57k, False: 703k]
  ------------------
  643|  1.57k|      _RET(parseBlock(param));
  ------------------
  |  |  636|  1.57k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 1.56k, False: 7]
  |  |  ------------------
  |  |  637|  1.57k|    return res.getValue();    \
  |  |  638|  1.57k|  else                        \
  |  |  639|  1.57k|    return None;
  ------------------
  644|  3.06k|    case TokenKind::rw_var:
  ------------------
  |  Branch (644:5): [True: 3.06k, False: 701k]
  ------------------
  645|  3.06k|      _RET(parseVariableStatement(Param{}));
  ------------------
  |  |  636|  3.06k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 3.06k, False: 0]
  |  |  ------------------
  |  |  637|  3.06k|    return res.getValue();    \
  |  |  638|  3.06k|  else                        \
  |  |  639|  3.06k|    return None;
  ------------------
  646|   263k|    case TokenKind::semi:
  ------------------
  |  Branch (646:5): [True: 263k, False: 441k]
  ------------------
  647|   263k|      _RET(parseEmptyStatement());
  ------------------
  |  |  636|   263k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 263k, False: 0]
  |  |  ------------------
  |  |  637|   263k|    return res.getValue();    \
  |  |  638|   263k|  else                        \
  |  |  639|   263k|    return None;
  ------------------
  648|      0|    case TokenKind::rw_if:
  ------------------
  |  Branch (648:5): [True: 0, False: 705k]
  ------------------
  649|      0|      _RET(parseIfStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  650|      3|    case TokenKind::rw_while:
  ------------------
  |  Branch (650:5): [True: 3, False: 705k]
  ------------------
  651|      3|      _RET(parseWhileStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      3|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 3, False: 0]
  |  |  ------------------
  |  |  637|      3|    return res.getValue();    \
  |  |  638|      3|  else                        \
  |  |  639|      3|    return None;
  ------------------
  652|      0|    case TokenKind::rw_do:
  ------------------
  |  Branch (652:5): [True: 0, False: 705k]
  ------------------
  653|      0|      _RET(parseDoWhileStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  654|      0|    case TokenKind::rw_for:
  ------------------
  |  Branch (654:5): [True: 0, False: 705k]
  ------------------
  655|      0|      _RET(parseForStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  656|      7|    case TokenKind::rw_continue:
  ------------------
  |  Branch (656:5): [True: 7, False: 705k]
  ------------------
  657|      7|      _RET(parseContinueStatement());
  ------------------
  |  |  636|      7|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 7, False: 0]
  |  |  ------------------
  |  |  637|      7|    return res.getValue();    \
  |  |  638|      7|  else                        \
  |  |  639|      7|    return None;
  ------------------
  658|      0|    case TokenKind::rw_break:
  ------------------
  |  Branch (658:5): [True: 0, False: 705k]
  ------------------
  659|      0|      _RET(parseBreakStatement());
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  660|      0|    case TokenKind::rw_return:
  ------------------
  |  Branch (660:5): [True: 0, False: 705k]
  ------------------
  661|      0|      _RET(parseReturnStatement());
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  662|      0|    case TokenKind::rw_with:
  ------------------
  |  Branch (662:5): [True: 0, False: 705k]
  ------------------
  663|      0|      _RET(parseWithStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  664|      0|    case TokenKind::rw_switch:
  ------------------
  |  Branch (664:5): [True: 0, False: 705k]
  ------------------
  665|      0|      _RET(parseSwitchStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  666|      0|    case TokenKind::rw_throw:
  ------------------
  |  Branch (666:5): [True: 0, False: 705k]
  ------------------
  667|      0|      _RET(parseThrowStatement(Param{}));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  668|      0|    case TokenKind::rw_try:
  ------------------
  |  Branch (668:5): [True: 0, False: 705k]
  ------------------
  669|      0|      _RET(parseTryStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  670|      0|    case TokenKind::rw_debugger:
  ------------------
  |  Branch (670:5): [True: 0, False: 705k]
  ------------------
  671|      0|      _RET(parseDebuggerStatement());
  ------------------
  |  |  636|      0|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 0, False: 0]
  |  |  ------------------
  |  |  637|      0|    return res.getValue();    \
  |  |  638|      0|  else                        \
  |  |  639|      0|    return None;
  ------------------
  672|       |
  673|   437k|    default:
  ------------------
  |  Branch (673:5): [True: 437k, False: 267k]
  ------------------
  674|   437k|      _RET(parseExpressionOrLabelledStatement(param.get(ParamReturn)));
  ------------------
  |  |  636|   437k|  if (auto res = (parseFunc)) \
  |  |  ------------------
  |  |  |  Branch (636:12): [True: 437k, False: 30]
  |  |  ------------------
  |  |  637|   437k|    return res.getValue();    \
  |  |  638|   437k|  else                        \
  |  |  639|   437k|    return None;
  ------------------
  675|   705k|  }
  676|       |
  677|   705k|#undef _RET
  678|   705k|}
_ZNK6hermes6parser6detail12JSParserImpl18copySeenDirectivesEv:
  681|    779|    const {
  682|    779|  llvh::SmallVector<llvh::SmallString<24>, 1> copies;
  683|    779|  for (UniqueString *directive : seenDirectives_) {
  ------------------
  |  Branch (683:32): [True: 11, False: 779]
  ------------------
  684|     11|    copies.emplace_back(directive->str());
  685|     11|  }
  686|    779|  return copies;
  687|    779|}
_ZN6hermes6parser6detail12JSParserImpl17parseFunctionBodyENS1_5ParamEbbbNS0_7JSLexer14GrammarContextEb:
  695|  4.92k|    bool parseDirectives) {
  696|  4.92k|  if (pass_ == LazyParse && !eagerly) {
  ------------------
  |  Branch (696:7): [True: 768, False: 4.15k]
  |  Branch (696:29): [True: 768, False: 0]
  ------------------
  697|    768|    auto startLoc = tok_->getStartLoc();
  698|    768|    assert(
  699|    768|        preParsed_->functionInfo.count(startLoc) == 1 &&
  700|    768|        "no function info stored during preparse");
  701|      0|    PreParsedFunctionInfo functionInfo = preParsed_->functionInfo[startLoc];
  702|    768|    SMLoc endLoc = functionInfo.end;
  703|    768|    if ((unsigned)(endLoc.getPointer() - startLoc.getPointer()) >=
  ------------------
  |  Branch (703:9): [True: 674, False: 94]
  ------------------
  704|    768|        context_.getPreemptiveFunctionCompilationThreshold()) {
  705|    674|      lexer_.seek(endLoc);
  706|    674|      advance(grammarContext);
  707|       |
  708|       |      // Emulate parsing the "use strict" directive in parseBlock.
  709|    674|      setStrictMode(functionInfo.strictMode);
  710|       |
  711|       |      // PreParse collected directives idents into \c PreParsedFunctionInfo,
  712|       |      // iterate on them and fabricate directive nodes into the body node so
  713|       |      // the semantic validator can scan them back.
  714|    674|      ESTree::NodeList stmtList;
  715|    674|      for (const llvh::SmallString<24> &directive : functionInfo.directives) {
  ------------------
  |  Branch (715:51): [True: 0, False: 674]
  ------------------
  716|      0|        auto *strLit = new (context_)
  717|      0|            ESTree::StringLiteralNode(lexer_.getIdentifier(directive));
  718|      0|        auto *dirStmt = new (context_)
  719|      0|            ESTree::ExpressionStatementNode(strLit, strLit->_value);
  720|      0|        stmtList.push_back(*dirStmt);
  721|      0|      }
  722|       |
  723|    674|      auto *body =
  724|    674|          new (context_) ESTree::BlockStatementNode(std::move(stmtList));
  725|    674|      body->isLazyFunctionBody = true;
  726|       |      // Set params based on what they were at the _start_ of the function's
  727|       |      // source, not what they are now, because they might have changed.
  728|       |      // For example,
  729|       |      // get [yield]() {}
  730|       |      // means different things based on the value of paramYield at `get`,
  731|       |      // not at the `{`.
  732|    674|      body->paramYield = paramYield;
  733|    674|      body->paramAwait = paramAwait;
  734|    674|      body->bufferId = lexer_.getBufferId();
  735|    674|      return setLocation(startLoc, endLoc, body);
  736|    674|    }
  737|    768|  }
  738|       |
  739|  4.25k|  auto body = parseBlock(ParamReturn, grammarContext, parseDirectives);
  740|  4.25k|  if (!body)
  ------------------
  |  Branch (740:7): [True: 13, False: 4.23k]
  ------------------
  741|     13|    return None;
  742|       |
  743|  4.23k|  if (pass_ == PreParse) {
  ------------------
  |  Branch (743:7): [True: 779, False: 3.46k]
  ------------------
  744|    779|    preParsed_->functionInfo[(*body)->getStartLoc()] = PreParsedFunctionInfo{
  745|    779|        (*body)->getEndLoc(), isStrictMode(), copySeenDirectives()};
  746|    779|  }
  747|       |
  748|  4.23k|  return body;
  749|  4.25k|}
_ZN6hermes6parser6detail12JSParserImpl16parseDeclarationENS1_5ParamE:
  751|  4.91k|Optional<ESTree::Node *> JSParserImpl::parseDeclaration(Param param) {
  752|  4.91k|  CHECK_RECURSION;
  ------------------
  |  | 1346|  4.91k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  4.91k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 4.91k]
  |  |  ------------------
  |  | 1348|  4.91k|    return llvh::None;
  ------------------
  753|       |
  754|  4.91k|  assert(checkDeclaration() && "invalid start for declaration");
  755|       |
  756|  4.91k|  if (check(TokenKind::rw_function) || check(asyncIdent_)) {
  ------------------
  |  Branch (756:7): [True: 4.91k, False: 0]
  |  Branch (756:40): [True: 0, False: 0]
  ------------------
  757|  4.91k|    auto fdecl = parseFunctionDeclaration(Param{});
  758|  4.91k|    if (!fdecl)
  ------------------
  |  Branch (758:9): [True: 2, False: 4.91k]
  ------------------
  759|      2|      return None;
  760|       |
  761|  4.91k|    return *fdecl;
  762|  4.91k|  }
  763|       |
  764|      0|  if (check(TokenKind::rw_class)) {
  ------------------
  |  Branch (764:7): [True: 0, False: 0]
  ------------------
  765|      0|    auto optClass = parseClassDeclaration(Param{});
  766|      0|    if (!optClass)
  ------------------
  |  Branch (766:9): [True: 0, False: 0]
  ------------------
  767|      0|      return None;
  768|       |
  769|      0|    return *optClass;
  770|      0|  }
  771|       |
  772|      0|  if (checkN(TokenKind::rw_const, letIdent_)) {
  ------------------
  |  Branch (772:7): [True: 0, False: 0]
  ------------------
  773|      0|    auto optLexDecl = parseLexicalDeclaration(ParamIn);
  774|      0|    if (!optLexDecl)
  ------------------
  |  Branch (774:9): [True: 0, False: 0]
  ------------------
  775|      0|      return None;
  776|       |
  777|      0|    return *optLexDecl;
  778|      0|  }
  779|       |
  780|      0|#if HERMES_PARSE_FLOW
  781|      0|  if (context_.getParseFlow()) {
  ------------------
  |  Branch (781:7): [True: 0, False: 0]
  ------------------
  782|      0|    auto optDecl = parseFlowDeclaration();
  783|      0|    if (!optDecl)
  ------------------
  |  Branch (783:9): [True: 0, False: 0]
  ------------------
  784|      0|      return None;
  785|      0|    return *optDecl;
  786|      0|  }
  787|      0|#endif
  788|       |
  789|      0|#if HERMES_PARSE_TS
  790|      0|  if (context_.getParseTS()) {
  ------------------
  |  Branch (790:7): [True: 0, False: 0]
  ------------------
  791|      0|    auto optDecl = parseTSDeclaration();
  792|      0|    if (!optDecl)
  ------------------
  |  Branch (792:9): [True: 0, False: 0]
  ------------------
  793|      0|      return None;
  794|      0|    return *optDecl;
  795|      0|  }
  796|      0|#endif
  797|       |
  798|      0|  assert(false && "checkDeclaration() returned true without a declaration");
  799|      0|  return None;
  800|      0|}
_ZN6hermes6parser6detail12JSParserImpl22parseStatementListItemENS1_5ParamENS2_17AllowImportExportERN4llvh12simple_ilistINS_6ESTree4NodeEJEEE:
  805|   624k|    ESTree::NodeList &stmtList) {
  806|   624k|  if (checkDeclaration()) {
  ------------------
  |  Branch (806:7): [True: 4.91k, False: 619k]
  ------------------
  807|  4.91k|    auto decl = parseDeclaration(Param{});
  808|  4.91k|    if (!decl)
  ------------------
  |  Branch (808:9): [True: 2, False: 4.91k]
  ------------------
  809|      2|      return false;
  810|       |
  811|  4.91k|    stmtList.push_back(*decl.getValue());
  812|  4.91k|#if HERMES_PARSE_FLOW
  813|   619k|  } else if (context_.getParseFlow() && checkDeclareType()) {
  ------------------
  |  Branch (813:14): [True: 0, False: 619k]
  |  Branch (813:41): [True: 0, False: 0]
  ------------------
  814|       |    // declare var, declare function, declare interface, etc.
  815|      0|    SMLoc start = advance(JSLexer::GrammarContext::Type).Start;
  816|      0|    auto decl = parseDeclareFLow(start, AllowDeclareExportType::No);
  817|      0|    if (!decl)
  ------------------
  |  Branch (817:9): [True: 0, False: 0]
  ------------------
  818|      0|      return false;
  819|      0|    stmtList.push_back(*decl.getValue());
  820|      0|#endif
  821|   619k|  } else if (tok_->getKind() == TokenKind::rw_import) {
  ------------------
  |  Branch (821:14): [True: 0, False: 619k]
  ------------------
  822|       |    // 'import' can indicate an import declaration, but it's also possible a
  823|       |    // Statement begins with a call to `import()`, so do a lookahead to see if
  824|       |    // the next token is '('.
  825|      0|    auto optNext = lexer_.lookahead1(None);
  826|      0|    if (optNext.hasValue() && *optNext == TokenKind::l_paren) {
  ------------------
  |  Branch (826:9): [True: 0, False: 0]
  |  Branch (826:31): [True: 0, False: 0]
  ------------------
  827|      0|      auto stmt = parseStatement(param.get(ParamReturn));
  828|      0|      if (!stmt)
  ------------------
  |  Branch (828:11): [True: 0, False: 0]
  ------------------
  829|      0|        return false;
  830|       |
  831|      0|      stmtList.push_back(*stmt.getValue());
  832|      0|    } else {
  833|      0|      auto importDecl = parseImportDeclaration();
  834|      0|      if (!importDecl) {
  ------------------
  |  Branch (834:11): [True: 0, False: 0]
  ------------------
  835|      0|        return false;
  836|      0|      }
  837|       |
  838|      0|      stmtList.push_back(*importDecl.getValue());
  839|      0|      if (allowImportExport == AllowImportExport::No) {
  ------------------
  |  Branch (839:11): [True: 0, False: 0]
  ------------------
  840|      0|        error(
  841|      0|            importDecl.getValue()->getSourceRange(),
  842|      0|            "import declaration must be at top level of module");
  843|      0|      }
  844|      0|    }
  845|   619k|  } else if (tok_->getKind() == TokenKind::rw_export) {
  ------------------
  |  Branch (845:14): [True: 0, False: 619k]
  ------------------
  846|      0|    auto exportDecl = parseExportDeclaration();
  847|      0|    if (!exportDecl) {
  ------------------
  |  Branch (847:9): [True: 0, False: 0]
  ------------------
  848|      0|      return false;
  849|      0|    }
  850|       |
  851|      0|    if (allowImportExport == AllowImportExport::Yes) {
  ------------------
  |  Branch (851:9): [True: 0, False: 0]
  ------------------
  852|      0|      stmtList.push_back(**exportDecl);
  853|      0|    } else {
  854|      0|      error(
  855|      0|          exportDecl.getValue()->getSourceRange(),
  856|      0|          "export declaration must be at top level of module");
  857|      0|    }
  858|   619k|  } else {
  859|   619k|    auto stmt = parseStatement(param.get(ParamReturn));
  860|   619k|    if (!stmt)
  ------------------
  |  Branch (860:9): [True: 37, False: 619k]
  ------------------
  861|     37|      return false;
  862|       |
  863|   619k|    stmtList.push_back(*stmt.getValue());
  864|   619k|  }
  865|       |
  866|   624k|  return true;
  867|   624k|}
_ZN6hermes6parser6detail12JSParserImpl10parseBlockENS1_5ParamENS0_7JSLexer14GrammarContextEb:
  897|  5.82k|    bool parseDirectives) {
  898|       |  // {
  899|  5.82k|  assert(check(TokenKind::l_brace));
  900|      0|  SMLoc startLoc = advance().Start;
  901|       |
  902|  5.82k|  ESTree::NodeList stmtList;
  903|       |
  904|  5.82k|  if (!parseStatementList(
  ------------------
  |  Branch (904:7): [True: 19, False: 5.80k]
  ------------------
  905|  5.82k|          param,
  906|  5.82k|          TokenKind::r_brace,
  907|  5.82k|          parseDirectives,
  908|  5.82k|          AllowImportExport::No,
  909|  5.82k|          stmtList)) {
  910|     19|    return None;
  911|     19|  }
  912|       |
  913|       |  // }
  914|  5.80k|  auto *body = setLocation(
  915|  5.80k|      startLoc,
  916|  5.80k|      tok_,
  917|  5.80k|      new (context_) ESTree::BlockStatementNode(std::move(stmtList)));
  918|  5.80k|  if (!eat(
  ------------------
  |  Branch (918:7): [True: 1, False: 5.80k]
  ------------------
  919|  5.80k|          TokenKind::r_brace,
  920|  5.80k|          grammarContext,
  921|  5.80k|          "at end of block",
  922|  5.80k|          "block starts here",
  923|  5.80k|          startLoc))
  924|      1|    return None;
  925|       |
  926|  5.80k|  return body;
  927|  5.80k|}
_ZN6hermes6parser6detail12JSParserImpl25validateBindingIdentifierENS1_5ParamEN4llvh7SMRangeEPNS_12UniqueStringENS0_9TokenKindE:
  933|   237k|    TokenKind kind) {
  934|   237k|  if (id == yieldIdent_) {
  ------------------
  |  Branch (934:7): [True: 0, False: 237k]
  ------------------
  935|       |    // yield is permitted as BindingIdentifier in the grammar,
  936|       |    // and prohibited with static semantics.
  937|      0|    if (isStrictMode() || paramYield_) {
  ------------------
  |  Branch (937:9): [True: 0, False: 0]
  |  Branch (937:27): [True: 0, False: 0]
  ------------------
  938|      0|      error(range, "Unexpected usage of 'yield' as an identifier");
  939|      0|    }
  940|      0|  }
  941|       |
  942|   237k|  if (id == awaitIdent_) {
  ------------------
  |  Branch (942:7): [True: 0, False: 237k]
  ------------------
  943|       |    // await is permitted as BindingIdentifier in the grammar,
  944|       |    // and prohibited with static semantics.
  945|      0|    if (paramAwait_) {
  ------------------
  |  Branch (945:9): [True: 0, False: 0]
  ------------------
  946|      0|      error(range, "Unexpected usage of 'await' as an identifier");
  947|      0|    }
  948|      0|  }
  949|       |
  950|   237k|  if (isStrictMode() && id == letIdent_) {
  ------------------
  |  Branch (950:7): [True: 0, False: 237k]
  |  Branch (950:25): [True: 0, False: 0]
  ------------------
  951|       |    // ES9.0 12.1.1
  952|       |    // BindingIdentifier : Identifier
  953|       |    // Identifier : IdentifierName (but not ReservedWord)
  954|       |    // It is a Syntax Error if this phrase is contained in strict mode code
  955|       |    // and the StringValue of IdentifierName is: "implements", "interface",
  956|       |    // "let", "package", "private", "protected", "public", "static", or
  957|       |    // "yield".
  958|       |    // NOTE: All except 'let' are scanned as reserved words instead of
  959|       |    // identifiers, so we only check for `let` here.
  960|      0|    error(
  961|      0|        range,
  962|      0|        "Invalid use of strict mode reserved word as binding identifier");
  963|      0|  }
  964|       |
  965|   237k|  return kind == TokenKind::identifier || kind == TokenKind::rw_yield;
  ------------------
  |  Branch (965:10): [True: 237k, False: 0]
  |  Branch (965:43): [True: 0, False: 0]
  ------------------
  966|   237k|}
_ZN6hermes6parser6detail12JSParserImpl22parseBindingIdentifierENS1_5ParamE:
  969|  9.52k|    Param param) {
  970|  9.52k|  if (!check(TokenKind::identifier) && !tok_->isResWord()) {
  ------------------
  |  Branch (970:7): [True: 0, False: 9.52k]
  |  Branch (970:40): [True: 0, False: 0]
  ------------------
  971|      0|    return None;
  972|      0|  }
  973|  9.52k|  SMRange identRng = tok_->getSourceRange();
  974|       |
  975|       |  // If we have an identifier or reserved word, then store it and the kind,
  976|       |  // and pass it to the validateBindingIdentifier function.
  977|  9.52k|  UniqueString *id = tok_->getResWordOrIdentifier();
  978|  9.52k|  TokenKind kind = tok_->getKind();
  979|  9.52k|  if (!validateBindingIdentifier(param, tok_->getSourceRange(), id, kind)) {
  ------------------
  |  Branch (979:7): [True: 0, False: 9.52k]
  ------------------
  980|      0|    return None;
  981|      0|  }
  982|  9.52k|  advance();
  983|       |
  984|  9.52k|  ESTree::Node *type = nullptr;
  985|  9.52k|  bool optional = false;
  986|  9.52k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
  987|  9.52k|  if (context_.getParseTypes()) {
  ------------------
  |  Branch (987:7): [True: 0, False: 9.52k]
  ------------------
  988|      0|    if (check(TokenKind::question)) {
  ------------------
  |  Branch (988:9): [True: 0, False: 0]
  ------------------
  989|      0|      optional = true;
  990|      0|      advance(JSLexer::GrammarContext::Type);
  991|      0|    }
  992|       |
  993|      0|    if (check(TokenKind::colon)) {
  ------------------
  |  Branch (993:9): [True: 0, False: 0]
  ------------------
  994|      0|      SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
  995|      0|      auto optType = parseTypeAnnotation(annotStart);
  996|      0|      if (!optType)
  ------------------
  |  Branch (996:11): [True: 0, False: 0]
  ------------------
  997|      0|        return None;
  998|      0|      type = *optType;
  999|      0|    }
 1000|      0|  }
 1001|  9.52k|#endif
 1002|       |
 1003|  9.52k|  return setLocation(
 1004|  9.52k|      identRng,
 1005|  9.52k|      getPrevTokenEndLoc(),
 1006|  9.52k|      new (context_) ESTree::IdentifierNode(id, type, optional));
 1007|  9.52k|}
_ZN6hermes6parser6detail12JSParserImpl23parseLexicalDeclarationENS1_5ParamE:
 1010|  3.06k|JSParserImpl::parseLexicalDeclaration(Param param) {
 1011|  3.06k|  assert(
 1012|  3.06k|      (check(TokenKind::rw_var) || check(TokenKind::rw_const) ||
 1013|  3.06k|       check(letIdent_)) &&
 1014|  3.06k|      "parseLexicalDeclaration() expects var/const/let");
 1015|      0|  bool isConst = check(TokenKind::rw_const);
 1016|  3.06k|  auto kindIdent = tok_->getResWordOrIdentifier();
 1017|       |
 1018|  3.06k|  SMLoc startLoc = advance().Start;
 1019|       |
 1020|  3.06k|  ESTree::NodeList declList;
 1021|  3.06k|  if (!parseVariableDeclarationList(param, declList, startLoc))
  ------------------
  |  Branch (1021:7): [True: 0, False: 3.06k]
  ------------------
 1022|      0|    return None;
 1023|       |
 1024|  3.06k|  if (!eatSemi())
  ------------------
  |  Branch (1024:7): [True: 0, False: 3.06k]
  ------------------
 1025|      0|    return None;
 1026|       |
 1027|  3.06k|  if (isConst) {
  ------------------
  |  Branch (1027:7): [True: 0, False: 3.06k]
  ------------------
 1028|      0|    for (const ESTree::Node &decl : declList) {
  ------------------
  |  Branch (1028:35): [True: 0, False: 0]
  ------------------
 1029|      0|      const auto *varDecl = cast<ESTree::VariableDeclaratorNode>(&decl);
 1030|      0|      if (!varDecl->_init) {
  ------------------
  |  Branch (1030:11): [True: 0, False: 0]
  ------------------
 1031|       |        // ES9.0 13.3.1.1
 1032|       |        // LexicalBinding : BindingIdentifier Initializer
 1033|       |        // It is a Syntax Error if Initializer is not present and
 1034|       |        // IsConstantDeclaration of the LexicalDeclaration containing this
 1035|       |        // LexicalBinding is true.
 1036|       |        // Note that we don't perform this check in the SemanticValidator
 1037|       |        // because `const` declarations in `for` loops don't need initializers.
 1038|      0|        error(
 1039|      0|            varDecl->getSourceRange(),
 1040|      0|            "missing initializer in const declaration");
 1041|      0|      }
 1042|      0|    }
 1043|      0|  }
 1044|       |
 1045|  3.06k|  auto *res = setLocation(
 1046|  3.06k|      startLoc,
 1047|  3.06k|      getPrevTokenEndLoc(),
 1048|  3.06k|      new (context_)
 1049|  3.06k|          ESTree::VariableDeclarationNode(kindIdent, std::move(declList)));
 1050|       |
 1051|  3.06k|  ensureDestructuringInitialized(res);
 1052|       |
 1053|  3.06k|  return res;
 1054|  3.06k|}
_ZN6hermes6parser6detail12JSParserImpl22parseVariableStatementENS1_5ParamE:
 1057|  3.06k|JSParserImpl::parseVariableStatement(Param param) {
 1058|  3.06k|  return parseLexicalDeclaration(ParamIn);
 1059|  3.06k|}
_ZN6hermes6parser6detail12JSParserImpl28parseVariableDeclarationListENS1_5ParamERN4llvh12simple_ilistINS_6ESTree4NodeEJEEENS4_5SMLocE:
 1076|  3.06k|    SMLoc declLoc) {
 1077|  3.06k|  do {
 1078|  3.06k|    auto optDecl = parseVariableDeclaration(param, declLoc);
 1079|  3.06k|    if (!optDecl)
  ------------------
  |  Branch (1079:9): [True: 0, False: 3.06k]
  ------------------
 1080|      0|      return None;
 1081|  3.06k|    declList.push_back(*optDecl.getValue());
 1082|  3.06k|  } while (checkAndEat(TokenKind::comma));
  ------------------
  |  Branch (1082:12): [True: 0, False: 3.06k]
  ------------------
 1083|       |
 1084|  3.06k|  return "OK";
 1085|  3.06k|}
_ZN6hermes6parser6detail12JSParserImpl30ensureDestructuringInitializedEPNS_6ESTree23VariableDeclarationNodeE:
 1088|  3.06k|    ESTree::VariableDeclarationNode *declNode) {
 1089|  3.06k|  for (auto &elem : declNode->_declarations) {
  ------------------
  |  Branch (1089:19): [True: 3.06k, False: 3.06k]
  ------------------
 1090|  3.06k|    auto *declarator = cast<ESTree::VariableDeclaratorNode>(&elem);
 1091|       |
 1092|  3.06k|    if (!isa<ESTree::PatternNode>(declarator->_id) || declarator->_init)
  ------------------
  |  Branch (1092:9): [True: 3.06k, False: 0]
  |  Branch (1092:55): [True: 0, False: 0]
  ------------------
 1093|  3.06k|      continue;
 1094|       |
 1095|      0|    error(
 1096|      0|        declarator->_id->getSourceRange(),
 1097|      0|        "destucturing declaration must be initialized");
 1098|      0|  }
 1099|  3.06k|}
_ZN6hermes6parser6detail12JSParserImpl24parseVariableDeclarationENS1_5ParamEN4llvh5SMLocE:
 1102|  3.06k|JSParserImpl::parseVariableDeclaration(Param param, SMLoc declLoc) {
 1103|  3.06k|  ESTree::Node *target;
 1104|  3.06k|  SMLoc startLoc = tok_->getStartLoc();
 1105|       |
 1106|  3.06k|  if (check(TokenKind::l_square, TokenKind::l_brace)) {
  ------------------
  |  Branch (1106:7): [True: 0, False: 3.06k]
  ------------------
 1107|      0|    auto optPat = parseBindingPattern(param);
 1108|      0|    if (!optPat)
  ------------------
  |  Branch (1108:9): [True: 0, False: 0]
  ------------------
 1109|      0|      return None;
 1110|       |
 1111|      0|    target = *optPat;
 1112|  3.06k|  } else {
 1113|  3.06k|    auto optIdent = parseBindingIdentifier(Param{});
 1114|  3.06k|    if (!optIdent) {
  ------------------
  |  Branch (1114:9): [True: 0, False: 3.06k]
  ------------------
 1115|      0|      errorExpected(
 1116|      0|          TokenKind::identifier,
 1117|      0|          "in declaration",
 1118|      0|          "declaration started here",
 1119|      0|          declLoc);
 1120|      0|      return None;
 1121|      0|    }
 1122|       |
 1123|  3.06k|    target = *optIdent;
 1124|  3.06k|  }
 1125|       |
 1126|       |  // No initializer?
 1127|  3.06k|  if (!check(TokenKind::equal)) {
  ------------------
  |  Branch (1127:7): [True: 3.06k, False: 0]
  ------------------
 1128|  3.06k|    return setLocation(
 1129|  3.06k|        startLoc,
 1130|  3.06k|        getPrevTokenEndLoc(),
 1131|  3.06k|        new (context_) ESTree::VariableDeclaratorNode(nullptr, target));
 1132|  3.06k|  };
 1133|       |
 1134|       |  // Parse the initializer.
 1135|      0|  auto debugLoc = advance().Start;
 1136|       |
 1137|      0|  auto expr = parseAssignmentExpression(
 1138|      0|      param, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 1139|      0|  if (!expr)
  ------------------
  |  Branch (1139:7): [True: 0, False: 0]
  ------------------
 1140|      0|    return None;
 1141|       |
 1142|      0|  return setLocation(
 1143|      0|      startLoc,
 1144|      0|      getPrevTokenEndLoc(),
 1145|      0|      debugLoc,
 1146|      0|      new (context_) ESTree::VariableDeclaratorNode(*expr, target));
 1147|      0|}
_ZN6hermes6parser6detail12JSParserImpl19parseBindingElementENS1_5ParamE:
 1230|  1.54k|Optional<ESTree::Node *> JSParserImpl::parseBindingElement(Param param) {
 1231|  1.54k|  CHECK_RECURSION;
  ------------------
  |  | 1346|  1.54k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  1.54k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 1.54k]
  |  |  ------------------
  |  | 1348|  1.54k|    return llvh::None;
  ------------------
 1232|  1.54k|  ESTree::Node *elem;
 1233|       |
 1234|  1.54k|  if (check(TokenKind::l_square, TokenKind::l_brace)) {
  ------------------
  |  Branch (1234:7): [True: 0, False: 1.54k]
  ------------------
 1235|      0|    auto optPat = parseBindingPattern(param);
 1236|      0|    if (!optPat)
  ------------------
  |  Branch (1236:9): [True: 0, False: 0]
  ------------------
 1237|      0|      return None;
 1238|      0|    elem = *optPat;
 1239|  1.54k|  } else {
 1240|  1.54k|    auto optIdent = parseBindingIdentifier(param);
 1241|  1.54k|    if (!optIdent) {
  ------------------
  |  Branch (1241:9): [True: 0, False: 1.54k]
  ------------------
 1242|      0|      error(
 1243|      0|          tok_->getStartLoc(),
 1244|      0|          "identifier, '{' or '[' expected in binding pattern");
 1245|      0|      return None;
 1246|      0|    }
 1247|  1.54k|    elem = *optIdent;
 1248|  1.54k|  }
 1249|       |
 1250|       |  // No initializer?
 1251|  1.54k|  if (!check(TokenKind::equal))
  ------------------
  |  Branch (1251:7): [True: 1.54k, False: 0]
  ------------------
 1252|  1.54k|    return elem;
 1253|       |
 1254|      0|  auto optInit = parseBindingInitializer(param, elem);
 1255|      0|  if (!optInit)
  ------------------
  |  Branch (1255:7): [True: 0, False: 0]
  ------------------
 1256|      0|    return None;
 1257|      0|  return *optInit;
 1258|      0|}
_ZN6hermes6parser6detail12JSParserImpl19parseEmptyStatementEv:
 1459|   263k|Optional<ESTree::EmptyStatementNode *> JSParserImpl::parseEmptyStatement() {
 1460|   263k|  assert(check(TokenKind::semi));
 1461|      0|  auto *empty =
 1462|   263k|      setLocation(tok_, tok_, new (context_) ESTree::EmptyStatementNode());
 1463|   263k|  advance();
 1464|       |
 1465|   263k|  return empty;
 1466|   263k|}
_ZN6hermes6parser6detail12JSParserImpl34parseExpressionOrLabelledStatementENS1_5ParamE:
 1469|   437k|    Param param) {
 1470|   437k|  bool startsWithIdentifier = check(TokenKind::identifier);
 1471|       |
 1472|       |  // ES9.0 13.5
 1473|       |  // Lookahead cannot be any of: {, function, async function, class, let [
 1474|       |  // Allow execution to continue because the expression may be parsed,
 1475|       |  // but report an error because it will be ambiguous whether the parse was
 1476|       |  // correct.
 1477|   437k|  if (checkN(TokenKind::l_brace, TokenKind::rw_function, TokenKind::rw_class) ||
  ------------------
  |  Branch (1477:7): [True: 0, False: 437k]
  ------------------
 1478|   437k|      (check(asyncIdent_) && checkAsyncFunction())) {
  ------------------
  |  Branch (1478:8): [True: 1, False: 437k]
  |  Branch (1478:30): [True: 0, False: 1]
  ------------------
 1479|       |    // There's no need to stop reporting errors.
 1480|      0|    error(
 1481|      0|        tok_->getSourceRange(),
 1482|      0|        "declaration not allowed as expression statement");
 1483|      0|  }
 1484|       |
 1485|   437k|  if (check(letIdent_)) {
  ------------------
  |  Branch (1485:7): [True: 0, False: 437k]
  ------------------
 1486|      0|    SMLoc letLoc = advance().Start;
 1487|      0|    if (check(TokenKind::l_square)) {
  ------------------
  |  Branch (1487:9): [True: 0, False: 0]
  ------------------
 1488|       |      // let [
 1489|      0|      error(
 1490|      0|          {letLoc, tok_->getEndLoc()},
 1491|      0|          "ambiguous 'let [': either a 'let' binding or a member expression");
 1492|      0|    }
 1493|      0|    lexer_.seek(letLoc);
 1494|      0|    advance();
 1495|      0|  }
 1496|       |
 1497|   437k|  SMLoc startLoc = tok_->getStartLoc();
 1498|   437k|  auto optExpr = parseExpression(ParamIn, CoverTypedParameters::No);
 1499|   437k|  if (!optExpr)
  ------------------
  |  Branch (1499:7): [True: 30, False: 437k]
  ------------------
 1500|     30|    return None;
 1501|       |
 1502|       |  // Check whether this is a label. The expression must have started with an
 1503|       |  // identifier, be just an identifier and be
 1504|       |  // followed by ':'
 1505|   437k|  if (startsWithIdentifier && isa<ESTree::IdentifierNode>(optExpr.getValue()) &&
  ------------------
  |  Branch (1505:7): [True: 413k, False: 23.5k]
  |  Branch (1505:31): [True: 259k, False: 153k]
  ------------------
 1506|   437k|      checkAndEat(TokenKind::colon)) {
  ------------------
  |  Branch (1506:7): [True: 85.6k, False: 173k]
  ------------------
 1507|  85.6k|    auto *id = cast<ESTree::IdentifierNode>(optExpr.getValue());
 1508|       |
 1509|  85.6k|    ESTree::Node *body = nullptr;
 1510|  85.6k|    if (check(TokenKind::rw_function)) {
  ------------------
  |  Branch (1510:9): [True: 0, False: 85.6k]
  ------------------
 1511|      0|      auto optFunc = parseFunctionDeclaration(param);
 1512|      0|      if (!optFunc)
  ------------------
  |  Branch (1512:11): [True: 0, False: 0]
  ------------------
 1513|      0|        return None;
 1514|       |      /// ES9.0 13.13.1
 1515|       |      /// It is a Syntax Error if any source text matches this rule.
 1516|       |      /// LabelledItem : FunctionDeclaration
 1517|       |      /// NOTE: GeneratorDeclarations are disallowed as part of the grammar
 1518|       |      /// as well, so all FunctionDeclarations are disallowed as labeled
 1519|       |      /// items, except via an AnnexB extension which is unsupported in
 1520|       |      /// Hermes.
 1521|      0|      error(
 1522|      0|          optFunc.getValue()->getSourceRange().Start,
 1523|      0|          "Function declaration not allowed as body of labeled statement");
 1524|      0|      body = optFunc.getValue();
 1525|  85.6k|    } else {
 1526|       |      // Statement
 1527|  85.6k|      auto optBody = parseStatement(param.get(ParamReturn));
 1528|  85.6k|      if (!optBody)
  ------------------
  |  Branch (1528:11): [True: 0, False: 85.6k]
  ------------------
 1529|      0|        return None;
 1530|  85.6k|      body = optBody.getValue();
 1531|  85.6k|    }
 1532|       |
 1533|  85.6k|    return setLocation(
 1534|  85.6k|        id, body, new (context_) ESTree::LabeledStatementNode(id, body));
 1535|   351k|  } else {
 1536|   351k|    if (!eatSemi())
  ------------------
  |  Branch (1536:9): [True: 0, False: 351k]
  ------------------
 1537|      0|      return None;
 1538|       |
 1539|   351k|    return setLocation(
 1540|   351k|        startLoc,
 1541|   351k|        getPrevTokenEndLoc(),
 1542|   351k|        new (context_)
 1543|   351k|            ESTree::ExpressionStatementNode(optExpr.getValue(), nullptr));
 1544|   351k|  }
 1545|   437k|}
_ZN6hermes6parser6detail12JSParserImpl19parseWhileStatementENS1_5ParamE:
 1597|      3|    Param param) {
 1598|      3|  assert(check(TokenKind::rw_while));
 1599|      0|  SMLoc startLoc = advance().Start;
 1600|       |
 1601|      3|  if (!eat(
  ------------------
  |  Branch (1601:7): [True: 0, False: 3]
  ------------------
 1602|      3|          TokenKind::l_paren,
 1603|      3|          JSLexer::AllowRegExp,
 1604|      3|          "after 'while'",
 1605|      3|          "location of 'while'",
 1606|      3|          startLoc))
 1607|      0|    return None;
 1608|      3|  auto optTest = parseExpression();
 1609|      3|  if (!optTest)
  ------------------
  |  Branch (1609:7): [True: 0, False: 3]
  ------------------
 1610|      0|    return None;
 1611|      3|  if (!eat(
  ------------------
  |  Branch (1611:7): [True: 0, False: 3]
  ------------------
 1612|      3|          TokenKind::r_paren,
 1613|      3|          JSLexer::AllowRegExp,
 1614|      3|          "at end of 'while' condition",
 1615|      3|          "location of 'while'",
 1616|      3|          startLoc))
 1617|      0|    return None;
 1618|       |
 1619|      3|  auto optBody = parseStatement(param.get(ParamReturn));
 1620|      3|  if (!optBody)
  ------------------
  |  Branch (1620:7): [True: 0, False: 3]
  ------------------
 1621|      0|    return None;
 1622|       |
 1623|      3|  return setLocation(
 1624|      3|      startLoc,
 1625|      3|      optBody.getValue(),
 1626|      3|      new (context_)
 1627|      3|          ESTree::WhileStatementNode(optBody.getValue(), optTest.getValue()));
 1628|      3|}
_ZN6hermes6parser6detail12JSParserImpl22parseContinueStatementEv:
 1865|      7|JSParserImpl::parseContinueStatement() {
 1866|      7|  assert(check(TokenKind::rw_continue));
 1867|      0|  SMLoc startLoc = advance().Start;
 1868|       |
 1869|      7|  if (eatSemi(true))
  ------------------
  |  Branch (1869:7): [True: 7, False: 0]
  ------------------
 1870|      7|    return setLocation(
 1871|      7|        startLoc,
 1872|      7|        getPrevTokenEndLoc(),
 1873|      7|        new (context_) ESTree::ContinueStatementNode(nullptr));
 1874|       |
 1875|      0|  if (!need(
  ------------------
  |  Branch (1875:7): [True: 0, False: 0]
  ------------------
 1876|      0|          TokenKind::identifier,
 1877|      0|          "after 'continue'",
 1878|      0|          "location of 'continue'",
 1879|      0|          startLoc))
 1880|      0|    return None;
 1881|      0|  auto *id = setLocation(
 1882|      0|      tok_,
 1883|      0|      tok_,
 1884|      0|      new (context_)
 1885|      0|          ESTree::IdentifierNode(tok_->getIdentifier(), nullptr, false));
 1886|      0|  advance();
 1887|       |
 1888|      0|  if (!eatSemi())
  ------------------
  |  Branch (1888:7): [True: 0, False: 0]
  ------------------
 1889|      0|    return None;
 1890|       |
 1891|      0|  return setLocation(
 1892|      0|      startLoc,
 1893|      0|      getPrevTokenEndLoc(),
 1894|      0|      new (context_) ESTree::ContinueStatementNode(id));
 1895|      0|}
_ZN6hermes6parser6detail12JSParserImpl22parsePrimaryExpressionEv:
 2250|  3.95M|Optional<ESTree::Node *> JSParserImpl::parsePrimaryExpression() {
 2251|  3.95M|  CHECK_RECURSION;
  ------------------
  |  | 1346|  3.95M|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  3.95M|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 3, False: 3.95M]
  |  |  ------------------
  |  | 1348|  3.95M|    return llvh::None;
  ------------------
 2252|       |
 2253|  3.95M|  switch (tok_->getKind()) {
 2254|      0|    case TokenKind::rw_this: {
  ------------------
  |  Branch (2254:5): [True: 0, False: 3.95M]
  ------------------
 2255|      0|      auto *res =
 2256|      0|          setLocation(tok_, tok_, new (context_) ESTree::ThisExpressionNode());
 2257|      0|      advance(JSLexer::AllowDiv);
 2258|      0|      return res;
 2259|      0|    }
 2260|       |
 2261|  1.29M|    case TokenKind::identifier: {
  ------------------
  |  Branch (2261:5): [True: 1.29M, False: 2.65M]
  ------------------
 2262|  1.29M|      if (check(yieldIdent_)) {
  ------------------
  |  Branch (2262:11): [True: 0, False: 1.29M]
  ------------------
 2263|       |        // yield is only allowed as an IdentifierReference when ParamYield is
 2264|       |        // false.
 2265|      0|        if (paramYield_) {
  ------------------
  |  Branch (2265:13): [True: 0, False: 0]
  ------------------
 2266|      0|          error(
 2267|      0|              tok_->getSourceRange(),
 2268|      0|              "Unexpected usage of 'yield' as an identifier reference");
 2269|      0|        }
 2270|      0|      }
 2271|  1.29M|      if (check(asyncIdent_) && checkAsyncFunction()) {
  ------------------
  |  Branch (2271:11): [True: 8, False: 1.29M]
  |  Branch (2271:33): [True: 0, False: 8]
  ------------------
 2272|      0|        auto func = parseFunctionExpression();
 2273|      0|        if (!func)
  ------------------
  |  Branch (2273:13): [True: 0, False: 0]
  ------------------
 2274|      0|          return None;
 2275|      0|        return func.getValue();
 2276|      0|      }
 2277|  1.29M|      auto *res = setLocation(
 2278|  1.29M|          tok_,
 2279|  1.29M|          tok_,
 2280|  1.29M|          new (context_)
 2281|  1.29M|              ESTree::IdentifierNode(tok_->getIdentifier(), nullptr, false));
 2282|  1.29M|      advance(JSLexer::AllowDiv);
 2283|  1.29M|      return res;
 2284|  1.29M|    }
 2285|       |
 2286|      0|    case TokenKind::rw_null: {
  ------------------
  |  Branch (2286:5): [True: 0, False: 3.95M]
  ------------------
 2287|      0|      auto *res =
 2288|      0|          setLocation(tok_, tok_, new (context_) ESTree::NullLiteralNode());
 2289|      0|      advance(JSLexer::AllowDiv);
 2290|      0|      return res;
 2291|  1.29M|    }
 2292|       |
 2293|      0|    case TokenKind::rw_true:
  ------------------
  |  Branch (2293:5): [True: 0, False: 3.95M]
  ------------------
 2294|  4.03k|    case TokenKind::rw_false: {
  ------------------
  |  Branch (2294:5): [True: 4.03k, False: 3.94M]
  ------------------
 2295|  4.03k|      auto *res = setLocation(
 2296|  4.03k|          tok_,
 2297|  4.03k|          tok_,
 2298|  4.03k|          new (context_) ESTree::BooleanLiteralNode(
 2299|  4.03k|              tok_->getKind() == TokenKind::rw_true));
 2300|  4.03k|      advance(JSLexer::AllowDiv);
 2301|  4.03k|      return res;
 2302|      0|    }
 2303|       |
 2304|  1.79M|    case TokenKind::numeric_literal: {
  ------------------
  |  Branch (2304:5): [True: 1.79M, False: 2.15M]
  ------------------
 2305|  1.79M|      auto *res = setLocation(
 2306|  1.79M|          tok_,
 2307|  1.79M|          tok_,
 2308|  1.79M|          new (context_) ESTree::NumericLiteralNode(tok_->getNumericLiteral()));
 2309|  1.79M|      advance(JSLexer::AllowDiv);
 2310|  1.79M|      return res;
 2311|      0|    }
 2312|       |
 2313|     24|    case TokenKind::bigint_literal: {
  ------------------
  |  Branch (2313:5): [True: 24, False: 3.95M]
  ------------------
 2314|     24|      auto *res = setLocation(
 2315|     24|          tok_,
 2316|     24|          tok_,
 2317|     24|          new (context_) ESTree::BigIntLiteralNode(tok_->getBigIntLiteral()));
 2318|     24|      advance(JSLexer::AllowDiv);
 2319|     24|      return res;
 2320|      0|    }
 2321|       |
 2322|  3.49k|    case TokenKind::string_literal: {
  ------------------
  |  Branch (2322:5): [True: 3.49k, False: 3.94M]
  ------------------
 2323|  3.49k|      auto *res = setLocation(
 2324|  3.49k|          tok_,
 2325|  3.49k|          tok_,
 2326|  3.49k|          new (context_) ESTree::StringLiteralNode(tok_->getStringLiteral()));
 2327|  3.49k|      advance(JSLexer::AllowDiv);
 2328|  3.49k|      return res;
 2329|      0|    }
 2330|       |
 2331|  34.1k|    case TokenKind::regexp_literal: {
  ------------------
  |  Branch (2331:5): [True: 34.1k, False: 3.91M]
  ------------------
 2332|  34.1k|      auto *res = setLocation(
 2333|  34.1k|          tok_,
 2334|  34.1k|          tok_,
 2335|  34.1k|          new (context_) ESTree::RegExpLiteralNode(
 2336|  34.1k|              tok_->getRegExpLiteral()->getBody(),
 2337|  34.1k|              tok_->getRegExpLiteral()->getFlags()));
 2338|  34.1k|      advance(JSLexer::AllowDiv);
 2339|  34.1k|      return res;
 2340|      0|    }
 2341|       |
 2342|  67.1k|    case TokenKind::l_square: {
  ------------------
  |  Branch (2342:5): [True: 67.1k, False: 3.88M]
  ------------------
 2343|  67.1k|      auto res = parseArrayLiteral();
 2344|  67.1k|      if (!res)
  ------------------
  |  Branch (2344:11): [True: 8, False: 67.1k]
  ------------------
 2345|      8|        return None;
 2346|  67.1k|      return res.getValue();
 2347|  67.1k|    }
 2348|       |
 2349|  10.2k|    case TokenKind::l_brace: {
  ------------------
  |  Branch (2349:5): [True: 10.2k, False: 3.94M]
  ------------------
 2350|  10.2k|      auto res = parseObjectLiteral();
 2351|  10.2k|      if (!res)
  ------------------
  |  Branch (2351:11): [True: 0, False: 10.2k]
  ------------------
 2352|      0|        return None;
 2353|  10.2k|      return res.getValue();
 2354|  10.2k|    }
 2355|       |
 2356|    730|    case TokenKind::l_paren: {
  ------------------
  |  Branch (2356:5): [True: 730, False: 3.95M]
  ------------------
 2357|    730|      SMLoc startLoc = advance().Start;
 2358|       |
 2359|       |      // Cover "()".
 2360|    730|      if (check(TokenKind::r_paren)) {
  ------------------
  |  Branch (2360:11): [True: 146, False: 584]
  ------------------
 2361|    146|        SMLoc endLoc = advance().End;
 2362|    146|        return setLocation(
 2363|    146|            startLoc, endLoc, new (context_) ESTree::CoverEmptyArgsNode());
 2364|    146|      }
 2365|       |
 2366|    584|      ESTree::Node *expr;
 2367|    584|      if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2367:11): [True: 0, False: 584]
  ------------------
 2368|      0|        auto optRest = parseBindingRestElement(ParamIn);
 2369|      0|        if (!optRest)
  ------------------
  |  Branch (2369:13): [True: 0, False: 0]
  ------------------
 2370|      0|          return None;
 2371|       |
 2372|      0|        expr = setLocation(
 2373|      0|            *optRest,
 2374|      0|            *optRest,
 2375|      0|            new (context_) ESTree::CoverRestElementNode(*optRest));
 2376|    584|      } else {
 2377|    584|        auto optExpr = parseExpression(ParamIn, CoverTypedParameters::Yes);
 2378|    584|        if (!optExpr)
  ------------------
  |  Branch (2378:13): [True: 584, False: 0]
  ------------------
 2379|    584|          return None;
 2380|      0|        expr = *optExpr;
 2381|      0|      }
 2382|       |
 2383|      0|#if HERMES_PARSE_FLOW
 2384|      0|      if (context_.getParseFlow()) {
  ------------------
  |  Branch (2384:11): [True: 0, False: 0]
  ------------------
 2385|       |        // In both these cases, we set the location to encompass the `()`.
 2386|       |        // (x: T)
 2387|       |        // ^^^^^^
 2388|       |        // by using `startLoc` and `tok_` as the start/end.
 2389|       |        // If `tok_` is not `)`, then we'll error on the `eat` call immediately
 2390|       |        // after these checks.
 2391|      0|        if (auto *cover = dyn_cast<ESTree::CoverTypedIdentifierNode>(expr)) {
  ------------------
  |  Branch (2391:19): [True: 0, False: 0]
  ------------------
 2392|      0|          if (cover->_right && !cover->_optional) {
  ------------------
  |  Branch (2392:15): [True: 0, False: 0]
  |  Branch (2392:32): [True: 0, False: 0]
  ------------------
 2393|      0|            expr = setLocation(
 2394|      0|                startLoc,
 2395|      0|                tok_,
 2396|      0|                new (context_) ESTree::TypeCastExpressionNode(
 2397|      0|                    cover->_left, cover->_right));
 2398|      0|          }
 2399|      0|        } else if (check(TokenKind::colon)) {
  ------------------
  |  Branch (2399:20): [True: 0, False: 0]
  ------------------
 2400|      0|          SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2401|      0|          auto optType = parseTypeAnnotationFlow(annotStart);
 2402|      0|          if (!optType)
  ------------------
  |  Branch (2402:15): [True: 0, False: 0]
  ------------------
 2403|      0|            return None;
 2404|      0|          ESTree::Node *type = *optType;
 2405|      0|          expr = setLocation(
 2406|      0|              startLoc,
 2407|      0|              tok_,
 2408|      0|              new (context_) ESTree::TypeCastExpressionNode(expr, type));
 2409|      0|        }
 2410|      0|      }
 2411|      0|#endif
 2412|       |
 2413|      0|      if (!eat(
  ------------------
  |  Branch (2413:11): [True: 0, False: 0]
  ------------------
 2414|      0|              TokenKind::r_paren,
 2415|      0|              JSLexer::AllowDiv,
 2416|      0|              "at end of parenthesized expression",
 2417|      0|              "started here",
 2418|      0|              startLoc))
 2419|      0|        return None;
 2420|       |      // Record the number of parens surrounding an expression.
 2421|      0|      expr->incParens();
 2422|      0|      return expr;
 2423|      0|    }
 2424|       |
 2425|      0|    case TokenKind::rw_function: {
  ------------------
  |  Branch (2425:5): [True: 0, False: 3.95M]
  ------------------
 2426|      0|      auto fExpr = parseFunctionExpression();
 2427|      0|      if (!fExpr)
  ------------------
  |  Branch (2427:11): [True: 0, False: 0]
  ------------------
 2428|      0|        return None;
 2429|      0|      return fExpr.getValue();
 2430|      0|    }
 2431|       |
 2432|      0|    case TokenKind::rw_class: {
  ------------------
  |  Branch (2432:5): [True: 0, False: 3.95M]
  ------------------
 2433|      0|      auto optClass = parseClassExpression();
 2434|      0|      if (!optClass)
  ------------------
  |  Branch (2434:11): [True: 0, False: 0]
  ------------------
 2435|      0|        return None;
 2436|      0|      return optClass.getValue();
 2437|      0|    }
 2438|       |
 2439|   742k|    case TokenKind::no_substitution_template:
  ------------------
  |  Branch (2439:5): [True: 742k, False: 3.20M]
  ------------------
 2440|   742k|    case TokenKind::template_head: {
  ------------------
  |  Branch (2440:5): [True: 1, False: 3.95M]
  ------------------
 2441|   742k|      auto optTemplate = parseTemplateLiteral(Param{});
 2442|   742k|      if (!optTemplate) {
  ------------------
  |  Branch (2442:11): [True: 1, False: 742k]
  ------------------
 2443|      1|        return None;
 2444|      1|      }
 2445|   742k|      return optTemplate.getValue();
 2446|   742k|    }
 2447|       |
 2448|      0|#if HERMES_PARSE_JSX
 2449|      0|    case TokenKind::less:
  ------------------
  |  Branch (2449:5): [True: 0, False: 3.95M]
  ------------------
 2450|      0|      if (context_.getParseJSX()) {
  ------------------
  |  Branch (2450:11): [True: 0, False: 0]
  ------------------
 2451|      0|        auto optJSX = parseJSX();
 2452|      0|        if (!optJSX)
  ------------------
  |  Branch (2452:13): [True: 0, False: 0]
  ------------------
 2453|      0|          return None;
 2454|      0|        return optJSX.getValue();
 2455|      0|      }
 2456|      0|      error(
 2457|      0|          tok_->getStartLoc(),
 2458|      0|          "invalid expression (possible JSX: pass -parse-jsx to parse)");
 2459|      0|      return None;
 2460|      0|#endif
 2461|       |
 2462|     10|    default:
  ------------------
  |  Branch (2462:5): [True: 10, False: 3.95M]
  ------------------
 2463|     10|      error(tok_->getStartLoc(), "invalid expression");
 2464|     10|      return None;
 2465|  3.95M|  }
 2466|  3.95M|}
_ZN6hermes6parser6detail12JSParserImpl17parseArrayLiteralEv:
 2468|  67.1k|Optional<ESTree::ArrayExpressionNode *> JSParserImpl::parseArrayLiteral() {
 2469|  67.1k|  assert(check(TokenKind::l_square));
 2470|      0|  SMLoc startLoc = advance().Start;
 2471|       |
 2472|  67.1k|  ESTree::NodeList elemList;
 2473|       |
 2474|  67.1k|  bool trailingComma = false;
 2475|       |
 2476|  67.1k|  if (!check(TokenKind::r_square)) {
  ------------------
  |  Branch (2476:7): [True: 40.6k, False: 26.5k]
  ------------------
 2477|  1.70M|    for (;;) {
 2478|       |      // Elision.
 2479|  1.70M|      if (check(TokenKind::comma)) {
  ------------------
  |  Branch (2479:11): [True: 493, False: 1.70M]
  ------------------
 2480|    493|        elemList.push_back(
 2481|    493|            *setLocation(tok_, tok_, new (context_) ESTree::EmptyNode()));
 2482|  1.70M|      } else if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2482:18): [True: 0, False: 1.70M]
  ------------------
 2483|       |        // Spread.
 2484|      0|        auto optSpread = parseSpreadElement();
 2485|      0|        if (!optSpread)
  ------------------
  |  Branch (2485:13): [True: 0, False: 0]
  ------------------
 2486|      0|          return None;
 2487|       |
 2488|      0|        elemList.push_back(**optSpread);
 2489|  1.70M|      } else {
 2490|  1.70M|        auto expr = parseAssignmentExpression();
 2491|  1.70M|        if (!expr)
  ------------------
  |  Branch (2491:13): [True: 3, False: 1.70M]
  ------------------
 2492|      3|          return None;
 2493|  1.70M|        elemList.push_back(*expr.getValue());
 2494|  1.70M|      }
 2495|       |
 2496|  1.70M|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (2496:11): [True: 40.6k, False: 1.66M]
  ------------------
 2497|  40.6k|        break;
 2498|  1.66M|      if (check(TokenKind::r_square)) {
  ------------------
  |  Branch (2498:11): [True: 2, False: 1.66M]
  ------------------
 2499|       |        // Check for ",]".
 2500|      2|        trailingComma = true;
 2501|      2|        break;
 2502|      2|      }
 2503|  1.66M|    }
 2504|  40.6k|  }
 2505|       |
 2506|  67.1k|  SMLoc endLoc = tok_->getEndLoc();
 2507|  67.1k|  if (!eat(
  ------------------
  |  Branch (2507:7): [True: 5, False: 67.1k]
  ------------------
 2508|  67.1k|          TokenKind::r_square,
 2509|  67.1k|          JSLexer::AllowDiv,
 2510|  67.1k|          "at end of array literal '[...'",
 2511|  67.1k|          "location of '['",
 2512|  67.1k|          startLoc))
 2513|      5|    return None;
 2514|       |
 2515|  67.1k|  return setLocation(
 2516|  67.1k|      startLoc,
 2517|  67.1k|      endLoc,
 2518|  67.1k|      new (context_)
 2519|  67.1k|          ESTree::ArrayExpressionNode(std::move(elemList), trailingComma));
 2520|  67.1k|}
_ZN6hermes6parser6detail12JSParserImpl18parseObjectLiteralEv:
 2522|  10.2k|Optional<ESTree::ObjectExpressionNode *> JSParserImpl::parseObjectLiteral() {
 2523|  10.2k|  assert(check(TokenKind::l_brace));
 2524|      0|  SMLoc startLoc = advance().Start;
 2525|       |
 2526|  10.2k|  ESTree::NodeList elemList;
 2527|       |
 2528|  10.2k|  if (!check(TokenKind::r_brace)) {
  ------------------
  |  Branch (2528:7): [True: 10.2k, False: 84]
  ------------------
 2529|  12.0k|    for (;;) {
 2530|  12.0k|      if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (2530:11): [True: 0, False: 12.0k]
  ------------------
 2531|       |        // Spread.
 2532|      0|        auto optSpread = parseSpreadElement();
 2533|      0|        if (!optSpread)
  ------------------
  |  Branch (2533:13): [True: 0, False: 0]
  ------------------
 2534|      0|          return None;
 2535|       |
 2536|      0|        elemList.push_back(**optSpread);
 2537|  12.0k|      } else {
 2538|  12.0k|        auto prop = parsePropertyAssignment(false);
 2539|  12.0k|        if (!prop)
  ------------------
  |  Branch (2539:13): [True: 0, False: 12.0k]
  ------------------
 2540|      0|          return None;
 2541|       |
 2542|  12.0k|        elemList.push_back(*prop.getValue());
 2543|  12.0k|      }
 2544|       |
 2545|  12.0k|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (2545:11): [True: 10.2k, False: 1.87k]
  ------------------
 2546|  10.2k|        break;
 2547|  1.87k|      if (check(TokenKind::r_brace)) // check for ",}"
  ------------------
  |  Branch (2547:11): [True: 0, False: 1.87k]
  ------------------
 2548|      0|        break;
 2549|  1.87k|    }
 2550|  10.2k|  }
 2551|       |
 2552|  10.2k|  SMLoc endLoc = tok_->getEndLoc();
 2553|  10.2k|  if (!eat(
  ------------------
  |  Branch (2553:7): [True: 0, False: 10.2k]
  ------------------
 2554|  10.2k|          TokenKind::r_brace,
 2555|  10.2k|          JSLexer::AllowDiv,
 2556|  10.2k|          "at end of object literal '{...'",
 2557|  10.2k|          "location of '{'",
 2558|  10.2k|          startLoc))
 2559|      0|    return None;
 2560|       |
 2561|  10.2k|  return setLocation(
 2562|  10.2k|      startLoc,
 2563|  10.2k|      endLoc,
 2564|  10.2k|      new (context_) ESTree::ObjectExpressionNode(std::move(elemList)));
 2565|  10.2k|}
_ZN6hermes6parser6detail12JSParserImpl23parsePropertyAssignmentEb:
 2581|  12.0k|Optional<ESTree::Node *> JSParserImpl::parsePropertyAssignment(bool eagerly) {
 2582|  12.0k|  SMLoc startLoc = tok_->getStartLoc();
 2583|  12.0k|  ESTree::NodePtr key = nullptr;
 2584|       |
 2585|  12.0k|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
 2586|       |
 2587|  12.0k|  bool computed = false;
 2588|  12.0k|  bool generator = false;
 2589|  12.0k|  bool async = false;
 2590|  12.0k|  bool method = false;
 2591|       |
 2592|  12.0k|  if (check(getIdent_)) {
  ------------------
  |  Branch (2592:7): [True: 0, False: 12.0k]
  ------------------
 2593|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2594|      0|    SMRange identRng = tok_->getSourceRange();
 2595|      0|    advance();
 2596|       |
 2597|       |    // This could either be a getter, or a property named 'get'.
 2598|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2598:9): [True: 0, False: 0]
  ------------------
 2599|       |      // This is just a property.
 2600|      0|      key = setLocation(
 2601|      0|          identRng,
 2602|      0|          identRng,
 2603|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2604|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2605|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2605:16): [True: 0, False: 0]
  |  Branch (2605:44): [True: 0, False: 0]
  ------------------
 2606|       |      // This is a method definition.
 2607|      0|      method = true;
 2608|      0|      key = setLocation(
 2609|      0|          identRng,
 2610|      0|          identRng,
 2611|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2612|      0|#endif
 2613|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2613:16): [True: 0, False: 0]
  ------------------
 2614|       |      // If the next token is "," or "}", this is a shorthand property
 2615|       |      // definition.
 2616|      0|      key = setLocation(
 2617|      0|          identRng,
 2618|      0|          identRng,
 2619|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2620|      0|      auto *value = setLocation(
 2621|      0|          key,
 2622|      0|          key,
 2623|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2624|      0|      return setLocation(
 2625|      0|          startLoc,
 2626|      0|          value,
 2627|      0|          new (context_)
 2628|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2629|      0|    } else {
 2630|       |      // A getter method.
 2631|      0|      computed = check(TokenKind::l_square);
 2632|      0|      auto optKey = parsePropertyName();
 2633|      0|      if (!optKey)
  ------------------
  |  Branch (2633:11): [True: 0, False: 0]
  ------------------
 2634|      0|        return None;
 2635|       |
 2636|      0|      if (!eat(
  ------------------
  |  Branch (2636:11): [True: 0, False: 0]
  ------------------
 2637|      0|              TokenKind::l_paren,
 2638|      0|              JSLexer::AllowRegExp,
 2639|      0|              "in getter declaration",
 2640|      0|              "start of getter declaration",
 2641|      0|              startLoc))
 2642|      0|        return None;
 2643|      0|      if (!eat(
  ------------------
  |  Branch (2643:11): [True: 0, False: 0]
  ------------------
 2644|      0|              TokenKind::r_paren,
 2645|      0|              JSLexer::AllowRegExp,
 2646|      0|              "in empty getter parameter list",
 2647|      0|              "start of getter declaration",
 2648|      0|              startLoc))
 2649|      0|        return None;
 2650|       |
 2651|      0|      ESTree::Node *returnType = nullptr;
 2652|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2653|      0|      if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (2653:11): [True: 0, False: 0]
  |  Branch (2653:39): [True: 0, False: 0]
  ------------------
 2654|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2655|      0|        auto optRet = parseTypeAnnotation(annotStart);
 2656|      0|        if (!optRet)
  ------------------
  |  Branch (2656:13): [True: 0, False: 0]
  ------------------
 2657|      0|          return None;
 2658|      0|        returnType = *optRet;
 2659|      0|      }
 2660|      0|#endif
 2661|       |
 2662|      0|      llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 2663|      0|      llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, false);
 2664|      0|      if (!need(
  ------------------
  |  Branch (2664:11): [True: 0, False: 0]
  ------------------
 2665|      0|              TokenKind::l_brace,
 2666|      0|              "in getter declaration",
 2667|      0|              "start of getter declaration",
 2668|      0|              startLoc))
 2669|      0|        return None;
 2670|      0|      auto block = parseFunctionBody(
 2671|      0|          ParamReturn,
 2672|      0|          eagerly,
 2673|      0|          oldParamYield.get(),
 2674|      0|          oldParamAwait.get(),
 2675|      0|          JSLexer::AllowRegExp,
 2676|      0|          true);
 2677|      0|      if (!block)
  ------------------
  |  Branch (2677:11): [True: 0, False: 0]
  ------------------
 2678|      0|        return None;
 2679|       |
 2680|      0|      auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 2681|      0|          nullptr,
 2682|      0|          ESTree::NodeList{},
 2683|      0|          block.getValue(),
 2684|      0|          nullptr,
 2685|      0|          returnType,
 2686|      0|          /* predicate */ nullptr,
 2687|      0|          false,
 2688|      0|          false);
 2689|      0|      funcExpr->isMethodDefinition = true;
 2690|      0|      setLocation(startLoc, block.getValue(), funcExpr);
 2691|       |
 2692|      0|      auto *node = new (context_) ESTree::PropertyNode(
 2693|      0|          optKey.getValue(), funcExpr, getIdent_, computed, false, false);
 2694|      0|      return setLocation(startLoc, block.getValue(), node);
 2695|      0|    }
 2696|  12.0k|  } else if (check(setIdent_)) {
  ------------------
  |  Branch (2696:14): [True: 0, False: 12.0k]
  ------------------
 2697|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2698|      0|    SMRange identRng = tok_->getSourceRange();
 2699|      0|    advance();
 2700|       |
 2701|       |    // This could either be a setter, or a property named 'set'.
 2702|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2702:9): [True: 0, False: 0]
  ------------------
 2703|       |      // This is just a property.
 2704|      0|      key = setLocation(
 2705|      0|          identRng,
 2706|      0|          identRng,
 2707|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2708|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2709|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2709:16): [True: 0, False: 0]
  |  Branch (2709:44): [True: 0, False: 0]
  ------------------
 2710|       |      // This is a method definition.
 2711|      0|      method = true;
 2712|      0|      key = setLocation(
 2713|      0|          identRng,
 2714|      0|          identRng,
 2715|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2716|      0|#endif
 2717|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2717:16): [True: 0, False: 0]
  ------------------
 2718|       |      // If the next token is "," or "}", this is a shorthand property
 2719|       |      // definition.
 2720|      0|      key = setLocation(
 2721|      0|          identRng,
 2722|      0|          identRng,
 2723|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2724|      0|      auto *value = setLocation(
 2725|      0|          key,
 2726|      0|          key,
 2727|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2728|      0|      return setLocation(
 2729|      0|          startLoc,
 2730|      0|          value,
 2731|      0|          new (context_)
 2732|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2733|      0|    } else {
 2734|       |      // A setter method.
 2735|      0|      computed = check(TokenKind::l_square);
 2736|      0|      auto optKey = parsePropertyName();
 2737|      0|      if (!optKey)
  ------------------
  |  Branch (2737:11): [True: 0, False: 0]
  ------------------
 2738|      0|        return None;
 2739|       |
 2740|      0|      llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 2741|      0|      llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, false);
 2742|       |
 2743|      0|      ESTree::NodeList params;
 2744|      0|      eat(TokenKind::l_paren,
 2745|      0|          JSLexer::AllowRegExp,
 2746|      0|          "in setter declaration",
 2747|      0|          "start of setter declaration",
 2748|      0|          startLoc);
 2749|       |
 2750|       |      // PropertySetParameterList -> FormalParameter -> BindingElement
 2751|      0|      auto optParam = parseBindingElement(Param{});
 2752|      0|      if (!optParam)
  ------------------
  |  Branch (2752:11): [True: 0, False: 0]
  ------------------
 2753|      0|        return None;
 2754|      0|      params.push_back(**optParam);
 2755|       |
 2756|      0|      if (!eat(
  ------------------
  |  Branch (2756:11): [True: 0, False: 0]
  ------------------
 2757|      0|              TokenKind::r_paren,
 2758|      0|              JSLexer::AllowRegExp,
 2759|      0|              "at end of setter parameter list",
 2760|      0|              "start of setter declaration",
 2761|      0|              startLoc))
 2762|      0|        return None;
 2763|       |
 2764|      0|      ESTree::Node *returnType = nullptr;
 2765|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2766|      0|      if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (2766:11): [True: 0, False: 0]
  |  Branch (2766:39): [True: 0, False: 0]
  ------------------
 2767|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2768|      0|        auto optRet = parseTypeAnnotation(annotStart);
 2769|      0|        if (!optRet)
  ------------------
  |  Branch (2769:13): [True: 0, False: 0]
  ------------------
 2770|      0|          return None;
 2771|      0|        returnType = *optRet;
 2772|      0|      }
 2773|      0|#endif
 2774|       |
 2775|      0|      if (!need(
  ------------------
  |  Branch (2775:11): [True: 0, False: 0]
  ------------------
 2776|      0|              TokenKind::l_brace,
 2777|      0|              "in setter declaration",
 2778|      0|              "start of setter declaration",
 2779|      0|              startLoc))
 2780|      0|        return None;
 2781|      0|      auto block = parseFunctionBody(
 2782|      0|          ParamReturn,
 2783|      0|          eagerly,
 2784|      0|          oldParamYield.get(),
 2785|      0|          oldParamAwait.get(),
 2786|      0|          JSLexer::AllowRegExp,
 2787|      0|          true);
 2788|      0|      if (!block)
  ------------------
  |  Branch (2788:11): [True: 0, False: 0]
  ------------------
 2789|      0|        return None;
 2790|       |
 2791|      0|      auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 2792|      0|          nullptr,
 2793|      0|          std::move(params),
 2794|      0|          block.getValue(),
 2795|      0|          nullptr,
 2796|      0|          returnType,
 2797|      0|          /* predicate */ nullptr,
 2798|      0|          false,
 2799|      0|          false);
 2800|      0|      funcExpr->isMethodDefinition = true;
 2801|      0|      setLocation(startLoc, block.getValue(), funcExpr);
 2802|       |
 2803|      0|      auto *node = new (context_) ESTree::PropertyNode(
 2804|      0|          optKey.getValue(), funcExpr, setIdent_, computed, false, false);
 2805|      0|      return setLocation(startLoc, block.getValue(), node);
 2806|      0|    }
 2807|  12.0k|  } else if (check(asyncIdent_)) {
  ------------------
  |  Branch (2807:14): [True: 0, False: 12.0k]
  ------------------
 2808|      0|    UniqueString *ident = tok_->getResWordOrIdentifier();
 2809|      0|    SMRange identRng = tok_->getSourceRange();
 2810|      0|    advance();
 2811|       |
 2812|       |    // This could either be an async function, or a property named 'async'.
 2813|      0|    if (check(TokenKind::colon, TokenKind::l_paren)) {
  ------------------
  |  Branch (2813:9): [True: 0, False: 0]
  ------------------
 2814|       |      // This is just a property (or method) called 'async'.
 2815|      0|      key = setLocation(
 2816|      0|          identRng,
 2817|      0|          identRng,
 2818|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2819|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2820|      0|    } else if (context_.getParseTypes() && check(TokenKind::less)) {
  ------------------
  |  Branch (2820:16): [True: 0, False: 0]
  |  Branch (2820:44): [True: 0, False: 0]
  ------------------
 2821|       |      // This is a method definition.
 2822|      0|      method = true;
 2823|      0|      key = setLocation(
 2824|      0|          identRng,
 2825|      0|          identRng,
 2826|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2827|      0|#endif
 2828|      0|    } else if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2828:16): [True: 0, False: 0]
  ------------------
 2829|       |      // If the next token is "," or "}", this is a shorthand property
 2830|       |      // definition.
 2831|      0|      key = setLocation(
 2832|      0|          identRng,
 2833|      0|          identRng,
 2834|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2835|      0|      auto *value = setLocation(
 2836|      0|          key,
 2837|      0|          key,
 2838|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2839|      0|      return setLocation(
 2840|      0|          startLoc,
 2841|      0|          value,
 2842|      0|          new (context_)
 2843|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2844|      0|    } else {
 2845|       |      // This is an async function, parse the key and set `async` to true.
 2846|      0|      async = true;
 2847|      0|      method = true;
 2848|      0|      generator = checkAndEat(TokenKind::star);
 2849|      0|      computed = check(TokenKind::l_square);
 2850|      0|      auto optKey = parsePropertyName();
 2851|      0|      if (!optKey)
  ------------------
  |  Branch (2851:11): [True: 0, False: 0]
  ------------------
 2852|      0|        return None;
 2853|       |
 2854|      0|      key = optKey.getValue();
 2855|      0|    }
 2856|  12.0k|  } else if (check(TokenKind::identifier)) {
  ------------------
  |  Branch (2856:14): [True: 0, False: 12.0k]
  ------------------
 2857|      0|    auto *ident = tok_->getIdentifier();
 2858|      0|    key = setLocation(
 2859|      0|        tok_,
 2860|      0|        tok_,
 2861|      0|        new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2862|      0|    advance();
 2863|       |    // If the next token is "," or "}", this is a shorthand property definition.
 2864|      0|    if (check(TokenKind::comma, TokenKind::r_brace)) {
  ------------------
  |  Branch (2864:9): [True: 0, False: 0]
  ------------------
 2865|      0|      auto *value = setLocation(
 2866|      0|          key,
 2867|      0|          key,
 2868|      0|          new (context_) ESTree::IdentifierNode(ident, nullptr, false));
 2869|       |
 2870|      0|      return setLocation(
 2871|      0|          startLoc,
 2872|      0|          value,
 2873|      0|          new (context_)
 2874|      0|              ESTree::PropertyNode(key, value, initIdent_, false, false, true));
 2875|      0|    }
 2876|  12.0k|  } else {
 2877|  12.0k|    generator = checkAndEat(TokenKind::star);
 2878|  12.0k|    computed = check(TokenKind::l_square);
 2879|  12.0k|    auto optKey = parsePropertyName();
 2880|  12.0k|    if (!optKey)
  ------------------
  |  Branch (2880:9): [True: 0, False: 12.0k]
  ------------------
 2881|      0|      return None;
 2882|       |
 2883|  12.0k|    key = optKey.getValue();
 2884|  12.0k|  }
 2885|       |
 2886|  12.0k|  ESTree::Node *value;
 2887|  12.0k|  bool shorthand = false;
 2888|       |
 2889|  12.0k|  if (isa<ESTree::IdentifierNode>(key) && check(TokenKind::equal)) {
  ------------------
  |  Branch (2889:7): [True: 0, False: 12.0k]
  |  Branch (2889:43): [True: 0, False: 0]
  ------------------
 2890|       |    // Check for CoverInitializedName: IdentifierReference Initializer
 2891|      0|    auto startLoc = advance().Start;
 2892|      0|    auto optInit = parseAssignmentExpression();
 2893|      0|    if (!optInit)
  ------------------
  |  Branch (2893:9): [True: 0, False: 0]
  ------------------
 2894|      0|      return None;
 2895|       |
 2896|      0|    shorthand = true;
 2897|       |
 2898|      0|    value = setLocation(
 2899|      0|        startLoc,
 2900|      0|        getPrevTokenEndLoc(),
 2901|      0|        new (context_) ESTree::CoverInitializerNode(*optInit));
 2902|  12.0k|  } else if (check(TokenKind::l_paren, TokenKind::less) || async) {
  ------------------
  |  Branch (2902:14): [True: 0, False: 12.0k]
  |  Branch (2902:60): [True: 0, False: 12.0k]
  ------------------
 2903|       |    // Try this branch when we have '(' or '<' to indicate a method
 2904|       |    // or when we know this is async, because async must also indicate a method,
 2905|       |    // and we must avoid parsing ordinary properties from ':'.
 2906|       |
 2907|       |    // Parse the MethodDefinition manually here.
 2908|       |    // Do not use `parseClassElement` because we had to parsePropertyName
 2909|       |    // in this function ourselves and check for SingleNameBindings, which are
 2910|       |    // not parsed with `parsePropertyName`.
 2911|       |    // MethodDefinition:
 2912|       |    // PropertyName "(" UniqueFormalParameters ")" "{" FunctionBody "}"
 2913|       |    //               ^
 2914|      0|    llvh::SaveAndRestore<bool> oldParamYield(paramYield_, generator);
 2915|      0|    llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, async);
 2916|       |
 2917|      0|    method = true;
 2918|       |
 2919|      0|    ESTree::Node *typeParams = nullptr;
 2920|      0|#if HERMES_PARSE_FLOW
 2921|      0|    if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (2921:9): [True: 0, False: 0]
  |  Branch (2921:36): [True: 0, False: 0]
  ------------------
 2922|      0|      auto optTypeParams = parseTypeParamsFlow();
 2923|      0|      if (!optTypeParams)
  ------------------
  |  Branch (2923:11): [True: 0, False: 0]
  ------------------
 2924|      0|        return None;
 2925|      0|      typeParams = *optTypeParams;
 2926|      0|    }
 2927|      0|#endif
 2928|      0|#if HERMES_PARSE_TS
 2929|      0|    if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (2929:9): [True: 0, False: 0]
  |  Branch (2929:34): [True: 0, False: 0]
  ------------------
 2930|      0|      auto optTypeParams = parseTSTypeParameters();
 2931|      0|      if (!optTypeParams)
  ------------------
  |  Branch (2931:11): [True: 0, False: 0]
  ------------------
 2932|      0|        return None;
 2933|      0|      typeParams = *optTypeParams;
 2934|      0|    }
 2935|      0|#endif
 2936|       |
 2937|       |    // (
 2938|      0|    if (!need(
  ------------------
  |  Branch (2938:9): [True: 0, False: 0]
  ------------------
 2939|      0|            TokenKind::l_paren,
 2940|      0|            "in method definition",
 2941|      0|            "start of method definition",
 2942|      0|            startLoc))
 2943|      0|      return None;
 2944|       |
 2945|      0|    ESTree::NodeList args{};
 2946|      0|    if (!parseFormalParameters(Param{}, args))
  ------------------
  |  Branch (2946:9): [True: 0, False: 0]
  ------------------
 2947|      0|      return None;
 2948|       |
 2949|      0|    ESTree::Node *returnType = nullptr;
 2950|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 2951|      0|    if (context_.getParseTypes() && check(TokenKind::colon)) {
  ------------------
  |  Branch (2951:9): [True: 0, False: 0]
  |  Branch (2951:37): [True: 0, False: 0]
  ------------------
 2952|      0|      SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 2953|      0|      auto optRet = parseTypeAnnotation(annotStart);
 2954|      0|      if (!optRet)
  ------------------
  |  Branch (2954:11): [True: 0, False: 0]
  ------------------
 2955|      0|        return None;
 2956|      0|      returnType = *optRet;
 2957|      0|    }
 2958|      0|#endif
 2959|       |
 2960|      0|    if (!need(
  ------------------
  |  Branch (2960:9): [True: 0, False: 0]
  ------------------
 2961|      0|            TokenKind::l_brace,
 2962|      0|            "in method definition",
 2963|      0|            "start of method definition",
 2964|      0|            startLoc))
 2965|      0|      return None;
 2966|      0|    auto optBody = parseFunctionBody(
 2967|      0|        ParamReturn,
 2968|      0|        eagerly,
 2969|      0|        oldParamYield.get(),
 2970|      0|        oldParamAwait.get(),
 2971|      0|        JSLexer::AllowRegExp,
 2972|      0|        true);
 2973|      0|    if (!optBody)
  ------------------
  |  Branch (2973:9): [True: 0, False: 0]
  ------------------
 2974|      0|      return None;
 2975|       |
 2976|      0|    auto *funcExpr = new (context_) ESTree::FunctionExpressionNode(
 2977|      0|        nullptr,
 2978|      0|        std::move(args),
 2979|      0|        optBody.getValue(),
 2980|      0|        typeParams,
 2981|      0|        returnType,
 2982|      0|        /* predicate */ nullptr,
 2983|      0|        generator,
 2984|      0|        async);
 2985|      0|    funcExpr->isMethodDefinition = true;
 2986|      0|    setLocation(startLoc, optBody.getValue(), funcExpr);
 2987|       |
 2988|      0|    value = funcExpr;
 2989|  12.0k|  } else {
 2990|  12.0k|    if (!eat(
  ------------------
  |  Branch (2990:9): [True: 0, False: 12.0k]
  ------------------
 2991|  12.0k|            TokenKind::colon,
 2992|  12.0k|            JSLexer::AllowRegExp,
 2993|  12.0k|            "in property initialization",
 2994|  12.0k|            "start of property initialization",
 2995|  12.0k|            startLoc))
 2996|      0|      return None;
 2997|       |
 2998|  12.0k|    auto optValue = parseAssignmentExpression();
 2999|  12.0k|    if (!optValue)
  ------------------
  |  Branch (2999:9): [True: 0, False: 12.0k]
  ------------------
 3000|      0|      return None;
 3001|  12.0k|    value = *optValue;
 3002|  12.0k|  }
 3003|       |
 3004|  12.0k|  return setLocation(
 3005|  12.0k|      startLoc,
 3006|  12.0k|      getPrevTokenEndLoc(),
 3007|  12.0k|      new (context_) ESTree::PropertyNode(
 3008|  12.0k|          key, value, initIdent_, computed, method, shorthand));
 3009|  12.0k|}
_ZN6hermes6parser6detail12JSParserImpl17parsePropertyNameEv:
 3011|  12.0k|Optional<ESTree::Node *> JSParserImpl::parsePropertyName() {
 3012|  12.0k|  switch (tok_->getKind()) {
 3013|  12.0k|    case TokenKind::string_literal: {
  ------------------
  |  Branch (3013:5): [True: 12.0k, False: 0]
  ------------------
 3014|  12.0k|      auto *res = setLocation(
 3015|  12.0k|          tok_,
 3016|  12.0k|          tok_,
 3017|  12.0k|          new (context_) ESTree::StringLiteralNode(tok_->getStringLiteral()));
 3018|  12.0k|      advance();
 3019|  12.0k|      return res;
 3020|      0|    }
 3021|       |
 3022|      0|    case TokenKind::numeric_literal: {
  ------------------
  |  Branch (3022:5): [True: 0, False: 12.0k]
  ------------------
 3023|      0|      auto *res = setLocation(
 3024|      0|          tok_,
 3025|      0|          tok_,
 3026|      0|          new (context_) ESTree::NumericLiteralNode(tok_->getNumericLiteral()));
 3027|      0|      advance();
 3028|      0|      return res;
 3029|      0|    }
 3030|       |
 3031|      0|    case TokenKind::identifier: {
  ------------------
  |  Branch (3031:5): [True: 0, False: 12.0k]
  ------------------
 3032|      0|      auto *res = setLocation(
 3033|      0|          tok_,
 3034|      0|          tok_,
 3035|      0|          new (context_)
 3036|      0|              ESTree::IdentifierNode(tok_->getIdentifier(), nullptr, false));
 3037|      0|      advance();
 3038|      0|      return res;
 3039|      0|    }
 3040|       |
 3041|      0|    case TokenKind::l_square: {
  ------------------
  |  Branch (3041:5): [True: 0, False: 12.0k]
  ------------------
 3042|      0|      SMLoc start = advance().Start;
 3043|      0|      auto optExpr = parseAssignmentExpression(ParamIn);
 3044|      0|      if (!optExpr) {
  ------------------
  |  Branch (3044:11): [True: 0, False: 0]
  ------------------
 3045|      0|        return None;
 3046|      0|      }
 3047|      0|      if (!need(
  ------------------
  |  Branch (3047:11): [True: 0, False: 0]
  ------------------
 3048|      0|              TokenKind::r_square,
 3049|      0|              "at end of computed property key",
 3050|      0|              "start of property key",
 3051|      0|              start)) {
 3052|      0|        return llvh::None;
 3053|      0|      }
 3054|      0|      advance();
 3055|      0|      return *optExpr;
 3056|      0|    }
 3057|       |
 3058|      0|    default:
  ------------------
  |  Branch (3058:5): [True: 0, False: 12.0k]
  ------------------
 3059|      0|      if (tok_->isResWord()) {
  ------------------
  |  Branch (3059:11): [True: 0, False: 0]
  ------------------
 3060|      0|        auto *res = setLocation(
 3061|      0|            tok_,
 3062|      0|            tok_,
 3063|      0|            new (context_) ESTree::IdentifierNode(
 3064|      0|                tok_->getResWordIdentifier(), nullptr, false));
 3065|      0|        advance();
 3066|      0|        return res;
 3067|      0|      } else {
 3068|      0|        error(
 3069|      0|            tok_->getSourceRange(),
 3070|      0|            "invalid property name - must be a string, number or identifier");
 3071|      0|        return None;
 3072|      0|      }
 3073|  12.0k|  }
 3074|  12.0k|}
_ZN6hermes6parser6detail12JSParserImpl20parseTemplateLiteralENS1_5ParamE:
 3076|   743k|Optional<ESTree::Node *> JSParserImpl::parseTemplateLiteral(Param param) {
 3077|   743k|  assert(checkTemplateLiteral() && "invalid template literal start");
 3078|       |
 3079|      0|  SMLoc start = tok_->getStartLoc();
 3080|       |
 3081|   743k|  ESTree::NodeList quasis;
 3082|   743k|  ESTree::NodeList expressions;
 3083|       |
 3084|       |  /// Push the current TemplateElement onto quasis and advance the lexer.
 3085|       |  /// \param tail true if pushing the last element.
 3086|       |  /// \return false on failure.
 3087|   743k|  auto pushTemplateElement = [&quasis, &param, this](bool tail) -> bool {
 3088|   743k|    if (tok_->getTemplateLiteralContainsNotEscapes() &&
 3089|   743k|        !param.has(ParamTagged)) {
 3090|   743k|      error(
 3091|   743k|          tok_->getSourceRange(),
 3092|   743k|          "untagged template literal contains invalid escape sequence");
 3093|   743k|      return false;
 3094|   743k|    }
 3095|   743k|    auto *quasi = setLocation(
 3096|   743k|        tok_,
 3097|   743k|        tok_,
 3098|   743k|        new (context_) ESTree::TemplateElementNode(
 3099|   743k|            tail, tok_->getTemplateValue(), tok_->getTemplateRawValue()));
 3100|   743k|    quasis.push_back(*quasi);
 3101|   743k|    return true;
 3102|   743k|  };
 3103|       |
 3104|       |  // TemplateSpans
 3105|   743k|  while (
 3106|   898k|      !check(TokenKind::no_substitution_template, TokenKind::template_tail)) {
  ------------------
  |  Branch (3106:7): [True: 155k, False: 743k]
  ------------------
 3107|       |    // TemplateSpans
 3108|       |    // Alternate TemplateMiddle and Expression until TemplateTail.
 3109|   155k|    if (!check(TokenKind::template_head, TokenKind::template_middle)) {
  ------------------
  |  Branch (3109:9): [True: 0, False: 155k]
  ------------------
 3110|      0|      error(tok_->getSourceRange(), "expected template literal");
 3111|      0|      return None;
 3112|      0|    }
 3113|       |
 3114|       |    // First, push the TemplateElement.
 3115|   155k|    if (!pushTemplateElement(false))
  ------------------
  |  Branch (3115:9): [True: 0, False: 155k]
  ------------------
 3116|      0|      return None;
 3117|   155k|    SMLoc subStart = advance().Start;
 3118|       |
 3119|       |    // Parse the next expression and add it to the expressions.
 3120|   155k|    auto optExpr = parseExpression(ParamIn);
 3121|   155k|    if (!optExpr)
  ------------------
  |  Branch (3121:9): [True: 3, False: 155k]
  ------------------
 3122|      3|      return None;
 3123|   155k|    expressions.push_back(*optExpr.getValue());
 3124|       |
 3125|   155k|    if (!check(TokenKind::r_brace)) {
  ------------------
  |  Branch (3125:9): [True: 1, False: 155k]
  ------------------
 3126|      1|      errorExpected(
 3127|      1|          TokenKind::r_brace,
 3128|      1|          "at end of substition in template literal",
 3129|      1|          "start of substitution",
 3130|      1|          subStart);
 3131|      1|      return None;
 3132|      1|    }
 3133|       |
 3134|       |    // The } at the end of the expression must be rescanned as a
 3135|       |    // TemplateMiddle or TemplateTail.
 3136|   155k|    lexer_.rescanRBraceInTemplateLiteral();
 3137|   155k|  }
 3138|       |
 3139|       |  // TemplateTail or NoSubstitutionTemplate
 3140|   743k|  if (!pushTemplateElement(true))
  ------------------
  |  Branch (3140:7): [True: 0, False: 743k]
  ------------------
 3141|      0|    return None;
 3142|       |
 3143|   743k|  return setLocation(
 3144|   743k|      start,
 3145|   743k|      advance().End,
 3146|   743k|      new (context_) ESTree::TemplateLiteralNode(
 3147|   743k|          std::move(quasis), std::move(expressions)));
 3148|   743k|}
_ZN6hermes6parser6detail12JSParserImpl32parseOptionalExpressionExceptNewENS2_17IsConstructorCallE:
 3159|  3.95M|    IsConstructorCall isConstructorCall) {
 3160|  3.95M|  SMLoc startLoc = tok_->getStartLoc();
 3161|       |
 3162|  3.95M|  ESTree::NodePtr expr;
 3163|  3.95M|  if (check(TokenKind::rw_super)) {
  ------------------
  |  Branch (3163:7): [True: 0, False: 3.95M]
  ------------------
 3164|       |    // SuperProperty can be used the same way as PrimaryExpression, but
 3165|       |    // must not have a TemplateLiteral immediately after the `super` keyword.
 3166|      0|    expr = setLocation(tok_, tok_, new (context_) ESTree::SuperNode());
 3167|      0|    advance();
 3168|      0|    if (!checkN(TokenKind::l_paren, TokenKind::l_square, TokenKind::period)) {
  ------------------
  |  Branch (3168:9): [True: 0, False: 0]
  ------------------
 3169|      0|      errorExpected(
 3170|      0|          {TokenKind::l_paren, TokenKind::l_square, TokenKind::period},
 3171|      0|          "after 'super' keyword",
 3172|      0|          "location of 'super'",
 3173|      0|          startLoc);
 3174|      0|      return None;
 3175|      0|    }
 3176|  3.95M|  } else if (check(TokenKind::rw_import)) {
  ------------------
  |  Branch (3176:14): [True: 0, False: 3.95M]
  ------------------
 3177|      0|    SMRange importRange = advance();
 3178|      0|    if (checkAndEat(TokenKind::period)) {
  ------------------
  |  Branch (3178:9): [True: 0, False: 0]
  ------------------
 3179|       |      // ImportMeta: import . meta
 3180|       |      //                      ^
 3181|      0|      if (!check(metaIdent_)) {
  ------------------
  |  Branch (3181:11): [True: 0, False: 0]
  ------------------
 3182|      0|        error(tok_->getSourceRange(), "'meta' expected in member expression");
 3183|      0|        sm_.note(
 3184|      0|            importRange.Start, "start of member expression", Subsystem::Parser);
 3185|      0|        return None;
 3186|      0|      }
 3187|      0|      auto *meta = setLocation(
 3188|      0|          importRange,
 3189|      0|          importRange,
 3190|      0|          new (context_) ESTree::IdentifierNode(importIdent_, nullptr, false));
 3191|      0|      auto *prop = setLocation(
 3192|      0|          tok_,
 3193|      0|          tok_,
 3194|      0|          new (context_) ESTree::IdentifierNode(metaIdent_, nullptr, false));
 3195|      0|      advance();
 3196|      0|      expr = setLocation(
 3197|      0|          meta,
 3198|      0|          getPrevTokenEndLoc(),
 3199|      0|          new (context_) ESTree::MetaPropertyNode(meta, prop));
 3200|      0|    } else {
 3201|       |      // ImportCall must be a call with an AssignmentExpression as the
 3202|       |      // argument.
 3203|      0|      if (!eat(
  ------------------
  |  Branch (3203:11): [True: 0, False: 0]
  ------------------
 3204|      0|              TokenKind::l_paren,
 3205|      0|              JSLexer::AllowRegExp,
 3206|      0|              "in import call",
 3207|      0|              "location of 'import'",
 3208|      0|              startLoc))
 3209|      0|        return None;
 3210|       |
 3211|      0|      auto optSource = parseAssignmentExpression(ParamIn);
 3212|      0|      if (!optSource)
  ------------------
  |  Branch (3212:11): [True: 0, False: 0]
  ------------------
 3213|      0|        return None;
 3214|      0|      ESTree::Node *source = *optSource;
 3215|       |
 3216|      0|      checkAndEat(TokenKind::comma);
 3217|       |
 3218|      0|      ESTree::Node *attributes = nullptr;
 3219|      0|      if (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (3219:11): [True: 0, False: 0]
  ------------------
 3220|      0|        auto optAttributes = parseAssignmentExpression();
 3221|      0|        if (!optAttributes)
  ------------------
  |  Branch (3221:13): [True: 0, False: 0]
  ------------------
 3222|      0|          return None;
 3223|      0|        attributes = *optAttributes;
 3224|      0|        checkAndEat(TokenKind::comma);
 3225|      0|      }
 3226|       |
 3227|      0|      SMLoc endLoc = tok_->getEndLoc();
 3228|      0|      if (!eat(
  ------------------
  |  Branch (3228:11): [True: 0, False: 0]
  ------------------
 3229|      0|              TokenKind::r_paren,
 3230|      0|              JSLexer::AllowRegExp,
 3231|      0|              "in import call",
 3232|      0|              "location of 'import'",
 3233|      0|              startLoc))
 3234|      0|        return None;
 3235|       |
 3236|      0|      expr = setLocation(
 3237|      0|          startLoc,
 3238|      0|          endLoc,
 3239|      0|          new (context_) ESTree::ImportExpressionNode(source, attributes));
 3240|      0|    }
 3241|  3.95M|  } else {
 3242|  3.95M|    auto primExpr = parsePrimaryExpression();
 3243|  3.95M|    if (!primExpr)
  ------------------
  |  Branch (3243:9): [True: 606, False: 3.95M]
  ------------------
 3244|    606|      return None;
 3245|  3.95M|    expr = primExpr.getValue();
 3246|  3.95M|  }
 3247|       |
 3248|  3.95M|  return parseOptionalExpressionExceptNew_tail(
 3249|  3.95M|      isConstructorCall, startLoc, expr);
 3250|  3.95M|}
_ZN6hermes6parser6detail12JSParserImpl37parseOptionalExpressionExceptNew_tailENS2_17IsConstructorCallEN4llvh5SMLocEPNS_6ESTree4NodeE:
 3255|  3.95M|    ESTree::Node *expr) {
 3256|  3.95M|  SMLoc objectLoc = startLoc;
 3257|  3.95M|  bool seenOptionalChain = false;
 3258|  3.95M|  llvh::SaveAndRestore<unsigned> savedRecursionDepth{
 3259|  3.95M|      recursionDepth_, recursionDepth_};
 3260|  3.95M|  while (
 3261|  3.95M|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot) ||
  ------------------
  |  Branch (3261:7): [True: 6.81k, False: 3.95M]
  ------------------
 3262|  3.95M|      checkTemplateLiteral()) {
  ------------------
  |  Branch (3262:7): [True: 643, False: 3.95M]
  ------------------
 3263|  7.45k|    ++recursionDepth_;
 3264|  7.45k|    if (LLVM_UNLIKELY(recursionDepthCheck())) {
  ------------------
  |  |  189|  7.45k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.45k]
  |  |  ------------------
  ------------------
 3265|      0|      return None;
 3266|      0|    }
 3267|  7.45k|    SMLoc nextObjectLoc = tok_->getStartLoc();
 3268|  7.45k|    if (checkN(
  ------------------
  |  Branch (3268:9): [True: 6.81k, False: 643]
  ------------------
 3269|  7.45k|            TokenKind::l_square, TokenKind::period, TokenKind::questiondot)) {
 3270|  6.81k|      if (check(TokenKind::questiondot)) {
  ------------------
  |  Branch (3270:11): [True: 139, False: 6.67k]
  ------------------
 3271|    139|        seenOptionalChain = true;
 3272|    139|        if (isConstructorCall == IsConstructorCall::Yes) {
  ------------------
  |  Branch (3272:13): [True: 0, False: 139]
  ------------------
 3273|       |          // Report the error here, but continue on because we can still parse
 3274|       |          // the rest of the file.
 3275|      0|          error(
 3276|      0|              tok_->getSourceRange(),
 3277|      0|              "Constructor calls may not contain an optional chain");
 3278|      0|        }
 3279|    139|      }
 3280|       |      // MemberExpression [ Expression ]
 3281|       |      // MemberExpression . IdentifierName
 3282|       |      // MemberExpression OptionalChain
 3283|  6.81k|      auto msel =
 3284|  6.81k|          parseMemberSelect(startLoc, objectLoc, expr, seenOptionalChain);
 3285|  6.81k|      if (!msel)
  ------------------
  |  Branch (3285:11): [True: 0, False: 6.81k]
  ------------------
 3286|      0|        return None;
 3287|  6.81k|      objectLoc = nextObjectLoc;
 3288|  6.81k|      expr = msel.getValue();
 3289|  6.81k|    } else {
 3290|    643|      assert(checkTemplateLiteral());
 3291|    643|      if (isa<ESTree::SuperNode>(expr)) {
  ------------------
  |  Branch (3291:11): [True: 0, False: 643]
  ------------------
 3292|      0|        error(
 3293|      0|            expr->getSourceRange(),
 3294|      0|            "invalid use of 'super' as a template literal tag");
 3295|      0|        return None;
 3296|      0|      }
 3297|    643|      if (seenOptionalChain) {
  ------------------
  |  Branch (3297:11): [True: 0, False: 643]
  ------------------
 3298|       |        // This construction is allowed by the grammar but accounted for by
 3299|       |        // static semantics in order to prevent ASI from being used like this:
 3300|       |        // \code
 3301|       |        // a?.b
 3302|       |        // `abc`;
 3303|       |        // \endcode
 3304|      0|        error(
 3305|      0|            tok_->getSourceRange(),
 3306|      0|            "invalid use of tagged template literal in optional chain");
 3307|      0|        sm_.note(expr->getSourceRange(), "location of optional chain");
 3308|      0|      }
 3309|       |      // MemberExpression TemplateLiteral
 3310|    643|      auto optTemplate = parseTemplateLiteral(ParamTagged);
 3311|    643|      if (!optTemplate)
  ------------------
  |  Branch (3311:11): [True: 3, False: 640]
  ------------------
 3312|      3|        return None;
 3313|    640|      expr = setLocation(
 3314|    640|          startLoc,
 3315|    640|          optTemplate.getValue(),
 3316|    640|          new (context_) ESTree::TaggedTemplateExpressionNode(
 3317|    640|              expr, optTemplate.getValue()));
 3318|    640|      objectLoc = nextObjectLoc;
 3319|    640|    }
 3320|  7.45k|  }
 3321|       |
 3322|  3.95M|  return expr;
 3323|  3.95M|}
_ZN6hermes6parser6detail12JSParserImpl14parseArgumentsERN4llvh12simple_ilistINS_6ESTree4NodeEJEEERNS3_5SMLocE:
 3327|  2.49k|    SMLoc &endLoc) {
 3328|  2.49k|  assert(check(TokenKind::l_paren));
 3329|      0|  SMLoc startLoc = advance().Start;
 3330|  2.49k|  if (!check(TokenKind::r_paren)) {
  ------------------
  |  Branch (3330:7): [True: 454, False: 2.04k]
  ------------------
 3331|    454|    for (;;) {
 3332|    454|      SMLoc argStart = tok_->getStartLoc();
 3333|    454|      bool isSpread = checkAndEat(TokenKind::dotdotdot);
 3334|       |
 3335|    454|      auto arg = parseAssignmentExpression();
 3336|    454|      if (!arg)
  ------------------
  |  Branch (3336:11): [True: 438, False: 16]
  ------------------
 3337|    438|        return None;
 3338|       |
 3339|     16|      if (isSpread) {
  ------------------
  |  Branch (3339:11): [True: 0, False: 16]
  ------------------
 3340|      0|        argList.push_back(*setLocation(
 3341|      0|            argStart,
 3342|      0|            getPrevTokenEndLoc(),
 3343|      0|            new (context_) ESTree::SpreadElementNode(arg.getValue())));
 3344|     16|      } else {
 3345|     16|        argList.push_back(*arg.getValue());
 3346|     16|      }
 3347|       |
 3348|     16|      if (!checkAndEat(TokenKind::comma))
  ------------------
  |  Branch (3348:11): [True: 16, False: 0]
  ------------------
 3349|     16|        break;
 3350|       |
 3351|       |      // Check for ",)".
 3352|      0|      if (check(TokenKind::r_paren))
  ------------------
  |  Branch (3352:11): [True: 0, False: 0]
  ------------------
 3353|      0|        break;
 3354|      0|    }
 3355|    454|  }
 3356|  2.05k|  endLoc = tok_->getEndLoc();
 3357|  2.05k|  if (!eat(
  ------------------
  |  Branch (3357:7): [True: 0, False: 2.05k]
  ------------------
 3358|  2.05k|          TokenKind::r_paren,
 3359|  2.05k|          JSLexer::AllowDiv,
 3360|  2.05k|          "at end of function call",
 3361|  2.05k|          "location of '('",
 3362|  2.05k|          startLoc))
 3363|      0|    return None;
 3364|       |
 3365|  2.05k|  return "OK";
 3366|  2.05k|}
_ZN6hermes6parser6detail12JSParserImpl17parseMemberSelectEN4llvh5SMLocES4_PNS_6ESTree4NodeEb:
 3372|  8.85k|    bool seenOptionalChain) {
 3373|  8.85k|  assert(
 3374|  8.85k|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot));
 3375|      0|  SMLoc puncLoc = tok_->getStartLoc();
 3376|  8.85k|  bool optional = checkAndEat(TokenKind::questiondot);
 3377|  8.85k|  if (checkAndEat(TokenKind::l_square)) {
  ------------------
  |  Branch (3377:7): [True: 2.08k, False: 6.77k]
  ------------------
 3378|       |    // Parsing another Expression directly without going through
 3379|       |    // PrimaryExpression. This can overflow, so check.
 3380|  2.08k|    CHECK_RECURSION;
  ------------------
  |  | 1346|  2.08k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  2.08k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 2.08k]
  |  |  ------------------
  |  | 1348|  2.08k|    return llvh::None;
  ------------------
 3381|  2.08k|    auto propExpr = parseExpression();
 3382|  2.08k|    if (!propExpr)
  ------------------
  |  Branch (3382:9): [True: 2.04k, False: 40]
  ------------------
 3383|  2.04k|      return None;
 3384|     40|    SMLoc endLoc = tok_->getEndLoc();
 3385|     40|    if (!eat(
  ------------------
  |  Branch (3385:9): [True: 0, False: 40]
  ------------------
 3386|     40|            TokenKind::r_square,
 3387|     40|            JSLexer::AllowDiv,
 3388|     40|            "at end of member expression '[...'",
 3389|     40|            "location iof '['",
 3390|     40|            puncLoc))
 3391|      0|      return None;
 3392|       |
 3393|     40|    if (optional || seenOptionalChain) {
  ------------------
  |  Branch (3393:9): [True: 0, False: 40]
  |  Branch (3393:21): [True: 0, False: 40]
  ------------------
 3394|      0|      return setLocation(
 3395|      0|          startLoc,
 3396|      0|          endLoc,
 3397|      0|          puncLoc,
 3398|      0|          new (context_) ESTree::OptionalMemberExpressionNode(
 3399|      0|              expr, propExpr.getValue(), true, optional));
 3400|      0|    }
 3401|     40|    return setLocation(
 3402|     40|        startLoc,
 3403|     40|        endLoc,
 3404|     40|        puncLoc,
 3405|     40|        new (context_)
 3406|     40|            ESTree::MemberExpressionNode(expr, propExpr.getValue(), true));
 3407|  6.77k|  } else if (
 3408|  6.77k|      checkAndEat(TokenKind::period) ||
  ------------------
  |  Branch (3408:7): [True: 6.63k, False: 139]
  ------------------
 3409|  6.77k|      (optional &&
  ------------------
  |  Branch (3409:8): [True: 139, False: 0]
  ------------------
 3410|    139|       !(check(TokenKind::l_paren) ||
  ------------------
  |  Branch (3410:10): [True: 0, False: 139]
  ------------------
 3411|  6.77k|         (context_.getParseFlow() && check(TokenKind::less))))) {
  ------------------
  |  Branch (3411:11): [True: 0, False: 139]
  |  Branch (3411:38): [True: 0, False: 0]
  ------------------
 3412|  6.77k|    if (!check(TokenKind::identifier, TokenKind::private_identifier) &&
  ------------------
  |  Branch (3412:9): [True: 130, False: 6.64k]
  ------------------
 3413|  6.77k|        !tok_->isResWord()) {
  ------------------
  |  Branch (3413:9): [True: 0, False: 130]
  ------------------
 3414|       |      // Just use the pattern here, even though we know it will fail.
 3415|      0|      if (!need(
  ------------------
  |  Branch (3415:11): [True: 0, False: 0]
  ------------------
 3416|      0|              TokenKind::identifier,
 3417|      0|              "after '.' or '?.' in member expression",
 3418|      0|              "start of member expression",
 3419|      0|              objectLoc))
 3420|      0|        return None;
 3421|      0|    }
 3422|       |
 3423|  6.77k|    ESTree::Node *id = nullptr;
 3424|  6.77k|    if (check(TokenKind::private_identifier)) {
  ------------------
  |  Branch (3424:9): [True: 0, False: 6.77k]
  ------------------
 3425|      0|      auto optId = parsePrivateName();
 3426|      0|      if (!optId)
  ------------------
  |  Branch (3426:11): [True: 0, False: 0]
  ------------------
 3427|      0|        return None;
 3428|      0|      id = *optId;
 3429|  6.77k|    } else {
 3430|  6.77k|      id = setLocation(
 3431|  6.77k|          tok_,
 3432|  6.77k|          tok_,
 3433|  6.77k|          new (context_) ESTree::IdentifierNode(
 3434|  6.77k|              tok_->getResWordOrIdentifier(), nullptr, false));
 3435|  6.77k|      advance(JSLexer::AllowDiv);
 3436|  6.77k|    }
 3437|       |
 3438|  6.77k|    if (optional || seenOptionalChain) {
  ------------------
  |  Branch (3438:9): [True: 139, False: 6.63k]
  |  Branch (3438:21): [True: 3.37k, False: 3.25k]
  ------------------
 3439|  3.51k|      return setLocation(
 3440|  3.51k|          startLoc,
 3441|  3.51k|          id,
 3442|  3.51k|          puncLoc,
 3443|  3.51k|          new (context_)
 3444|  3.51k|              ESTree::OptionalMemberExpressionNode(expr, id, false, optional));
 3445|  3.51k|    }
 3446|  3.25k|    return setLocation(
 3447|  3.25k|        startLoc,
 3448|  3.25k|        id,
 3449|  3.25k|        puncLoc,
 3450|  3.25k|        new (context_) ESTree::MemberExpressionNode(expr, id, false));
 3451|  6.77k|  } else {
 3452|      0|    assert(
 3453|      0|        optional &&
 3454|      0|        (check(TokenKind::l_paren) ||
 3455|      0|         (context_.getParseFlow() && check(TokenKind::less))) &&
 3456|      0|        "must be ?.() at this point");
 3457|       |    // ?. Arguments :
 3458|       |    // ?. ( ArgumentList )
 3459|       |    //      ^
 3460|      0|    auto debugLoc = tok_->getStartLoc();
 3461|       |
 3462|      0|    ESTree::NodePtr typeArgs = nullptr;
 3463|      0|#if HERMES_PARSE_FLOW
 3464|      0|    if (context_.getParseFlow() && check(TokenKind::less)) {
  ------------------
  |  Branch (3464:9): [True: 0, False: 0]
  |  Branch (3464:36): [True: 0, False: 0]
  ------------------
 3465|      0|      auto optTypeArgs = parseTypeArgsFlow();
 3466|      0|      if (!optTypeArgs) {
  ------------------
  |  Branch (3466:11): [True: 0, False: 0]
  ------------------
 3467|      0|        return None;
 3468|      0|      }
 3469|       |
 3470|      0|      typeArgs = *optTypeArgs;
 3471|       |
 3472|      0|      if (!need(
  ------------------
  |  Branch (3472:11): [True: 0, False: 0]
  ------------------
 3473|      0|              TokenKind::l_paren,
 3474|      0|              "after type arguments in optional call",
 3475|      0|              "start of optional call",
 3476|      0|              objectLoc))
 3477|      0|        return None;
 3478|      0|    }
 3479|      0|#endif
 3480|      0|#if HERMES_PARSE_TS
 3481|      0|    if (context_.getParseTS() && check(TokenKind::less)) {
  ------------------
  |  Branch (3481:9): [True: 0, False: 0]
  |  Branch (3481:34): [True: 0, False: 0]
  ------------------
 3482|      0|      auto optTypeArgs = parseTSTypeArguments();
 3483|      0|      if (!optTypeArgs) {
  ------------------
  |  Branch (3483:11): [True: 0, False: 0]
  ------------------
 3484|      0|        return None;
 3485|      0|      }
 3486|       |
 3487|      0|      typeArgs = *optTypeArgs;
 3488|       |
 3489|      0|      if (!need(
  ------------------
  |  Branch (3489:11): [True: 0, False: 0]
  ------------------
 3490|      0|              TokenKind::l_paren,
 3491|      0|              "after type arguments in optional call",
 3492|      0|              "start of optional call",
 3493|      0|              objectLoc))
 3494|      0|        return None;
 3495|      0|    }
 3496|      0|#endif
 3497|       |
 3498|      0|    ESTree::NodeList argList;
 3499|      0|    SMLoc endLoc;
 3500|      0|    if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3500:9): [True: 0, False: 0]
  ------------------
 3501|      0|      return None;
 3502|       |
 3503|      0|    return setLocation(
 3504|      0|        startLoc,
 3505|      0|        endLoc,
 3506|      0|        debugLoc,
 3507|      0|        new (context_) ESTree::OptionalCallExpressionNode(
 3508|      0|            expr, typeArgs, std::move(argList), true));
 3509|      0|  }
 3510|       |
 3511|      0|  llvm_unreachable("Invalid token in parseMemberSelect");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 3512|  8.85k|}
_ZN6hermes6parser6detail12JSParserImpl19parseCallExpressionEN4llvh5SMLocEPNS_6ESTree4NodeES7_bb:
 3519|  2.48k|    bool optional) {
 3520|  2.48k|  assert(checkN(
 3521|  2.48k|      TokenKind::l_paren,
 3522|  2.48k|      TokenKind::no_substitution_template,
 3523|  2.48k|      TokenKind::template_head));
 3524|       |
 3525|      0|  SMLoc objectLoc = startLoc;
 3526|       |
 3527|  4.54k|  for (;;) {
 3528|  4.54k|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3529|  4.54k|    if ((context_.getParseFlowAmbiguous() || context_.getParseTS()) &&
  ------------------
  |  Branch (3529:10): [True: 0, False: 4.54k]
  |  Branch (3529:46): [True: 0, False: 4.54k]
  ------------------
 3530|  4.54k|        !typeArgs && check(TokenKind::less)) {
  ------------------
  |  Branch (3530:9): [True: 0, False: 0]
  |  Branch (3530:22): [True: 0, False: 0]
  ------------------
 3531|      0|      JSLexer::SavePoint savePoint{&lexer_};
 3532|       |      // Each call in a chain may have type arguments.
 3533|       |      // As such, we must attempt to parse them upon encountering '<',
 3534|       |      // but roll back if it just ended up being a comparison operator.
 3535|      0|      SourceErrorManager::SaveAndSuppressMessages suppress{
 3536|      0|          &sm_, Subsystem::Parser};
 3537|      0|      auto optTypeArgs =
 3538|      0|          context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3538:11): [True: 0, False: 0]
  ------------------
 3539|      0|      if (optTypeArgs && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3539:11): [True: 0, False: 0]
  |  Branch (3539:26): [True: 0, False: 0]
  ------------------
 3540|       |        // Call expression with type arguments.
 3541|      0|        typeArgs = *optTypeArgs;
 3542|      0|      } else {
 3543|       |        // Failed to parse a call expression with type arguments,
 3544|       |        // simply roll back and start again.
 3545|      0|        savePoint.restore();
 3546|      0|      }
 3547|      0|    }
 3548|  4.54k|#endif
 3549|  4.54k|    if (check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3549:9): [True: 2.49k, False: 2.05k]
  ------------------
 3550|  2.49k|      auto debugLoc = tok_->getStartLoc();
 3551|  2.49k|      ESTree::NodeList argList;
 3552|  2.49k|      SMLoc endLoc;
 3553|       |
 3554|       |      // parseArguments can result in another call to parseCallExpression
 3555|       |      // without parsing another primary or declaration.
 3556|  2.49k|      CHECK_RECURSION;
  ------------------
  |  | 1346|  2.49k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  2.49k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 2.49k]
  |  |  ------------------
  |  | 1348|  2.49k|    return llvh::None;
  ------------------
 3557|  2.49k|      if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3557:11): [True: 438, False: 2.05k]
  ------------------
 3558|    438|        return None;
 3559|       |
 3560|  2.05k|      if (seenOptionalChain) {
  ------------------
  |  Branch (3560:11): [True: 0, False: 2.05k]
  ------------------
 3561|      0|        expr = setLocation(
 3562|      0|            startLoc,
 3563|      0|            endLoc,
 3564|      0|            debugLoc,
 3565|      0|            new (context_) ESTree::OptionalCallExpressionNode(
 3566|      0|                expr, typeArgs, std::move(argList), optional));
 3567|  2.05k|      } else {
 3568|  2.05k|        expr = setLocation(
 3569|  2.05k|            startLoc,
 3570|  2.05k|            endLoc,
 3571|  2.05k|            debugLoc,
 3572|  2.05k|            new (context_)
 3573|  2.05k|                ESTree::CallExpressionNode(expr, typeArgs, std::move(argList)));
 3574|  2.05k|      }
 3575|       |
 3576|       |      // typeArgs have been used, discard them so the next item in the call
 3577|       |      // chain can populate them if necessary.
 3578|  2.05k|      typeArgs = nullptr;
 3579|  2.05k|    } else if (checkN(
  ------------------
  |  Branch (3579:16): [True: 2.04k, False: 8]
  ------------------
 3580|  2.05k|                   TokenKind::l_square,
 3581|  2.05k|                   TokenKind::period,
 3582|  2.05k|                   TokenKind::questiondot)) {
 3583|  2.04k|      if (check(TokenKind::questiondot)) {
  ------------------
  |  Branch (3583:11): [True: 0, False: 2.04k]
  ------------------
 3584|      0|        seenOptionalChain = true;
 3585|      0|      }
 3586|       |
 3587|  2.04k|      SMLoc nextObjectLoc = tok_->getStartLoc();
 3588|  2.04k|      auto msel =
 3589|  2.04k|          parseMemberSelect(startLoc, objectLoc, expr, seenOptionalChain);
 3590|  2.04k|      if (!msel)
  ------------------
  |  Branch (3590:11): [True: 2.04k, False: 0]
  ------------------
 3591|  2.04k|        return None;
 3592|      0|      objectLoc = nextObjectLoc;
 3593|      0|      expr = msel.getValue();
 3594|      8|    } else if (check(
  ------------------
  |  Branch (3594:16): [True: 0, False: 8]
  ------------------
 3595|      8|                   TokenKind::no_substitution_template,
 3596|      8|                   TokenKind::template_head)) {
 3597|      0|      auto debugLoc = tok_->getStartLoc();
 3598|      0|      auto optTemplate = parseTemplateLiteral(ParamTagged);
 3599|      0|      if (!optTemplate)
  ------------------
  |  Branch (3599:11): [True: 0, False: 0]
  ------------------
 3600|      0|        return None;
 3601|      0|      expr = setLocation(
 3602|      0|          startLoc,
 3603|      0|          optTemplate.getValue(),
 3604|      0|          debugLoc,
 3605|      0|          new (context_) ESTree::TaggedTemplateExpressionNode(
 3606|      0|              expr, optTemplate.getValue()));
 3607|      8|    } else {
 3608|      8|      break;
 3609|      8|    }
 3610|  4.54k|  }
 3611|       |
 3612|      8|  return expr;
 3613|  2.48k|}
_ZN6hermes6parser6detail12JSParserImpl38parseNewExpressionOrOptionalExpressionENS2_17IsConstructorCallE:
 3641|  3.95M|    IsConstructorCall isConstructorCall) {
 3642|  3.95M|  if (!check(TokenKind::rw_new))
  ------------------
  |  Branch (3642:7): [True: 3.95M, False: 0]
  ------------------
 3643|  3.95M|    return parseOptionalExpressionExceptNew(isConstructorCall);
 3644|       |
 3645|      0|  SMRange newRange = advance();
 3646|       |
 3647|      0|  if (checkAndEat(TokenKind::period)) {
  ------------------
  |  Branch (3647:7): [True: 0, False: 0]
  ------------------
 3648|       |    // NewTarget: new . target
 3649|       |    //                  ^
 3650|      0|    if (!check(targetIdent_)) {
  ------------------
  |  Branch (3650:9): [True: 0, False: 0]
  ------------------
 3651|      0|      error(tok_->getSourceRange(), "'target' expected in member expression");
 3652|      0|      sm_.note(newRange.Start, "start of member expression");
 3653|      0|      return None;
 3654|      0|    }
 3655|      0|    auto *meta = setLocation(
 3656|      0|        newRange,
 3657|      0|        newRange,
 3658|      0|        new (context_) ESTree::IdentifierNode(newIdent_, nullptr, false));
 3659|      0|    auto *prop = setLocation(
 3660|      0|        tok_,
 3661|      0|        tok_,
 3662|      0|        new (context_) ESTree::IdentifierNode(targetIdent_, nullptr, false));
 3663|      0|    advance();
 3664|      0|    auto *expr = setLocation(
 3665|      0|        meta, prop, new (context_) ESTree::MetaPropertyNode(meta, prop));
 3666|      0|    return parseOptionalExpressionExceptNew_tail(
 3667|      0|        isConstructorCall, newRange.Start, expr);
 3668|      0|  }
 3669|       |
 3670|      0|  CHECK_RECURSION;
  ------------------
  |  | 1346|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1347|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1348|      0|    return llvh::None;
  ------------------
 3671|      0|  auto optExpr = parseNewExpressionOrOptionalExpression(IsConstructorCall::Yes);
 3672|      0|  if (!optExpr)
  ------------------
  |  Branch (3672:7): [True: 0, False: 0]
  ------------------
 3673|      0|    return None;
 3674|      0|  ESTree::NodePtr expr = optExpr.getValue();
 3675|       |
 3676|      0|  ESTree::Node *typeArgs = nullptr;
 3677|      0|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3678|      0|  if ((context_.getParseFlowAmbiguous() || context_.getParseTS()) &&
  ------------------
  |  Branch (3678:8): [True: 0, False: 0]
  |  Branch (3678:44): [True: 0, False: 0]
  ------------------
 3679|      0|      check(TokenKind::less)) {
  ------------------
  |  Branch (3679:7): [True: 0, False: 0]
  ------------------
 3680|      0|    JSLexer::SavePoint savePoint{&lexer_};
 3681|       |    // Attempt to parse type args upon encountering '<',
 3682|       |    // but roll back if it just ended up being a comparison operator.
 3683|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 3684|      0|        &sm_, Subsystem::Parser};
 3685|      0|    auto optTypeArgs =
 3686|      0|        context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3686:9): [True: 0, False: 0]
  ------------------
 3687|      0|    if (optTypeArgs) {
  ------------------
  |  Branch (3687:9): [True: 0, False: 0]
  ------------------
 3688|       |      // New expression with type arguments.
 3689|      0|      typeArgs = *optTypeArgs;
 3690|      0|    } else {
 3691|       |      // Failed to parse a call expression with type arguments,
 3692|       |      // simply roll back and start again.
 3693|      0|      savePoint.restore();
 3694|      0|    }
 3695|      0|  }
 3696|      0|#endif
 3697|       |
 3698|       |  // Do we have arguments to a child MemberExpression? If yes, then it really
 3699|       |  // was a 'new MemberExpression(args)', otherwise it is a NewExpression
 3700|      0|  if (!check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3700:7): [True: 0, False: 0]
  ------------------
 3701|      0|    return setLocation(
 3702|      0|        newRange,
 3703|      0|        getPrevTokenEndLoc(),
 3704|      0|        new (context_)
 3705|      0|            ESTree::NewExpressionNode(expr, typeArgs, ESTree::NodeList{}));
 3706|      0|  }
 3707|       |
 3708|      0|  auto debugLoc = tok_->getStartLoc();
 3709|      0|  ESTree::NodeList argList;
 3710|      0|  SMLoc endLoc;
 3711|      0|  if (!parseArguments(argList, endLoc))
  ------------------
  |  Branch (3711:7): [True: 0, False: 0]
  ------------------
 3712|      0|    return None;
 3713|       |
 3714|      0|  expr = setLocation(
 3715|      0|      newRange,
 3716|      0|      endLoc,
 3717|      0|      debugLoc,
 3718|      0|      new (context_)
 3719|      0|          ESTree::NewExpressionNode(expr, typeArgs, std::move(argList)));
 3720|       |
 3721|      0|  SMLoc objectLoc = newRange.Start;
 3722|      0|  while (
 3723|      0|      checkN(TokenKind::l_square, TokenKind::period, TokenKind::questiondot)) {
  ------------------
  |  Branch (3723:7): [True: 0, False: 0]
  ------------------
 3724|      0|    SMLoc nextObjectLoc = tok_->getStartLoc();
 3725|      0|    auto optMSel = parseMemberSelect(newRange.Start, objectLoc, expr, false);
 3726|      0|    if (!optMSel)
  ------------------
  |  Branch (3726:9): [True: 0, False: 0]
  ------------------
 3727|      0|      return None;
 3728|      0|    objectLoc = nextObjectLoc;
 3729|      0|    expr = optMSel.getValue();
 3730|      0|  }
 3731|       |
 3732|      0|  return expr;
 3733|      0|}
_ZN6hermes6parser6detail12JSParserImpl27parseLeftHandSideExpressionEv:
 3735|  3.95M|Optional<ESTree::Node *> JSParserImpl::parseLeftHandSideExpression() {
 3736|  3.95M|  SMLoc startLoc = tok_->getStartLoc();
 3737|       |
 3738|  3.95M|  auto optExpr = parseNewExpressionOrOptionalExpression(IsConstructorCall::No);
 3739|  3.95M|  if (!optExpr)
  ------------------
  |  Branch (3739:7): [True: 609, False: 3.95M]
  ------------------
 3740|    609|    return None;
 3741|  3.95M|  auto *expr = optExpr.getValue();
 3742|       |
 3743|  3.95M|  bool optional = checkAndEat(TokenKind::questiondot);
 3744|  3.95M|  bool seenOptionalChain = optional ||
  ------------------
  |  Branch (3744:28): [True: 0, False: 3.95M]
  ------------------
 3745|  3.95M|      (expr->getParens() == 0 &&
  ------------------
  |  Branch (3745:8): [True: 3.95M, False: 0]
  ------------------
 3746|  3.95M|       (llvh::isa<ESTree::OptionalMemberExpressionNode>(expr) ||
  ------------------
  |  Branch (3746:9): [True: 105, False: 3.95M]
  ------------------
 3747|  3.95M|        llvh::isa<ESTree::OptionalCallExpressionNode>(expr)));
  ------------------
  |  Branch (3747:9): [True: 0, False: 3.95M]
  ------------------
 3748|       |
 3749|  3.95M|  ESTree::Node *typeArgs = nullptr;
 3750|  3.95M|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 3751|       |  // If the less than sign is immediately following a question dot then it
 3752|       |  // cannot be a binary expression and is unambiguously Flow type syntax.
 3753|  3.95M|  if (((optional ? context_.getParseFlow()
  ------------------
  |  Branch (3753:8): [True: 0, False: 3.95M]
  |  Branch (3753:9): [True: 0, False: 3.95M]
  ------------------
 3754|  3.95M|                 : context_.getParseFlowAmbiguous()) ||
 3755|  3.95M|       context_.getParseTS()) &&
  ------------------
  |  Branch (3755:8): [True: 0, False: 3.95M]
  ------------------
 3756|  3.95M|      check(TokenKind::less)) {
  ------------------
  |  Branch (3756:7): [True: 0, False: 0]
  ------------------
 3757|      0|    JSLexer::SavePoint savePoint{&lexer_};
 3758|       |    // Suppress messages from the parser while still displaying lexer messages.
 3759|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 3760|      0|        &sm_, Subsystem::Parser};
 3761|      0|    auto optTypeArgs =
 3762|      0|        context_.getParseTS() ? parseTSTypeArguments() : parseTypeArgsFlow();
  ------------------
  |  Branch (3762:9): [True: 0, False: 0]
  ------------------
 3763|      0|    if (optTypeArgs && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (3763:9): [True: 0, False: 0]
  |  Branch (3763:24): [True: 0, False: 0]
  ------------------
 3764|       |      // Call expression with type arguments.
 3765|      0|      typeArgs = *optTypeArgs;
 3766|      0|    } else {
 3767|       |      // Failed to parse a call expression with type arguments,
 3768|       |      // simply roll back and start again.
 3769|      0|      savePoint.restore();
 3770|      0|    }
 3771|      0|  }
 3772|  3.95M|#endif
 3773|       |
 3774|       |  // Is this a CallExpression?
 3775|  3.95M|  if (checkN(
  ------------------
  |  Branch (3775:7): [True: 2.48k, False: 3.94M]
  ------------------
 3776|  3.95M|          TokenKind::l_paren,
 3777|  3.95M|          TokenKind::no_substitution_template,
 3778|  3.95M|          TokenKind::template_head)) {
 3779|  2.48k|    auto optCallExpr = parseCallExpression(
 3780|  2.48k|        startLoc, expr, typeArgs, seenOptionalChain, optional);
 3781|  2.48k|    if (!optCallExpr)
  ------------------
  |  Branch (3781:9): [True: 2.48k, False: 8]
  ------------------
 3782|  2.48k|      return None;
 3783|      8|    expr = optCallExpr.getValue();
 3784|      8|  }
 3785|       |
 3786|  3.94M|  return expr;
 3787|  3.95M|}
_ZN6hermes6parser6detail12JSParserImpl22parsePostfixExpressionEv:
 3789|  3.95M|Optional<ESTree::Node *> JSParserImpl::parsePostfixExpression() {
 3790|  3.95M|  SMLoc startLoc = tok_->getStartLoc();
 3791|  3.95M|  auto optLHandExpr = parseLeftHandSideExpression();
 3792|  3.95M|  if (!optLHandExpr)
  ------------------
  |  Branch (3792:7): [True: 3.08k, False: 3.94M]
  ------------------
 3793|  3.08k|    return None;
 3794|       |
 3795|  3.94M|  if (check(TokenKind::plusplus, TokenKind::minusminus) &&
  ------------------
  |  Branch (3795:7): [True: 58, False: 3.94M]
  ------------------
 3796|  3.94M|      !lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (3796:7): [True: 58, False: 0]
  ------------------
 3797|     58|    auto *res = setLocation(
 3798|     58|        startLoc,
 3799|     58|        tok_,
 3800|     58|        tok_,
 3801|     58|        new (context_) ESTree::UpdateExpressionNode(
 3802|     58|            getTokenIdent(tok_->getKind()), optLHandExpr.getValue(), false));
 3803|     58|    advance(JSLexer::AllowDiv);
 3804|     58|    return res;
 3805|  3.94M|  } else {
 3806|  3.94M|    return optLHandExpr.getValue();
 3807|  3.94M|  }
 3808|  3.94M|}
_ZN6hermes6parser6detail12JSParserImpl20parseUnaryExpressionEv:
 3810|  3.96M|Optional<ESTree::Node *> JSParserImpl::parseUnaryExpression() {
 3811|  3.96M|  SMLoc startLoc = tok_->getStartLoc();
 3812|       |
 3813|  3.96M|  switch (tok_->getKind()) {
 3814|      2|    case TokenKind::rw_delete:
  ------------------
  |  Branch (3814:5): [True: 2, False: 3.96M]
  ------------------
 3815|      2|    case TokenKind::rw_void:
  ------------------
  |  Branch (3815:5): [True: 0, False: 3.96M]
  ------------------
 3816|      4|    case TokenKind::rw_typeof:
  ------------------
  |  Branch (3816:5): [True: 2, False: 3.96M]
  ------------------
 3817|    143|    case TokenKind::plus:
  ------------------
  |  Branch (3817:5): [True: 139, False: 3.96M]
  ------------------
 3818|  10.4k|    case TokenKind::minus:
  ------------------
  |  Branch (3818:5): [True: 10.2k, False: 3.95M]
  ------------------
 3819|  11.0k|    case TokenKind::tilde:
  ------------------
  |  Branch (3819:5): [True: 647, False: 3.96M]
  ------------------
 3820|  11.0k|    case TokenKind::exclaim: {
  ------------------
  |  Branch (3820:5): [True: 26, False: 3.96M]
  ------------------
 3821|  11.0k|      UniqueString *op = getTokenIdent(tok_->getKind());
 3822|  11.0k|      advance();
 3823|  11.0k|      CHECK_RECURSION;
  ------------------
  |  | 1346|  11.0k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|  11.0k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 11.0k]
  |  |  ------------------
  |  | 1348|  11.0k|    return llvh::None;
  ------------------
 3824|  11.0k|      auto expr = parseUnaryExpression();
 3825|  11.0k|      if (!expr)
  ------------------
  |  Branch (3825:11): [True: 0, False: 11.0k]
  ------------------
 3826|      0|        return None;
 3827|       |
 3828|  11.0k|      if (check(TokenKind::starstar)) {
  ------------------
  |  Branch (3828:11): [True: 0, False: 11.0k]
  ------------------
 3829|       |        // ExponentiationExpression only allows UpdateExpressionNode on the
 3830|       |        // left. The simplest way to enforce that the left operand is not
 3831|       |        // an unparenthesized UnaryExpression is to check here.
 3832|      0|        error(
 3833|      0|            {startLoc, tok_->getEndLoc()},
 3834|      0|            "Unary operator before ** must use parens to disambiguate");
 3835|      0|      }
 3836|       |
 3837|  11.0k|      return setLocation(
 3838|  11.0k|          startLoc,
 3839|  11.0k|          getPrevTokenEndLoc(),
 3840|  11.0k|          new (context_)
 3841|  11.0k|              ESTree::UnaryExpressionNode(op, expr.getValue(), true));
 3842|  11.0k|    }
 3843|       |
 3844|      0|    case TokenKind::plusplus:
  ------------------
  |  Branch (3844:5): [True: 0, False: 3.96M]
  ------------------
 3845|      0|    case TokenKind::minusminus: {
  ------------------
  |  Branch (3845:5): [True: 0, False: 3.96M]
  ------------------
 3846|      0|      UniqueString *op = getTokenIdent(tok_->getKind());
 3847|      0|      advance();
 3848|      0|      CHECK_RECURSION;
  ------------------
  |  | 1346|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1347|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1348|      0|    return llvh::None;
  ------------------
 3849|      0|      auto expr = parseUnaryExpression();
 3850|      0|      if (!expr)
  ------------------
  |  Branch (3850:11): [True: 0, False: 0]
  ------------------
 3851|      0|        return None;
 3852|       |
 3853|      0|      return setLocation(
 3854|      0|          startLoc,
 3855|      0|          getPrevTokenEndLoc(),
 3856|      0|          new (context_)
 3857|      0|              ESTree::UpdateExpressionNode(op, expr.getValue(), true));
 3858|      0|    }
 3859|       |
 3860|      0|#if HERMES_PARSE_TS
 3861|      0|    case TokenKind::less:
  ------------------
  |  Branch (3861:5): [True: 0, False: 3.96M]
  ------------------
 3862|      0|      if (context_.getParseTS() && !context_.getParseJSX()) {
  ------------------
  |  Branch (3862:11): [True: 0, False: 0]
  |  Branch (3862:36): [True: 0, False: 0]
  ------------------
 3863|       |        // TSTypeAssertions are only parsed if JSX is disabled,
 3864|       |        // so there's no backtracking necessary here.
 3865|       |        // < Type > UnaryExpression
 3866|       |        // ^
 3867|      0|        advance(JSLexer::GrammarContext::Type);
 3868|      0|        auto optType = parseTypeAnnotationTS();
 3869|      0|        if (!optType)
  ------------------
  |  Branch (3869:13): [True: 0, False: 0]
  ------------------
 3870|      0|          return None;
 3871|      0|        if (!eat(
  ------------------
  |  Branch (3871:13): [True: 0, False: 0]
  ------------------
 3872|      0|                TokenKind::greater,
 3873|      0|                JSLexer::GrammarContext::AllowRegExp,
 3874|      0|                "in type assertion",
 3875|      0|                "start of assertion",
 3876|      0|                startLoc))
 3877|      0|          return None;
 3878|      0|        CHECK_RECURSION;
  ------------------
  |  | 1346|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1347|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1348|      0|    return llvh::None;
  ------------------
 3879|      0|        auto optExpr = parseUnaryExpression();
 3880|      0|        if (!optExpr)
  ------------------
  |  Branch (3880:13): [True: 0, False: 0]
  ------------------
 3881|      0|          return None;
 3882|      0|        return setLocation(
 3883|      0|            startLoc,
 3884|      0|            getPrevTokenEndLoc(),
 3885|      0|            new (context_) ESTree::TSTypeAssertionNode(*optType, *optExpr));
 3886|      0|      }
 3887|      0|#endif
 3888|       |
 3889|  1.29M|    case TokenKind::identifier:
  ------------------
  |  Branch (3889:5): [True: 1.29M, False: 2.66M]
  ------------------
 3890|  1.29M|      if (check(awaitIdent_) && paramAwait_) {
  ------------------
  |  Branch (3890:11): [True: 0, False: 1.29M]
  |  Branch (3890:33): [True: 0, False: 0]
  ------------------
 3891|      0|        advance();
 3892|      0|        CHECK_RECURSION;
  ------------------
  |  | 1346|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1347|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1348|      0|    return llvh::None;
  ------------------
 3893|      0|        auto optExpr = parseUnaryExpression();
 3894|      0|        if (!optExpr)
  ------------------
  |  Branch (3894:13): [True: 0, False: 0]
  ------------------
 3895|      0|          return None;
 3896|      0|        return setLocation(
 3897|      0|            startLoc,
 3898|      0|            getPrevTokenEndLoc(),
 3899|      0|            new (context_) ESTree::AwaitExpressionNode(optExpr.getValue()));
 3900|      0|      }
 3901|       |      // Fall-through to default for all other identifiers.
 3902|  1.29M|      LLVM_FALLTHROUGH;
  ------------------
  |  |  245|  1.29M|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
 3903|       |
 3904|  3.95M|    default:
  ------------------
  |  Branch (3904:5): [True: 2.65M, False: 1.30M]
  ------------------
 3905|  3.95M|      return parsePostfixExpression();
 3906|  3.96M|  }
 3907|  3.96M|}
_ZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamE:
 3957|  2.56M|Optional<ESTree::Node *> JSParserImpl::parseBinaryExpression(Param param) {
 3958|       |  // The stack can never go deeper than the number of precedence levels,
 3959|       |  // unless we have a right-associative operator.
 3960|       |  // We have 10 precedence levels.
 3961|  2.56M|  constexpr unsigned STACK_SIZE = 16;
 3962|       |
 3963|  2.56M|  struct PrecedenceStackEntry {
 3964|       |    /// Left hand side expression.
 3965|  2.56M|    ESTree::NodePtr expr;
 3966|       |    // Operator for this expression.
 3967|  2.56M|    TokenKind opKind;
 3968|       |    // Start location for the left hand side expression.
 3969|  2.56M|    SMLoc exprStartLoc;
 3970|       |
 3971|  2.56M|    PrecedenceStackEntry(
 3972|  2.56M|        ESTree::NodePtr expr,
 3973|  2.56M|        TokenKind opKind,
 3974|  2.56M|        SMLoc exprStartLoc)
 3975|  2.56M|        : expr(expr), opKind(opKind), exprStartLoc(exprStartLoc) {}
 3976|  2.56M|  };
 3977|  2.56M|  llvh::SmallVector<PrecedenceStackEntry, STACK_SIZE> stack{};
 3978|       |
 3979|       |  // True upon encountering a '??' operator.
 3980|  2.56M|  bool hasNullish = false;
 3981|       |  // True upon encountering a '&&' or '||' operator.
 3982|  2.56M|  bool hasBoolean = false;
 3983|       |
 3984|       |  /// Allocate a binary expression node with the specified children and
 3985|       |  /// operator.
 3986|  2.56M|  const auto newBinNode = [this, &hasNullish, &hasBoolean](
 3987|  2.56M|                              ESTree::NodePtr left,
 3988|  2.56M|                              TokenKind opKind,
 3989|  2.56M|                              ESTree::NodePtr right,
 3990|  2.56M|                              SMLoc startLoc,
 3991|  2.56M|                              SMLoc endLoc) -> ESTree::NodePtr {
 3992|  2.56M|    UniqueString *opIdent = getTokenIdent(opKind);
 3993|  2.56M|    if (opKind == TokenKind::ampamp || opKind == TokenKind::pipepipe ||
 3994|  2.56M|        opKind == TokenKind::questionquestion) {
 3995|  2.56M|      if ((hasNullish && opKind != TokenKind::questionquestion) ||
 3996|  2.56M|          (hasBoolean && opKind == TokenKind::questionquestion)) {
 3997|       |        // This error doesn't prevent parsing the rest of the binary expression,
 3998|       |        // because it's only there to avoid confusion from the JS author's
 3999|       |        // perspective. Report the error but continue parsing.
 4000|       |        // The question marks are escaped to avoid triggering a trigraph.
 4001|  2.56M|        error(
 4002|  2.56M|            {left->getStartLoc(), right->getEndLoc()},
 4003|  2.56M|            "Mixing '\?\?' with '&&' or '||' requires parentheses");
 4004|  2.56M|      }
 4005|  2.56M|      if (opKind == TokenKind::questionquestion) {
 4006|  2.56M|        hasNullish = true;
 4007|  2.56M|      } else {
 4008|  2.56M|        hasBoolean = true;
 4009|  2.56M|      }
 4010|  2.56M|      return setLocation(
 4011|  2.56M|          startLoc,
 4012|  2.56M|          endLoc,
 4013|  2.56M|          new (context_) ESTree::LogicalExpressionNode(left, right, opIdent));
 4014|  2.56M|#if HERMES_PARSE_TS
 4015|  2.56M|    } else if (LLVM_UNLIKELY(opKind == TokenKind::identifier)) {
 4016|       |      // The only identifier used as a binary operator is 'as' in TS
 4017|       |      // and it would only have been pushed if TS parsing was enabled.
 4018|  2.56M|      return setLocation(
 4019|  2.56M|          startLoc,
 4020|  2.56M|          endLoc,
 4021|  2.56M|          new (context_) ESTree::TSAsExpressionNode(left, right));
 4022|  2.56M|#endif
 4023|  2.56M|    } else {
 4024|  2.56M|      return setLocation(
 4025|  2.56M|          startLoc,
 4026|  2.56M|          endLoc,
 4027|  2.56M|          new (context_) ESTree::BinaryExpressionNode(left, right, opIdent));
 4028|  2.56M|    }
 4029|  2.56M|  };
 4030|       |
 4031|       |  /// Parse a private identifier, which can only be used as LHS in an `in`.
 4032|       |  /// If it's not in a valid position, report an error.
 4033|  2.56M|  const auto consumePrivateIdentifier = [this, &stack]() -> ESTree::Node * {
 4034|  2.56M|    assert(check(TokenKind::private_identifier));
 4035|  2.56M|    ESTree::Node *name = setLocation(
 4036|  2.56M|        tok_,
 4037|  2.56M|        tok_,
 4038|  2.56M|        new (context_) ESTree::PrivateNameNode(setLocation(
 4039|  2.56M|            tok_,
 4040|  2.56M|            tok_,
 4041|  2.56M|            new (context_) ESTree::IdentifierNode(
 4042|  2.56M|                tok_->getPrivateIdentifier(), nullptr, false))));
 4043|  2.56M|    advance();
 4044|  2.56M|    unsigned prevPrec = stack.empty() ? 0 : getPrecedence(stack.back().opKind);
 4045|       |    // Check the precedence of the previous operator on the stack if it exists.
 4046|       |    // If prevPrec is higher precedence than `in`, the private name will end
 4047|       |    // up as the RHS in an invalid binary expression, so report an error.
 4048|  2.56M|    if (!check(TokenKind::rw_in) || prevPrec >= getPrecedence(TokenKind::rw_in))
 4049|  2.56M|      error(
 4050|  2.56M|          name->getSourceRange(),
 4051|  2.56M|          "Private name can only be used as left-hand side of `in` expression");
 4052|  2.56M|    return name;
 4053|  2.56M|  };
 4054|       |
 4055|       |  // Decide whether to recognize "in" as a binary operator.
 4056|  2.56M|  const TokenKind exceptKind =
 4057|  2.56M|      !param.has(ParamIn) ? TokenKind::rw_in : TokenKind::none;
  ------------------
  |  Branch (4057:7): [True: 0, False: 2.56M]
  ------------------
 4058|       |
 4059|  2.56M|  SMLoc topExprStartLoc = tok_->getStartLoc();
 4060|  2.56M|  ESTree::Node *topExpr = nullptr;
 4061|  2.56M|  if (LLVM_UNLIKELY(check(TokenKind::private_identifier))) {
  ------------------
  |  |  189|  2.56M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.56M]
  |  |  ------------------
  ------------------
 4062|      0|    topExpr = consumePrivateIdentifier();
 4063|  2.56M|  } else {
 4064|  2.56M|    auto optExpr = parseUnaryExpression();
 4065|  2.56M|    if (!optExpr)
  ------------------
  |  Branch (4065:9): [True: 3.08k, False: 2.55M]
  ------------------
 4066|  3.08k|      return None;
 4067|  2.55M|    topExpr = optExpr.getValue();
 4068|  2.55M|  }
 4069|  2.55M|  SMLoc topExprEndLoc = getPrevTokenEndLoc();
 4070|       |
 4071|       |  // While the current token is a binary operator.
 4072|  3.94M|  while (unsigned precedence = getPrecedenceExcept(
  ------------------
  |  Branch (4072:19): [True: 1.39M, False: 2.55M]
  ------------------
 4073|  2.55M|             tok_,
 4074|  2.55M|             exceptKind,
 4075|  2.55M|             HERMES_PARSE_TS && context_.getParseTS() ? asIdent_ : nullptr)) {
 4076|       |    // If the next operator has no greater precedence than the operator on the
 4077|       |    // stack, pop the stack, creating a new binary expression.
 4078|  2.74M|    while (!stack.empty() && precedence <= getPrecedence(stack.back().opKind)) {
  ------------------
  |  Branch (4078:12): [True: 1.88M, False: 857k]
  |  Branch (4078:30): [True: 1.35M, False: 532k]
  ------------------
 4079|  1.35M|      if (precedence == getPrecedence(stack.back().opKind) &&
  ------------------
  |  Branch (4079:11): [True: 1.26M, False: 91.5k]
  ------------------
 4080|  1.35M|          !isLeftAssoc(stack.back().opKind)) {
  ------------------
  |  Branch (4080:11): [True: 0, False: 1.26M]
  ------------------
 4081|       |        // If the precedences are equal, then we avoid popping for
 4082|       |        // right-associative operators to allow for the entire right-associative
 4083|       |        // expression to be built from the right.
 4084|      0|        break;
 4085|      0|      }
 4086|  1.35M|      topExpr = newBinNode(
 4087|  1.35M|          stack.back().expr,
 4088|  1.35M|          stack.back().opKind,
 4089|  1.35M|          topExpr,
 4090|  1.35M|          stack.back().exprStartLoc,
 4091|  1.35M|          topExprEndLoc);
 4092|  1.35M|      topExprStartLoc = topExpr->getStartLoc();
 4093|  1.35M|      stack.pop_back();
 4094|  1.35M|    }
 4095|       |
 4096|       |    // The next operator has a higher precedence than the previous one (or there
 4097|       |    // is no previous one). The situation looks something like this:
 4098|       |    //    .... + topExpr * rightExpr ....
 4099|       |    //                     ^
 4100|       |    //                 We are here
 4101|       |    // Push topExpr and the '*', so we can parse rightExpr.
 4102|  1.39M|    stack.emplace_back(topExpr, tok_->getKind(), topExprStartLoc);
 4103|  1.39M|    advance();
 4104|       |
 4105|  1.39M|    topExprStartLoc = tok_->getStartLoc();
 4106|  1.39M|#if HERMES_PARSE_TS
 4107|  1.39M|    if (context_.getParseTS() &&
  ------------------
  |  Branch (4107:9): [True: 0, False: 1.39M]
  ------------------
 4108|  1.39M|        LLVM_UNLIKELY(stack.back().opKind == TokenKind::identifier)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 4109|      0|      auto optRightExpr = parseTypeAnnotationTS();
 4110|      0|      if (!optRightExpr)
  ------------------
  |  Branch (4110:11): [True: 0, False: 0]
  ------------------
 4111|      0|        return None;
 4112|      0|      topExpr = optRightExpr.getValue();
 4113|      0|    } else
 4114|  1.39M|#endif
 4115|  1.39M|    {
 4116|  1.39M|      if (LLVM_UNLIKELY(check(TokenKind::private_identifier))) {
  ------------------
  |  |  189|  1.39M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.39M]
  |  |  ------------------
  ------------------
 4117|      0|        topExpr = consumePrivateIdentifier();
 4118|  1.39M|      } else {
 4119|  1.39M|        auto optRightExpr = parseUnaryExpression();
 4120|  1.39M|        if (!optRightExpr)
  ------------------
  |  Branch (4120:13): [True: 7, False: 1.39M]
  ------------------
 4121|      7|          return None;
 4122|  1.39M|        topExpr = optRightExpr.getValue();
 4123|  1.39M|      }
 4124|  1.39M|    }
 4125|       |
 4126|  1.39M|    topExprEndLoc = getPrevTokenEndLoc();
 4127|  1.39M|  }
 4128|       |
 4129|       |  // We have consumed all binary operators. Pop the stack, creating expressions.
 4130|  2.59M|  while (!stack.empty()) {
  ------------------
  |  Branch (4130:10): [True: 34.5k, False: 2.55M]
  ------------------
 4131|  34.5k|    topExpr = newBinNode(
 4132|  34.5k|        stack.back().expr,
 4133|  34.5k|        stack.back().opKind,
 4134|  34.5k|        topExpr,
 4135|  34.5k|        stack.back().exprStartLoc,
 4136|  34.5k|        topExprEndLoc);
 4137|  34.5k|    stack.pop_back();
 4138|  34.5k|  }
 4139|       |
 4140|  2.55M|  assert(
 4141|  2.55M|      stack.empty() &&
 4142|  2.55M|      "Stack must be empty when done parsing binary expression");
 4143|       |
 4144|      0|  return topExpr;
 4145|  2.55M|}
_ZN6hermes6parser6detail12JSParserImpl26parseConditionalExpressionENS1_5ParamENS2_20CoverTypedParametersE:
 4149|  2.56M|    CoverTypedParameters coverTypedParameters) {
 4150|  2.56M|  SMLoc startLoc = tok_->getStartLoc();
 4151|  2.56M|  auto optTest = parseBinaryExpression(param);
 4152|  2.56M|  if (!optTest)
  ------------------
  |  Branch (4152:7): [True: 3.08k, False: 2.55M]
  ------------------
 4153|  3.08k|    return None;
 4154|  2.55M|  ESTree::Node *test = *optTest;
 4155|       |
 4156|  2.55M|  if (!check(TokenKind::question)) {
  ------------------
  |  Branch (4156:7): [True: 2.55M, False: 180]
  ------------------
 4157|       |    // No '?', so this isn't a conditional expression.
 4158|       |    // If CoverTypedParameters::Yes, we still need to account for this
 4159|       |    // being formal parameters, so try that.
 4160|       |    // TS doesn't have type casts with this syntax, but we must still
 4161|       |    // cover the typed identifier node for when it turns into an arrow function.
 4162|  2.55M|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 4163|  2.55M|    if (context_.getParseTypes() &&
  ------------------
  |  Branch (4163:9): [True: 0, False: 2.55M]
  ------------------
 4164|  2.55M|        coverTypedParameters == CoverTypedParameters::Yes) {
  ------------------
  |  Branch (4164:9): [True: 0, False: 0]
  ------------------
 4165|      0|      auto optCover = tryParseCoverTypedIdentifierNode(test, false);
 4166|      0|      if (!optCover)
  ------------------
  |  Branch (4166:11): [True: 0, False: 0]
  ------------------
 4167|      0|        return None;
 4168|      0|      if (*optCover)
  ------------------
  |  Branch (4168:11): [True: 0, False: 0]
  ------------------
 4169|      0|        return *optCover;
 4170|      0|    }
 4171|  2.55M|#endif
 4172|       |
 4173|       |    // No CoverTypedParameters found, just return the LHS.
 4174|  2.55M|    return test;
 4175|  2.55M|  }
 4176|       |
 4177|    180|  ESTree::Node *consequent = nullptr;
 4178|    180|  SMRange questionRange = tok_->getSourceRange();
 4179|       |
 4180|    180|#if HERMES_PARSE_FLOW || HERMES_PARSE_TS
 4181|    180|  if (context_.getParseTypes()) {
  ------------------
  |  Branch (4181:7): [True: 0, False: 180]
  ------------------
 4182|       |    // Save here to save the question mark (we can only save on punctuators).
 4183|       |    // Early returns will happen if we find anything that leads to
 4184|       |    // short-circuiting out of the traditional conditional expression.
 4185|      0|    JSLexer::SavePoint savePoint{&lexer_};
 4186|      0|    advance();
 4187|       |
 4188|       |    // If CoverTypedParameters::Yes, we still need to account for this
 4189|       |    // being formal parameters, so try that,
 4190|       |    // in which case the '?' was part of an optional parameter, not a
 4191|       |    // conditional expression.
 4192|      0|    if (coverTypedParameters == CoverTypedParameters::Yes) {
  ------------------
  |  Branch (4192:9): [True: 0, False: 0]
  ------------------
 4193|      0|      auto optCover = tryParseCoverTypedIdentifierNode(test, true);
 4194|      0|      if (!optCover)
  ------------------
  |  Branch (4194:11): [True: 0, False: 0]
  ------------------
 4195|      0|        return None;
 4196|      0|      if (*optCover)
  ------------------
  |  Branch (4196:11): [True: 0, False: 0]
  ------------------
 4197|      0|        return *optCover;
 4198|      0|    }
 4199|       |
 4200|       |    // It is also possible to have a '?' without ':' but not be a conditional
 4201|       |    // expression, in the case of typed arrow parameters that didn't have a type
 4202|       |    // annotation. For example:
 4203|       |    // (foo?) => 1
 4204|       |    //      ^
 4205|       |    // The tokens which can come here are limited to ',', '=', and ')'.
 4206|      0|    if (coverTypedParameters == CoverTypedParameters::Yes &&
  ------------------
  |  Branch (4206:9): [True: 0, False: 0]
  ------------------
 4207|      0|        checkN(TokenKind::comma, TokenKind::r_paren, TokenKind::equal)) {
  ------------------
  |  Branch (4207:9): [True: 0, False: 0]
  ------------------
 4208|      0|      return setLocation(
 4209|      0|          startLoc,
 4210|      0|          questionRange,
 4211|      0|          new (context_) ESTree::CoverTypedIdentifierNode(test, nullptr, true));
 4212|      0|    }
 4213|       |
 4214|       |    // Now we're in the real backtracking stage.
 4215|       |    // First, parse with AllowTypedArrowFunction::Yes to allow for the
 4216|       |    // possibility of a concise arrow function with return types. However, we
 4217|       |    // want to avoid the possibility of eating the ':' that we'll need for the
 4218|       |    // conditional expression's alternate. For example:
 4219|       |    // a ? b1 => (c1) : b2 => (c2)
 4220|       |    // We want to account for b2 incorrectly being parsed as the returnType
 4221|       |    // of an arrow function returned by the arrow function with param b1.
 4222|       |    // Thus, after parsing with AllowTypedArrowFunction::Yes, we check to
 4223|       |    // see if there is a ':' afterwards. If there isn't, failure is assured,
 4224|       |    // so we restore to the '?' and try again below, with
 4225|       |    // AllowTypedArrowFunction::No.
 4226|      0|    SourceErrorManager::SaveAndSuppressMessages suppress{
 4227|      0|        &sm_, Subsystem::Parser};
 4228|      0|    CHECK_RECURSION;
  ------------------
  |  | 1346|      0|  TrackRecursion trackRecursion{this}; \
  |  | 1347|      0|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 0]
  |  |  ------------------
  |  | 1348|      0|    return llvh::None;
  ------------------
 4229|      0|    auto optConsequent = parseAssignmentExpression(
 4230|      0|        ParamIn, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 4231|      0|    if (optConsequent && check(TokenKind::colon)) {
  ------------------
  |  Branch (4231:9): [True: 0, False: 0]
  |  Branch (4231:26): [True: 0, False: 0]
  ------------------
 4232|      0|      consequent = *optConsequent;
 4233|      0|    } else {
 4234|       |      // Parsing with typed arrow functions failed because we don't have a :,
 4235|       |      // so reset and try again.
 4236|      0|      savePoint.restore();
 4237|      0|    }
 4238|      0|  }
 4239|    180|#endif
 4240|       |
 4241|       |  // Calls to parseAssignmentExpression may recursively invoke
 4242|       |  // parseConditionalExpression.
 4243|    360|  CHECK_RECURSION;
  ------------------
  |  | 1346|    180|  TrackRecursion trackRecursion{this}; \
  |  | 1347|    180|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 180]
  |  |  ------------------
  |  | 1348|    180|    return llvh::None;
  ------------------
 4244|       |
 4245|       |  // Only try with AllowTypedArrowFunction::No if we haven't already set
 4246|       |  // up the consequent using AllowTypedArrowFunction::Yes.
 4247|    360|  if (!consequent) {
  ------------------
  |  Branch (4247:7): [True: 180, False: 0]
  ------------------
 4248|       |    // Consume the '?' (either for the first time or after savePoint.restore()).
 4249|    180|    advance();
 4250|    180|    auto optConsequent = parseAssignmentExpression(
 4251|    180|        ParamIn, AllowTypedArrowFunction::No, CoverTypedParameters::No);
 4252|    180|    if (!optConsequent)
  ------------------
  |  Branch (4252:9): [True: 0, False: 180]
  ------------------
 4253|      0|      return None;
 4254|    180|    consequent = *optConsequent;
 4255|    180|  }
 4256|       |
 4257|    180|  if (!eat(
  ------------------
  |  Branch (4257:7): [True: 0, False: 180]
  ------------------
 4258|    180|          TokenKind::colon,
 4259|    180|          JSLexer::AllowRegExp,
 4260|    180|          "in conditional expression after '... ? ...'",
 4261|    180|          "location of '?'",
 4262|    180|          questionRange.Start))
 4263|      0|    return None;
 4264|       |
 4265|    180|  auto optAlternate = parseAssignmentExpression(
 4266|    180|      param, AllowTypedArrowFunction::Yes, CoverTypedParameters::No);
 4267|    180|  if (!optAlternate)
  ------------------
  |  Branch (4267:7): [True: 0, False: 180]
  ------------------
 4268|      0|    return None;
 4269|    180|  ESTree::Node *alternate = *optAlternate;
 4270|       |
 4271|    180|  return setLocation(
 4272|    180|      startLoc,
 4273|    180|      getPrevTokenEndLoc(),
 4274|    180|      new (context_)
 4275|    180|          ESTree::ConditionalExpressionNode(test, alternate, consequent));
 4276|    180|}
_ZN6hermes6parser6detail12JSParserImpl22reparseArrowParametersEPNS_6ESTree4NodeERN4llvh12simple_ilistIS4_JEEERb:
 5087|   228k|    bool &isAsync) {
 5088|       |  // Empty argument list "()".
 5089|   228k|  if (node->getParens() == 0 && isa<ESTree::CoverEmptyArgsNode>(node))
  ------------------
  |  Branch (5089:7): [True: 228k, False: 0]
  |  Branch (5089:33): [True: 0, False: 228k]
  ------------------
 5090|      0|    return true;
 5091|       |
 5092|       |  // A single identifier without parens.
 5093|   228k|  if (node->getParens() == 0 && isa<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (5093:7): [True: 228k, False: 0]
  |  Branch (5093:33): [True: 228k, False: 0]
  ------------------
 5094|   228k|    paramList.push_back(*node);
 5095|   228k|    return validateBindingIdentifier(
 5096|   228k|        Param{},
 5097|   228k|        node->getSourceRange(),
 5098|   228k|        cast<ESTree::IdentifierNode>(node)->_name,
 5099|   228k|        TokenKind::identifier);
 5100|   228k|  }
 5101|       |
 5102|      0|  ESTree::NodeList nodeList{};
 5103|       |
 5104|      0|  if (auto *callNode = dyn_cast<ESTree::CallExpressionNode>(node)) {
  ------------------
  |  Branch (5104:13): [True: 0, False: 0]
  ------------------
 5105|       |    // Async function parameters look like call expressions. For example:
 5106|       |    // async(x,y)
 5107|       |    // It must have no surrounding parens and the name must be 'async'.
 5108|       |    // It must also not already be `async`, because the CallExpression
 5109|       |    // determines whether it is `async`.
 5110|       |    // Set `isAsync = true` to indicate that this was async.
 5111|      0|    auto *callee = dyn_cast<ESTree::IdentifierNode>(callNode->_callee);
 5112|      0|    if (!isAsync && callNode->getParens() == 0 && callee &&
  ------------------
  |  Branch (5112:9): [True: 0, False: 0]
  |  Branch (5112:21): [True: 0, False: 0]
  |  Branch (5112:51): [True: 0, False: 0]
  ------------------
 5113|      0|        callee->_name == asyncIdent_) {
  ------------------
  |  Branch (5113:9): [True: 0, False: 0]
  ------------------
 5114|      0|      nodeList = std::move(callNode->_arguments);
 5115|      0|      isAsync = true;
 5116|      0|    } else {
 5117|      0|      error(node->getSourceRange(), "invalid arrow function parameter list");
 5118|      0|      return false;
 5119|      0|    }
 5120|      0|  } else {
 5121|      0|    if (node->getParens() != 1) {
  ------------------
  |  Branch (5121:9): [True: 0, False: 0]
  ------------------
 5122|      0|      error(node->getSourceRange(), "invalid arrow function parameter list");
 5123|      0|      return false;
 5124|      0|    }
 5125|       |
 5126|      0|    if (auto *seqNode = dyn_cast<ESTree::SequenceExpressionNode>(node)) {
  ------------------
  |  Branch (5126:15): [True: 0, False: 0]
  ------------------
 5127|      0|      nodeList = std::move(seqNode->_expressions);
 5128|      0|    } else {
 5129|      0|      node->clearParens();
 5130|      0|      nodeList.push_back(*node);
 5131|      0|    }
 5132|      0|  }
 5133|       |
 5134|      0|  llvh::SaveAndRestore<bool> oldParamAwait(paramAwait_, paramAwait_ || isAsync);
  ------------------
  |  Branch (5134:57): [True: 0, False: 0]
  |  Branch (5134:72): [True: 0, False: 0]
  ------------------
 5135|       |
 5136|       |  // If the node has 0 parentheses, return true, otherwise print an error and
 5137|       |  // return false.
 5138|      0|  auto checkParens = [this](ESTree::Node *n) {
 5139|      0|    if (n->getParens() == 0)
 5140|      0|      return true;
 5141|       |
 5142|      0|    error(n->getSourceRange(), "parentheses are not allowed around parameters");
 5143|      0|    return false;
 5144|      0|  };
 5145|       |
 5146|      0|  for (auto it = nodeList.begin(), e = nodeList.end(); it != e;) {
  ------------------
  |  Branch (5146:56): [True: 0, False: 0]
  ------------------
 5147|      0|    auto *expr = &*it;
 5148|      0|    it = nodeList.erase(it);
 5149|       |
 5150|      0|    if (!checkParens(expr))
  ------------------
  |  Branch (5150:9): [True: 0, False: 0]
  ------------------
 5151|      0|      continue;
 5152|       |
 5153|      0|    if (auto *CRE = dyn_cast<ESTree::CoverRestElementNode>(expr)) {
  ------------------
  |  Branch (5153:15): [True: 0, False: 0]
  ------------------
 5154|      0|      if (it != e)
  ------------------
  |  Branch (5154:11): [True: 0, False: 0]
  ------------------
 5155|      0|        error(expr->getSourceRange(), "rest parameter must be last");
 5156|      0|      else
 5157|      0|        paramList.push_back(*CRE->_rest);
 5158|      0|      continue;
 5159|      0|    }
 5160|       |
 5161|      0|    if (auto *spread = dyn_cast<ESTree::SpreadElementNode>(expr)) {
  ------------------
  |  Branch (5161:15): [True: 0, False: 0]
  ------------------
 5162|       |      // async arrow heads are initially parsed as CallExpression,
 5163|       |      // which means that Rest elements are parsed as SpreadElement.
 5164|      0|      if (it != e)
  ------------------
  |  Branch (5164:11): [True: 0, False: 0]
  ------------------
 5165|      0|        error(expr->getSourceRange(), "rest parameter must be last");
 5166|      0|      else
 5167|      0|        paramList.push_back(*new (context_)
 5168|      0|                                ESTree::RestElementNode(spread->_argument));
 5169|      0|      continue;
 5170|      0|    }
 5171|       |
 5172|      0|    if (isa<ESTree::CoverTrailingCommaNode>(expr)) {
  ------------------
  |  Branch (5172:9): [True: 0, False: 0]
  ------------------
 5173|      0|      assert(
 5174|      0|          it == e &&
 5175|      0|          "CoverTrailingCommaNode should have been only parsed last");
 5176|       |      // Just skip it.
 5177|      0|      continue;
 5178|      0|    }
 5179|       |
 5180|      0|    ESTree::AssignmentExpressionNode *asn = nullptr;
 5181|      0|    ESTree::Node *init = nullptr;
 5182|       |
 5183|       |    // If we encounter an initializer, unpack it.
 5184|      0|    if ((asn = dyn_cast<ESTree::AssignmentExpressionNode>(expr))) {
  ------------------
  |  Branch (5184:9): [True: 0, False: 0]
  ------------------
 5185|      0|      if (asn->_operator == getTokenIdent(TokenKind::equal)) {
  ------------------
  |  Branch (5185:11): [True: 0, False: 0]
  ------------------
 5186|      0|        expr = asn->_left;
 5187|      0|        init = asn->_right;
 5188|       |
 5189|      0|        if (!checkParens(expr))
  ------------------
  |  Branch (5189:13): [True: 0, False: 0]
  ------------------
 5190|      0|          continue;
 5191|      0|      }
 5192|      0|    }
 5193|       |
 5194|      0|    auto optParam = reparseAssignmentPattern(expr, true);
 5195|      0|    if (!optParam)
  ------------------
  |  Branch (5195:9): [True: 0, False: 0]
  ------------------
 5196|      0|      continue;
 5197|      0|    expr = *optParam;
 5198|       |
 5199|      0|    if (init) {
  ------------------
  |  Branch (5199:9): [True: 0, False: 0]
  ------------------
 5200|      0|      expr = setLocation(
 5201|      0|          asn, asn, new (context_) ESTree::AssignmentPatternNode(expr, init));
 5202|      0|    }
 5203|       |
 5204|      0|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(expr)) {
  ------------------
  |  Branch (5204:15): [True: 0, False: 0]
  ------------------
 5205|      0|      validateBindingIdentifier(
 5206|      0|          Param{},
 5207|      0|          ident->getSourceRange(),
 5208|      0|          ident->_name,
 5209|      0|          TokenKind::identifier);
 5210|      0|    }
 5211|       |
 5212|      0|    paramList.push_back(*expr);
 5213|      0|  }
 5214|       |
 5215|      0|  return true;
 5216|      0|}
_ZN6hermes6parser6detail12JSParserImpl28parseArrowFunctionExpressionENS1_5ParamEPNS_6ESTree4NodeES6_S6_S6_N4llvh5SMLocENS2_23AllowTypedArrowFunctionEb:
 5226|   228k|    bool forceAsync) {
 5227|       |  // ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5228|   228k|  assert(
 5229|   228k|      check(TokenKind::equalgreater) && !lexer_.isNewLineBeforeCurrentToken() &&
 5230|   228k|      "ArrowFunctionExpression expects [no new line] '=>'");
 5231|       |
 5232|      0|  llvh::SaveAndRestore<bool> argsParamAwait(paramAwait_, forceAsync);
 5233|       |
 5234|   228k|  if (!eat(
  ------------------
  |  Branch (5234:7): [True: 0, False: 228k]
  ------------------
 5235|   228k|          TokenKind::equalgreater,
 5236|   228k|          JSLexer::GrammarContext::AllowRegExp,
 5237|   228k|          "in arrow function expression",
 5238|   228k|          "start of arrow function",
 5239|   228k|          startLoc))
 5240|      0|    return None;
 5241|       |
 5242|   228k|  bool isAsync = forceAsync;
 5243|   228k|  ESTree::NodeList paramList;
 5244|   228k|  if (!reparseArrowParameters(leftExpr, paramList, isAsync))
  ------------------
  |  Branch (5244:7): [True: 0, False: 228k]
  ------------------
 5245|      0|    return None;
 5246|       |
 5247|   228k|  SaveStrictModeAndSeenDirectives saveStrictModeAndSeenDirectives{this};
 5248|   228k|  ESTree::Node *body;
 5249|   228k|  bool expression;
 5250|       |
 5251|   228k|  llvh::SaveAndRestore<bool> oldParamYield(paramYield_, false);
 5252|   228k|  llvh::SaveAndRestore<bool> bodyParamAwait(paramAwait_, isAsync);
 5253|   228k|  if (check(TokenKind::l_brace)) {
  ------------------
  |  Branch (5253:7): [True: 11, False: 228k]
  ------------------
 5254|     11|    auto optBody = parseFunctionBody(
 5255|     11|        Param{},
 5256|     11|        true,
 5257|     11|        oldParamYield.get(),
 5258|     11|        argsParamAwait.get(),
 5259|     11|        JSLexer::AllowDiv,
 5260|     11|        true);
 5261|     11|    if (!optBody)
  ------------------
  |  Branch (5261:9): [True: 11, False: 0]
  ------------------
 5262|     11|      return None;
 5263|      0|    body = *optBody;
 5264|      0|    expression = false;
 5265|   228k|  } else {
 5266|       |    // It's possible to recurse onto parseAssignmentExpression directly
 5267|       |    // and get stuck without a depth check if we don't have one here.
 5268|   228k|    CHECK_RECURSION;
  ------------------
  |  | 1346|   228k|  TrackRecursion trackRecursion{this}; \
  |  | 1347|   228k|  if (recursionDepthCheck())           \
  |  |  ------------------
  |  |  |  Branch (1347:7): [True: 0, False: 228k]
  |  |  ------------------
  |  | 1348|   228k|    return llvh::None;
  ------------------
 5269|   228k|    auto optConcise = parseAssignmentExpression(
 5270|   228k|        param.get(ParamIn),
 5271|   228k|        allowTypedArrowFunction,
 5272|   228k|        CoverTypedParameters::No,
 5273|   228k|        nullptr);
 5274|   228k|    if (!optConcise)
  ------------------
  |  Branch (5274:9): [True: 1, False: 228k]
  ------------------
 5275|      1|      return None;
 5276|   228k|    body = *optConcise;
 5277|   228k|    expression = true;
 5278|   228k|  }
 5279|       |
 5280|   228k|  auto *arrow = new (context_) ESTree::ArrowFunctionExpressionNode(
 5281|   228k|      nullptr,
 5282|   228k|      std::move(paramList),
 5283|   228k|      body,
 5284|   228k|      typeParams,
 5285|   228k|      returnType,
 5286|   228k|      predicate,
 5287|   228k|      expression,
 5288|   228k|      isAsync);
 5289|       |
 5290|   228k|  return setLocation(startLoc, getPrevTokenEndLoc(), arrow);
 5291|   228k|}
_ZN6hermes6parser6detail12JSParserImpl24reparseAssignmentPatternEPNS_6ESTree4NodeEb:
 5295|    246|    bool inDecl) {
 5296|    246|  if (!node->getParens()) {
  ------------------
  |  Branch (5296:7): [True: 246, False: 0]
  ------------------
 5297|    246|    if (auto *AEN = dyn_cast<ESTree::ArrayExpressionNode>(node)) {
  ------------------
  |  Branch (5297:15): [True: 228, False: 18]
  ------------------
 5298|    228|      return reparseArrayAsignmentPattern(AEN, inDecl);
 5299|    228|    }
 5300|     18|    if (auto *OEN = dyn_cast<ESTree::ObjectExpressionNode>(node)) {
  ------------------
  |  Branch (5300:15): [True: 0, False: 18]
  ------------------
 5301|      0|      return reparseObjectAssignmentPattern(OEN, inDecl);
 5302|      0|    }
 5303|     18|    if (auto *ident = dyn_cast<ESTree::IdentifierNode>(node)) {
  ------------------
  |  Branch (5303:15): [True: 18, False: 0]
  ------------------
 5304|       |      // Validate in this function to avoid validating in each branch of
 5305|       |      // the conditions within the other reparse functions.
 5306|       |      // Validation does not prevent progress of the parse here, so we can
 5307|       |      // return node regardless of whether we failed to validate.
 5308|     18|      validateBindingIdentifier(
 5309|     18|          Param{},
 5310|     18|          ident->getSourceRange(),
 5311|     18|          ident->_name,
 5312|     18|          TokenKind::identifier);
 5313|     18|      return node;
 5314|     18|    }
 5315|      0|    if (isa<ESTree::PatternNode>(node)) {
  ------------------
  |  Branch (5315:9): [True: 0, False: 0]
  ------------------
 5316|       |      // Pattern nodes validate their binding identifiers when they are
 5317|       |      // initially parsed, no work to do here.
 5318|      0|      return node;
 5319|      0|    }
 5320|      0|#if HERMES_PARSE_FLOW
 5321|      0|    if (auto *cover = dyn_cast<ESTree::CoverTypedIdentifierNode>(node)) {
  ------------------
  |  Branch (5321:15): [True: 0, False: 0]
  ------------------
 5322|      0|      auto optAssn = reparseAssignmentPattern(cover->_left, inDecl);
 5323|       |      // type may be nullptr, but the patterns may have null typeAnnotation.
 5324|      0|      auto *type = cover->_right;
 5325|      0|      if (!optAssn)
  ------------------
  |  Branch (5325:11): [True: 0, False: 0]
  ------------------
 5326|      0|        return None;
 5327|      0|      if (auto *apn = dyn_cast<ESTree::ArrayPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5327:17): [True: 0, False: 0]
  ------------------
 5328|      0|        apn->_typeAnnotation = type;
 5329|      0|        return setLocation(cover, cover, apn);
 5330|      0|      }
 5331|      0|      if (auto *opn = dyn_cast<ESTree::ObjectPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5331:17): [True: 0, False: 0]
  ------------------
 5332|      0|        opn->_typeAnnotation = type;
 5333|      0|        return setLocation(cover, cover, opn);
 5334|      0|      }
 5335|      0|      if (auto *id = dyn_cast<ESTree::IdentifierNode>(*optAssn)) {
  ------------------
  |  Branch (5335:17): [True: 0, False: 0]
  ------------------
 5336|      0|        id->_typeAnnotation = type;
 5337|      0|        id->_optional = cover->_optional;
 5338|      0|        return setLocation(cover, cover, id);
 5339|      0|      }
 5340|      0|    }
 5341|      0|    if (auto *typecast = dyn_cast<ESTree::TypeCastExpressionNode>(node)) {
  ------------------
  |  Branch (5341:15): [True: 0, False: 0]
  ------------------
 5342|      0|      auto optAssn = reparseAssignmentPattern(typecast->_expression, inDecl);
 5343|      0|      auto *type = typecast->_typeAnnotation;
 5344|      0|      if (!optAssn)
  ------------------
  |  Branch (5344:11): [True: 0, False: 0]
  ------------------
 5345|      0|        return None;
 5346|      0|      if (auto *apn = dyn_cast<ESTree::ArrayPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5346:17): [True: 0, False: 0]
  ------------------
 5347|      0|        apn->_typeAnnotation = type;
 5348|      0|        return setLocation(apn, type, apn);
 5349|      0|      }
 5350|      0|      if (auto *opn = dyn_cast<ESTree::ObjectPatternNode>(*optAssn)) {
  ------------------
  |  Branch (5350:17): [True: 0, False: 0]
  ------------------
 5351|      0|        opn->_typeAnnotation = type;
 5352|      0|        return setLocation(opn, type, opn);
 5353|      0|      }
 5354|      0|      if (auto *id = dyn_cast<ESTree::IdentifierNode>(*optAssn)) {
  ------------------
  |  Branch (5354:17): [True: 0, False: 0]
  ------------------
 5355|      0|        id->_typeAnnotation = type;
 5356|      0|        return setLocation(id, type, id);
 5357|      0|      }
 5358|      0|    }
 5359|      0|#endif
 5360|      0|  }
 5361|       |
 5362|      0|  if (inDecl) {
  ------------------
  |  Branch (5362:7): [True: 0, False: 0]
  ------------------
 5363|      0|    error(node->getSourceRange(), "identifier or pattern expected");
 5364|      0|    return None;
 5365|      0|  }
 5366|       |
 5367|      0|  return node;
 5368|      0|}
_ZN6hermes6parser6detail12JSParserImpl28reparseArrayAsignmentPatternEPNS_6ESTree19ArrayExpressionNodeEb:
 5372|    228|    bool inDecl) {
 5373|    228|  ESTree::NodeList elements{};
 5374|       |
 5375|    878|  for (auto it = AEN->_elements.begin(), e = AEN->_elements.end(); it != e;) {
  ------------------
  |  Branch (5375:68): [True: 650, False: 228]
  ------------------
 5376|    650|    ESTree::Node *elem = &*it++;
 5377|    650|    AEN->_elements.remove(*elem);
 5378|       |
 5379|       |    // Every element in the array assignment pattern is optional,
 5380|       |    // because we can parse the Elision production.
 5381|    650|    if (isa<ESTree::EmptyNode>(elem)) {
  ------------------
  |  Branch (5381:9): [True: 468, False: 182]
  ------------------
 5382|    468|      elements.push_back(*elem);
 5383|    468|      continue;
 5384|    468|    }
 5385|       |
 5386|    182|    if (auto *spread = dyn_cast<ESTree::SpreadElementNode>(elem)) {
  ------------------
  |  Branch (5386:15): [True: 0, False: 182]
  ------------------
 5387|      0|      if (it != e || AEN->_trailingComma) {
  ------------------
  |  Branch (5387:11): [True: 0, False: 0]
  |  Branch (5387:22): [True: 0, False: 0]
  ------------------
 5388|      0|        error(spread->getSourceRange(), "rest element must be last");
 5389|      0|        continue;
 5390|      0|      }
 5391|       |
 5392|      0|      auto optSubPattern = reparseAssignmentPattern(spread->_argument, inDecl);
 5393|      0|      if (!optSubPattern)
  ------------------
  |  Branch (5393:11): [True: 0, False: 0]
  ------------------
 5394|      0|        continue;
 5395|      0|      elem = setLocation(
 5396|      0|          spread,
 5397|      0|          spread,
 5398|      0|          new (context_) ESTree::RestElementNode(*optSubPattern));
 5399|    182|    } else {
 5400|    182|      ESTree::AssignmentExpressionNode *asn = nullptr;
 5401|    182|      ESTree::Node *init = nullptr;
 5402|       |
 5403|       |      // If we encounter an initializer, unpack it.
 5404|    182|      if (!elem->getParens()) {
  ------------------
  |  Branch (5404:11): [True: 182, False: 0]
  ------------------
 5405|    182|        if ((asn = dyn_cast<ESTree::AssignmentExpressionNode>(elem))) {
  ------------------
  |  Branch (5405:13): [True: 0, False: 182]
  ------------------
 5406|      0|          if (asn->_operator == getTokenIdent(TokenKind::equal)) {
  ------------------
  |  Branch (5406:15): [True: 0, False: 0]
  ------------------
 5407|      0|            elem = asn->_left;
 5408|      0|            init = asn->_right;
 5409|      0|          }
 5410|      0|        }
 5411|    182|      }
 5412|       |
 5413|       |      // Reparse {...} or [...]
 5414|    182|      auto optSubPattern = reparseAssignmentPattern(elem, inDecl);
 5415|    182|      if (!optSubPattern)
  ------------------
  |  Branch (5415:11): [True: 0, False: 182]
  ------------------
 5416|      0|        continue;
 5417|    182|      elem = *optSubPattern;
 5418|       |
 5419|    182|      if (init) {
  ------------------
  |  Branch (5419:11): [True: 0, False: 182]
  ------------------
 5420|      0|        elem = setLocation(
 5421|      0|            asn, asn, new (context_) ESTree::AssignmentPatternNode(elem, init));
 5422|      0|      }
 5423|    182|    }
 5424|       |
 5425|    182|    elements.push_back(*elem);
 5426|    182|  }
 5427|       |
 5428|    228|  return setLocation(
 5429|    228|      AEN->getStartLoc(),
 5430|    228|      AEN->getEndLoc(),
 5431|    228|      new (context_) ESTree::ArrayPatternNode(std::move(elements), nullptr));
 5432|    228|}
_ZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeE:
 5613|  2.55M|    ESTree::Node *typeParams) {
 5614|  2.55M|  struct State {
 5615|  2.55M|    SMLoc leftStartLoc = {};
 5616|  2.55M|    Optional<ESTree::Node *> optLeftExpr = llvh::None;
 5617|  2.55M|    UniqueString *op = nullptr;
 5618|  2.55M|    SMLoc debugLoc = {};
 5619|       |
 5620|  2.55M|    explicit State() {}
 5621|  2.55M|  };
 5622|       |
 5623|  2.55M|  auto parseHelper = [this](
 5624|  2.55M|                         State &state,
 5625|  2.55M|                         Param param,
 5626|  2.55M|                         AllowTypedArrowFunction allowTypedArrowFunction,
 5627|  2.55M|                         CoverTypedParameters coverTypedParameters,
 5628|  2.55M|                         ESTree::Node *typeParams) -> Optional<ESTree::Node *> {
 5629|       |    // Check for yield, which may be lexed as a reserved word, but only in
 5630|       |    // strict mode.
 5631|  2.55M|    if (paramYield_ && check(TokenKind::rw_yield, TokenKind::identifier) &&
 5632|  2.55M|        tok_->getResWordOrIdentifier() == yieldIdent_) {
 5633|  2.55M|      auto optYieldExpr = parseYieldExpression(param.get(ParamIn));
 5634|  2.55M|      if (!optYieldExpr)
 5635|  2.55M|        return None;
 5636|  2.55M|      ESTree::YieldExpressionNode *yieldExpr = *optYieldExpr;
 5637|  2.55M|      if (yieldExpr->_argument && !checkEndAssignmentExpression()) {
 5638|  2.55M|        error(tok_->getStartLoc(), "unexpected token after yield expression");
 5639|  2.55M|        return None;
 5640|  2.55M|      }
 5641|  2.55M|      return yieldExpr;
 5642|  2.55M|    }
 5643|       |
 5644|  2.55M|    SMLoc startLoc = tok_->getStartLoc();
 5645|  2.55M|    bool forceAsync = false;
 5646|  2.55M|    if (check(asyncIdent_)) {
 5647|  2.55M|      OptValue<TokenKind> optNext = lexer_.lookahead1(TokenKind::identifier);
 5648|  2.55M|      if (optNext.hasValue() && *optNext == TokenKind::identifier) {
 5649|  2.55M|        forceAsync = true;
 5650|  2.55M|      }
 5651|  2.55M|#if HERMES_PARSE_FLOW
 5652|  2.55M|      if (context_.getParseFlow() && optNext.hasValue() &&
 5653|  2.55M|          (*optNext == TokenKind::less || *optNext == TokenKind::l_paren)) {
 5654|  2.55M|        auto optAsyncArrow = tryParseTypedAsyncArrowFunction(param);
 5655|  2.55M|        if (optAsyncArrow.hasValue()) {
 5656|  2.55M|          return *optAsyncArrow;
 5657|  2.55M|        }
 5658|  2.55M|      }
 5659|  2.55M|#endif
 5660|  2.55M|    }
 5661|       |
 5662|  2.55M|#if HERMES_PARSE_FLOW
 5663|  2.55M|    if (context_.getParseFlow() &&
 5664|  2.55M|        allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5665|  2.55M|        !typeParams && check(TokenKind::less)) {
 5666|  2.55M|      JSLexer::SavePoint savePoint{&lexer_};
 5667|       |      // Suppress messages from the parser while still displaying lexer
 5668|       |      // messages.
 5669|  2.55M|      CollectMessagesRAII collect{&sm_, true};
 5670|       |      // Do as the flow parser does due to JSX ambiguities.
 5671|       |      // First we try and parse as an assignment expression disallowing
 5672|       |      // typed arrow functions. If that fails, then try again while allowing
 5673|       |      // typed arrow functions and attach the type parameters after the fact.
 5674|  2.55M|      auto optAssign = parseAssignmentExpression(
 5675|  2.55M|          param,
 5676|  2.55M|          AllowTypedArrowFunction::No,
 5677|  2.55M|          CoverTypedParameters::No,
 5678|  2.55M|          nullptr);
 5679|  2.55M|      if (optAssign) {
 5680|       |        // That worked, so just return it directly.
 5681|  2.55M|        collect.setDiscardMessages(false);
 5682|  2.55M|        return *optAssign;
 5683|  2.55M|      } else {
 5684|       |        // Consume the type parameters and try again.
 5685|  2.55M|        savePoint.restore();
 5686|  2.55M|        auto optTypeParams = parseTypeParamsFlow();
 5687|       |        // Type parameters must be followed by a '(' to be meaningful.
 5688|  2.55M|        if (optTypeParams && check(TokenKind::l_paren)) {
 5689|  2.55M|          typeParams = *optTypeParams;
 5690|  2.55M|          optAssign = parseAssignmentExpression(
 5691|  2.55M|              param,
 5692|  2.55M|              AllowTypedArrowFunction::Yes,
 5693|  2.55M|              CoverTypedParameters::No,
 5694|  2.55M|              typeParams);
 5695|  2.55M|          if (optAssign) {
 5696|       |            // We've got the arrow function now, return it directly.
 5697|  2.55M|            return *optAssign;
 5698|  2.55M|          } else {
 5699|       |            // That's everything we can try.
 5700|  2.55M|            error(
 5701|  2.55M|                typeParams->getSourceRange(),
 5702|  2.55M|                "type parameters must be used in an arrow function expression");
 5703|  2.55M|            return None;
 5704|  2.55M|          }
 5705|  2.55M|        } else {
 5706|       |          // Invalid type params, and also invalid JSX. Bail.
 5707|  2.55M|          savePoint.restore();
 5708|  2.55M|        }
 5709|  2.55M|      }
 5710|  2.55M|    }
 5711|  2.55M|#endif
 5712|       |
 5713|  2.55M|    state.leftStartLoc = tok_->getStartLoc();
 5714|  2.55M|    state.optLeftExpr = parseConditionalExpression(param, coverTypedParameters);
 5715|  2.55M|    if (!state.optLeftExpr)
 5716|  2.55M|      return None;
 5717|       |
 5718|  2.55M|    ESTree::Node *returnType = nullptr;
 5719|  2.55M|    ESTree::Node *predicate = nullptr;
 5720|  2.55M|#if HERMES_PARSE_FLOW
 5721|  2.55M|    if (context_.getParseFlow()) {
 5722|  2.55M|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5723|  2.55M|          ((*state.optLeftExpr)->getParens() != 0 ||
 5724|  2.55M|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
 5725|  2.55M|          check(TokenKind::colon)) {
 5726|  2.55M|        JSLexer::SavePoint savePoint{&lexer_};
 5727|       |        // Defer our decision on whether to show or suppress messages for this
 5728|       |        // next section.
 5729|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5730|       |        // start parsing JSX children inside tags, instead of function type
 5731|       |        // parameters. We need to suppress lexer messages because the lexing
 5732|       |        // rules inside JSX are quite different from JS/Flow. For example: x ?
 5733|       |        // (1) : <tag>#{foo}</tag>;
 5734|       |        //         ^
 5735|       |        // and
 5736|       |        // x ? (1) : <tag>"</tag>;
 5737|       |        //         ^
 5738|       |        // must be able to handle the lexer errors that would occur if we lexed
 5739|       |        // the inside of the JSX tags as JS.
 5740|  2.55M|        CollectMessagesRAII collect{&sm_, true};
 5741|  2.55M|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5742|  2.55M|        bool startsWithPredicate = check(checksIdent_);
 5743|  2.55M|        auto optType = startsWithPredicate
 5744|  2.55M|            ? llvh::None
 5745|  2.55M|            : parseTypeAnnotationFlow(annotStart, AllowAnonFunctionType::No);
 5746|  2.55M|        if (optType)
 5747|  2.55M|          returnType = *optType;
 5748|  2.55M|        if (optType || startsWithPredicate) {
 5749|  2.55M|          if (check(TokenKind::equalgreater)) {
 5750|  2.55M|            assert(
 5751|  2.55M|                !startsWithPredicate && "no returnType if startsWithPredicate");
 5752|       |            // Done parsing the return type and predicate.
 5753|       |            // Successful parse, show any messages that the lexer emitted.
 5754|  2.55M|            collect.setDiscardMessages(false);
 5755|  2.55M|          } else if (check(checksIdent_)) {
 5756|  2.55M|            auto optPred = parsePredicateFlow();
 5757|  2.55M|            if (optPred && check(TokenKind::equalgreater)) {
 5758|       |              // Done parsing the return type and predicate.
 5759|  2.55M|              predicate = *optPred;
 5760|       |              // Successful parse, show any messages that the lexer emitted.
 5761|  2.55M|              collect.setDiscardMessages(false);
 5762|  2.55M|            } else {
 5763|  2.55M|              savePoint.restore();
 5764|  2.55M|            }
 5765|  2.55M|          } else {
 5766|  2.55M|            savePoint.restore();
 5767|  2.55M|          }
 5768|  2.55M|        } else {
 5769|  2.55M|          savePoint.restore();
 5770|  2.55M|        }
 5771|  2.55M|      }
 5772|  2.55M|    }
 5773|  2.55M|#endif
 5774|       |
 5775|  2.55M|#if HERMES_PARSE_TS
 5776|  2.55M|    if (context_.getParseTS()) {
 5777|       |      // Separate logic for TS parsing here, because the semantics don't
 5778|       |      // require as much complexity as Flow due to a lack of predicates.
 5779|  2.55M|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
 5780|  2.55M|          ((*state.optLeftExpr)->getParens() != 0 ||
 5781|  2.55M|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
 5782|  2.55M|          check(TokenKind::colon)) {
 5783|  2.55M|        JSLexer::SavePoint savePoint{&lexer_};
 5784|       |        // Defer our decision on whether to show or suppress messages for this
 5785|       |        // next section.
 5786|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5787|       |        // start parsing JSX children inside tags, instead of function type
 5788|       |        // parameters. We need to suppress lexer messages because the lexing
 5789|       |        // rules inside JSX are quite different from TS. For example: x ? (1) :
 5790|       |        // <tag>#{foo}</tag>;
 5791|       |        //         ^
 5792|       |        // and
 5793|       |        // x ? (1) : <tag>"</tag>;
 5794|       |        //         ^
 5795|       |        // must be able to handle the lexer errors that would occur if we lexed
 5796|       |        // the inside of the JSX tags as JS.
 5797|  2.55M|        CollectMessagesRAII collect{&sm_, true};
 5798|  2.55M|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5799|  2.55M|        auto optType = parseTypeAnnotationTS(annotStart);
 5800|  2.55M|        if (optType)
 5801|  2.55M|          returnType = *optType;
 5802|  2.55M|        if (optType) {
 5803|  2.55M|          if (check(TokenKind::equalgreater)) {
 5804|       |            // Done parsing the return type.
 5805|       |            // Successful parse, show any messages that the lexer emitted.
 5806|  2.55M|            collect.setDiscardMessages(false);
 5807|  2.55M|          } else {
 5808|  2.55M|            savePoint.restore();
 5809|  2.55M|          }
 5810|  2.55M|        } else {
 5811|  2.55M|          savePoint.restore();
 5812|  2.55M|        }
 5813|  2.55M|      }
 5814|  2.55M|    }
 5815|       |
 5816|  2.55M|#endif
 5817|       |
 5818|       |    // Check for ArrowFunction.
 5819|       |    //   ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5820|       |    //   AsyncArrowFunction :
 5821|       |    //   async [no line terminator] ArrowParameters [no line terminator] =>
 5822|       |    //   ConciseBody.
 5823|  2.55M|    if (check(TokenKind::equalgreater) &&
 5824|  2.55M|        !lexer_.isNewLineBeforeCurrentToken()) {
 5825|  2.55M|      return parseArrowFunctionExpression(
 5826|  2.55M|          param,
 5827|  2.55M|          *state.optLeftExpr,
 5828|  2.55M|          typeParams,
 5829|  2.55M|          returnType,
 5830|  2.55M|          predicate,
 5831|  2.55M|          typeParams ? typeParams->getStartLoc() : startLoc,
 5832|  2.55M|          allowTypedArrowFunction,
 5833|  2.55M|          forceAsync);
 5834|  2.55M|    }
 5835|       |
 5836|  2.55M|#if HERMES_PARSE_FLOW
 5837|  2.55M|    if (typeParams) {
 5838|  2.55M|      errorExpected(
 5839|  2.55M|          TokenKind::equalgreater,
 5840|  2.55M|          "in generic arrow function",
 5841|  2.55M|          "start of function",
 5842|  2.55M|          typeParams->getStartLoc());
 5843|  2.55M|      return None;
 5844|  2.55M|    }
 5845|  2.55M|#endif
 5846|       |
 5847|  2.55M|    if (!checkAssign())
 5848|  2.55M|      return *state.optLeftExpr;
 5849|       |
 5850|       |    // Check for destructuring assignment.
 5851|  2.55M|    if (check(TokenKind::equal) &&
 5852|  2.55M|        (isa<ESTree::ArrayExpressionNode>(*state.optLeftExpr) ||
 5853|  2.55M|         isa<ESTree::ObjectExpressionNode>(*state.optLeftExpr))) {
 5854|  2.55M|      state.optLeftExpr = reparseAssignmentPattern(*state.optLeftExpr, false);
 5855|  2.55M|      if (!state.optLeftExpr)
 5856|  2.55M|        return None;
 5857|  2.55M|    }
 5858|       |
 5859|  2.55M|    state.op = getTokenIdent(tok_->getKind());
 5860|  2.55M|    state.debugLoc = advance().Start;
 5861|  2.55M|    return nullptr;
 5862|  2.55M|  };
 5863|       |
 5864|  2.55M|  llvh::SmallVector<State, 2> stack;
 5865|       |
 5866|  2.55M|  stack.emplace_back();
 5867|  2.55M|  auto optRes = parseHelper(
 5868|  2.55M|      stack.back(),
 5869|  2.55M|      param,
 5870|  2.55M|      allowTypedArrowFunction,
 5871|  2.55M|      coverTypedParameters,
 5872|  2.55M|      typeParams);
 5873|       |
 5874|  2.56M|  for (;;) {
 5875|  2.56M|    if (!optRes)
  ------------------
  |  Branch (5875:9): [True: 3.10k, False: 2.55M]
  ------------------
 5876|  3.10k|      return None;
 5877|  2.55M|    if (!stack.back().op) {
  ------------------
  |  Branch (5877:9): [True: 2.54M, False: 9.19k]
  ------------------
 5878|  2.54M|      stack.pop_back();
 5879|  2.54M|      break;
 5880|  2.54M|    }
 5881|  9.19k|    if (stack.size() > ESTree::MAX_NESTED_ASSIGNMENTS) {
  ------------------
  |  Branch (5881:9): [True: 0, False: 9.19k]
  ------------------
 5882|      0|      recursionDepthExceeded();
 5883|      0|      return None;
 5884|      0|    }
 5885|  9.19k|    stack.emplace_back();
 5886|  9.19k|    optRes = parseHelper(
 5887|  9.19k|        stack.back(),
 5888|  9.19k|        param,
 5889|  9.19k|        AllowTypedArrowFunction::Yes,
 5890|  9.19k|        CoverTypedParameters::No,
 5891|  9.19k|        nullptr);
 5892|  9.19k|  }
 5893|       |
 5894|  2.54M|  assert(optRes.getValue() != nullptr);
 5895|       |
 5896|  2.55M|  while (!stack.empty()) {
  ------------------
  |  Branch (5896:10): [True: 9.19k, False: 2.54M]
  ------------------
 5897|  9.19k|    if (!checkEndAssignmentExpression()) {
  ------------------
  |  Branch (5897:9): [True: 0, False: 9.19k]
  ------------------
 5898|       |      // Note: We don't assert the valid end of an AssignmentExpression here
 5899|       |      // because we do not know yet whether the entire file is well-formed.
 5900|       |      // This check errors here to ensure that we still catch missing elements
 5901|       |      // in `checkEndAssignmentExpression` while allowing us to avoid actually
 5902|       |      // asserting and crashing.
 5903|      0|      error(
 5904|      0|          tok_->getStartLoc(), "unexpected token after assignment expression");
 5905|      0|      return None;
 5906|      0|    }
 5907|  9.19k|    auto &top = stack.back();
 5908|  9.19k|    optRes = setLocation(
 5909|  9.19k|        top.leftStartLoc,
 5910|  9.19k|        getPrevTokenEndLoc(),
 5911|  9.19k|        top.debugLoc,
 5912|  9.19k|        new (context_) ESTree::AssignmentExpressionNode(
 5913|  9.19k|            top.op, top.optLeftExpr.getValue(), optRes.getValue()));
 5914|  9.19k|    stack.pop_back();
 5915|  9.19k|  }
 5916|       |
 5917|  2.54M|  return optRes.getValue();
 5918|  2.54M|}
_ZN6hermes6parser6detail12JSParserImpl15parseExpressionENS1_5ParamENS2_20CoverTypedParametersE:
 5922|   595k|    CoverTypedParameters coverTypedParameters) {
 5923|   595k|  SMLoc startLoc = tok_->getStartLoc();
 5924|   595k|  auto optExpr = parseAssignmentExpression(
 5925|   595k|      param, AllowTypedArrowFunction::Yes, coverTypedParameters, nullptr);
 5926|   595k|  if (!optExpr)
  ------------------
  |  Branch (5926:7): [True: 2.65k, False: 592k]
  ------------------
 5927|  2.65k|    return None;
 5928|       |
 5929|   592k|  if (!check(TokenKind::comma))
  ------------------
  |  Branch (5929:7): [True: 591k, False: 1.18k]
  ------------------
 5930|   591k|    return optExpr.getValue();
 5931|       |
 5932|  1.18k|  ESTree::NodeList exprList;
 5933|  1.18k|  exprList.push_back(*optExpr.getValue());
 5934|       |
 5935|  9.58k|  while (check(TokenKind::comma)) {
  ------------------
  |  Branch (5935:10): [True: 8.40k, False: 1.18k]
  ------------------
 5936|       |    // Eat the ",".
 5937|  8.40k|    auto commaRng = advance();
 5938|       |
 5939|       |    // CoverParenthesizedExpressionAndArrowParameterList: (Expression ,)
 5940|  8.40k|    if (check(TokenKind::r_paren)) {
  ------------------
  |  Branch (5940:9): [True: 0, False: 8.40k]
  ------------------
 5941|      0|      auto *coverNode = setLocation(
 5942|      0|          commaRng,
 5943|      0|          tok_->getStartLoc(),
 5944|      0|          new (context_) ESTree::CoverTrailingCommaNode());
 5945|      0|      exprList.push_back(*coverNode);
 5946|      0|      break;
 5947|      0|    }
 5948|       |
 5949|  8.40k|    ESTree::Node *expr2;
 5950|       |
 5951|  8.40k|    if (check(TokenKind::dotdotdot)) {
  ------------------
  |  Branch (5951:9): [True: 0, False: 8.40k]
  ------------------
 5952|      0|      auto optRest = parseBindingRestElement(param);
 5953|      0|      if (!optRest)
  ------------------
  |  Branch (5953:11): [True: 0, False: 0]
  ------------------
 5954|      0|        return None;
 5955|      0|      expr2 = setLocation(
 5956|      0|          *optRest,
 5957|      0|          *optRest,
 5958|      0|          new (context_) ESTree::CoverRestElementNode(*optRest));
 5959|  8.40k|    } else {
 5960|  8.40k|      auto optExpr2 = parseAssignmentExpression(param);
 5961|  8.40k|      if (!optExpr2)
  ------------------
  |  Branch (5961:11): [True: 0, False: 8.40k]
  ------------------
 5962|      0|        return None;
 5963|  8.40k|      expr2 = *optExpr2;
 5964|  8.40k|    }
 5965|       |
 5966|  8.40k|    exprList.push_back(*expr2);
 5967|  8.40k|  }
 5968|       |
 5969|  1.18k|  return setLocation(
 5970|  1.18k|      startLoc,
 5971|  1.18k|      getPrevTokenEndLoc(),
 5972|  1.18k|      new (context_) ESTree::SequenceExpressionNode(std::move(exprList)));
 5973|  1.18k|}
_ZN6hermes6parser6detail12JSParserImpl14parseDirectiveEv:
 6769|      1|ESTree::ExpressionStatementNode *JSParserImpl::parseDirective() {
 6770|       |  // Is the current token a directive?
 6771|      1|  if (!lexer_.isCurrentTokenADirective())
  ------------------
  |  Branch (6771:7): [True: 0, False: 1]
  ------------------
 6772|      0|    return nullptr;
 6773|       |
 6774|       |  // Allocate a StringLiteralNode for the directive.
 6775|      1|  auto *strLit = setLocation(
 6776|      1|      tok_,
 6777|      1|      tok_,
 6778|      1|      new (context_) ESTree::StringLiteralNode(tok_->getStringLiteral()));
 6779|      1|  auto endLoc = tok_->getEndLoc();
 6780|       |
 6781|       |  // Actually process the directive. Note that we want to do that before we
 6782|       |  // have consumed any more tokens - strictness can affect the interpretation
 6783|       |  // of tokens.
 6784|      1|  processDirective(strLit->_value);
 6785|       |
 6786|      1|  advance(JSLexer::AllowDiv);
 6787|       |
 6788|       |  // Consume the optional semicolon.
 6789|      1|  if (check(TokenKind::semi))
  ------------------
  |  Branch (6789:7): [True: 1, False: 0]
  ------------------
 6790|      1|    endLoc = advance().End;
 6791|       |
 6792|       |  // Allocate an ExpressionStatementNode for the directive.
 6793|      1|  return setLocation(
 6794|      1|      strLit,
 6795|      1|      endLoc,
 6796|      1|      new (context_) ESTree::ExpressionStatementNode(strLit, strLit->_value));
 6797|      1|}
_ZN6hermes6parser6detail12JSParserImpl14preParseBufferERNS_7ContextEjRb:
 6813|     99|    bool &useStaticBuiltinDetected) {
 6814|     99|  PerfSection preparsing("Pre-Parsing JavaScript");
 6815|     99|  AllocationScope scope(context.getAllocator());
 6816|     99|  JSParserImpl parser(context, bufferId, PreParse);
 6817|     99|  auto result = parser.parse();
 6818|     99|  useStaticBuiltinDetected = parser.getUseStaticBuiltin();
 6819|     99|  return result.hasValue();
 6820|     99|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl20parseTemplateLiteralENS1_5ParamEENK3$_0clEb:
 3087|   898k|  auto pushTemplateElement = [&quasis, &param, this](bool tail) -> bool {
 3088|   898k|    if (tok_->getTemplateLiteralContainsNotEscapes() &&
  ------------------
  |  Branch (3088:9): [True: 0, False: 898k]
  ------------------
 3089|   898k|        !param.has(ParamTagged)) {
  ------------------
  |  Branch (3089:9): [True: 0, False: 0]
  ------------------
 3090|      0|      error(
 3091|      0|          tok_->getSourceRange(),
 3092|      0|          "untagged template literal contains invalid escape sequence");
 3093|      0|      return false;
 3094|      0|    }
 3095|   898k|    auto *quasi = setLocation(
 3096|   898k|        tok_,
 3097|   898k|        tok_,
 3098|   898k|        new (context_) ESTree::TemplateElementNode(
 3099|   898k|            tail, tok_->getTemplateValue(), tok_->getTemplateRawValue()));
 3100|   898k|    quasis.push_back(*quasi);
 3101|   898k|    return true;
 3102|   898k|  };
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_119getPrecedenceExceptEPKNS0_5TokenENS0_9TokenKindEPNS_12UniqueStringE:
 3944|  3.94M|    UniqueString *asIdent) {
 3945|  3.94M|  const TokenKind kind = token->getKind();
 3946|  3.94M|#if HERMES_PARSE_TS
 3947|       |  // 'as' has the same precedence as 'in' in TS.
 3948|  3.94M|  if (LLVM_UNLIKELY(kind == TokenKind::identifier) &&
  ------------------
  |  |  189|  7.89M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 154k, False: 3.79M]
  |  |  ------------------
  ------------------
 3949|  3.94M|      LLVM_UNLIKELY(token->getIdentifier() == asIdent)) {
  ------------------
  |  |  189|   154k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 154k]
  |  |  ------------------
  ------------------
 3950|      0|    return getPrecedence(TokenKind::rw_in);
 3951|      0|  }
 3952|  3.94M|#endif
 3953|  3.94M|  return LLVM_LIKELY(kind != except) ? getPrecedence(kind) : 0;
  ------------------
  |  |  188|  3.94M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.94M, False: 0]
  |  |  ------------------
  ------------------
 3954|  3.94M|}
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_113getPrecedenceENS0_9TokenKindE:
 3914|  7.19M|inline unsigned getPrecedence(TokenKind kind) {
 3915|       |  // Record the precedence of all binary operators.
 3916|  7.19M|  static const unsigned precedence[] = {
 3917|  7.19M|#define TOK(...) 0,
 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
 3919|       |
 3920|       |// There are two reserved words that are binary operators.
 3921|  7.19M|#define RESWORD(name)                                       \
 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
 3924|  7.19M|       ? 8                                                  \
 3925|  7.19M|       : 0),
 3926|  7.19M|#include "hermes/Parser/TokenKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef TOK
  |  |    9|       |#define TOK(name, str)
  |  |   10|       |#endif
  |  |   11|       |
  |  |   12|       |#ifndef RESWORD
  |  |   13|       |#define RESWORD(name) TOK(rw_##name, #name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|  7.19M|#ifndef PUNCTUATOR
  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |   18|  7.19M|#endif
  |  |   19|       |
  |  |   20|  7.19M|#ifndef PUNCTUATOR_FLOW
  |  |   21|  7.19M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |   22|  7.19M|#endif
  |  |   23|       |
  |  |   24|       |#ifndef BINOP
  |  |   25|       |#define BINOP(name, str, precedence) PUNCTUATOR(name, str)
  |  |   26|       |#endif
  |  |   27|       |
  |  |   28|  7.19M|#ifndef TEMPLATE
  |  |   29|  7.19M|#define TEMPLATE(name, str) TOK(name, str)
  |  |   30|  7.19M|#endif
  |  |   31|       |
  |  |   32|  7.19M|#ifndef RANGE_MARKER
  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |   34|  7.19M|#endif
  |  |   35|       |
  |  |   36|       |// clang-format off
  |  |   37|       |
  |  |   38|  7.19M|TOK(none, "<none>")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |   39|  7.19M|TOK(identifier, "identifier")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |   40|  7.19M|TOK(private_identifier, "private identifier")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |   41|       |
  |  |   42|  7.19M|RANGE_MARKER(_first_resword)
  |  |  ------------------
  |  |  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   43|  7.19M|RESWORD(function)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   44|  7.19M|RESWORD(for)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   45|  7.19M|RESWORD(if)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   46|  7.19M|RESWORD(in)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   47|  7.19M|RESWORD(var)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   48|  7.19M|RESWORD(break)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   49|  7.19M|RESWORD(continue)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   50|  7.19M|RESWORD(return)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   51|  7.19M|RESWORD(switch)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   52|  7.19M|RESWORD(this)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   53|       |
  |  |   54|  7.19M|RESWORD(true)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   55|  7.19M|RESWORD(false)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   56|  7.19M|RESWORD(null)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   57|  7.19M|RESWORD(case)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   58|  7.19M|RESWORD(catch)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   59|  7.19M|RESWORD(const)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   60|  7.19M|RESWORD(debugger)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   61|  7.19M|RESWORD(default)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   62|  7.19M|RESWORD(delete)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   63|  7.19M|RESWORD(do)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   64|  7.19M|RESWORD(else)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   65|  7.19M|RESWORD(finally)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   66|  7.19M|RESWORD(instanceof)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   67|  7.19M|RESWORD(new)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   68|  7.19M|RESWORD(throw)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   69|  7.19M|RESWORD(try)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   70|  7.19M|RESWORD(typeof)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   71|  7.19M|RESWORD(void)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   72|  7.19M|RESWORD(while)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   73|  7.19M|RESWORD(with)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   74|       |
  |  |   75|  7.19M|RESWORD(export)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   76|  7.19M|RESWORD(import)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   77|       |
  |  |   78|  7.19M|RESWORD(class)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   79|  7.19M|RESWORD(static)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   80|  7.19M|RESWORD(extends)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   81|  7.19M|RESWORD(super)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   82|       |
  |  |   83|       |// Future reserved words
  |  |   84|  7.19M|RESWORD(enum)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   85|       |
  |  |   86|       |// Strict mode future reserved words
  |  |   87|  7.19M|RESWORD(implements)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   88|  7.19M|RESWORD(interface)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   89|  7.19M|RESWORD(package)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   90|  7.19M|RESWORD(private)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   91|  7.19M|RESWORD(protected)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   92|  7.19M|RESWORD(public)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   93|  7.19M|RESWORD(yield)
  |  |  ------------------
  |  |  |  | 3922|  7.19M|  (TokenKind::rw_##name == TokenKind::rw_in ||              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3922:4): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3923|  7.19M|           TokenKind::rw_##name == TokenKind::rw_instanceof \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (3923:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 3924|  7.19M|       ? 8                                                  \
  |  |  |  | 3925|  7.19M|       : 0),
  |  |  ------------------
  |  |   94|  7.19M|RANGE_MARKER(_last_resword)
  |  |  ------------------
  |  |  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   95|       |
  |  |   96|  7.19M|PUNCTUATOR(l_brace,             "{")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   97|  7.19M|PUNCTUATOR_FLOW(l_bracepipe,    "{|")
  |  |  ------------------
  |  |  |  |   21|  7.19M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   98|  7.19M|PUNCTUATOR(r_brace,             "}")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   99|  7.19M|PUNCTUATOR_FLOW(piper_brace,    "|}")
  |  |  ------------------
  |  |  |  |   21|  7.19M|#define PUNCTUATOR_FLOW(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  100|  7.19M|PUNCTUATOR(l_paren,             "(")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  101|  7.19M|PUNCTUATOR(r_paren,             ")")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  102|  7.19M|PUNCTUATOR(l_square,            "[")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  103|  7.19M|PUNCTUATOR(r_square,            "]")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  104|  7.19M|PUNCTUATOR(period,              ".")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  105|  7.19M|PUNCTUATOR(questiondot,         "?.")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  106|  7.19M|PUNCTUATOR(dotdotdot,           "...")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  107|  7.19M|PUNCTUATOR(semi,                ";")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  108|  7.19M|PUNCTUATOR(comma,               ",")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  109|  7.19M|PUNCTUATOR(plusplus,            "++")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|  7.19M|PUNCTUATOR(minusminus,          "--")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|  7.19M|RANGE_MARKER(_first_binary)
  |  |  ------------------
  |  |  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  112|  7.19M|BINOP(     starstar,            "**",  12)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  113|  7.19M|BINOP(     star,                "*",   11)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  114|  7.19M|BINOP(     percent,             "%",   11)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  115|  7.19M|BINOP(     slash,               "/",   11)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  116|  7.19M|BINOP(     plus,                "+",   10)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  117|  7.19M|BINOP(     minus,               "-",   10)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  118|  7.19M|BINOP(     lessless,            "<<",   9)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  119|  7.19M|BINOP(     greatergreater,      ">>",   9)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  120|  7.19M|BINOP(     greatergreatergreater,">>>", 9)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  121|  7.19M|BINOP(     less,                "<",    8)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  122|  7.19M|BINOP(     greater,             ">",    8)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  123|  7.19M|BINOP(     lessequal,           "<=",   8)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  124|  7.19M|BINOP(     greaterequal,        ">=",   8)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  125|  7.19M|BINOP(     equalequal,          "==",   7)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  126|  7.19M|BINOP(     exclaimequal,        "!=",   7)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  127|  7.19M|BINOP(     equalequalequal,     "===",  7)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  128|  7.19M|BINOP(     exclaimequalequal,   "!==",  7)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  129|  7.19M|BINOP(     amp,                 "&",    6)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  130|  7.19M|BINOP(     caret,               "^",    5)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  131|  7.19M|BINOP(     pipe,                "|",    4)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  132|  7.19M|BINOP(     ampamp,              "&&",   3)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  133|  7.19M|BINOP(     pipepipe,            "||",   2)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  134|  7.19M|BINOP(     questionquestion,    "??",   1)
  |  |  ------------------
  |  |  |  | 3918|  7.19M|#define BINOP(name, str, precedence) precedence,
  |  |  ------------------
  |  |  135|  7.19M|RANGE_MARKER(_last_binary)
  |  |  ------------------
  |  |  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|  7.19M|PUNCTUATOR(exclaim,             "!")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  137|  7.19M|PUNCTUATOR(tilde,               "~")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  138|  7.19M|PUNCTUATOR(question,            "?")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|  7.19M|PUNCTUATOR(colon,               ":")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  140|  7.19M|PUNCTUATOR(equal,               "=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  141|  7.19M|PUNCTUATOR(plusequal,           "+=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|  7.19M|PUNCTUATOR(minusequal,          "-=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  143|  7.19M|PUNCTUATOR(starequal,           "*=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  144|  7.19M|PUNCTUATOR(starstarequal,       "**=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|  7.19M|PUNCTUATOR(percentequal,        "%=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  146|  7.19M|PUNCTUATOR(slashequal,          "/=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  147|  7.19M|PUNCTUATOR(lesslessequal,       "<<=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|  7.19M|PUNCTUATOR(greatergreaterequal, ">>=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  149|  7.19M|PUNCTUATOR(greatergreatergreaterequal, ">>>=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  150|  7.19M|PUNCTUATOR(ampequal,            "&=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|  7.19M|PUNCTUATOR(pipeequal,           "|=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  152|  7.19M|PUNCTUATOR(ampampequal,         "&&=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  153|  7.19M|PUNCTUATOR(pipepipeequal,       "||=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|  7.19M|PUNCTUATOR(questionquestionequal, "\?\?=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  155|  7.19M|PUNCTUATOR(caretequal,          "^=")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  156|  7.19M|PUNCTUATOR(equalgreater,        "=>")
  |  |  ------------------
  |  |  |  |   17|  7.19M|#define PUNCTUATOR(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  157|       |
  |  |  158|  7.19M|TOK(numeric_literal, "number")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  159|  7.19M|TOK(string_literal, "string")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  160|  7.19M|TOK(regexp_literal, "regexp")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  161|  7.19M|TOK(jsx_text, "JSX text")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  162|  7.19M|TOK(bigint_literal, "bigint")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  163|       |
  |  |  164|  7.19M|TEMPLATE(no_substitution_template, "template literal")
  |  |  ------------------
  |  |  |  |   29|  7.19M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  165|  7.19M|TEMPLATE(template_head, "template literal start")
  |  |  ------------------
  |  |  |  |   29|  7.19M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  166|  7.19M|TEMPLATE(template_middle, "template literal resume")
  |  |  ------------------
  |  |  |  |   29|  7.19M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  167|  7.19M|TEMPLATE(template_tail, "template literal end")
  |  |  ------------------
  |  |  |  |   29|  7.19M|#define TEMPLATE(name, str) TOK(name, str)
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  168|       |
  |  |  169|  7.19M|TOK(eof, "<eof>")
  |  |  ------------------
  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  ------------------
  |  |  170|  7.19M|RANGE_MARKER(_last_token)
  |  |  ------------------
  |  |  |  |   33|  7.19M|#define RANGE_MARKER(name) TOK(name, "<" #name ">")
  |  |  |  |  ------------------
  |  |  |  |  |  | 3917|  7.19M|#define TOK(...) 0,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  171|       |
  |  |  172|  7.19M|#undef TOK
  |  |  173|  7.19M|#undef RESWORD
  |  |  174|  7.19M|#undef PUNCTUATOR
  |  |  175|  7.19M|#undef PUNCTUATOR_FLOW
  |  |  176|  7.19M|#undef BINOP
  |  |  177|  7.19M|#undef TEMPLATE
  |  |  178|  7.19M|#undef RANGE_MARKER
  ------------------
 3927|  7.19M|  };
 3928|       |
 3929|  7.19M|  return precedence[static_cast<unsigned>(kind)];
 3930|  7.19M|}
JSParserImpl.cpp:_ZN6hermes6parser6detail12_GLOBAL__N_111isLeftAssocENS0_9TokenKindE:
 3933|  1.26M|inline bool isLeftAssoc(TokenKind kind) {
 3934|  1.26M|  return kind != TokenKind::starstar;
 3935|  1.26M|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamEENK3$_1clEPNS_6ESTree4NodeENS0_9TokenKindES7_N4llvh5SMLocESA_:
 3991|  1.39M|                              SMLoc endLoc) -> ESTree::NodePtr {
 3992|  1.39M|    UniqueString *opIdent = getTokenIdent(opKind);
 3993|  1.39M|    if (opKind == TokenKind::ampamp || opKind == TokenKind::pipepipe ||
  ------------------
  |  Branch (3993:9): [True: 56, False: 1.39M]
  |  Branch (3993:40): [True: 90.0k, False: 1.30M]
  ------------------
 3994|  1.39M|        opKind == TokenKind::questionquestion) {
  ------------------
  |  Branch (3994:9): [True: 0, False: 1.30M]
  ------------------
 3995|  90.0k|      if ((hasNullish && opKind != TokenKind::questionquestion) ||
  ------------------
  |  Branch (3995:12): [True: 0, False: 90.0k]
  |  Branch (3995:26): [True: 0, False: 0]
  ------------------
 3996|  90.0k|          (hasBoolean && opKind == TokenKind::questionquestion)) {
  ------------------
  |  Branch (3996:12): [True: 89.9k, False: 110]
  |  Branch (3996:26): [True: 0, False: 89.9k]
  ------------------
 3997|       |        // This error doesn't prevent parsing the rest of the binary expression,
 3998|       |        // because it's only there to avoid confusion from the JS author's
 3999|       |        // perspective. Report the error but continue parsing.
 4000|       |        // The question marks are escaped to avoid triggering a trigraph.
 4001|      0|        error(
 4002|      0|            {left->getStartLoc(), right->getEndLoc()},
 4003|      0|            "Mixing '\?\?' with '&&' or '||' requires parentheses");
 4004|      0|      }
 4005|  90.0k|      if (opKind == TokenKind::questionquestion) {
  ------------------
  |  Branch (4005:11): [True: 0, False: 90.0k]
  ------------------
 4006|      0|        hasNullish = true;
 4007|  90.0k|      } else {
 4008|  90.0k|        hasBoolean = true;
 4009|  90.0k|      }
 4010|  90.0k|      return setLocation(
 4011|  90.0k|          startLoc,
 4012|  90.0k|          endLoc,
 4013|  90.0k|          new (context_) ESTree::LogicalExpressionNode(left, right, opIdent));
 4014|  90.0k|#if HERMES_PARSE_TS
 4015|  1.30M|    } else if (LLVM_UNLIKELY(opKind == TokenKind::identifier)) {
  ------------------
  |  |  189|  1.30M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.30M]
  |  |  ------------------
  ------------------
 4016|       |      // The only identifier used as a binary operator is 'as' in TS
 4017|       |      // and it would only have been pushed if TS parsing was enabled.
 4018|      0|      return setLocation(
 4019|      0|          startLoc,
 4020|      0|          endLoc,
 4021|      0|          new (context_) ESTree::TSAsExpressionNode(left, right));
 4022|      0|#endif
 4023|  1.30M|    } else {
 4024|  1.30M|      return setLocation(
 4025|  1.30M|          startLoc,
 4026|  1.30M|          endLoc,
 4027|  1.30M|          new (context_) ESTree::BinaryExpressionNode(left, right, opIdent));
 4028|  1.30M|    }
 4029|  1.39M|  };
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeEENK3$_5clERZNS2_25parseAssignmentExpressionES3_S4_S5_S8_E5StateS3_S4_S5_S8_:
 5628|  2.56M|                         ESTree::Node *typeParams) -> Optional<ESTree::Node *> {
 5629|       |    // Check for yield, which may be lexed as a reserved word, but only in
 5630|       |    // strict mode.
 5631|  2.56M|    if (paramYield_ && check(TokenKind::rw_yield, TokenKind::identifier) &&
  ------------------
  |  Branch (5631:9): [True: 0, False: 2.56M]
  |  Branch (5631:24): [True: 0, False: 0]
  ------------------
 5632|  2.56M|        tok_->getResWordOrIdentifier() == yieldIdent_) {
  ------------------
  |  Branch (5632:9): [True: 0, False: 0]
  ------------------
 5633|      0|      auto optYieldExpr = parseYieldExpression(param.get(ParamIn));
 5634|      0|      if (!optYieldExpr)
  ------------------
  |  Branch (5634:11): [True: 0, False: 0]
  ------------------
 5635|      0|        return None;
 5636|      0|      ESTree::YieldExpressionNode *yieldExpr = *optYieldExpr;
 5637|      0|      if (yieldExpr->_argument && !checkEndAssignmentExpression()) {
  ------------------
  |  Branch (5637:11): [True: 0, False: 0]
  |  Branch (5637:35): [True: 0, False: 0]
  ------------------
 5638|      0|        error(tok_->getStartLoc(), "unexpected token after yield expression");
 5639|      0|        return None;
 5640|      0|      }
 5641|      0|      return yieldExpr;
 5642|      0|    }
 5643|       |
 5644|  2.56M|    SMLoc startLoc = tok_->getStartLoc();
 5645|  2.56M|    bool forceAsync = false;
 5646|  2.56M|    if (check(asyncIdent_)) {
  ------------------
  |  Branch (5646:9): [True: 8, False: 2.56M]
  ------------------
 5647|      8|      OptValue<TokenKind> optNext = lexer_.lookahead1(TokenKind::identifier);
 5648|      8|      if (optNext.hasValue() && *optNext == TokenKind::identifier) {
  ------------------
  |  Branch (5648:11): [True: 2, False: 6]
  |  Branch (5648:33): [True: 0, False: 2]
  ------------------
 5649|      0|        forceAsync = true;
 5650|      0|      }
 5651|      8|#if HERMES_PARSE_FLOW
 5652|      8|      if (context_.getParseFlow() && optNext.hasValue() &&
  ------------------
  |  Branch (5652:11): [True: 0, False: 8]
  |  Branch (5652:38): [True: 0, False: 0]
  ------------------
 5653|      8|          (*optNext == TokenKind::less || *optNext == TokenKind::l_paren)) {
  ------------------
  |  Branch (5653:12): [True: 0, False: 0]
  |  Branch (5653:43): [True: 0, False: 0]
  ------------------
 5654|      0|        auto optAsyncArrow = tryParseTypedAsyncArrowFunction(param);
 5655|      0|        if (optAsyncArrow.hasValue()) {
  ------------------
  |  Branch (5655:13): [True: 0, False: 0]
  ------------------
 5656|      0|          return *optAsyncArrow;
 5657|      0|        }
 5658|      0|      }
 5659|      8|#endif
 5660|      8|    }
 5661|       |
 5662|  2.56M|#if HERMES_PARSE_FLOW
 5663|  2.56M|    if (context_.getParseFlow() &&
  ------------------
  |  Branch (5663:9): [True: 0, False: 2.56M]
  ------------------
 5664|  2.56M|        allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5664:9): [True: 0, False: 0]
  ------------------
 5665|  2.56M|        !typeParams && check(TokenKind::less)) {
  ------------------
  |  Branch (5665:9): [True: 0, False: 0]
  |  Branch (5665:24): [True: 0, False: 0]
  ------------------
 5666|      0|      JSLexer::SavePoint savePoint{&lexer_};
 5667|       |      // Suppress messages from the parser while still displaying lexer
 5668|       |      // messages.
 5669|      0|      CollectMessagesRAII collect{&sm_, true};
 5670|       |      // Do as the flow parser does due to JSX ambiguities.
 5671|       |      // First we try and parse as an assignment expression disallowing
 5672|       |      // typed arrow functions. If that fails, then try again while allowing
 5673|       |      // typed arrow functions and attach the type parameters after the fact.
 5674|      0|      auto optAssign = parseAssignmentExpression(
 5675|      0|          param,
 5676|      0|          AllowTypedArrowFunction::No,
 5677|      0|          CoverTypedParameters::No,
 5678|      0|          nullptr);
 5679|      0|      if (optAssign) {
  ------------------
  |  Branch (5679:11): [True: 0, False: 0]
  ------------------
 5680|       |        // That worked, so just return it directly.
 5681|      0|        collect.setDiscardMessages(false);
 5682|      0|        return *optAssign;
 5683|      0|      } else {
 5684|       |        // Consume the type parameters and try again.
 5685|      0|        savePoint.restore();
 5686|      0|        auto optTypeParams = parseTypeParamsFlow();
 5687|       |        // Type parameters must be followed by a '(' to be meaningful.
 5688|      0|        if (optTypeParams && check(TokenKind::l_paren)) {
  ------------------
  |  Branch (5688:13): [True: 0, False: 0]
  |  Branch (5688:30): [True: 0, False: 0]
  ------------------
 5689|      0|          typeParams = *optTypeParams;
 5690|      0|          optAssign = parseAssignmentExpression(
 5691|      0|              param,
 5692|      0|              AllowTypedArrowFunction::Yes,
 5693|      0|              CoverTypedParameters::No,
 5694|      0|              typeParams);
 5695|      0|          if (optAssign) {
  ------------------
  |  Branch (5695:15): [True: 0, False: 0]
  ------------------
 5696|       |            // We've got the arrow function now, return it directly.
 5697|      0|            return *optAssign;
 5698|      0|          } else {
 5699|       |            // That's everything we can try.
 5700|      0|            error(
 5701|      0|                typeParams->getSourceRange(),
 5702|      0|                "type parameters must be used in an arrow function expression");
 5703|      0|            return None;
 5704|      0|          }
 5705|      0|        } else {
 5706|       |          // Invalid type params, and also invalid JSX. Bail.
 5707|      0|          savePoint.restore();
 5708|      0|        }
 5709|      0|      }
 5710|      0|    }
 5711|  2.56M|#endif
 5712|       |
 5713|  2.56M|    state.leftStartLoc = tok_->getStartLoc();
 5714|  2.56M|    state.optLeftExpr = parseConditionalExpression(param, coverTypedParameters);
 5715|  2.56M|    if (!state.optLeftExpr)
  ------------------
  |  Branch (5715:9): [True: 3.08k, False: 2.55M]
  ------------------
 5716|  3.08k|      return None;
 5717|       |
 5718|  2.55M|    ESTree::Node *returnType = nullptr;
 5719|  2.55M|    ESTree::Node *predicate = nullptr;
 5720|  2.55M|#if HERMES_PARSE_FLOW
 5721|  2.55M|    if (context_.getParseFlow()) {
  ------------------
  |  Branch (5721:9): [True: 0, False: 2.55M]
  ------------------
 5722|      0|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5722:11): [True: 0, False: 0]
  ------------------
 5723|      0|          ((*state.optLeftExpr)->getParens() != 0 ||
  ------------------
  |  Branch (5723:12): [True: 0, False: 0]
  ------------------
 5724|      0|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
  ------------------
  |  Branch (5724:12): [True: 0, False: 0]
  ------------------
 5725|      0|          check(TokenKind::colon)) {
  ------------------
  |  Branch (5725:11): [True: 0, False: 0]
  ------------------
 5726|      0|        JSLexer::SavePoint savePoint{&lexer_};
 5727|       |        // Defer our decision on whether to show or suppress messages for this
 5728|       |        // next section.
 5729|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5730|       |        // start parsing JSX children inside tags, instead of function type
 5731|       |        // parameters. We need to suppress lexer messages because the lexing
 5732|       |        // rules inside JSX are quite different from JS/Flow. For example: x ?
 5733|       |        // (1) : <tag>#{foo}</tag>;
 5734|       |        //         ^
 5735|       |        // and
 5736|       |        // x ? (1) : <tag>"</tag>;
 5737|       |        //         ^
 5738|       |        // must be able to handle the lexer errors that would occur if we lexed
 5739|       |        // the inside of the JSX tags as JS.
 5740|      0|        CollectMessagesRAII collect{&sm_, true};
 5741|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5742|      0|        bool startsWithPredicate = check(checksIdent_);
 5743|      0|        auto optType = startsWithPredicate
  ------------------
  |  Branch (5743:24): [True: 0, False: 0]
  ------------------
 5744|      0|            ? llvh::None
 5745|      0|            : parseTypeAnnotationFlow(annotStart, AllowAnonFunctionType::No);
 5746|      0|        if (optType)
  ------------------
  |  Branch (5746:13): [True: 0, False: 0]
  ------------------
 5747|      0|          returnType = *optType;
 5748|      0|        if (optType || startsWithPredicate) {
  ------------------
  |  Branch (5748:13): [True: 0, False: 0]
  |  Branch (5748:24): [True: 0, False: 0]
  ------------------
 5749|      0|          if (check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5749:15): [True: 0, False: 0]
  ------------------
 5750|      0|            assert(
 5751|      0|                !startsWithPredicate && "no returnType if startsWithPredicate");
 5752|       |            // Done parsing the return type and predicate.
 5753|       |            // Successful parse, show any messages that the lexer emitted.
 5754|      0|            collect.setDiscardMessages(false);
 5755|      0|          } else if (check(checksIdent_)) {
  ------------------
  |  Branch (5755:22): [True: 0, False: 0]
  ------------------
 5756|      0|            auto optPred = parsePredicateFlow();
 5757|      0|            if (optPred && check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5757:17): [True: 0, False: 0]
  |  Branch (5757:28): [True: 0, False: 0]
  ------------------
 5758|       |              // Done parsing the return type and predicate.
 5759|      0|              predicate = *optPred;
 5760|       |              // Successful parse, show any messages that the lexer emitted.
 5761|      0|              collect.setDiscardMessages(false);
 5762|      0|            } else {
 5763|      0|              savePoint.restore();
 5764|      0|            }
 5765|      0|          } else {
 5766|      0|            savePoint.restore();
 5767|      0|          }
 5768|      0|        } else {
 5769|      0|          savePoint.restore();
 5770|      0|        }
 5771|      0|      }
 5772|      0|    }
 5773|      0|#endif
 5774|       |
 5775|      0|#if HERMES_PARSE_TS
 5776|  2.55M|    if (context_.getParseTS()) {
  ------------------
  |  Branch (5776:9): [True: 0, False: 2.55M]
  ------------------
 5777|       |      // Separate logic for TS parsing here, because the semantics don't
 5778|       |      // require as much complexity as Flow due to a lack of predicates.
 5779|      0|      if (allowTypedArrowFunction == AllowTypedArrowFunction::Yes &&
  ------------------
  |  Branch (5779:11): [True: 0, False: 0]
  ------------------
 5780|      0|          ((*state.optLeftExpr)->getParens() != 0 ||
  ------------------
  |  Branch (5780:12): [True: 0, False: 0]
  ------------------
 5781|      0|           isa<ESTree::CoverEmptyArgsNode>(*state.optLeftExpr)) &&
  ------------------
  |  Branch (5781:12): [True: 0, False: 0]
  ------------------
 5782|      0|          check(TokenKind::colon)) {
  ------------------
  |  Branch (5782:11): [True: 0, False: 0]
  ------------------
 5783|      0|        JSLexer::SavePoint savePoint{&lexer_};
 5784|       |        // Defer our decision on whether to show or suppress messages for this
 5785|       |        // next section.
 5786|       |        // If we are unsuccessful during the parse, it can mean that we need to
 5787|       |        // start parsing JSX children inside tags, instead of function type
 5788|       |        // parameters. We need to suppress lexer messages because the lexing
 5789|       |        // rules inside JSX are quite different from TS. For example: x ? (1) :
 5790|       |        // <tag>#{foo}</tag>;
 5791|       |        //         ^
 5792|       |        // and
 5793|       |        // x ? (1) : <tag>"</tag>;
 5794|       |        //         ^
 5795|       |        // must be able to handle the lexer errors that would occur if we lexed
 5796|       |        // the inside of the JSX tags as JS.
 5797|      0|        CollectMessagesRAII collect{&sm_, true};
 5798|      0|        SMLoc annotStart = advance(JSLexer::GrammarContext::Type).Start;
 5799|      0|        auto optType = parseTypeAnnotationTS(annotStart);
 5800|      0|        if (optType)
  ------------------
  |  Branch (5800:13): [True: 0, False: 0]
  ------------------
 5801|      0|          returnType = *optType;
 5802|      0|        if (optType) {
  ------------------
  |  Branch (5802:13): [True: 0, False: 0]
  ------------------
 5803|      0|          if (check(TokenKind::equalgreater)) {
  ------------------
  |  Branch (5803:15): [True: 0, False: 0]
  ------------------
 5804|       |            // Done parsing the return type.
 5805|       |            // Successful parse, show any messages that the lexer emitted.
 5806|      0|            collect.setDiscardMessages(false);
 5807|      0|          } else {
 5808|      0|            savePoint.restore();
 5809|      0|          }
 5810|      0|        } else {
 5811|      0|          savePoint.restore();
 5812|      0|        }
 5813|      0|      }
 5814|      0|    }
 5815|       |
 5816|  2.55M|#endif
 5817|       |
 5818|       |    // Check for ArrowFunction.
 5819|       |    //   ArrowFunction : ArrowParameters [no line terminator] => ConciseBody.
 5820|       |    //   AsyncArrowFunction :
 5821|       |    //   async [no line terminator] ArrowParameters [no line terminator] =>
 5822|       |    //   ConciseBody.
 5823|  2.55M|    if (check(TokenKind::equalgreater) &&
  ------------------
  |  Branch (5823:9): [True: 228k, False: 2.32M]
  ------------------
 5824|  2.55M|        !lexer_.isNewLineBeforeCurrentToken()) {
  ------------------
  |  Branch (5824:9): [True: 228k, False: 0]
  ------------------
 5825|   228k|      return parseArrowFunctionExpression(
 5826|   228k|          param,
 5827|   228k|          *state.optLeftExpr,
 5828|   228k|          typeParams,
 5829|   228k|          returnType,
 5830|   228k|          predicate,
 5831|   228k|          typeParams ? typeParams->getStartLoc() : startLoc,
  ------------------
  |  Branch (5831:11): [True: 0, False: 228k]
  ------------------
 5832|   228k|          allowTypedArrowFunction,
 5833|   228k|          forceAsync);
 5834|   228k|    }
 5835|       |
 5836|  2.32M|#if HERMES_PARSE_FLOW
 5837|  2.32M|    if (typeParams) {
  ------------------
  |  Branch (5837:9): [True: 0, False: 2.32M]
  ------------------
 5838|      0|      errorExpected(
 5839|      0|          TokenKind::equalgreater,
 5840|      0|          "in generic arrow function",
 5841|      0|          "start of function",
 5842|      0|          typeParams->getStartLoc());
 5843|      0|      return None;
 5844|      0|    }
 5845|  2.32M|#endif
 5846|       |
 5847|  2.32M|    if (!checkAssign())
  ------------------
  |  Branch (5847:9): [True: 2.32M, False: 9.19k]
  ------------------
 5848|  2.32M|      return *state.optLeftExpr;
 5849|       |
 5850|       |    // Check for destructuring assignment.
 5851|  9.19k|    if (check(TokenKind::equal) &&
  ------------------
  |  Branch (5851:9): [True: 8.89k, False: 306]
  ------------------
 5852|  9.19k|        (isa<ESTree::ArrayExpressionNode>(*state.optLeftExpr) ||
  ------------------
  |  Branch (5852:10): [True: 64, False: 8.82k]
  ------------------
 5853|  8.89k|         isa<ESTree::ObjectExpressionNode>(*state.optLeftExpr))) {
  ------------------
  |  Branch (5853:10): [True: 0, False: 8.82k]
  ------------------
 5854|     64|      state.optLeftExpr = reparseAssignmentPattern(*state.optLeftExpr, false);
 5855|     64|      if (!state.optLeftExpr)
  ------------------
  |  Branch (5855:11): [True: 0, False: 64]
  ------------------
 5856|      0|        return None;
 5857|     64|    }
 5858|       |
 5859|  9.19k|    state.op = getTokenIdent(tok_->getKind());
 5860|  9.19k|    state.debugLoc = advance().Start;
 5861|  9.19k|    return nullptr;
 5862|  9.19k|  };
_ZN6hermes6parser6detail12JSParserImpl18parseStatementListIJEEEN4llvh8OptionalIbEENS1_5ParamENS0_9TokenKindEbNS2_17AllowImportExportERNS4_12simple_ilistINS_6ESTree4NodeEJEEEDpT_:
  876|  6.08k|    Tail... otherUntil) {
  877|  6.08k|  if (parseDirectives) {
  ------------------
  |  Branch (877:7): [True: 4.51k, False: 1.57k]
  ------------------
  878|  4.51k|    ESTree::ExpressionStatementNode *dirStmt;
  879|  4.51k|    while (check(TokenKind::string_literal) &&
  ------------------
  |  Branch (879:12): [True: 1, False: 4.51k]
  ------------------
  880|  4.51k|           (dirStmt = parseDirective()) != nullptr) {
  ------------------
  |  Branch (880:12): [True: 1, False: 0]
  ------------------
  881|      1|      stmtList.push_back(*dirStmt);
  882|      1|    }
  883|  4.51k|  }
  884|       |
  885|   630k|  while (!check(TokenKind::eof) && !checkN(until, otherUntil...)) {
  ------------------
  |  Branch (885:10): [True: 630k, False: 244]
  |  Branch (885:36): [True: 624k, False: 5.80k]
  ------------------
  886|   624k|    if (!parseStatementListItem(param, allowImportExport, stmtList)) {
  ------------------
  |  Branch (886:9): [True: 39, False: 624k]
  ------------------
  887|     39|      return None;
  888|     39|    }
  889|   624k|  }
  890|       |
  891|  6.05k|  return true;
  892|  6.08k|}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl21parseBinaryExpressionENS1_5ParamEEN20PrecedenceStackEntryC2EPNS_6ESTree4NodeENS0_9TokenKindEN4llvh5SMLocE:
 3975|  1.39M|        : expr(expr), opKind(opKind), exprStartLoc(exprStartLoc) {}
JSParserImpl.cpp:_ZZN6hermes6parser6detail12JSParserImpl25parseAssignmentExpressionENS1_5ParamENS2_23AllowTypedArrowFunctionENS2_20CoverTypedParametersEPNS_6ESTree4NodeEEN5StateC2Ev:
 5620|  2.56M|    explicit State() {}

_ZNK6hermes6parser6detail12JSParserImpl12isStrictModeEv:
  106|   483k|  bool isStrictMode() const {
  107|   483k|    return lexer_.isStrictMode();
  108|   483k|  }
_ZN6hermes6parser6detail12JSParserImpl13setStrictModeEb:
  110|   246k|  void setStrictMode(bool mode) {
  111|   246k|    lexer_.setStrictMode(mode);
  112|   246k|  }
_ZNK6hermes6parser6detail12JSParserImpl19getUseStaticBuiltinEv:
  166|     99|  bool getUseStaticBuiltin() const {
  167|     99|    return useStaticBuiltin_;
  168|     99|  }
_ZN6hermes6parser6detail5ParamC2Ev:
   41|   996k|  constexpr Param() : flags_(0) {}
_ZN6hermes6parser6detail5ParamC2Ej:
   42|  1.37M|  constexpr explicit Param(unsigned f) : flags_(f) {}
_ZNK6hermes6parser6detail5Param3hasES2_:
   52|  2.56M|  bool has(Param p) const {
   53|  2.56M|    return flags_ & p.flags_;
   54|  2.56M|  }
_ZNK6hermes6parser6detail5Param3getES2_:
   63|  1.37M|  constexpr Param get(Param p) const {
   64|  1.37M|    return Param{flags_ & p.flags_};
   65|  1.37M|  }
_ZN6hermes6parser6detail12JSParserImpl17getSeenDirectivesEv:
  114|   490k|  llvh::SmallVector<UniqueString *, 1> &getSeenDirectives() {
  115|   490k|    return seenDirectives_;
  116|   490k|  }
_ZNK6hermes6parser6detail12JSParserImpl13getTokenIdentENS0_9TokenKindE:
  316|  1.41M|  UniqueString *getTokenIdent(TokenKind kind) const {
  317|  1.41M|    return tokenIdent_[(unsigned)kind];
  318|  1.41M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEPKNS0_5TokenE:
  345|  8.62M|  static SMLoc getStartLoc(const Token *tok) {
  346|  8.62M|    return tok->getStartLoc();
  347|  8.62M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEPKNS_6ESTree4NodeE:
  348|   171k|  static SMLoc getStartLoc(const ESTree::Node *from) {
  349|   171k|    return from->getStartLoc();
  350|   171k|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocEN4llvh5SMLocE:
  351|  5.70M|  static SMLoc getStartLoc(SMLoc loc) {
  352|  5.70M|    return loc;
  353|  5.70M|  }
_ZN6hermes6parser6detail12JSParserImpl11getStartLocERKN4llvh7SMRangeE:
  354|  19.0k|  static SMLoc getStartLoc(const SMRange &rng) {
  355|  19.0k|    return rng.Start;
  356|  19.0k|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEPKNS0_5TokenE:
  358|  4.31M|  static SMLoc getEndLoc(const Token *tok) {
  359|  4.31M|    return tok->getEndLoc();
  360|  4.31M|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEPKNS_6ESTree4NodeE:
  361|  98.0k|  static SMLoc getEndLoc(const ESTree::Node *from) {
  362|  98.0k|    return from->getEndLoc();
  363|  98.0k|  }
_ZN6hermes6parser6detail12JSParserImpl9getEndLocEN4llvh5SMLocE:
  364|  2.84M|  static SMLoc getEndLoc(SMLoc loc) {
  365|  2.84M|    return loc;
  366|  2.84M|  }
_ZNK6hermes6parser6detail12JSParserImpl18getPrevTokenEndLocEv:
  371|  4.57M|  SMLoc getPrevTokenEndLoc() const {
  372|  4.57M|    return lexer_.getPrevTokenEndLoc();
  373|  4.57M|  }
_ZN6hermes6parser6detail12JSParserImpl7advanceENS0_7JSLexer14GrammarContextE:
  379|  8.13M|      JSLexer::GrammarContext grammarContext = JSLexer::AllowRegExp) {
  380|  8.13M|    SMRange loc = tok_->getSourceRange();
  381|  8.13M|    tok_ = lexer_.advance(grammarContext);
  382|  8.13M|    return loc;
  383|  8.13M|  }
_ZN6hermes6parser6detail12JSParserImpl13errorExpectedENS0_9TokenKindEPKcS5_N4llvh5SMLocE:
  405|      7|      SMLoc whatLoc) {
  406|      7|    errorExpected(ArrayRef<TokenKind>(k1), where, what, whatLoc);
  407|      7|  }
_ZN6hermes6parser6detail12JSParserImpl5errorEN4llvh5SMLocERKNS3_5TwineE:
  427|     13|  void error(SMLoc loc, const llvh::Twine &message) {
  428|     13|    sm_.error(loc, message, Subsystem::Parser);
  429|     13|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkENS0_9TokenKindE:
  474|  93.7M|  bool check(TokenKind kind) const {
  475|  93.7M|    return tok_->getKind() == kind;
  476|  93.7M|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkEPNS_12UniqueStringE:
  478|  8.61M|  bool check(UniqueString *ident) const {
  479|  8.61M|    return tok_->getKind() == TokenKind::identifier &&
  ------------------
  |  Branch (479:12): [True: 6.04M, False: 2.57M]
  ------------------
  480|  8.61M|        tok_->getIdentifier() == ident;
  ------------------
  |  Branch (480:9): [True: 28, False: 6.04M]
  ------------------
  481|  8.61M|  }
_ZNK6hermes6parser6detail12JSParserImpl5checkENS0_9TokenKindES3_:
  484|  9.72M|  bool check(TokenKind kind1, TokenKind kind2) const {
  485|  9.72M|    return tok_->getKind() == kind1 || tok_->getKind() == kind2;
  ------------------
  |  Branch (485:12): [True: 1.49M, False: 8.22M]
  |  Branch (485:40): [True: 155k, False: 8.07M]
  ------------------
  486|  9.72M|  }
_ZN6hermes6parser6detail12JSParserImpl16checkDeclarationEv:
  503|   629k|  bool checkDeclaration() {
  504|   629k|    if (checkN(
  ------------------
  |  Branch (504:9): [True: 9.83k, False: 619k]
  ------------------
  505|   629k|            TokenKind::rw_function,
  506|   629k|            letIdent_,
  507|   629k|            TokenKind::rw_const,
  508|   629k|            TokenKind::rw_class) ||
  509|   629k|        (check(asyncIdent_) && checkAsyncFunction())) {
  ------------------
  |  Branch (509:10): [True: 1, False: 619k]
  |  Branch (509:32): [True: 0, False: 1]
  ------------------
  510|  9.83k|      return true;
  511|  9.83k|    }
  512|       |
  513|   619k|#if HERMES_PARSE_FLOW
  514|   619k|    if (context_.getParseFlow()) {
  ------------------
  |  Branch (514:9): [True: 0, False: 619k]
  ------------------
  515|      0|      if (check(opaqueIdent_)) {
  ------------------
  |  Branch (515:11): [True: 0, False: 0]
  ------------------
  516|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  517|      0|        return optNext.hasValue() && (*optNext == TokenKind::identifier);
  ------------------
  |  Branch (517:16): [True: 0, False: 0]
  |  Branch (517:38): [True: 0, False: 0]
  ------------------
  518|      0|      }
  519|      0|      if (checkN(typeIdent_, interfaceIdent_)) {
  ------------------
  |  Branch (519:11): [True: 0, False: 0]
  ------------------
  520|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  521|      0|        return optNext.hasValue() && *optNext == TokenKind::identifier;
  ------------------
  |  Branch (521:16): [True: 0, False: 0]
  |  Branch (521:38): [True: 0, False: 0]
  ------------------
  522|      0|      }
  523|      0|      if (check(TokenKind::rw_interface)) {
  ------------------
  |  Branch (523:11): [True: 0, False: 0]
  ------------------
  524|      0|        return true;
  525|      0|      }
  526|      0|      if (check(TokenKind::rw_enum)) {
  ------------------
  |  Branch (526:11): [True: 0, False: 0]
  ------------------
  527|      0|        return true;
  528|      0|      }
  529|      0|    }
  530|   619k|#endif
  531|       |
  532|   619k|#if HERMES_PARSE_TS
  533|   619k|    if (context_.getParseTS()) {
  ------------------
  |  Branch (533:9): [True: 0, False: 619k]
  ------------------
  534|      0|      if (checkN(typeIdent_, interfaceIdent_, namespaceIdent_)) {
  ------------------
  |  Branch (534:11): [True: 0, False: 0]
  ------------------
  535|      0|        auto optNext = lexer_.lookahead1(llvh::None);
  536|      0|        return optNext.hasValue() && *optNext == TokenKind::identifier;
  ------------------
  |  Branch (536:16): [True: 0, False: 0]
  |  Branch (536:38): [True: 0, False: 0]
  ------------------
  537|      0|      }
  538|      0|      if (check(TokenKind::rw_interface)) {
  ------------------
  |  Branch (538:11): [True: 0, False: 0]
  ------------------
  539|      0|        return true;
  540|      0|      }
  541|      0|      if (check(TokenKind::rw_enum)) {
  ------------------
  |  Branch (541:11): [True: 0, False: 0]
  ------------------
  542|      0|        return true;
  543|      0|      }
  544|      0|    }
  545|   619k|#endif
  546|       |
  547|   619k|    return false;
  548|   619k|  }
_ZNK6hermes6parser6detail12JSParserImpl20checkTemplateLiteralEv:
  566|  4.69M|  bool checkTemplateLiteral() const {
  567|  4.69M|    return check(TokenKind::no_substitution_template, TokenKind::template_head);
  568|  4.69M|  }
_ZN6hermes6parser6detail12JSParserImpl19recursionDepthCheckEv:
  593|  4.91M|  inline bool recursionDepthCheck() {
  594|  4.91M|    if (LLVM_LIKELY(recursionDepth_ < MAX_RECURSION_DEPTH)) {
  ------------------
  |  |  188|  4.91M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.91M, False: 3]
  |  |  ------------------
  ------------------
  595|  4.91M|      return false;
  596|  4.91M|    }
  597|      3|    return recursionDepthExceeded();
  598|  4.91M|  }
_ZN6hermes6parser6detail12JSParserImpl31SaveStrictModeAndSeenDirectivesC2EPS2_:
 1321|   245k|          oldSeenDirectiveSize_(parser->getSeenDirectives().size()) {}
_ZN6hermes6parser6detail12JSParserImpl31SaveStrictModeAndSeenDirectivesD2Ev:
 1322|   245k|    ~SaveStrictModeAndSeenDirectives() {
 1323|   245k|      parser_->setStrictMode(oldStrictMode_);
 1324|   245k|      parser_->getSeenDirectives().resize(oldSeenDirectiveSize_);
 1325|   245k|    }
_ZN6hermes6parser6detail12JSParserImpl14TrackRecursionC2EPS2_:
 1333|  4.90M|    TrackRecursion(JSParserImpl *parser) : parser_(parser) {
 1334|  4.90M|      ++parser_->recursionDepth_;
 1335|  4.90M|    }
_ZN6hermes6parser6detail12JSParserImpl14TrackRecursionD2Ev:
 1336|  4.90M|    ~TrackRecursion() {
 1337|  4.90M|      --parser_->recursionDepth_;
 1338|  4.90M|    }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJPNS_12UniqueStringES4_S4_EEEbT_DpT0_:
  495|   629k|  inline bool checkN(Head h, Tail... tail) const {
  496|   629k|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 9.83k, False: 619k]
  |  Branch (496:24): [True: 0, False: 619k]
  ------------------
  497|   629k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNIPNS_12UniqueStringEJNS0_9TokenKindES6_EEEbT_DpT0_:
  495|   619k|  inline bool checkN(Head h, Tail... tail) const {
  496|   619k|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 619k]
  |  Branch (496:24): [True: 0, False: 619k]
  ------------------
  497|   619k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_EEEbT_DpT0_:
  495|  11.3M|  inline bool checkN(Head h, Tail... tail) const {
  496|  11.3M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 19.8k, False: 11.2M]
  |  Branch (496:24): [True: 418, False: 11.2M]
  ------------------
  497|  11.3M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEEEbT_:
  489|  11.9M|  inline bool checkN(T t) const {
  490|  11.9M|    return check(t);
  491|  11.9M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19TemplateElementNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|   898k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|   898k|    node->setStartLoc(getStartLoc(start));
  326|   898k|    node->setEndLoc(getEndLoc(end));
  327|   898k|    node->setDebugLoc(getStartLoc(start));
  328|   898k|    return node;
  329|   898k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree21LogicalExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  90.0k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  90.0k|    node->setStartLoc(getStartLoc(start));
  326|  90.0k|    node->setEndLoc(getEndLoc(end));
  327|  90.0k|    node->setDebugLoc(getStartLoc(start));
  328|  90.0k|    return node;
  329|  90.0k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20BinaryExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  1.30M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  1.30M|    node->setStartLoc(getStartLoc(start));
  326|  1.30M|    node->setEndLoc(getEndLoc(end));
  327|  1.30M|    node->setDebugLoc(getStartLoc(start));
  328|  1.30M|    return node;
  329|  1.30M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 908, False: 2.32M]
  |  Branch (496:24): [True: 4.52k, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 8.89k, False: 2.32M]
  |  Branch (496:24): [True: 306, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 306, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 306, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 306, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 12, False: 2.32M]
  |  Branch (496:24): [True: 294, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 294, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 294, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 294, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 294, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 5.73k, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJPNS_12UniqueStringES4_S4_S4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  9.19k|  inline bool checkN(Head h, Tail... tail) const {
  496|  9.19k|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 9.19k]
  |  Branch (496:24): [True: 5.43k, False: 3.75k]
  ------------------
  497|  9.19k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNIPNS_12UniqueStringEJNS0_9TokenKindES6_S6_S6_S6_S6_S6_EEEbT_DpT0_:
  495|  9.19k|  inline bool checkN(Head h, Tail... tail) const {
  496|  9.19k|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 9.19k]
  |  Branch (496:24): [True: 5.43k, False: 3.75k]
  ------------------
  497|  9.19k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree11ProgramNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|    243|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    243|    node->setStartLoc(getStartLoc(start));
  326|    243|    node->setEndLoc(getEndLoc(end));
  327|    243|    node->setDebugLoc(getStartLoc(start));
  328|    243|    return node;
  329|    243|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree16FunctionLikeNodeEN4llvh5SMLocEPNS4_18BlockStatementNodeEEEPT_T0_T1_SB_:
  324|  4.91k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  4.91k|    node->setStartLoc(getStartLoc(start));
  326|  4.91k|    node->setEndLoc(getEndLoc(end));
  327|  4.91k|    node->setDebugLoc(getStartLoc(start));
  328|  4.91k|    return node;
  329|  4.91k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BlockStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|    674|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    674|    node->setStartLoc(getStartLoc(start));
  326|    674|    node->setEndLoc(getEndLoc(end));
  327|    674|    node->setDebugLoc(getStartLoc(start));
  328|    674|    return node;
  329|    674|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BlockStatementNodeEN4llvh5SMLocEPKNS0_5TokenEEEPT_T0_T1_SC_:
  324|  5.80k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  5.80k|    node->setStartLoc(getStartLoc(start));
  326|  5.80k|    node->setEndLoc(getEndLoc(end));
  327|  5.80k|    node->setDebugLoc(getStartLoc(start));
  328|  5.80k|    return node;
  329|  5.80k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree14IdentifierNodeEN4llvh7SMRangeENS6_5SMLocEEEPT_T0_T1_SA_:
  324|  9.52k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  9.52k|    node->setStartLoc(getStartLoc(start));
  326|  9.52k|    node->setEndLoc(getEndLoc(end));
  327|  9.52k|    node->setDebugLoc(getStartLoc(start));
  328|  9.52k|    return node;
  329|  9.52k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23VariableDeclarationNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  3.06k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  3.06k|    node->setStartLoc(getStartLoc(start));
  326|  3.06k|    node->setEndLoc(getEndLoc(end));
  327|  3.06k|    node->setDebugLoc(getStartLoc(start));
  328|  3.06k|    return node;
  329|  3.06k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree14IdentifierNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|  1.30M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  1.30M|    node->setStartLoc(getStartLoc(start));
  326|  1.30M|    node->setEndLoc(getEndLoc(end));
  327|  1.30M|    node->setDebugLoc(getStartLoc(start));
  328|  1.30M|    return node;
  329|  1.30M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree22VariableDeclaratorNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  3.06k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  3.06k|    node->setStartLoc(getStartLoc(start));
  326|  3.06k|    node->setEndLoc(getEndLoc(end));
  327|  3.06k|    node->setDebugLoc(getStartLoc(start));
  328|  3.06k|    return node;
  329|  3.06k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree9EmptyNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|    493|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    493|    node->setStartLoc(getStartLoc(start));
  326|    493|    node->setEndLoc(getEndLoc(end));
  327|    493|    node->setDebugLoc(getStartLoc(start));
  328|    493|    return node;
  329|    493|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree16ArrayPatternNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|    228|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    228|    node->setStartLoc(getStartLoc(start));
  326|    228|    node->setEndLoc(getEndLoc(end));
  327|    228|    node->setDebugLoc(getStartLoc(start));
  328|    228|    return node;
  329|    228|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree12PropertyNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  12.0k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  12.0k|    node->setStartLoc(getStartLoc(start));
  326|  12.0k|    node->setEndLoc(getEndLoc(end));
  327|  12.0k|    node->setDebugLoc(getStartLoc(start));
  328|  12.0k|    return node;
  329|  12.0k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18EmptyStatementNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|   263k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|   263k|    node->setStartLoc(getStartLoc(start));
  326|   263k|    node->setEndLoc(getEndLoc(end));
  327|   263k|    node->setDebugLoc(getStartLoc(start));
  328|   263k|    return node;
  329|   263k|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_EEEbT_DpT0_:
  495|  10.6M|  inline bool checkN(Head h, Tail... tail) const {
  496|  10.6M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 13.7k, False: 10.6M]
  |  Branch (496:24): [True: 20.3k, False: 10.6M]
  ------------------
  497|  10.6M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20LabeledStatementNodeEPNS4_14IdentifierNodeEPNS4_4NodeEEEPT_T0_T1_SB_:
  324|  85.6k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  85.6k|    node->setStartLoc(getStartLoc(start));
  326|  85.6k|    node->setEndLoc(getEndLoc(end));
  327|  85.6k|    node->setDebugLoc(getStartLoc(start));
  328|  85.6k|    return node;
  329|  85.6k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23ExpressionStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|   351k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|   351k|    node->setStartLoc(getStartLoc(start));
  326|   351k|    node->setEndLoc(getEndLoc(end));
  327|   351k|    node->setDebugLoc(getStartLoc(start));
  328|   351k|    return node;
  329|   351k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18WhileStatementNodeEN4llvh5SMLocEPNS4_4NodeEEEPT_T0_T1_SB_:
  324|      3|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|      3|    node->setStartLoc(getStartLoc(start));
  326|      3|    node->setEndLoc(getEndLoc(end));
  327|      3|    node->setDebugLoc(getStartLoc(start));
  328|      3|    return node;
  329|      3|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree21ContinueStatementNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|      7|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|      7|    node->setStartLoc(getStartLoc(start));
  326|      7|    node->setEndLoc(getEndLoc(end));
  327|      7|    node->setDebugLoc(getStartLoc(start));
  328|      7|    return node;
  329|      7|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18BooleanLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|  4.03k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  4.03k|    node->setStartLoc(getStartLoc(start));
  326|  4.03k|    node->setEndLoc(getEndLoc(end));
  327|  4.03k|    node->setDebugLoc(getStartLoc(start));
  328|  4.03k|    return node;
  329|  4.03k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18NumericLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|  1.79M|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  1.79M|    node->setStartLoc(getStartLoc(start));
  326|  1.79M|    node->setEndLoc(getEndLoc(end));
  327|  1.79M|    node->setDebugLoc(getStartLoc(start));
  328|  1.79M|    return node;
  329|  1.79M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17BigIntLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|     24|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|     24|    node->setStartLoc(getStartLoc(start));
  326|     24|    node->setEndLoc(getEndLoc(end));
  327|     24|    node->setDebugLoc(getStartLoc(start));
  328|     24|    return node;
  329|     24|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17StringLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|  15.5k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  15.5k|    node->setStartLoc(getStartLoc(start));
  326|  15.5k|    node->setEndLoc(getEndLoc(end));
  327|  15.5k|    node->setDebugLoc(getStartLoc(start));
  328|  15.5k|    return node;
  329|  15.5k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree17RegExpLiteralNodeEPKNS0_5TokenES8_EEPT_T0_T1_SA_:
  324|  34.1k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  34.1k|    node->setStartLoc(getStartLoc(start));
  326|  34.1k|    node->setEndLoc(getEndLoc(end));
  327|  34.1k|    node->setDebugLoc(getStartLoc(start));
  328|  34.1k|    return node;
  329|  34.1k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18CoverEmptyArgsNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|    146|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    146|    node->setStartLoc(getStartLoc(start));
  326|    146|    node->setEndLoc(getEndLoc(end));
  327|    146|    node->setDebugLoc(getStartLoc(start));
  328|    146|    return node;
  329|    146|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19ArrayExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  67.1k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  67.1k|    node->setStartLoc(getStartLoc(start));
  326|  67.1k|    node->setEndLoc(getEndLoc(end));
  327|  67.1k|    node->setDebugLoc(getStartLoc(start));
  328|  67.1k|    return node;
  329|  67.1k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20ObjectExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  10.2k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  10.2k|    node->setStartLoc(getStartLoc(start));
  326|  10.2k|    node->setEndLoc(getEndLoc(end));
  327|  10.2k|    node->setDebugLoc(getStartLoc(start));
  328|  10.2k|    return node;
  329|  10.2k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19TemplateLiteralNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|   743k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|   743k|    node->setStartLoc(getStartLoc(start));
  326|   743k|    node->setEndLoc(getEndLoc(end));
  327|   743k|    node->setDebugLoc(getStartLoc(start));
  328|   743k|    return node;
  329|   743k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree28TaggedTemplateExpressionNodeEN4llvh5SMLocEPNS4_4NodeEEEPT_T0_T1_SB_:
  324|    640|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    640|    node->setStartLoc(getStartLoc(start));
  326|    640|    node->setEndLoc(getEndLoc(end));
  327|    640|    node->setDebugLoc(getStartLoc(start));
  328|    640|    return node;
  329|    640|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20MemberExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  333|     40|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|     40|    node->setStartLoc(getStartLoc(start));
  335|     40|    node->setEndLoc(getEndLoc(end));
  336|     40|    node->setDebugLoc(getStartLoc(debugLoc));
  337|     40|    return node;
  338|     40|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree28OptionalMemberExpressionNodeEN4llvh5SMLocEPNS4_4NodeES7_EEPT_T0_T1_T2_SB_:
  333|  3.51k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|  3.51k|    node->setStartLoc(getStartLoc(start));
  335|  3.51k|    node->setEndLoc(getEndLoc(end));
  336|  3.51k|    node->setDebugLoc(getStartLoc(debugLoc));
  337|  3.51k|    return node;
  338|  3.51k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20MemberExpressionNodeEN4llvh5SMLocEPNS4_4NodeES7_EEPT_T0_T1_T2_SB_:
  333|  3.25k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|  3.25k|    node->setStartLoc(getStartLoc(start));
  335|  3.25k|    node->setEndLoc(getEndLoc(end));
  336|  3.25k|    node->setDebugLoc(getStartLoc(debugLoc));
  337|  3.25k|    return node;
  338|  3.25k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree18CallExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  333|  2.05k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|  2.05k|    node->setStartLoc(getStartLoc(start));
  335|  2.05k|    node->setEndLoc(getEndLoc(end));
  336|  2.05k|    node->setDebugLoc(getStartLoc(debugLoc));
  337|  2.05k|    return node;
  338|  2.05k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree20UpdateExpressionNodeEN4llvh5SMLocEPKNS0_5TokenESA_EEPT_T0_T1_T2_SC_:
  333|     58|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|     58|    node->setStartLoc(getStartLoc(start));
  335|     58|    node->setEndLoc(getEndLoc(end));
  336|     58|    node->setDebugLoc(getStartLoc(debugLoc));
  337|     58|    return node;
  338|     58|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree19UnaryExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  11.0k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  11.0k|    node->setStartLoc(getStartLoc(start));
  326|  11.0k|    node->setEndLoc(getEndLoc(end));
  327|  11.0k|    node->setDebugLoc(getStartLoc(start));
  328|  11.0k|    return node;
  329|  11.0k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree25ConditionalExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|    180|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|    180|    node->setStartLoc(getStartLoc(start));
  326|    180|    node->setEndLoc(getEndLoc(end));
  327|    180|    node->setDebugLoc(getStartLoc(start));
  328|    180|    return node;
  329|    180|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 294, False: 2.32M]
  |  Branch (496:24): [True: 5.43k, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZNK6hermes6parser6detail12JSParserImpl6checkNINS0_9TokenKindEJS4_S4_S4_S4_EEEbT_DpT0_:
  495|  2.32M|  inline bool checkN(Head h, Tail... tail) const {
  496|  2.32M|    return check(h) || checkN(tail...);
  ------------------
  |  Branch (496:12): [True: 0, False: 2.32M]
  |  Branch (496:24): [True: 5.43k, False: 2.32M]
  ------------------
  497|  2.32M|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree27ArrowFunctionExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|   228k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|   228k|    node->setStartLoc(getStartLoc(start));
  326|   228k|    node->setEndLoc(getEndLoc(end));
  327|   228k|    node->setDebugLoc(getStartLoc(start));
  328|   228k|    return node;
  329|   228k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree24AssignmentExpressionNodeEN4llvh5SMLocES7_S7_EEPT_T0_T1_T2_S9_:
  333|  9.19k|  Node *setLocation(StartLoc start, EndLoc end, DebugLoc debugLoc, Node *node) {
  334|  9.19k|    node->setStartLoc(getStartLoc(start));
  335|  9.19k|    node->setEndLoc(getEndLoc(end));
  336|  9.19k|    node->setDebugLoc(getStartLoc(debugLoc));
  337|  9.19k|    return node;
  338|  9.19k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree22SequenceExpressionNodeEN4llvh5SMLocES7_EEPT_T0_T1_S9_:
  324|  1.18k|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|  1.18k|    node->setStartLoc(getStartLoc(start));
  326|  1.18k|    node->setEndLoc(getEndLoc(end));
  327|  1.18k|    node->setDebugLoc(getStartLoc(start));
  328|  1.18k|    return node;
  329|  1.18k|  }
_ZN6hermes6parser6detail12JSParserImpl11setLocationINS_6ESTree23ExpressionStatementNodeEPNS4_17StringLiteralNodeEN4llvh5SMLocEEEPT_T0_T1_SB_:
  324|      1|  Node *setLocation(StartLoc start, EndLoc end, Node *node) {
  325|      1|    node->setStartLoc(getStartLoc(start));
  326|      1|    node->setEndLoc(getEndLoc(end));
  327|      1|    node->setDebugLoc(getStartLoc(start));
  328|      1|    return node;
  329|      1|  }

_ZN6hermes19isUnicodeOnlyLetterEj:
   37|  5.75k|bool isUnicodeOnlyLetter(uint32_t cp) {
   38|       |  // "any character in the Unicode categories “Uppercase letter (Lu)”,
   39|       |  // “Lowercase letter (Ll)”, “Titlecase letter (Lt)”, “Modifier letter (Lm)”,
   40|       |  // “Other letter (Lo)”, or “Letter number (Nl)”".
   41|       |  // ASCII characters are not "UnicodeOnly" and so we return false.
   42|  5.75k|  if (cp <= 0x7F)
  ------------------
  |  Branch (42:7): [True: 4, False: 5.74k]
  ------------------
   43|      4|    return false;
   44|       |
   45|  5.74k|  return lookup(UNICODE_LETTERS, cp);
   46|  5.75k|}
_ZN6hermes18isUnicodeOnlySpaceEj:
   49|     89|bool isUnicodeOnlySpace(uint32_t cp) {
   50|       |  // "Other category “Zs”: Any other Unicode “space separator”"
   51|       |  // Exclude ASCII.
   52|     89|  if (cp <= 0x7F)
  ------------------
  |  Branch (52:7): [True: 4, False: 85]
  ------------------
   53|      4|    return false;
   54|       |
   55|     85|  switch (cp) {
   56|      0|    case 0xa0:
  ------------------
  |  Branch (56:5): [True: 0, False: 85]
  ------------------
   57|      0|    case 0x1680:
  ------------------
  |  Branch (57:5): [True: 0, False: 85]
  ------------------
   58|      0|    case 0x2000:
  ------------------
  |  Branch (58:5): [True: 0, False: 85]
  ------------------
   59|     56|    case 0x2001:
  ------------------
  |  Branch (59:5): [True: 56, False: 29]
  ------------------
   60|     56|    case 0x2002:
  ------------------
  |  Branch (60:5): [True: 0, False: 85]
  ------------------
   61|     56|    case 0x2003:
  ------------------
  |  Branch (61:5): [True: 0, False: 85]
  ------------------
   62|     56|    case 0x2004:
  ------------------
  |  Branch (62:5): [True: 0, False: 85]
  ------------------
   63|     56|    case 0x2005:
  ------------------
  |  Branch (63:5): [True: 0, False: 85]
  ------------------
   64|     56|    case 0x2006:
  ------------------
  |  Branch (64:5): [True: 0, False: 85]
  ------------------
   65|     56|    case 0x2007:
  ------------------
  |  Branch (65:5): [True: 0, False: 85]
  ------------------
   66|     64|    case 0x2008:
  ------------------
  |  Branch (66:5): [True: 8, False: 77]
  ------------------
   67|     64|    case 0x2009:
  ------------------
  |  Branch (67:5): [True: 0, False: 85]
  ------------------
   68|     64|    case 0x200a:
  ------------------
  |  Branch (68:5): [True: 0, False: 85]
  ------------------
   69|     64|    case 0x202f:
  ------------------
  |  Branch (69:5): [True: 0, False: 85]
  ------------------
   70|     64|    case 0x205f:
  ------------------
  |  Branch (70:5): [True: 0, False: 85]
  ------------------
   71|     64|    case 0x3000:
  ------------------
  |  Branch (71:5): [True: 0, False: 85]
  ------------------
   72|     64|      return true;
   73|     21|    default:
  ------------------
  |  Branch (73:5): [True: 21, False: 64]
  ------------------
   74|     21|      return false;
   75|     85|  }
   76|     85|}
_ZN6hermes22isUnicodeCombiningMarkEj:
   78|      1|bool isUnicodeCombiningMark(uint32_t cp) {
   79|       |  // "any character in the Unicode categories “Non-spacing mark (Mn)” or
   80|       |  // “Combining spacing mark (Mc)”"
   81|      1|  return lookup(UNICODE_COMBINING_MARK, cp);
   82|      1|}
_ZN6hermes14isUnicodeDigitEj:
   84|      1|bool isUnicodeDigit(uint32_t cp) {
   85|       |  // "any character in the Unicode category “Decimal number (Nd)”"
   86|       |  // 0-9 is the common case.
   87|      1|  return (cp >= '0' && cp <= '9') || lookup(UNICODE_DIGIT, cp);
  ------------------
  |  Branch (87:11): [True: 1, False: 0]
  |  Branch (87:24): [True: 0, False: 1]
  |  Branch (87:38): [True: 0, False: 1]
  ------------------
   88|      1|};
_ZN6hermes29isUnicodeConnectorPunctuationEj:
   90|      1|bool isUnicodeConnectorPunctuation(uint32_t cp) {
   91|       |  // "any character in the Unicode category “Connector punctuation (Pc)"
   92|       |  // _ is the common case.
   93|      1|  return cp == '_' || lookup(UNICODE_CONNECTOR_PUNCTUATION, cp);
  ------------------
  |  Branch (93:10): [True: 0, False: 1]
  |  Branch (93:23): [True: 0, False: 1]
  ------------------
   94|      1|}
_ZN6hermes6lookupIA354_NS_12UnicodeRangeEEEbRKT_j:
   32|  5.74k|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   33|  5.74k|  return std::binary_search(
   34|  5.74k|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   35|  5.74k|}
CharacterProperties.cpp:_ZNK6hermes12_GLOBAL__N_116UnicodeRangeCompclENS_12UnicodeRangeEj:
   22|  51.4k|  bool operator()(UnicodeRange p, uint32_t s) const {
   23|  51.4k|    return p.second < s;
   24|  51.4k|  }
CharacterProperties.cpp:_ZNK6hermes12_GLOBAL__N_116UnicodeRangeCompclEjNS_12UnicodeRangeE:
   25|  5.74k|  bool operator()(uint32_t s, UnicodeRange p) const {
   26|  5.74k|    return s < p.first;
   27|  5.74k|  }
_ZN6hermes6lookupIA245_NS_12UnicodeRangeEEEbRKT_j:
   32|      1|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   33|      1|  return std::binary_search(
   34|      1|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   35|      1|}
_ZN6hermes6lookupIA61_NS_12UnicodeRangeEEEbRKT_j:
   32|      1|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   33|      1|  return std::binary_search(
   34|      1|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   35|      1|}
_ZN6hermes6lookupIA6_NS_12UnicodeRangeEEEbRKT_j:
   32|      1|inline bool lookup(const UnicodeRangeTable &table, const uint32_t cp) {
   33|      1|  return std::binary_search(
   34|      1|      std::begin(table), std::end(table), cp, UnicodeRangeComp());
   35|      1|}

_ZN6hermes5regex18searchWithBytecodeEN4llvh8ArrayRefIhEEPKDsjjPNSt3__16vectorINS0_13CapturedRangeENS6_9allocatorIS8_EEEENS0_9constants13MatchFlagTypeE:
 1574|   355k|    constants::MatchFlagType matchFlags) {
 1575|   355k|  return searchWithBytecodeImpl<char16_t, UTF16RegexTraits>(
 1576|   355k|      bytecode, first, start, length, m, matchFlags);
 1577|   355k|}
_ZN6hermes5regex18searchWithBytecodeEN4llvh8ArrayRefIhEEPKcjjPNSt3__16vectorINS0_13CapturedRangeENS6_9allocatorIS8_EEEENS0_9constants13MatchFlagTypeE:
 1585|  48.9k|    constants::MatchFlagType matchFlags) {
 1586|  48.9k|  return searchWithBytecodeImpl<char, ASCIIRegexTraits>(
 1587|  48.9k|      bytecode, first, start, length, m, matchFlags);
 1588|  48.9k|}
_ZN6hermes5regex22searchWithBytecodeImplIDsNS0_16UTF16RegexTraitsEEENS0_18MatchRuntimeResultEN4llvh8ArrayRefIhEEPKT_jjPNSt3__16vectorINS0_13CapturedRangeENSA_9allocatorISC_EEEENS0_9constants13MatchFlagTypeE:
 1517|   355k|    constants::MatchFlagType matchFlags) {
 1518|   355k|  assert(
 1519|   355k|      bytecode.size() >= sizeof(RegexBytecodeHeader) && "Bytecode too small");
 1520|      0|  auto header = reinterpret_cast<const RegexBytecodeHeader *>(bytecode.data());
 1521|       |
 1522|       |  // Check for match impossibility before doing anything else.
 1523|   355k|  Cursor<Traits> cursor{
 1524|   355k|      first, first + start, first + length, true /* forwards */};
 1525|   355k|  if (!cursor.satisfiesConstraints(matchFlags, header->constraints))
  ------------------
  |  Branch (1525:7): [True: 0, False: 355k]
  ------------------
 1526|      0|    return MatchRuntimeResult::NoMatch;
 1527|       |
 1528|   355k|  auto markedCount = header->markedCount;
 1529|   355k|  auto loopCount = header->loopCount;
 1530|       |
 1531|   355k|  Context<Traits> ctx(
 1532|   355k|      bytecode,
 1533|   355k|      matchFlags,
 1534|   355k|      SyntaxFlags::fromByte(header->syntaxFlags),
 1535|   355k|      first,
 1536|   355k|      first + length,
 1537|   355k|      header->markedCount,
 1538|   355k|      header->loopCount);
 1539|   355k|  State<Traits> state{cursor, markedCount, loopCount};
 1540|       |
 1541|       |  // We check only one location if either the regex pattern constrains us to, or
 1542|       |  // the flags request it (via the sticky flag 'y').
 1543|   355k|  bool onlyAtStart = (header->constraints & MatchConstraintAnchoredAtStart) ||
  ------------------
  |  Branch (1543:22): [True: 0, False: 355k]
  ------------------
 1544|   355k|      (matchFlags & constants::matchOnlyAtStart);
  ------------------
  |  Branch (1544:7): [True: 0, False: 355k]
  ------------------
 1545|       |
 1546|   355k|  auto res = ctx.match(&state, onlyAtStart);
 1547|   355k|  if (!res) {
  ------------------
  |  Branch (1547:7): [True: 0, False: 355k]
  ------------------
 1548|      0|    assert(res.getStatus() == ExecutionStatus::STACK_OVERFLOW);
 1549|      0|    return MatchRuntimeResult::StackOverflow;
 1550|      0|  }
 1551|   355k|  if (const CharT *matchStartLoc = res.getValue()) {
  ------------------
  |  Branch (1551:20): [True: 355k, False: 3]
  ------------------
 1552|       |    // Match succeeded. Return captured ranges. The first range is the total
 1553|       |    // match, followed by any capture groups.
 1554|   355k|    if (m != nullptr) {
  ------------------
  |  Branch (1554:9): [True: 355k, False: 0]
  ------------------
 1555|   355k|      uint32_t totalStart = static_cast<uint32_t>(matchStartLoc - first);
 1556|   355k|      uint32_t totalEnd =
 1557|   355k|          static_cast<uint32_t>(state.cursor_.currentPointer() - first);
 1558|   355k|      m->clear();
 1559|   355k|      m->push_back(CapturedRange{totalStart, totalEnd});
 1560|   355k|      std::copy_n(
 1561|   355k|          state.capturedRanges_.begin(), markedCount, std::back_inserter(*m));
 1562|   355k|    }
 1563|   355k|    return MatchRuntimeResult::Match;
 1564|   355k|  }
 1565|      3|  return MatchRuntimeResult::NoMatch;
 1566|   355k|}
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEEC2EPKDsS5_S5_b:
  118|   355k|        forwards_(forwards) {
  119|   355k|    assert(first_ <= last_ && "first and last out of order");
  120|      0|    assert(
  121|   355k|        first_ <= current_ && current <= last_ &&
  122|   355k|        "current pointer not in range");
  123|   355k|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE20satisfiesConstraintsENS0_9constants13MatchFlagTypeEh:
  220|   355k|      MatchConstraintSet constraints) const {
  221|   355k|    if ((constraints & MatchConstraintNonASCII) &&
  ------------------
  |  Branch (221:9): [True: 0, False: 355k]
  ------------------
  222|   355k|        (flags & constants::matchInputAllAscii))
  ------------------
  |  Branch (222:9): [True: 0, False: 0]
  ------------------
  223|      0|      return false;
  224|   355k|    if ((constraints & MatchConstraintAnchoredAtStart) && current_ != first_)
  ------------------
  |  Branch (224:9): [True: 0, False: 355k]
  |  Branch (224:59): [True: 0, False: 0]
  ------------------
  225|      0|      return false;
  226|   355k|    return true;
  227|   355k|  }
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEEC2EN4llvh8ArrayRefIhEENS0_9constants13MatchFlagTypeENS0_11SyntaxFlagsEPKDsSB_jj:
  417|   355k|        loopCount_(loopCount) {}
_ZN6hermes5regex5StateINS0_16UTF16RegexTraitsEEC2ENS0_6CursorIS2_EEjj:
  555|   355k|        loopDatas_(loopCount, {0, 0}) {}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE5matchEPNS0_5StateIS2_EEb:
  963|   355k|    -> ExecutorResult<const CodeUnit *> {
  964|   355k|  using State = State<Traits>;
  965|   355k|  BacktrackStack backtrackStack;
  966|       |
  967|       |  // We'll refer to the cursor often.
  968|   355k|  Cursor<Traits> &c = s->cursor_;
  969|       |
  970|       |  // Pull out the instruction portion of the bytecode, following the header.
  971|   355k|  const uint8_t *const bytecode = &bytecodeStream_[sizeof(RegexBytecodeHeader)];
  972|       |
  973|       |  // Save the incoming IP in case we have to loop.
  974|   355k|  const auto startIp = s->ip_;
  975|       |
  976|   355k|  const CodeUnit *const startLoc = c.currentPointer();
  977|       |
  978|       |  // Use offsetFromRight() instead of remaining() here so that the length passed
  979|       |  // to advanceStringIndex is accurate even when the cursor is going backwards.
  980|   355k|  const size_t charsToRight = c.offsetFromRight();
  981|       |
  982|       |  // Decide how many locations we'll need to check.
  983|       |  // Note that we do want to check the empty range at the end, so add one to
  984|       |  // charsToRight.
  985|   355k|  const size_t locsToCheckCount = onlyAtStart ? 1 : 1 + charsToRight;
  ------------------
  |  Branch (985:35): [True: 0, False: 355k]
  ------------------
  986|       |
  987|       |  // If we are tracking backwards, we should only ever have one potential match
  988|       |  // location. This is because advanceStringIndex only ever tracks forwards.
  989|   355k|  assert(
  990|   355k|      (c.forwards() || locsToCheckCount == 1) &&
  991|   355k|      "Can only check one location when cursor is backwards");
  992|       |
  993|       |  // Macro used when a state fails to match.
  994|      0|#define BACKTRACK()                            \
  995|      0|  do {                                         \
  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  998|      0|      return btRes.getStatus();                \
  999|      0|    if (*btRes)                                \
 1000|      0|      goto backtrackingSucceeded;              \
 1001|      0|    goto backtrackingExhausted;                \
 1002|      0|  } while (0)
 1003|       |
 1004|   355k|  for (size_t locIndex = 0; locIndex < locsToCheckCount;
  ------------------
  |  Branch (1004:29): [True: 355k, False: 3]
  ------------------
 1005|   355k|       locIndex = advanceStringIndex(startLoc, locIndex, charsToRight)) {
 1006|   355k|    const CodeUnit *potentialMatchLocation = startLoc + locIndex;
 1007|   355k|    c.setCurrentPointer(potentialMatchLocation);
 1008|   355k|    s->ip_ = startIp;
 1009|   355k|  backtrackingSucceeded:
 1010|   711k|    for (;;) {
 1011|   711k|      const Insn *base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1012|   711k|      switch (base->opcode) {
  ------------------
  |  Branch (1012:15): [True: 0, False: 711k]
  ------------------
 1013|   355k|        case Opcode::Goal:
  ------------------
  |  Branch (1013:9): [True: 355k, False: 355k]
  ------------------
 1014|   355k|          return potentialMatchLocation;
 1015|       |
 1016|      0|        case Opcode::LeftAnchor:
  ------------------
  |  Branch (1016:9): [True: 0, False: 711k]
  ------------------
 1017|      0|          if (!matchesLeftAnchor(*this, *s))
  ------------------
  |  Branch (1017:15): [True: 0, False: 0]
  ------------------
 1018|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1019|      0|          s->ip_ += sizeof(LeftAnchorInsn);
 1020|      0|          break;
 1021|       |
 1022|      0|        case Opcode::RightAnchor:
  ------------------
  |  Branch (1022:9): [True: 0, False: 711k]
  ------------------
 1023|      0|          if (!matchesRightAnchor(*this, *s))
  ------------------
  |  Branch (1023:15): [True: 0, False: 0]
  ------------------
 1024|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1025|      0|          s->ip_ += sizeof(RightAnchorInsn);
 1026|      0|          break;
 1027|       |
 1028|      0|        case Opcode::MatchAny:
  ------------------
  |  Branch (1028:9): [True: 0, False: 711k]
  ------------------
 1029|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1029:15): [True: 0, False: 0]
  ------------------
 1030|      0|              !matchWidth1<Width1Opcode::MatchAny>(base, c.consume()))
  ------------------
  |  Branch (1030:15): [True: 0, False: 0]
  ------------------
 1031|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1032|      0|          s->ip_ += sizeof(MatchAnyInsn);
 1033|      0|          break;
 1034|       |
 1035|      0|        case Opcode::U16MatchAny:
  ------------------
  |  Branch (1035:9): [True: 0, False: 711k]
  ------------------
 1036|      0|          if (c.atEnd())
  ------------------
  |  Branch (1036:15): [True: 0, False: 0]
  ------------------
 1037|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1038|      0|          c.consumeUTF16();
 1039|      0|          s->ip_ += sizeof(U16MatchAnyInsn);
 1040|      0|          break;
 1041|       |
 1042|   355k|        case Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (1042:9): [True: 355k, False: 355k]
  ------------------
 1043|   355k|          if (c.atEnd() ||
  ------------------
  |  Branch (1043:15): [True: 3, False: 355k]
  ------------------
 1044|   355k|              !matchWidth1<Width1Opcode::MatchAnyButNewline>(base, c.consume()))
  ------------------
  |  Branch (1044:15): [True: 0, False: 355k]
  ------------------
 1045|      3|            BACKTRACK();
  ------------------
  |  |  995|      3|  do {                                         \
  |  |  996|      3|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      3|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      3|      return btRes.getStatus();                \
  |  |  999|      3|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 3]
  |  |  ------------------
  |  | 1000|      3|      goto backtrackingSucceeded;              \
  |  | 1001|      3|    goto backtrackingExhausted;                \
  |  | 1002|      3|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1046|   355k|          s->ip_ += sizeof(MatchAnyButNewlineInsn);
 1047|   355k|          break;
 1048|       |
 1049|      0|        case Opcode::U16MatchAnyButNewline:
  ------------------
  |  Branch (1049:9): [True: 0, False: 711k]
  ------------------
 1050|      0|          if (c.atEnd() || isLineTerminator(c.consumeUTF16()))
  ------------------
  |  Branch (1050:15): [True: 0, False: 0]
  |  Branch (1050:28): [True: 0, False: 0]
  ------------------
 1051|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1052|      0|          s->ip_ += sizeof(U16MatchAnyButNewlineInsn);
 1053|      0|          break;
 1054|       |
 1055|      0|        case Opcode::MatchChar8: {
  ------------------
  |  Branch (1055:9): [True: 0, False: 711k]
  ------------------
 1056|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1056:15): [True: 0, False: 0]
  ------------------
 1057|      0|              !matchWidth1<Width1Opcode::MatchChar8>(base, c.consume()))
  ------------------
  |  Branch (1057:15): [True: 0, False: 0]
  ------------------
 1058|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1059|      0|          s->ip_ += sizeof(MatchChar8Insn);
 1060|      0|          break;
 1061|      0|        }
 1062|       |
 1063|      0|        case Opcode::MatchChar16: {
  ------------------
  |  Branch (1063:9): [True: 0, False: 711k]
  ------------------
 1064|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1064:15): [True: 0, False: 0]
  ------------------
 1065|      0|              !matchWidth1<Width1Opcode::MatchChar16>(base, c.consume()))
  ------------------
  |  Branch (1065:15): [True: 0, False: 0]
  ------------------
 1066|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1067|      0|          s->ip_ += sizeof(MatchChar16Insn);
 1068|      0|          break;
 1069|      0|        }
 1070|       |
 1071|      0|        case Opcode::U16MatchChar32: {
  ------------------
  |  Branch (1071:9): [True: 0, False: 711k]
  ------------------
 1072|      0|          const auto *insn = llvh::cast<U16MatchChar32Insn>(base);
 1073|      0|          if (c.atEnd() || c.consumeUTF16() != (CodePoint)insn->c)
  ------------------
  |  Branch (1073:15): [True: 0, False: 0]
  |  Branch (1073:28): [True: 0, False: 0]
  ------------------
 1074|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1075|      0|          s->ip_ += sizeof(U16MatchChar32Insn);
 1076|      0|          break;
 1077|      0|        }
 1078|       |
 1079|      0|        case Opcode::MatchCharICase8: {
  ------------------
  |  Branch (1079:9): [True: 0, False: 711k]
  ------------------
 1080|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1080:15): [True: 0, False: 0]
  ------------------
 1081|      0|              !matchWidth1<Width1Opcode::MatchCharICase8>(base, c.consume()))
  ------------------
  |  Branch (1081:15): [True: 0, False: 0]
  ------------------
 1082|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1083|      0|          s->ip_ += sizeof(MatchCharICase8Insn);
 1084|      0|          break;
 1085|      0|        }
 1086|       |
 1087|      0|        case Opcode::MatchCharICase16: {
  ------------------
  |  Branch (1087:9): [True: 0, False: 711k]
  ------------------
 1088|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1088:15): [True: 0, False: 0]
  ------------------
 1089|      0|              !matchWidth1<Width1Opcode::MatchCharICase16>(base, c.consume()))
  ------------------
  |  Branch (1089:15): [True: 0, False: 0]
  ------------------
 1090|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1091|      0|          s->ip_ += sizeof(MatchCharICase16Insn);
 1092|      0|          break;
 1093|      0|        }
 1094|       |
 1095|      0|        case Opcode::U16MatchCharICase32: {
  ------------------
  |  Branch (1095:9): [True: 0, False: 711k]
  ------------------
 1096|      0|          const auto *insn = llvh::cast<U16MatchCharICase32Insn>(base);
 1097|      0|          bool matched = false;
 1098|      0|          if (!c.atEnd()) {
  ------------------
  |  Branch (1098:15): [True: 0, False: 0]
  ------------------
 1099|      0|            CodePoint cp = c.consumeUTF16();
 1100|      0|            matched =
 1101|      0|                (cp == (CodePoint)insn->c ||
  ------------------
  |  Branch (1101:18): [True: 0, False: 0]
  ------------------
 1102|      0|                 traits_.canonicalize(cp, true) == (CodePoint)insn->c);
  ------------------
  |  Branch (1102:18): [True: 0, False: 0]
  ------------------
 1103|      0|          }
 1104|      0|          if (!matched)
  ------------------
  |  Branch (1104:15): [True: 0, False: 0]
  ------------------
 1105|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1106|      0|          s->ip_ += sizeof(U16MatchCharICase32Insn);
 1107|      0|          break;
 1108|      0|        }
 1109|       |
 1110|      0|        case Opcode::MatchNChar8: {
  ------------------
  |  Branch (1110:9): [True: 0, False: 711k]
  ------------------
 1111|      0|          const auto *insn = llvh::cast<MatchNChar8Insn>(base);
 1112|      0|          if (c.remaining() < insn->charCount || !matchesNChar8(insn, *s))
  ------------------
  |  Branch (1112:15): [True: 0, False: 0]
  |  Branch (1112:50): [True: 0, False: 0]
  ------------------
 1113|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1114|      0|          s->ip_ += insn->totalWidth();
 1115|      0|          break;
 1116|      0|        }
 1117|       |
 1118|      0|        case Opcode::MatchNCharICase8: {
  ------------------
  |  Branch (1118:9): [True: 0, False: 711k]
  ------------------
 1119|      0|          const auto *insn = llvh::cast<MatchNCharICase8Insn>(base);
 1120|      0|          if (c.remaining() < insn->charCount || !matchesNCharICase8(insn, *s))
  ------------------
  |  Branch (1120:15): [True: 0, False: 0]
  |  Branch (1120:50): [True: 0, False: 0]
  ------------------
 1121|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1122|      0|          s->ip_ += insn->totalWidth();
 1123|      0|          break;
 1124|      0|        }
 1125|       |
 1126|      0|        case Opcode::Alternation: {
  ------------------
  |  Branch (1126:9): [True: 0, False: 711k]
  ------------------
 1127|       |          // We have an alternation. Determine which of our first and second
 1128|       |          // branches are viable. If both are, we have to split our state.
 1129|      0|          const AlternationInsn *alt = llvh::cast<AlternationInsn>(base);
 1130|      0|          bool primaryViable =
 1131|      0|              c.satisfiesConstraints(flags_, alt->primaryConstraints);
 1132|      0|          bool secondaryViable =
 1133|      0|              c.satisfiesConstraints(flags_, alt->secondaryConstraints);
 1134|      0|          if (primaryViable && secondaryViable) {
  ------------------
  |  Branch (1134:15): [True: 0, False: 0]
  |  Branch (1134:32): [True: 0, False: 0]
  ------------------
 1135|       |            // We need to explore both branches. Explore the primary branch
 1136|       |            // first, backtrack to the secondary one.
 1137|      0|            s->ip_ += sizeof(AlternationInsn);
 1138|      0|            auto res = pushBacktrack(
 1139|      0|                backtrackStack,
 1140|      0|                BacktrackInsn::makeSetPosition(
 1141|      0|                    alt->secondaryBranch, c.currentPointer()));
 1142|      0|            if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1142:17): [True: 0, False: 0]
  ------------------
 1143|      0|              return res;
 1144|      0|            }
 1145|      0|          } else if (primaryViable) {
  ------------------
  |  Branch (1145:22): [True: 0, False: 0]
  ------------------
 1146|      0|            s->ip_ += sizeof(AlternationInsn);
 1147|      0|          } else if (secondaryViable) {
  ------------------
  |  Branch (1147:22): [True: 0, False: 0]
  ------------------
 1148|      0|            s->ip_ = alt->secondaryBranch;
 1149|      0|          } else {
 1150|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1151|      0|          }
 1152|      0|          break;
 1153|      0|        }
 1154|       |
 1155|      0|        case Opcode::Jump32:
  ------------------
  |  Branch (1155:9): [True: 0, False: 711k]
  ------------------
 1156|      0|          s->ip_ = llvh::cast<Jump32Insn>(base)->target;
 1157|      0|          break;
 1158|       |
 1159|      0|        case Opcode::Bracket: {
  ------------------
  |  Branch (1159:9): [True: 0, False: 711k]
  ------------------
 1160|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1160:15): [True: 0, False: 0]
  ------------------
 1161|      0|              !matchWidth1<Width1Opcode::Bracket>(base, c.consume()))
  ------------------
  |  Branch (1161:15): [True: 0, False: 0]
  ------------------
 1162|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1163|      0|          s->ip_ += llvh::cast<BracketInsn>(base)->totalWidth();
 1164|      0|          break;
 1165|      0|        }
 1166|       |
 1167|      0|        case Opcode::U16Bracket: {
  ------------------
  |  Branch (1167:9): [True: 0, False: 711k]
  ------------------
 1168|      0|          const U16BracketInsn *insn = llvh::cast<U16BracketInsn>(base);
 1169|       |          // U16BracketInsn is followed by a list of BracketRange32s.
 1170|      0|          const BracketRange32 *ranges =
 1171|      0|              reinterpret_cast<const BracketRange32 *>(insn + 1);
 1172|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1172:15): [True: 0, False: 0]
  ------------------
 1173|      0|              !bracketMatchesChar<Traits>(
  ------------------
  |  Branch (1173:15): [True: 0, False: 0]
  ------------------
 1174|      0|                  *this, insn, ranges, c.consumeUTF16()))
 1175|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1176|      0|          s->ip_ += insn->totalWidth();
 1177|      0|          break;
 1178|      0|        }
 1179|       |
 1180|      0|        case Opcode::WordBoundary: {
  ------------------
  |  Branch (1180:9): [True: 0, False: 711k]
  ------------------
 1181|      0|          const WordBoundaryInsn *insn = llvh::cast<WordBoundaryInsn>(base);
 1182|      0|          const auto *charPointer = c.currentPointer();
 1183|       |
 1184|      0|          bool prevIsWordchar = false;
 1185|      0|          if (!c.atLeft())
  ------------------
  |  Branch (1185:15): [True: 0, False: 0]
  ------------------
 1186|      0|            prevIsWordchar = traits_.characterHasType(
 1187|      0|                charPointer[-1], CharacterClass::Words);
 1188|       |
 1189|      0|          bool currentIsWordchar = false;
 1190|      0|          if (!c.atRight())
  ------------------
  |  Branch (1190:15): [True: 0, False: 0]
  ------------------
 1191|      0|            currentIsWordchar =
 1192|      0|                traits_.characterHasType(charPointer[0], CharacterClass::Words);
 1193|       |
 1194|      0|          bool isWordBoundary = (prevIsWordchar != currentIsWordchar);
 1195|      0|          if (isWordBoundary ^ insn->invert)
  ------------------
  |  Branch (1195:15): [True: 0, False: 0]
  ------------------
 1196|      0|            s->ip_ += sizeof(WordBoundaryInsn);
 1197|      0|          else
 1198|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1199|      0|          break;
 1200|      0|        }
 1201|       |
 1202|      0|        case Opcode::BeginMarkedSubexpression: {
  ------------------
  |  Branch (1202:9): [True: 0, False: 711k]
  ------------------
 1203|      0|          const auto *insn = llvh::cast<BeginMarkedSubexpressionInsn>(base);
 1204|      0|          auto res = pushBacktrack(
 1205|      0|              backtrackStack,
 1206|      0|              BacktrackInsn::makeSetCaptureGroup(
 1207|      0|                  insn->mexp, {kNotMatched, kNotMatched}));
 1208|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1208:15): [True: 0, False: 0]
  ------------------
 1209|      0|            return res;
 1210|      0|          }
 1211|       |          // When tracking backwards (in a lookbehind assertion) we traverse our
 1212|       |          // input backwards, so set the end before the start.
 1213|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1214|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1214:15): [True: 0, False: 0]
  ------------------
 1215|      0|            range.start = c.offsetFromLeft();
 1216|      0|          } else {
 1217|      0|            range.end = c.offsetFromLeft();
 1218|      0|          }
 1219|      0|          s->ip_ += sizeof(BeginMarkedSubexpressionInsn);
 1220|      0|          break;
 1221|      0|        }
 1222|       |
 1223|      0|        case Opcode::EndMarkedSubexpression: {
  ------------------
  |  Branch (1223:9): [True: 0, False: 711k]
  ------------------
 1224|      0|          const auto *insn = llvh::cast<EndMarkedSubexpressionInsn>(base);
 1225|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1226|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1226:15): [True: 0, False: 0]
  ------------------
 1227|      0|            assert(
 1228|      0|                range.start != kNotMatched && "Capture group was not entered");
 1229|      0|            range.end = c.offsetFromLeft();
 1230|      0|          } else {
 1231|      0|            assert(range.end != kNotMatched && "Capture group was not entered");
 1232|      0|            range.start = c.offsetFromLeft();
 1233|      0|          }
 1234|      0|          assert(range.start <= range.end && "Captured range end before start");
 1235|      0|          s->ip_ += sizeof(EndMarkedSubexpressionInsn);
 1236|      0|          break;
 1237|      0|        }
 1238|       |
 1239|       |        // ES10 21.2.2.9.1
 1240|      0|        case Opcode::BackRef: {
  ------------------
  |  Branch (1240:9): [True: 0, False: 711k]
  ------------------
 1241|      0|          const auto insn = llvh::cast<BackRefInsn>(base);
 1242|       |          // a. Let cap be x's captures List.
 1243|       |          // b. Let s be cap[n].
 1244|      0|          CapturedRange cr = s->getCapturedRange(insn->mexp);
 1245|       |
 1246|       |          // c. If s is undefined, return c(x).
 1247|       |          // Note we have to check both cr.start and cr.end here. If we are
 1248|       |          // currently in the middle of matching a capture group (going either
 1249|       |          // forwards or backwards) we should just return success.
 1250|      0|          if (cr.start == kNotMatched || cr.end == kNotMatched) {
  ------------------
  |  Branch (1250:15): [True: 0, False: 0]
  |  Branch (1250:42): [True: 0, False: 0]
  ------------------
 1251|       |            // Backreferences to a capture group that did not match always
 1252|       |            // succeed (ES10 21.2.2.9)
 1253|      0|            s->ip_ += sizeof(BackRefInsn);
 1254|      0|            break;
 1255|      0|          }
 1256|       |
 1257|       |          // TODO: this can be optimized by hoisting the branches out of the
 1258|       |          // loop.
 1259|      0|          bool icase = syntaxFlags_.ignoreCase;
 1260|      0|          bool unicode = syntaxFlags_.unicode;
 1261|      0|          auto capturedStart = first_ + cr.start;
 1262|      0|          auto capturedEnd = first_ + cr.end;
 1263|      0|          Cursor<Traits> cursor2(
 1264|      0|              capturedStart,
 1265|      0|              c.forwards() ? capturedStart : capturedEnd,
  ------------------
  |  Branch (1265:15): [True: 0, False: 0]
  ------------------
 1266|      0|              capturedEnd,
 1267|      0|              c.forwards());
 1268|      0|          Cursor<Traits> cursor1 = c;
 1269|      0|          bool matched = true;
 1270|      0|          while (matched && !cursor2.atEnd()) {
  ------------------
  |  Branch (1270:18): [True: 0, False: 0]
  |  Branch (1270:29): [True: 0, False: 0]
  ------------------
 1271|      0|            if (cursor1.atEnd()) {
  ------------------
  |  Branch (1271:17): [True: 0, False: 0]
  ------------------
 1272|      0|              matched = false;
 1273|      0|            } else if (!icase) {
  ------------------
  |  Branch (1273:24): [True: 0, False: 0]
  ------------------
 1274|       |              // Direct comparison. Here we don't need to decode surrogate
 1275|       |              // pairs.
 1276|      0|              matched = (cursor1.consume() == cursor2.consume());
 1277|      0|            } else if (!unicode) {
  ------------------
  |  Branch (1277:24): [True: 0, False: 0]
  ------------------
 1278|       |              // Case-insensitive non-Unicode comparison, no decoding of
 1279|       |              // surrogate pairs.
 1280|      0|              auto c1 = cursor1.consume();
 1281|      0|              auto c2 = cursor2.consume();
 1282|      0|              matched =
 1283|      0|                  (c1 == c2 ||
  ------------------
  |  Branch (1283:20): [True: 0, False: 0]
  ------------------
 1284|      0|                   traits_.canonicalize(c1, unicode) ==
  ------------------
  |  Branch (1284:20): [True: 0, False: 0]
  ------------------
 1285|      0|                       traits_.canonicalize(c2, unicode));
 1286|      0|            } else {
 1287|       |              // Unicode: we do need to decode surrogate pairs.
 1288|      0|              auto cp1 = cursor1.consumeUTF16();
 1289|      0|              auto cp2 = cursor2.consumeUTF16();
 1290|      0|              matched =
 1291|      0|                  (cp1 == cp2 ||
  ------------------
  |  Branch (1291:20): [True: 0, False: 0]
  ------------------
 1292|      0|                   traits_.canonicalize(cp1, unicode) ==
  ------------------
  |  Branch (1292:20): [True: 0, False: 0]
  ------------------
 1293|      0|                       traits_.canonicalize(cp2, unicode));
 1294|      0|            }
 1295|      0|          }
 1296|      0|          if (!matched) {
  ------------------
  |  Branch (1296:15): [True: 0, False: 0]
  ------------------
 1297|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1298|      0|          }
 1299|      0|          s->ip_ += sizeof(BackRefInsn);
 1300|      0|          c.setCurrentPointer(cursor1.currentPointer());
 1301|      0|          break;
 1302|      0|        }
 1303|       |
 1304|      0|        case Opcode::Lookaround: {
  ------------------
  |  Branch (1304:9): [True: 0, False: 711k]
  ------------------
 1305|      0|          const LookaroundInsn *insn = llvh::cast<LookaroundInsn>(base);
 1306|      0|          bool matched = false;
 1307|      0|          if (c.satisfiesConstraints(flags_, insn->constraints)) {
  ------------------
  |  Branch (1307:15): [True: 0, False: 0]
  ------------------
 1308|       |            // Copy the state. This is because if the match fails (or if we are
 1309|       |            // inverted) we need to restore its capture groups.
 1310|      0|            State savedState{*s};
 1311|       |
 1312|       |            // Set the direction of the cursor.
 1313|      0|            c.setForwards(insn->forwards);
 1314|       |
 1315|       |            // Invoke match() recursively with our expression.
 1316|       |            // Save and restore the position because lookaheads do not consume
 1317|       |            // anything.
 1318|      0|            s->ip_ += sizeof(LookaroundInsn);
 1319|      0|            auto match = this->match(s, true /* onlyAtStart */);
 1320|       |            // There were no errors and we matched something (so non-null
 1321|       |            // return)
 1322|      0|            matched = match && match.getValue();
  ------------------
  |  Branch (1322:23): [True: 0, False: 0]
  |  Branch (1322:32): [True: 0, False: 0]
  ------------------
 1323|      0|            c.setCurrentPointer(savedState.cursor_.currentPointer());
 1324|      0|            c.setForwards(savedState.cursor_.forwards());
 1325|       |
 1326|       |            // Restore capture groups unless we are a positive lookaround that
 1327|       |            // successfully matched. If we are a successfully matching positive
 1328|       |            // lookaround, set up backtracking to reset the capture groups. Note
 1329|       |            // we never backtrack INTO a successfully matched lookahead:
 1330|       |            // once a lookahead finds a match it forgets all other ways it could
 1331|       |            // have matched. (ES 5.1 15.10.2.8 Note 2).
 1332|      0|            if (matched && !insn->invert) {
  ------------------
  |  Branch (1332:17): [True: 0, False: 0]
  |  Branch (1332:28): [True: 0, False: 0]
  ------------------
 1333|       |              // Backtrack capture groups in the lookahead expression.
 1334|      0|              for (uint32_t i = insn->mexpBegin, e = insn->mexpEnd; i < e;
  ------------------
  |  Branch (1334:69): [True: 0, False: 0]
  ------------------
 1335|      0|                   i++) {
 1336|      0|                CapturedRange cr = savedState.getCapturedRange(i);
 1337|      0|                auto res = pushBacktrack(
 1338|      0|                    backtrackStack, BacktrackInsn::makeSetCaptureGroup(i, cr));
 1339|      0|                if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1339:21): [True: 0, False: 0]
  ------------------
 1340|      0|                  return res;
 1341|      0|              }
 1342|      0|            } else {
 1343|       |              // Restore the saved state.
 1344|      0|              *s = std::move(savedState);
 1345|      0|            }
 1346|      0|          }
 1347|       |
 1348|       |          // 'matched' tells us whether the enclosed assertion expression
 1349|       |          // matched the input. This instruction matched the input if it is a
 1350|       |          // positive assertion (invert == false) and the expression matched,
 1351|       |          // or a negative assertion (invert == true) and the expression did
 1352|       |          // not match. Hence xor with invert.
 1353|      0|          if (matched ^ insn->invert)
  ------------------
  |  Branch (1353:15): [True: 0, False: 0]
  ------------------
 1354|      0|            s->ip_ = insn->continuation;
 1355|      0|          else
 1356|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1357|      0|          break;
 1358|      0|        }
 1359|       |
 1360|      0|        case Opcode::BeginLoop: {
  ------------------
  |  Branch (1360:9): [True: 0, False: 711k]
  ------------------
 1361|       |          // Here we are entering a loop from outside, not jumping back into
 1362|       |          // it.
 1363|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1364|      0|          s->getLoop(loop->loopId).iterations = 0;
 1365|       |          // Check to see if the loop body is viable. If not, and the loop has
 1366|       |          // a nonzero minimum iteration, then we know we won't match and we
 1367|       |          // can reject the state. If it does have a minimum iteration, we can
 1368|       |          // just skip to the not-taken target. Note that this is a static
 1369|       |          // property of the loop so we don't need to check it on every
 1370|       |          // iteration, only the first one.
 1371|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1371:15): [True: 0, False: 0]
  ------------------
 1372|      0|            if (loop->min > 0) {
  ------------------
  |  Branch (1372:17): [True: 0, False: 0]
  ------------------
 1373|      0|              BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1374|      0|            } else {
 1375|      0|              s->ip_ = loop->notTakenTarget;
 1376|      0|              break;
 1377|      0|            }
 1378|      0|          }
 1379|      0|          goto runLoop;
 1380|      0|        }
 1381|       |
 1382|      0|        case Opcode::EndLoop:
  ------------------
  |  Branch (1382:9): [True: 0, False: 711k]
  ------------------
 1383|       |          // This is reached after the body of a loop finishes executing.
 1384|       |          // Move the IP to the loop and run it again immediately.
 1385|      0|          s->ip_ = llvh::cast<EndLoopInsn>(base)->target;
 1386|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1387|       |          // Note fall through.
 1388|       |
 1389|      0|        runLoop : {
 1390|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1391|      0|          auto &loopData = s->getLoop(loop->loopId);
 1392|      0|          uint32_t iteration = loopData.iterations;
 1393|       |
 1394|      0|          const uint32_t loopTakenIp = s->ip_ + sizeof(BeginLoopInsn);
 1395|       |
 1396|      0|          assert(loop->min <= loop->max && "Inconsistent loop bounds");
 1397|       |
 1398|       |          // Check to see if we have looped more than the minimum number of
 1399|       |          // iterations, and if so, whether the subexpression we looped over
 1400|       |          // matched an empty string. ES6 21.2.2.5.1 Note 4: "once the
 1401|       |          // minimum number of repetitions has been satisfied, any more
 1402|       |          // expansions of Atom that match the empty character sequence are
 1403|       |          // not considered for further repetitions."
 1404|      0|          if (iteration > loop->min &&
  ------------------
  |  Branch (1404:15): [True: 0, False: 0]
  ------------------
 1405|      0|              loopData.entryPosition == c.offsetFromLeft())
  ------------------
  |  Branch (1405:15): [True: 0, False: 0]
  ------------------
 1406|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1407|       |
 1408|      0|          if (iteration < loop->min) {
  ------------------
  |  Branch (1408:15): [True: 0, False: 0]
  ------------------
 1409|      0|            auto res = prepareToEnterLoopBody(s, loop, backtrackStack);
 1410|      0|            if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1410:17): [True: 0, False: 0]
  ------------------
 1411|      0|              return res;
 1412|      0|            s->ip_ = loopTakenIp;
 1413|      0|          } else if (iteration == loop->max) {
  ------------------
  |  Branch (1413:22): [True: 0, False: 0]
  ------------------
 1414|      0|            s->ip_ = loop->notTakenTarget;
 1415|      0|          } else {
 1416|       |            // We are within the target iteration range, figure out whether we
 1417|       |            // should continue or exit.
 1418|      0|            assert(iteration >= loop->min && iteration < loop->max);
 1419|      0|            if (!loop->greedy) {
  ------------------
  |  Branch (1419:17): [True: 0, False: 0]
  ------------------
 1420|       |              // Backtrack by entering this non-greedy loop.
 1421|      0|              loopData.entryPosition = c.offsetFromLeft();
 1422|      0|              auto res = pushBacktrack(
 1423|      0|                  backtrackStack,
 1424|      0|                  BacktrackInsn::makeEnterNonGreedyLoop(
 1425|      0|                      loop, loopTakenIp, loopData));
 1426|      0|              if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1426:19): [True: 0, False: 0]
  ------------------
 1427|      0|                return res;
 1428|      0|              }
 1429|      0|              s->ip_ = loop->notTakenTarget;
 1430|      0|            } else {
 1431|       |              // Backtrack by exiting this greedy loop.
 1432|      0|              auto pushRes = pushBacktrack(
 1433|      0|                  backtrackStack,
 1434|      0|                  BacktrackInsn::makeSetPosition(
 1435|      0|                      loop->notTakenTarget, c.currentPointer()));
 1436|      0|              if (pushRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1436:19): [True: 0, False: 0]
  ------------------
 1437|      0|                return pushRes;
 1438|       |
 1439|      0|              auto prepRes = prepareToEnterLoopBody(s, loop, backtrackStack);
 1440|      0|              if (prepRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1440:19): [True: 0, False: 0]
  ------------------
 1441|      0|                return prepRes;
 1442|      0|              s->ip_ = loopTakenIp;
 1443|      0|            }
 1444|      0|          }
 1445|      0|          break;
 1446|      0|        }
 1447|       |
 1448|      0|        case Opcode::BeginSimpleLoop: {
  ------------------
  |  Branch (1448:9): [True: 0, False: 711k]
  ------------------
 1449|       |          // Here we are entering a simple loop from outside,
 1450|       |          // not jumping back into it.
 1451|      0|          const BeginSimpleLoopInsn *loop =
 1452|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1453|       |
 1454|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1454:15): [True: 0, False: 0]
  ------------------
 1455|      0|            s->ip_ = loop->notTakenTarget;
 1456|      0|            break;
 1457|      0|          }
 1458|       |
 1459|      0|          goto runSimpleLoop;
 1460|      0|        }
 1461|       |
 1462|      0|        case Opcode::EndSimpleLoop:
  ------------------
  |  Branch (1462:9): [True: 0, False: 711k]
  ------------------
 1463|      0|          s->ip_ = llvh::cast<EndSimpleLoopInsn>(base)->target;
 1464|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1465|       |          // Note: fall-through.
 1466|       |
 1467|      0|        runSimpleLoop : {
 1468|      0|          const BeginSimpleLoopInsn *loop =
 1469|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1470|       |          // Since this is a simple loop, we'll always need to explore both
 1471|       |          // exiting the loop at this point and continuing to loop.
 1472|       |          // Note simple loops are always greedy.
 1473|      0|          auto res = pushBacktrack(
 1474|      0|              backtrackStack,
 1475|      0|              BacktrackInsn::makeSetPosition(
 1476|      0|                  loop->notTakenTarget, c.currentPointer()));
 1477|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1477:15): [True: 0, False: 0]
  ------------------
 1478|      0|            return res;
 1479|      0|          }
 1480|      0|          s->ip_ += sizeof(BeginSimpleLoopInsn);
 1481|      0|          break;
 1482|      0|        }
 1483|       |
 1484|      0|        case Opcode::Width1Loop: {
  ------------------
  |  Branch (1484:9): [True: 0, False: 711k]
  ------------------
 1485|      0|          const Width1LoopInsn *loop = llvh::cast<Width1LoopInsn>(base);
 1486|      0|          auto matchRes = matchWidth1Loop(loop, s, backtrackStack);
 1487|      0|          if (LLVM_UNLIKELY(!matchRes))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1488|      0|            return matchRes.getStatus();
 1489|      0|          if (!*matchRes)
  ------------------
  |  Branch (1489:15): [True: 0, False: 0]
  ------------------
 1490|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1491|      0|          break;
 1492|      0|        }
 1493|   711k|      }
 1494|   711k|    }
 1495|       |  // The search failed at this location.
 1496|      3|  backtrackingExhausted:
 1497|      3|    continue;
 1498|   355k|  }
 1499|      3|#undef BACKTRACK
 1500|       |  // The match failed.
 1501|      3|  return nullptr;
 1502|   355k|}
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE15offsetFromRightEv:
  157|   355k|  uint32_t offsetFromRight() const {
  158|   355k|    return last_ - current_;
  159|   355k|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE8forwardsEv:
  126|   355k|  bool forwards() const {
  127|   355k|    return forwards_;
  128|   355k|  }
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEE17setCurrentPointerEPKDs:
  186|   355k|  void setCurrentPointer(const CodeUnit *current) {
  187|   355k|    assert(first_ <= current && current <= last_ && "Current not in range");
  188|      0|    current_ = current;
  189|   355k|  }
_ZN6hermes5regex14ExecutorResultIPKDsEC2ERKS3_:
   41|   355k|      : status_(ExecutionStatus::RETURNED), value_(v) {}
_ZN6hermes5regex16isLineTerminatorIDsEEbT_:
  565|   355k|bool isLineTerminator(CharT c) {
  566|   355k|  return c == u'\u000A' || c == u'\u000D' || c == u'\u2028' || c == u'\u2029';
  ------------------
  |  Branch (566:10): [True: 0, False: 355k]
  |  Branch (566:28): [True: 0, False: 355k]
  |  Branch (566:46): [True: 0, False: 355k]
  |  Branch (566:64): [True: 0, False: 355k]
  ------------------
  567|   355k|}
_ZN6hermes5regex7ContextINS0_16UTF16RegexTraitsEE9backtrackERN4llvh11SmallVectorINS3_13BacktrackInsnELj64EEEPNS0_5StateIS2_EE:
  717|      3|    State<Traits> *s) {
  718|      3|  while (!bts.empty()) {
  ------------------
  |  Branch (718:10): [True: 0, False: 3]
  ------------------
  719|      0|    BacktrackInsn &binsn = bts.back();
  720|      0|    switch (binsn.op) {
  ------------------
  |  Branch (720:13): [True: 0, False: 0]
  ------------------
  721|      0|      case BacktrackOp::SetCaptureGroup:
  ------------------
  |  Branch (721:7): [True: 0, False: 0]
  ------------------
  722|      0|        s->getCapturedRange(binsn.setCaptureGroup.mexp) =
  723|      0|            binsn.setCaptureGroup.range;
  724|      0|        bts.pop_back();
  725|      0|        break;
  726|       |
  727|      0|      case BacktrackOp::SetLoopData:
  ------------------
  |  Branch (727:7): [True: 0, False: 0]
  ------------------
  728|      0|        s->getLoop(binsn.setLoopData.loopId) = binsn.setLoopData.loopData;
  729|      0|        bts.pop_back();
  730|      0|        break;
  731|       |
  732|      0|      case BacktrackOp::SetPosition:
  ------------------
  |  Branch (732:7): [True: 0, False: 0]
  ------------------
  733|      0|        s->cursor_.setCurrentPointer(binsn.setPosition.value);
  734|      0|        s->ip_ = binsn.setPosition.ip;
  735|      0|        bts.pop_back();
  736|      0|        return true;
  737|       |
  738|      0|      case BacktrackOp::EnterNonGreedyLoop: {
  ------------------
  |  Branch (738:7): [True: 0, False: 0]
  ------------------
  739|      0|        auto fields = binsn.enterNonGreedyLoop;
  740|      0|        bts.pop_back();
  741|      0|        auto res = performEnterNonGreedyLoop(
  742|      0|            s, fields.loopInsn, fields.bodyIp, fields.loopData, bts);
  743|      0|        if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (743:13): [True: 0, False: 0]
  ------------------
  744|      0|          return res;
  745|      0|        }
  746|      0|        return true;
  747|      0|      }
  748|       |
  749|      0|      case BacktrackOp::GreedyWidth1Loop:
  ------------------
  |  Branch (749:7): [True: 0, False: 0]
  ------------------
  750|      0|      case BacktrackOp::NongreedyWidth1Loop: {
  ------------------
  |  Branch (750:7): [True: 0, False: 0]
  ------------------
  751|       |        // In both of these instructions, we have a range [min, max] containing
  752|       |        // possible match locations, and the match failed at the max location
  753|       |        // (if we are greedy) or the min location (nongreedy). Backtrack by
  754|       |        // decrementing the max (incrementing the min) if we are greedy
  755|       |        // (nongreedy), setting the IP to that location, and jumping to the loop
  756|       |        // exit. Note that if we are tracking backwards (lookbehind assertion)
  757|       |        // our maximum is before our minimum, so we have to reverse the
  758|       |        // direction of increment/decrement.
  759|      0|        bool forwards = s->cursor_.forwards();
  760|      0|        assert(
  761|      0|            (forwards ? binsn.width1Loop.min <= binsn.width1Loop.max
  762|      0|                      : binsn.width1Loop.min >= binsn.width1Loop.max) &&
  763|      0|            "Loop min should be <= max (or >= max if backwards)");
  764|      0|        if (binsn.width1Loop.min == binsn.width1Loop.max) {
  ------------------
  |  Branch (764:13): [True: 0, False: 0]
  ------------------
  765|       |          // We have backtracked as far as possible. Give up.
  766|      0|          bts.pop_back();
  767|      0|          break;
  768|      0|        }
  769|      0|        if (binsn.op == BacktrackOp::GreedyWidth1Loop) {
  ------------------
  |  Branch (769:13): [True: 0, False: 0]
  ------------------
  770|      0|          binsn.width1Loop.max += forwards ? -1 : 1;
  ------------------
  |  Branch (770:35): [True: 0, False: 0]
  ------------------
  771|      0|          s->cursor_.setCurrentPointer(binsn.width1Loop.max);
  772|      0|        } else {
  773|      0|          binsn.width1Loop.min += forwards ? 1 : -1;
  ------------------
  |  Branch (773:35): [True: 0, False: 0]
  ------------------
  774|      0|          s->cursor_.setCurrentPointer(binsn.width1Loop.min);
  775|      0|        }
  776|      0|        s->ip_ = binsn.width1Loop.continuation;
  777|      0|        return true;
  778|      0|      }
  779|      0|    }
  780|      0|  }
  781|       |  // Exhausted the backtracking stack.
  782|      3|  return false;
  783|      3|}
_ZN6hermes5regex14ExecutorResultIbEC2ERKb:
   41|      4|      : status_(ExecutionStatus::RETURNED), value_(v) {}
_ZNK6hermes5regex14ExecutorResultIbEcvbEv:
   55|      4|  explicit operator bool() const {
   56|      4|    return hasValue();
   57|      4|  }
_ZNK6hermes5regex14ExecutorResultIbE8hasValueEv:
   51|      4|  bool hasValue() const {
   52|      4|    return status_ == ExecutionStatus::RETURNED;
   53|      4|  }
_ZNK6hermes5regex14ExecutorResultIbE9getStatusEv:
   64|      4|  ExecutionStatus getStatus() const {
   65|      4|    return status_;
   66|      4|  }
_ZNK6hermes5regex14ExecutorResultIbEdeEv:
   47|      4|  const T &operator*() const {
   48|      4|    return getValue();
   49|      4|  }
_ZNK6hermes5regex14ExecutorResultIbE8getValueEv:
   59|      4|  const T &getValue() const {
   60|      4|    assert(getStatus() == ExecutionStatus::RETURNED);
   61|      0|    return *reinterpret_cast<const T *>(&value_);
   62|      4|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE5atEndEv:
  142|   711k|  bool atEnd() const {
  143|   711k|    return current_ == end_;
  144|   711k|  }
_ZN6hermes5regex6CursorINS0_16UTF16RegexTraitsEE7consumeEv:
  192|   355k|  CodeUnit consume() {
  193|   355k|    CodeUnit result = current();
  194|   355k|    current_ += forwards_ ? 1 : -1;
  ------------------
  |  Branch (194:17): [True: 355k, False: 0]
  ------------------
  195|   355k|    return result;
  196|   355k|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE7currentEv:
  174|   355k|  CodeUnit current() const {
  175|       |    // Access the character at index 0 if forwards, -1 if backwards.
  176|   355k|    assert(!atEnd() && "Cursor is at end");
  177|      0|    return current_[(int)forwards_ - 1];
  178|   355k|  }
_ZNK6hermes5regex7ContextINS0_16UTF16RegexTraitsEE11matchWidth1ILNS0_12Width1OpcodeE5EEEbPKNS0_4InsnEDs:
  787|   355k|bool Context<Traits>::matchWidth1(const Insn *base, CodeUnit c) const {
  788|       |  // Note this switch should resolve at compile time.
  789|   355k|  assert(
  790|   355k|      base->opcode == static_cast<Opcode>(w1opcode) &&
  791|   355k|      "Instruction has wrong opcode");
  792|      0|  switch (w1opcode) {
  ------------------
  |  Branch (792:11): [Folded - Ignored]
  ------------------
  793|      0|    case Width1Opcode::MatchChar8: {
  ------------------
  |  Branch (793:5): [True: 0, False: 355k]
  ------------------
  794|      0|      const auto *insn = llvh::cast<MatchChar8Insn>(base);
  795|      0|      return c == insn->c;
  796|      0|    }
  797|       |
  798|      0|    case Width1Opcode::MatchChar16: {
  ------------------
  |  Branch (798:5): [True: 0, False: 355k]
  ------------------
  799|      0|      const auto *insn = llvh::cast<MatchChar16Insn>(base);
  800|      0|      return c == insn->c;
  801|      0|    }
  802|       |
  803|      0|    case Width1Opcode::MatchCharICase8: {
  ------------------
  |  Branch (803:5): [True: 0, False: 355k]
  ------------------
  804|      0|      const auto *insn = llvh::cast<MatchCharICase8Insn>(base);
  805|      0|      return c == (CodePoint)insn->c ||
  ------------------
  |  Branch (805:14): [True: 0, False: 0]
  ------------------
  806|      0|          (CodePoint)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (806:11): [True: 0, False: 0]
  ------------------
  807|      0|          (CodePoint)insn->c;
  808|      0|    }
  809|       |
  810|      0|    case Width1Opcode::MatchCharICase16: {
  ------------------
  |  Branch (810:5): [True: 0, False: 355k]
  ------------------
  811|      0|      const auto *insn = llvh::cast<MatchCharICase16Insn>(base);
  812|      0|      return c == insn->c ||
  ------------------
  |  Branch (812:14): [True: 0, False: 0]
  ------------------
  813|      0|          (char32_t)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (813:11): [True: 0, False: 0]
  ------------------
  814|      0|          (char32_t)insn->c;
  815|      0|    }
  816|       |
  817|      0|    case Width1Opcode::MatchAny:
  ------------------
  |  Branch (817:5): [True: 0, False: 355k]
  ------------------
  818|      0|      return true;
  819|       |
  820|   355k|    case Width1Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (820:5): [True: 355k, False: 0]
  ------------------
  821|   355k|      return !isLineTerminator(c);
  822|       |
  823|      0|    case Width1Opcode::Bracket: {
  ------------------
  |  Branch (823:5): [True: 0, False: 355k]
  ------------------
  824|       |      // BracketInsn is followed by a list of BracketRange32s.
  825|      0|      assert(
  826|      0|          !(syntaxFlags_.unicode) &&
  827|      0|          "Unicode should not be set for Width 1 brackets");
  828|      0|      const BracketInsn *insn = llvh::cast<BracketInsn>(base);
  829|      0|      const BracketRange32 *ranges =
  830|      0|          reinterpret_cast<const BracketRange32 *>(insn + 1);
  831|      0|      return bracketMatchesChar<Traits>(*this, insn, ranges, c);
  832|      0|    }
  833|   355k|  }
  834|      0|  llvm_unreachable("Invalid width 1 opcode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  835|   355k|}
_ZNK6hermes5regex7ContextINS0_16UTF16RegexTraitsEE18advanceStringIndexEPKDsmm:
  937|      3|    size_t length) const {
  938|      3|  if (sizeof(CodeUnit) == 1) {
  ------------------
  |  Branch (938:7): [Folded - Ignored]
  ------------------
  939|       |    // The input string is ASCII and therefore cannot have surrogate pairs.
  940|      0|    return index + 1;
  941|      0|  }
  942|       |  // "If unicode is false, return index+1."
  943|       |  // "If index+1 >= length, return index+1."
  944|      3|  if (LLVM_LIKELY(!(syntaxFlags_.unicode)) || (index + 1 >= length))
  ------------------
  |  |  188|      6|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (944:47): [True: 0, False: 0]
  ------------------
  945|      3|    return index + 1;
  946|       |
  947|       |  // Let first be the code unit value at index index in S
  948|       |  // If first < 0xD800 or first > 0xDBFF, return index+1
  949|       |  // Let second be the code unit value at index index+1 in S.
  950|       |  // If second < 0xDC00 or second > 0xDFFF, return index+1.
  951|      0|  CodeUnit first = start[index];
  952|      0|  CodeUnit second = start[index + 1];
  953|      0|  if (LLVM_LIKELY(!isHighSurrogate(first)) ||
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  954|      0|      LLVM_LIKELY(!isLowSurrogate(second))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  955|      0|    return index + 1;
  956|      0|  }
  957|       |  // Return index+2.
  958|      0|  return index + 2;
  959|      0|}
_ZNK6hermes5regex14ExecutorResultIPKDsEcvbEv:
   55|   355k|  explicit operator bool() const {
   56|   355k|    return hasValue();
   57|   355k|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE8hasValueEv:
   51|   355k|  bool hasValue() const {
   52|   355k|    return status_ == ExecutionStatus::RETURNED;
   53|   355k|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE9getStatusEv:
   64|   355k|  ExecutionStatus getStatus() const {
   65|   355k|    return status_;
   66|   355k|  }
_ZNK6hermes5regex14ExecutorResultIPKDsE8getValueEv:
   59|   355k|  const T &getValue() const {
   60|   355k|    assert(getStatus() == ExecutionStatus::RETURNED);
   61|      0|    return *reinterpret_cast<const T *>(&value_);
   62|   355k|  }
_ZNK6hermes5regex6CursorINS0_16UTF16RegexTraitsEE14currentPointerEv:
  181|   711k|  const CodeUnit *currentPointer() const {
  182|   711k|    return current_;
  183|   711k|  }
_ZN6hermes5regex22searchWithBytecodeImplIcNS0_16ASCIIRegexTraitsEEENS0_18MatchRuntimeResultEN4llvh8ArrayRefIhEEPKT_jjPNSt3__16vectorINS0_13CapturedRangeENSA_9allocatorISC_EEEENS0_9constants13MatchFlagTypeE:
 1517|  48.9k|    constants::MatchFlagType matchFlags) {
 1518|  48.9k|  assert(
 1519|  48.9k|      bytecode.size() >= sizeof(RegexBytecodeHeader) && "Bytecode too small");
 1520|      0|  auto header = reinterpret_cast<const RegexBytecodeHeader *>(bytecode.data());
 1521|       |
 1522|       |  // Check for match impossibility before doing anything else.
 1523|  48.9k|  Cursor<Traits> cursor{
 1524|  48.9k|      first, first + start, first + length, true /* forwards */};
 1525|  48.9k|  if (!cursor.satisfiesConstraints(matchFlags, header->constraints))
  ------------------
  |  Branch (1525:7): [True: 0, False: 48.9k]
  ------------------
 1526|      0|    return MatchRuntimeResult::NoMatch;
 1527|       |
 1528|  48.9k|  auto markedCount = header->markedCount;
 1529|  48.9k|  auto loopCount = header->loopCount;
 1530|       |
 1531|  48.9k|  Context<Traits> ctx(
 1532|  48.9k|      bytecode,
 1533|  48.9k|      matchFlags,
 1534|  48.9k|      SyntaxFlags::fromByte(header->syntaxFlags),
 1535|  48.9k|      first,
 1536|  48.9k|      first + length,
 1537|  48.9k|      header->markedCount,
 1538|  48.9k|      header->loopCount);
 1539|  48.9k|  State<Traits> state{cursor, markedCount, loopCount};
 1540|       |
 1541|       |  // We check only one location if either the regex pattern constrains us to, or
 1542|       |  // the flags request it (via the sticky flag 'y').
 1543|  48.9k|  bool onlyAtStart = (header->constraints & MatchConstraintAnchoredAtStart) ||
  ------------------
  |  Branch (1543:22): [True: 0, False: 48.9k]
  ------------------
 1544|  48.9k|      (matchFlags & constants::matchOnlyAtStart);
  ------------------
  |  Branch (1544:7): [True: 0, False: 48.9k]
  ------------------
 1545|       |
 1546|  48.9k|  auto res = ctx.match(&state, onlyAtStart);
 1547|  48.9k|  if (!res) {
  ------------------
  |  Branch (1547:7): [True: 0, False: 48.9k]
  ------------------
 1548|      0|    assert(res.getStatus() == ExecutionStatus::STACK_OVERFLOW);
 1549|      0|    return MatchRuntimeResult::StackOverflow;
 1550|      0|  }
 1551|  48.9k|  if (const CharT *matchStartLoc = res.getValue()) {
  ------------------
  |  Branch (1551:20): [True: 48.9k, False: 1]
  ------------------
 1552|       |    // Match succeeded. Return captured ranges. The first range is the total
 1553|       |    // match, followed by any capture groups.
 1554|  48.9k|    if (m != nullptr) {
  ------------------
  |  Branch (1554:9): [True: 48.9k, False: 0]
  ------------------
 1555|  48.9k|      uint32_t totalStart = static_cast<uint32_t>(matchStartLoc - first);
 1556|  48.9k|      uint32_t totalEnd =
 1557|  48.9k|          static_cast<uint32_t>(state.cursor_.currentPointer() - first);
 1558|  48.9k|      m->clear();
 1559|  48.9k|      m->push_back(CapturedRange{totalStart, totalEnd});
 1560|  48.9k|      std::copy_n(
 1561|  48.9k|          state.capturedRanges_.begin(), markedCount, std::back_inserter(*m));
 1562|  48.9k|    }
 1563|  48.9k|    return MatchRuntimeResult::Match;
 1564|  48.9k|  }
 1565|      1|  return MatchRuntimeResult::NoMatch;
 1566|  48.9k|}
_ZN6hermes5regex6CursorINS0_16ASCIIRegexTraitsEEC2EPKcS5_S5_b:
  118|  48.9k|        forwards_(forwards) {
  119|  48.9k|    assert(first_ <= last_ && "first and last out of order");
  120|      0|    assert(
  121|  48.9k|        first_ <= current_ && current <= last_ &&
  122|  48.9k|        "current pointer not in range");
  123|  48.9k|  }
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE20satisfiesConstraintsENS0_9constants13MatchFlagTypeEh:
  220|  48.9k|      MatchConstraintSet constraints) const {
  221|  48.9k|    if ((constraints & MatchConstraintNonASCII) &&
  ------------------
  |  Branch (221:9): [True: 0, False: 48.9k]
  ------------------
  222|  48.9k|        (flags & constants::matchInputAllAscii))
  ------------------
  |  Branch (222:9): [True: 0, False: 0]
  ------------------
  223|      0|      return false;
  224|  48.9k|    if ((constraints & MatchConstraintAnchoredAtStart) && current_ != first_)
  ------------------
  |  Branch (224:9): [True: 0, False: 48.9k]
  |  Branch (224:59): [True: 0, False: 0]
  ------------------
  225|      0|      return false;
  226|  48.9k|    return true;
  227|  48.9k|  }
_ZN6hermes5regex7ContextINS0_16ASCIIRegexTraitsEEC2EN4llvh8ArrayRefIhEENS0_9constants13MatchFlagTypeENS0_11SyntaxFlagsEPKcSB_jj:
  417|  48.9k|        loopCount_(loopCount) {}
_ZN6hermes5regex5StateINS0_16ASCIIRegexTraitsEEC2ENS0_6CursorIS2_EEjj:
  555|  48.9k|        loopDatas_(loopCount, {0, 0}) {}
_ZN6hermes5regex7ContextINS0_16ASCIIRegexTraitsEE5matchEPNS0_5StateIS2_EEb:
  963|  48.9k|    -> ExecutorResult<const CodeUnit *> {
  964|  48.9k|  using State = State<Traits>;
  965|  48.9k|  BacktrackStack backtrackStack;
  966|       |
  967|       |  // We'll refer to the cursor often.
  968|  48.9k|  Cursor<Traits> &c = s->cursor_;
  969|       |
  970|       |  // Pull out the instruction portion of the bytecode, following the header.
  971|  48.9k|  const uint8_t *const bytecode = &bytecodeStream_[sizeof(RegexBytecodeHeader)];
  972|       |
  973|       |  // Save the incoming IP in case we have to loop.
  974|  48.9k|  const auto startIp = s->ip_;
  975|       |
  976|  48.9k|  const CodeUnit *const startLoc = c.currentPointer();
  977|       |
  978|       |  // Use offsetFromRight() instead of remaining() here so that the length passed
  979|       |  // to advanceStringIndex is accurate even when the cursor is going backwards.
  980|  48.9k|  const size_t charsToRight = c.offsetFromRight();
  981|       |
  982|       |  // Decide how many locations we'll need to check.
  983|       |  // Note that we do want to check the empty range at the end, so add one to
  984|       |  // charsToRight.
  985|  48.9k|  const size_t locsToCheckCount = onlyAtStart ? 1 : 1 + charsToRight;
  ------------------
  |  Branch (985:35): [True: 0, False: 48.9k]
  ------------------
  986|       |
  987|       |  // If we are tracking backwards, we should only ever have one potential match
  988|       |  // location. This is because advanceStringIndex only ever tracks forwards.
  989|  48.9k|  assert(
  990|  48.9k|      (c.forwards() || locsToCheckCount == 1) &&
  991|  48.9k|      "Can only check one location when cursor is backwards");
  992|       |
  993|       |  // Macro used when a state fails to match.
  994|      0|#define BACKTRACK()                            \
  995|      0|  do {                                         \
  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  998|      0|      return btRes.getStatus();                \
  999|      0|    if (*btRes)                                \
 1000|      0|      goto backtrackingSucceeded;              \
 1001|      0|    goto backtrackingExhausted;                \
 1002|      0|  } while (0)
 1003|       |
 1004|  48.9k|  for (size_t locIndex = 0; locIndex < locsToCheckCount;
  ------------------
  |  Branch (1004:29): [True: 48.9k, False: 1]
  ------------------
 1005|  48.9k|       locIndex = advanceStringIndex(startLoc, locIndex, charsToRight)) {
 1006|  48.9k|    const CodeUnit *potentialMatchLocation = startLoc + locIndex;
 1007|  48.9k|    c.setCurrentPointer(potentialMatchLocation);
 1008|  48.9k|    s->ip_ = startIp;
 1009|  48.9k|  backtrackingSucceeded:
 1010|  97.8k|    for (;;) {
 1011|  97.8k|      const Insn *base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1012|  97.8k|      switch (base->opcode) {
  ------------------
  |  Branch (1012:15): [True: 0, False: 97.8k]
  ------------------
 1013|  48.9k|        case Opcode::Goal:
  ------------------
  |  Branch (1013:9): [True: 48.9k, False: 48.9k]
  ------------------
 1014|  48.9k|          return potentialMatchLocation;
 1015|       |
 1016|      0|        case Opcode::LeftAnchor:
  ------------------
  |  Branch (1016:9): [True: 0, False: 97.8k]
  ------------------
 1017|      0|          if (!matchesLeftAnchor(*this, *s))
  ------------------
  |  Branch (1017:15): [True: 0, False: 0]
  ------------------
 1018|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1019|      0|          s->ip_ += sizeof(LeftAnchorInsn);
 1020|      0|          break;
 1021|       |
 1022|      0|        case Opcode::RightAnchor:
  ------------------
  |  Branch (1022:9): [True: 0, False: 97.8k]
  ------------------
 1023|      0|          if (!matchesRightAnchor(*this, *s))
  ------------------
  |  Branch (1023:15): [True: 0, False: 0]
  ------------------
 1024|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1025|      0|          s->ip_ += sizeof(RightAnchorInsn);
 1026|      0|          break;
 1027|       |
 1028|      0|        case Opcode::MatchAny:
  ------------------
  |  Branch (1028:9): [True: 0, False: 97.8k]
  ------------------
 1029|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1029:15): [True: 0, False: 0]
  ------------------
 1030|      0|              !matchWidth1<Width1Opcode::MatchAny>(base, c.consume()))
  ------------------
  |  Branch (1030:15): [True: 0, False: 0]
  ------------------
 1031|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1032|      0|          s->ip_ += sizeof(MatchAnyInsn);
 1033|      0|          break;
 1034|       |
 1035|      0|        case Opcode::U16MatchAny:
  ------------------
  |  Branch (1035:9): [True: 0, False: 97.8k]
  ------------------
 1036|      0|          if (c.atEnd())
  ------------------
  |  Branch (1036:15): [True: 0, False: 0]
  ------------------
 1037|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1038|      0|          c.consumeUTF16();
 1039|      0|          s->ip_ += sizeof(U16MatchAnyInsn);
 1040|      0|          break;
 1041|       |
 1042|  48.9k|        case Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (1042:9): [True: 48.9k, False: 48.9k]
  ------------------
 1043|  48.9k|          if (c.atEnd() ||
  ------------------
  |  Branch (1043:15): [True: 1, False: 48.9k]
  ------------------
 1044|  48.9k|              !matchWidth1<Width1Opcode::MatchAnyButNewline>(base, c.consume()))
  ------------------
  |  Branch (1044:15): [True: 0, False: 48.9k]
  ------------------
 1045|      1|            BACKTRACK();
  ------------------
  |  |  995|      1|  do {                                         \
  |  |  996|      1|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      1|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      1|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 1]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      1|      return btRes.getStatus();                \
  |  |  999|      1|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 1]
  |  |  ------------------
  |  | 1000|      1|      goto backtrackingSucceeded;              \
  |  | 1001|      1|    goto backtrackingExhausted;                \
  |  | 1002|      1|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1046|  48.9k|          s->ip_ += sizeof(MatchAnyButNewlineInsn);
 1047|  48.9k|          break;
 1048|       |
 1049|      0|        case Opcode::U16MatchAnyButNewline:
  ------------------
  |  Branch (1049:9): [True: 0, False: 97.8k]
  ------------------
 1050|      0|          if (c.atEnd() || isLineTerminator(c.consumeUTF16()))
  ------------------
  |  Branch (1050:15): [True: 0, False: 0]
  |  Branch (1050:28): [True: 0, False: 0]
  ------------------
 1051|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1052|      0|          s->ip_ += sizeof(U16MatchAnyButNewlineInsn);
 1053|      0|          break;
 1054|       |
 1055|      0|        case Opcode::MatchChar8: {
  ------------------
  |  Branch (1055:9): [True: 0, False: 97.8k]
  ------------------
 1056|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1056:15): [True: 0, False: 0]
  ------------------
 1057|      0|              !matchWidth1<Width1Opcode::MatchChar8>(base, c.consume()))
  ------------------
  |  Branch (1057:15): [True: 0, False: 0]
  ------------------
 1058|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1059|      0|          s->ip_ += sizeof(MatchChar8Insn);
 1060|      0|          break;
 1061|      0|        }
 1062|       |
 1063|      0|        case Opcode::MatchChar16: {
  ------------------
  |  Branch (1063:9): [True: 0, False: 97.8k]
  ------------------
 1064|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1064:15): [True: 0, False: 0]
  ------------------
 1065|      0|              !matchWidth1<Width1Opcode::MatchChar16>(base, c.consume()))
  ------------------
  |  Branch (1065:15): [True: 0, False: 0]
  ------------------
 1066|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1067|      0|          s->ip_ += sizeof(MatchChar16Insn);
 1068|      0|          break;
 1069|      0|        }
 1070|       |
 1071|      0|        case Opcode::U16MatchChar32: {
  ------------------
  |  Branch (1071:9): [True: 0, False: 97.8k]
  ------------------
 1072|      0|          const auto *insn = llvh::cast<U16MatchChar32Insn>(base);
 1073|      0|          if (c.atEnd() || c.consumeUTF16() != (CodePoint)insn->c)
  ------------------
  |  Branch (1073:15): [True: 0, False: 0]
  |  Branch (1073:28): [True: 0, False: 0]
  ------------------
 1074|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1075|      0|          s->ip_ += sizeof(U16MatchChar32Insn);
 1076|      0|          break;
 1077|      0|        }
 1078|       |
 1079|      0|        case Opcode::MatchCharICase8: {
  ------------------
  |  Branch (1079:9): [True: 0, False: 97.8k]
  ------------------
 1080|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1080:15): [True: 0, False: 0]
  ------------------
 1081|      0|              !matchWidth1<Width1Opcode::MatchCharICase8>(base, c.consume()))
  ------------------
  |  Branch (1081:15): [True: 0, False: 0]
  ------------------
 1082|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1083|      0|          s->ip_ += sizeof(MatchCharICase8Insn);
 1084|      0|          break;
 1085|      0|        }
 1086|       |
 1087|      0|        case Opcode::MatchCharICase16: {
  ------------------
  |  Branch (1087:9): [True: 0, False: 97.8k]
  ------------------
 1088|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1088:15): [True: 0, False: 0]
  ------------------
 1089|      0|              !matchWidth1<Width1Opcode::MatchCharICase16>(base, c.consume()))
  ------------------
  |  Branch (1089:15): [True: 0, False: 0]
  ------------------
 1090|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1091|      0|          s->ip_ += sizeof(MatchCharICase16Insn);
 1092|      0|          break;
 1093|      0|        }
 1094|       |
 1095|      0|        case Opcode::U16MatchCharICase32: {
  ------------------
  |  Branch (1095:9): [True: 0, False: 97.8k]
  ------------------
 1096|      0|          const auto *insn = llvh::cast<U16MatchCharICase32Insn>(base);
 1097|      0|          bool matched = false;
 1098|      0|          if (!c.atEnd()) {
  ------------------
  |  Branch (1098:15): [True: 0, False: 0]
  ------------------
 1099|      0|            CodePoint cp = c.consumeUTF16();
 1100|      0|            matched =
 1101|      0|                (cp == (CodePoint)insn->c ||
  ------------------
  |  Branch (1101:18): [True: 0, False: 0]
  ------------------
 1102|      0|                 traits_.canonicalize(cp, true) == (CodePoint)insn->c);
  ------------------
  |  Branch (1102:18): [True: 0, False: 0]
  ------------------
 1103|      0|          }
 1104|      0|          if (!matched)
  ------------------
  |  Branch (1104:15): [True: 0, False: 0]
  ------------------
 1105|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1106|      0|          s->ip_ += sizeof(U16MatchCharICase32Insn);
 1107|      0|          break;
 1108|      0|        }
 1109|       |
 1110|      0|        case Opcode::MatchNChar8: {
  ------------------
  |  Branch (1110:9): [True: 0, False: 97.8k]
  ------------------
 1111|      0|          const auto *insn = llvh::cast<MatchNChar8Insn>(base);
 1112|      0|          if (c.remaining() < insn->charCount || !matchesNChar8(insn, *s))
  ------------------
  |  Branch (1112:15): [True: 0, False: 0]
  |  Branch (1112:50): [True: 0, False: 0]
  ------------------
 1113|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1114|      0|          s->ip_ += insn->totalWidth();
 1115|      0|          break;
 1116|      0|        }
 1117|       |
 1118|      0|        case Opcode::MatchNCharICase8: {
  ------------------
  |  Branch (1118:9): [True: 0, False: 97.8k]
  ------------------
 1119|      0|          const auto *insn = llvh::cast<MatchNCharICase8Insn>(base);
 1120|      0|          if (c.remaining() < insn->charCount || !matchesNCharICase8(insn, *s))
  ------------------
  |  Branch (1120:15): [True: 0, False: 0]
  |  Branch (1120:50): [True: 0, False: 0]
  ------------------
 1121|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1122|      0|          s->ip_ += insn->totalWidth();
 1123|      0|          break;
 1124|      0|        }
 1125|       |
 1126|      0|        case Opcode::Alternation: {
  ------------------
  |  Branch (1126:9): [True: 0, False: 97.8k]
  ------------------
 1127|       |          // We have an alternation. Determine which of our first and second
 1128|       |          // branches are viable. If both are, we have to split our state.
 1129|      0|          const AlternationInsn *alt = llvh::cast<AlternationInsn>(base);
 1130|      0|          bool primaryViable =
 1131|      0|              c.satisfiesConstraints(flags_, alt->primaryConstraints);
 1132|      0|          bool secondaryViable =
 1133|      0|              c.satisfiesConstraints(flags_, alt->secondaryConstraints);
 1134|      0|          if (primaryViable && secondaryViable) {
  ------------------
  |  Branch (1134:15): [True: 0, False: 0]
  |  Branch (1134:32): [True: 0, False: 0]
  ------------------
 1135|       |            // We need to explore both branches. Explore the primary branch
 1136|       |            // first, backtrack to the secondary one.
 1137|      0|            s->ip_ += sizeof(AlternationInsn);
 1138|      0|            auto res = pushBacktrack(
 1139|      0|                backtrackStack,
 1140|      0|                BacktrackInsn::makeSetPosition(
 1141|      0|                    alt->secondaryBranch, c.currentPointer()));
 1142|      0|            if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1142:17): [True: 0, False: 0]
  ------------------
 1143|      0|              return res;
 1144|      0|            }
 1145|      0|          } else if (primaryViable) {
  ------------------
  |  Branch (1145:22): [True: 0, False: 0]
  ------------------
 1146|      0|            s->ip_ += sizeof(AlternationInsn);
 1147|      0|          } else if (secondaryViable) {
  ------------------
  |  Branch (1147:22): [True: 0, False: 0]
  ------------------
 1148|      0|            s->ip_ = alt->secondaryBranch;
 1149|      0|          } else {
 1150|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1151|      0|          }
 1152|      0|          break;
 1153|      0|        }
 1154|       |
 1155|      0|        case Opcode::Jump32:
  ------------------
  |  Branch (1155:9): [True: 0, False: 97.8k]
  ------------------
 1156|      0|          s->ip_ = llvh::cast<Jump32Insn>(base)->target;
 1157|      0|          break;
 1158|       |
 1159|      0|        case Opcode::Bracket: {
  ------------------
  |  Branch (1159:9): [True: 0, False: 97.8k]
  ------------------
 1160|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1160:15): [True: 0, False: 0]
  ------------------
 1161|      0|              !matchWidth1<Width1Opcode::Bracket>(base, c.consume()))
  ------------------
  |  Branch (1161:15): [True: 0, False: 0]
  ------------------
 1162|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1163|      0|          s->ip_ += llvh::cast<BracketInsn>(base)->totalWidth();
 1164|      0|          break;
 1165|      0|        }
 1166|       |
 1167|      0|        case Opcode::U16Bracket: {
  ------------------
  |  Branch (1167:9): [True: 0, False: 97.8k]
  ------------------
 1168|      0|          const U16BracketInsn *insn = llvh::cast<U16BracketInsn>(base);
 1169|       |          // U16BracketInsn is followed by a list of BracketRange32s.
 1170|      0|          const BracketRange32 *ranges =
 1171|      0|              reinterpret_cast<const BracketRange32 *>(insn + 1);
 1172|      0|          if (c.atEnd() ||
  ------------------
  |  Branch (1172:15): [True: 0, False: 0]
  ------------------
 1173|      0|              !bracketMatchesChar<Traits>(
  ------------------
  |  Branch (1173:15): [True: 0, False: 0]
  ------------------
 1174|      0|                  *this, insn, ranges, c.consumeUTF16()))
 1175|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1176|      0|          s->ip_ += insn->totalWidth();
 1177|      0|          break;
 1178|      0|        }
 1179|       |
 1180|      0|        case Opcode::WordBoundary: {
  ------------------
  |  Branch (1180:9): [True: 0, False: 97.8k]
  ------------------
 1181|      0|          const WordBoundaryInsn *insn = llvh::cast<WordBoundaryInsn>(base);
 1182|      0|          const auto *charPointer = c.currentPointer();
 1183|       |
 1184|      0|          bool prevIsWordchar = false;
 1185|      0|          if (!c.atLeft())
  ------------------
  |  Branch (1185:15): [True: 0, False: 0]
  ------------------
 1186|      0|            prevIsWordchar = traits_.characterHasType(
 1187|      0|                charPointer[-1], CharacterClass::Words);
 1188|       |
 1189|      0|          bool currentIsWordchar = false;
 1190|      0|          if (!c.atRight())
  ------------------
  |  Branch (1190:15): [True: 0, False: 0]
  ------------------
 1191|      0|            currentIsWordchar =
 1192|      0|                traits_.characterHasType(charPointer[0], CharacterClass::Words);
 1193|       |
 1194|      0|          bool isWordBoundary = (prevIsWordchar != currentIsWordchar);
 1195|      0|          if (isWordBoundary ^ insn->invert)
  ------------------
  |  Branch (1195:15): [True: 0, False: 0]
  ------------------
 1196|      0|            s->ip_ += sizeof(WordBoundaryInsn);
 1197|      0|          else
 1198|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1199|      0|          break;
 1200|      0|        }
 1201|       |
 1202|      0|        case Opcode::BeginMarkedSubexpression: {
  ------------------
  |  Branch (1202:9): [True: 0, False: 97.8k]
  ------------------
 1203|      0|          const auto *insn = llvh::cast<BeginMarkedSubexpressionInsn>(base);
 1204|      0|          auto res = pushBacktrack(
 1205|      0|              backtrackStack,
 1206|      0|              BacktrackInsn::makeSetCaptureGroup(
 1207|      0|                  insn->mexp, {kNotMatched, kNotMatched}));
 1208|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1208:15): [True: 0, False: 0]
  ------------------
 1209|      0|            return res;
 1210|      0|          }
 1211|       |          // When tracking backwards (in a lookbehind assertion) we traverse our
 1212|       |          // input backwards, so set the end before the start.
 1213|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1214|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1214:15): [True: 0, False: 0]
  ------------------
 1215|      0|            range.start = c.offsetFromLeft();
 1216|      0|          } else {
 1217|      0|            range.end = c.offsetFromLeft();
 1218|      0|          }
 1219|      0|          s->ip_ += sizeof(BeginMarkedSubexpressionInsn);
 1220|      0|          break;
 1221|      0|        }
 1222|       |
 1223|      0|        case Opcode::EndMarkedSubexpression: {
  ------------------
  |  Branch (1223:9): [True: 0, False: 97.8k]
  ------------------
 1224|      0|          const auto *insn = llvh::cast<EndMarkedSubexpressionInsn>(base);
 1225|      0|          auto &range = s->getCapturedRange(insn->mexp);
 1226|      0|          if (c.forwards()) {
  ------------------
  |  Branch (1226:15): [True: 0, False: 0]
  ------------------
 1227|      0|            assert(
 1228|      0|                range.start != kNotMatched && "Capture group was not entered");
 1229|      0|            range.end = c.offsetFromLeft();
 1230|      0|          } else {
 1231|      0|            assert(range.end != kNotMatched && "Capture group was not entered");
 1232|      0|            range.start = c.offsetFromLeft();
 1233|      0|          }
 1234|      0|          assert(range.start <= range.end && "Captured range end before start");
 1235|      0|          s->ip_ += sizeof(EndMarkedSubexpressionInsn);
 1236|      0|          break;
 1237|      0|        }
 1238|       |
 1239|       |        // ES10 21.2.2.9.1
 1240|      0|        case Opcode::BackRef: {
  ------------------
  |  Branch (1240:9): [True: 0, False: 97.8k]
  ------------------
 1241|      0|          const auto insn = llvh::cast<BackRefInsn>(base);
 1242|       |          // a. Let cap be x's captures List.
 1243|       |          // b. Let s be cap[n].
 1244|      0|          CapturedRange cr = s->getCapturedRange(insn->mexp);
 1245|       |
 1246|       |          // c. If s is undefined, return c(x).
 1247|       |          // Note we have to check both cr.start and cr.end here. If we are
 1248|       |          // currently in the middle of matching a capture group (going either
 1249|       |          // forwards or backwards) we should just return success.
 1250|      0|          if (cr.start == kNotMatched || cr.end == kNotMatched) {
  ------------------
  |  Branch (1250:15): [True: 0, False: 0]
  |  Branch (1250:42): [True: 0, False: 0]
  ------------------
 1251|       |            // Backreferences to a capture group that did not match always
 1252|       |            // succeed (ES10 21.2.2.9)
 1253|      0|            s->ip_ += sizeof(BackRefInsn);
 1254|      0|            break;
 1255|      0|          }
 1256|       |
 1257|       |          // TODO: this can be optimized by hoisting the branches out of the
 1258|       |          // loop.
 1259|      0|          bool icase = syntaxFlags_.ignoreCase;
 1260|      0|          bool unicode = syntaxFlags_.unicode;
 1261|      0|          auto capturedStart = first_ + cr.start;
 1262|      0|          auto capturedEnd = first_ + cr.end;
 1263|      0|          Cursor<Traits> cursor2(
 1264|      0|              capturedStart,
 1265|      0|              c.forwards() ? capturedStart : capturedEnd,
  ------------------
  |  Branch (1265:15): [True: 0, False: 0]
  ------------------
 1266|      0|              capturedEnd,
 1267|      0|              c.forwards());
 1268|      0|          Cursor<Traits> cursor1 = c;
 1269|      0|          bool matched = true;
 1270|      0|          while (matched && !cursor2.atEnd()) {
  ------------------
  |  Branch (1270:18): [True: 0, False: 0]
  |  Branch (1270:29): [True: 0, False: 0]
  ------------------
 1271|      0|            if (cursor1.atEnd()) {
  ------------------
  |  Branch (1271:17): [True: 0, False: 0]
  ------------------
 1272|      0|              matched = false;
 1273|      0|            } else if (!icase) {
  ------------------
  |  Branch (1273:24): [True: 0, False: 0]
  ------------------
 1274|       |              // Direct comparison. Here we don't need to decode surrogate
 1275|       |              // pairs.
 1276|      0|              matched = (cursor1.consume() == cursor2.consume());
 1277|      0|            } else if (!unicode) {
  ------------------
  |  Branch (1277:24): [True: 0, False: 0]
  ------------------
 1278|       |              // Case-insensitive non-Unicode comparison, no decoding of
 1279|       |              // surrogate pairs.
 1280|      0|              auto c1 = cursor1.consume();
 1281|      0|              auto c2 = cursor2.consume();
 1282|      0|              matched =
 1283|      0|                  (c1 == c2 ||
  ------------------
  |  Branch (1283:20): [True: 0, False: 0]
  ------------------
 1284|      0|                   traits_.canonicalize(c1, unicode) ==
  ------------------
  |  Branch (1284:20): [True: 0, False: 0]
  ------------------
 1285|      0|                       traits_.canonicalize(c2, unicode));
 1286|      0|            } else {
 1287|       |              // Unicode: we do need to decode surrogate pairs.
 1288|      0|              auto cp1 = cursor1.consumeUTF16();
 1289|      0|              auto cp2 = cursor2.consumeUTF16();
 1290|      0|              matched =
 1291|      0|                  (cp1 == cp2 ||
  ------------------
  |  Branch (1291:20): [True: 0, False: 0]
  ------------------
 1292|      0|                   traits_.canonicalize(cp1, unicode) ==
  ------------------
  |  Branch (1292:20): [True: 0, False: 0]
  ------------------
 1293|      0|                       traits_.canonicalize(cp2, unicode));
 1294|      0|            }
 1295|      0|          }
 1296|      0|          if (!matched) {
  ------------------
  |  Branch (1296:15): [True: 0, False: 0]
  ------------------
 1297|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1298|      0|          }
 1299|      0|          s->ip_ += sizeof(BackRefInsn);
 1300|      0|          c.setCurrentPointer(cursor1.currentPointer());
 1301|      0|          break;
 1302|      0|        }
 1303|       |
 1304|      0|        case Opcode::Lookaround: {
  ------------------
  |  Branch (1304:9): [True: 0, False: 97.8k]
  ------------------
 1305|      0|          const LookaroundInsn *insn = llvh::cast<LookaroundInsn>(base);
 1306|      0|          bool matched = false;
 1307|      0|          if (c.satisfiesConstraints(flags_, insn->constraints)) {
  ------------------
  |  Branch (1307:15): [True: 0, False: 0]
  ------------------
 1308|       |            // Copy the state. This is because if the match fails (or if we are
 1309|       |            // inverted) we need to restore its capture groups.
 1310|      0|            State savedState{*s};
 1311|       |
 1312|       |            // Set the direction of the cursor.
 1313|      0|            c.setForwards(insn->forwards);
 1314|       |
 1315|       |            // Invoke match() recursively with our expression.
 1316|       |            // Save and restore the position because lookaheads do not consume
 1317|       |            // anything.
 1318|      0|            s->ip_ += sizeof(LookaroundInsn);
 1319|      0|            auto match = this->match(s, true /* onlyAtStart */);
 1320|       |            // There were no errors and we matched something (so non-null
 1321|       |            // return)
 1322|      0|            matched = match && match.getValue();
  ------------------
  |  Branch (1322:23): [True: 0, False: 0]
  |  Branch (1322:32): [True: 0, False: 0]
  ------------------
 1323|      0|            c.setCurrentPointer(savedState.cursor_.currentPointer());
 1324|      0|            c.setForwards(savedState.cursor_.forwards());
 1325|       |
 1326|       |            // Restore capture groups unless we are a positive lookaround that
 1327|       |            // successfully matched. If we are a successfully matching positive
 1328|       |            // lookaround, set up backtracking to reset the capture groups. Note
 1329|       |            // we never backtrack INTO a successfully matched lookahead:
 1330|       |            // once a lookahead finds a match it forgets all other ways it could
 1331|       |            // have matched. (ES 5.1 15.10.2.8 Note 2).
 1332|      0|            if (matched && !insn->invert) {
  ------------------
  |  Branch (1332:17): [True: 0, False: 0]
  |  Branch (1332:28): [True: 0, False: 0]
  ------------------
 1333|       |              // Backtrack capture groups in the lookahead expression.
 1334|      0|              for (uint32_t i = insn->mexpBegin, e = insn->mexpEnd; i < e;
  ------------------
  |  Branch (1334:69): [True: 0, False: 0]
  ------------------
 1335|      0|                   i++) {
 1336|      0|                CapturedRange cr = savedState.getCapturedRange(i);
 1337|      0|                auto res = pushBacktrack(
 1338|      0|                    backtrackStack, BacktrackInsn::makeSetCaptureGroup(i, cr));
 1339|      0|                if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1339:21): [True: 0, False: 0]
  ------------------
 1340|      0|                  return res;
 1341|      0|              }
 1342|      0|            } else {
 1343|       |              // Restore the saved state.
 1344|      0|              *s = std::move(savedState);
 1345|      0|            }
 1346|      0|          }
 1347|       |
 1348|       |          // 'matched' tells us whether the enclosed assertion expression
 1349|       |          // matched the input. This instruction matched the input if it is a
 1350|       |          // positive assertion (invert == false) and the expression matched,
 1351|       |          // or a negative assertion (invert == true) and the expression did
 1352|       |          // not match. Hence xor with invert.
 1353|      0|          if (matched ^ insn->invert)
  ------------------
  |  Branch (1353:15): [True: 0, False: 0]
  ------------------
 1354|      0|            s->ip_ = insn->continuation;
 1355|      0|          else
 1356|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1357|      0|          break;
 1358|      0|        }
 1359|       |
 1360|      0|        case Opcode::BeginLoop: {
  ------------------
  |  Branch (1360:9): [True: 0, False: 97.8k]
  ------------------
 1361|       |          // Here we are entering a loop from outside, not jumping back into
 1362|       |          // it.
 1363|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1364|      0|          s->getLoop(loop->loopId).iterations = 0;
 1365|       |          // Check to see if the loop body is viable. If not, and the loop has
 1366|       |          // a nonzero minimum iteration, then we know we won't match and we
 1367|       |          // can reject the state. If it does have a minimum iteration, we can
 1368|       |          // just skip to the not-taken target. Note that this is a static
 1369|       |          // property of the loop so we don't need to check it on every
 1370|       |          // iteration, only the first one.
 1371|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1371:15): [True: 0, False: 0]
  ------------------
 1372|      0|            if (loop->min > 0) {
  ------------------
  |  Branch (1372:17): [True: 0, False: 0]
  ------------------
 1373|      0|              BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1374|      0|            } else {
 1375|      0|              s->ip_ = loop->notTakenTarget;
 1376|      0|              break;
 1377|      0|            }
 1378|      0|          }
 1379|      0|          goto runLoop;
 1380|      0|        }
 1381|       |
 1382|      0|        case Opcode::EndLoop:
  ------------------
  |  Branch (1382:9): [True: 0, False: 97.8k]
  ------------------
 1383|       |          // This is reached after the body of a loop finishes executing.
 1384|       |          // Move the IP to the loop and run it again immediately.
 1385|      0|          s->ip_ = llvh::cast<EndLoopInsn>(base)->target;
 1386|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1387|       |          // Note fall through.
 1388|       |
 1389|      0|        runLoop : {
 1390|      0|          const BeginLoopInsn *loop = llvh::cast<BeginLoopInsn>(base);
 1391|      0|          auto &loopData = s->getLoop(loop->loopId);
 1392|      0|          uint32_t iteration = loopData.iterations;
 1393|       |
 1394|      0|          const uint32_t loopTakenIp = s->ip_ + sizeof(BeginLoopInsn);
 1395|       |
 1396|      0|          assert(loop->min <= loop->max && "Inconsistent loop bounds");
 1397|       |
 1398|       |          // Check to see if we have looped more than the minimum number of
 1399|       |          // iterations, and if so, whether the subexpression we looped over
 1400|       |          // matched an empty string. ES6 21.2.2.5.1 Note 4: "once the
 1401|       |          // minimum number of repetitions has been satisfied, any more
 1402|       |          // expansions of Atom that match the empty character sequence are
 1403|       |          // not considered for further repetitions."
 1404|      0|          if (iteration > loop->min &&
  ------------------
  |  Branch (1404:15): [True: 0, False: 0]
  ------------------
 1405|      0|              loopData.entryPosition == c.offsetFromLeft())
  ------------------
  |  Branch (1405:15): [True: 0, False: 0]
  ------------------
 1406|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1407|       |
 1408|      0|          if (iteration < loop->min) {
  ------------------
  |  Branch (1408:15): [True: 0, False: 0]
  ------------------
 1409|      0|            auto res = prepareToEnterLoopBody(s, loop, backtrackStack);
 1410|      0|            if (res != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1410:17): [True: 0, False: 0]
  ------------------
 1411|      0|              return res;
 1412|      0|            s->ip_ = loopTakenIp;
 1413|      0|          } else if (iteration == loop->max) {
  ------------------
  |  Branch (1413:22): [True: 0, False: 0]
  ------------------
 1414|      0|            s->ip_ = loop->notTakenTarget;
 1415|      0|          } else {
 1416|       |            // We are within the target iteration range, figure out whether we
 1417|       |            // should continue or exit.
 1418|      0|            assert(iteration >= loop->min && iteration < loop->max);
 1419|      0|            if (!loop->greedy) {
  ------------------
  |  Branch (1419:17): [True: 0, False: 0]
  ------------------
 1420|       |              // Backtrack by entering this non-greedy loop.
 1421|      0|              loopData.entryPosition = c.offsetFromLeft();
 1422|      0|              auto res = pushBacktrack(
 1423|      0|                  backtrackStack,
 1424|      0|                  BacktrackInsn::makeEnterNonGreedyLoop(
 1425|      0|                      loop, loopTakenIp, loopData));
 1426|      0|              if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1426:19): [True: 0, False: 0]
  ------------------
 1427|      0|                return res;
 1428|      0|              }
 1429|      0|              s->ip_ = loop->notTakenTarget;
 1430|      0|            } else {
 1431|       |              // Backtrack by exiting this greedy loop.
 1432|      0|              auto pushRes = pushBacktrack(
 1433|      0|                  backtrackStack,
 1434|      0|                  BacktrackInsn::makeSetPosition(
 1435|      0|                      loop->notTakenTarget, c.currentPointer()));
 1436|      0|              if (pushRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1436:19): [True: 0, False: 0]
  ------------------
 1437|      0|                return pushRes;
 1438|       |
 1439|      0|              auto prepRes = prepareToEnterLoopBody(s, loop, backtrackStack);
 1440|      0|              if (prepRes != ExecutionStatus::RETURNED)
  ------------------
  |  Branch (1440:19): [True: 0, False: 0]
  ------------------
 1441|      0|                return prepRes;
 1442|      0|              s->ip_ = loopTakenIp;
 1443|      0|            }
 1444|      0|          }
 1445|      0|          break;
 1446|      0|        }
 1447|       |
 1448|      0|        case Opcode::BeginSimpleLoop: {
  ------------------
  |  Branch (1448:9): [True: 0, False: 97.8k]
  ------------------
 1449|       |          // Here we are entering a simple loop from outside,
 1450|       |          // not jumping back into it.
 1451|      0|          const BeginSimpleLoopInsn *loop =
 1452|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1453|       |
 1454|      0|          if (!c.satisfiesConstraints(flags_, loop->loopeeConstraints)) {
  ------------------
  |  Branch (1454:15): [True: 0, False: 0]
  ------------------
 1455|      0|            s->ip_ = loop->notTakenTarget;
 1456|      0|            break;
 1457|      0|          }
 1458|       |
 1459|      0|          goto runSimpleLoop;
 1460|      0|        }
 1461|       |
 1462|      0|        case Opcode::EndSimpleLoop:
  ------------------
  |  Branch (1462:9): [True: 0, False: 97.8k]
  ------------------
 1463|      0|          s->ip_ = llvh::cast<EndSimpleLoopInsn>(base)->target;
 1464|      0|          base = reinterpret_cast<const Insn *>(&bytecode[s->ip_]);
 1465|       |          // Note: fall-through.
 1466|       |
 1467|      0|        runSimpleLoop : {
 1468|      0|          const BeginSimpleLoopInsn *loop =
 1469|      0|              llvh::cast<BeginSimpleLoopInsn>(base);
 1470|       |          // Since this is a simple loop, we'll always need to explore both
 1471|       |          // exiting the loop at this point and continuing to loop.
 1472|       |          // Note simple loops are always greedy.
 1473|      0|          auto res = pushBacktrack(
 1474|      0|              backtrackStack,
 1475|      0|              BacktrackInsn::makeSetPosition(
 1476|      0|                  loop->notTakenTarget, c.currentPointer()));
 1477|      0|          if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1477:15): [True: 0, False: 0]
  ------------------
 1478|      0|            return res;
 1479|      0|          }
 1480|      0|          s->ip_ += sizeof(BeginSimpleLoopInsn);
 1481|      0|          break;
 1482|      0|        }
 1483|       |
 1484|      0|        case Opcode::Width1Loop: {
  ------------------
  |  Branch (1484:9): [True: 0, False: 97.8k]
  ------------------
 1485|      0|          const Width1LoopInsn *loop = llvh::cast<Width1LoopInsn>(base);
 1486|      0|          auto matchRes = matchWidth1Loop(loop, s, backtrackStack);
 1487|      0|          if (LLVM_UNLIKELY(!matchRes))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1488|      0|            return matchRes.getStatus();
 1489|      0|          if (!*matchRes)
  ------------------
  |  Branch (1489:15): [True: 0, False: 0]
  ------------------
 1490|      0|            BACKTRACK();
  ------------------
  |  |  995|      0|  do {                                         \
  |  |  996|      0|    auto btRes = backtrack(backtrackStack, s); \
  |  |  997|      0|    if (LLVM_UNLIKELY(!btRes))                 \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  998|      0|      return btRes.getStatus();                \
  |  |  999|      0|    if (*btRes)                                \
  |  |  ------------------
  |  |  |  Branch (999:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1000|      0|      goto backtrackingSucceeded;              \
  |  | 1001|      0|    goto backtrackingExhausted;                \
  |  | 1002|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1002:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1491|      0|          break;
 1492|      0|        }
 1493|  97.8k|      }
 1494|  97.8k|    }
 1495|       |  // The search failed at this location.
 1496|      1|  backtrackingExhausted:
 1497|      1|    continue;
 1498|  48.9k|  }
 1499|      1|#undef BACKTRACK
 1500|       |  // The match failed.
 1501|      1|  return nullptr;
 1502|  48.9k|}
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE15offsetFromRightEv:
  157|  48.9k|  uint32_t offsetFromRight() const {
  158|  48.9k|    return last_ - current_;
  159|  48.9k|  }
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE8forwardsEv:
  126|  48.9k|  bool forwards() const {
  127|  48.9k|    return forwards_;
  128|  48.9k|  }
_ZN6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE17setCurrentPointerEPKc:
  186|  48.9k|  void setCurrentPointer(const CodeUnit *current) {
  187|  48.9k|    assert(first_ <= current && current <= last_ && "Current not in range");
  188|      0|    current_ = current;
  189|  48.9k|  }
_ZN6hermes5regex14ExecutorResultIPKcEC2ERKS3_:
   41|  48.9k|      : status_(ExecutionStatus::RETURNED), value_(v) {}
_ZN6hermes5regex16isLineTerminatorIcEEbT_:
  565|  48.9k|bool isLineTerminator(CharT c) {
  566|  48.9k|  return c == u'\u000A' || c == u'\u000D' || c == u'\u2028' || c == u'\u2029';
  ------------------
  |  Branch (566:10): [True: 0, False: 48.9k]
  |  Branch (566:28): [True: 0, False: 48.9k]
  |  Branch (566:46): [True: 0, False: 48.9k]
  |  Branch (566:64): [True: 0, False: 48.9k]
  ------------------
  567|  48.9k|}
_ZN6hermes5regex7ContextINS0_16ASCIIRegexTraitsEE9backtrackERN4llvh11SmallVectorINS3_13BacktrackInsnELj64EEEPNS0_5StateIS2_EE:
  717|      1|    State<Traits> *s) {
  718|      1|  while (!bts.empty()) {
  ------------------
  |  Branch (718:10): [True: 0, False: 1]
  ------------------
  719|      0|    BacktrackInsn &binsn = bts.back();
  720|      0|    switch (binsn.op) {
  ------------------
  |  Branch (720:13): [True: 0, False: 0]
  ------------------
  721|      0|      case BacktrackOp::SetCaptureGroup:
  ------------------
  |  Branch (721:7): [True: 0, False: 0]
  ------------------
  722|      0|        s->getCapturedRange(binsn.setCaptureGroup.mexp) =
  723|      0|            binsn.setCaptureGroup.range;
  724|      0|        bts.pop_back();
  725|      0|        break;
  726|       |
  727|      0|      case BacktrackOp::SetLoopData:
  ------------------
  |  Branch (727:7): [True: 0, False: 0]
  ------------------
  728|      0|        s->getLoop(binsn.setLoopData.loopId) = binsn.setLoopData.loopData;
  729|      0|        bts.pop_back();
  730|      0|        break;
  731|       |
  732|      0|      case BacktrackOp::SetPosition:
  ------------------
  |  Branch (732:7): [True: 0, False: 0]
  ------------------
  733|      0|        s->cursor_.setCurrentPointer(binsn.setPosition.value);
  734|      0|        s->ip_ = binsn.setPosition.ip;
  735|      0|        bts.pop_back();
  736|      0|        return true;
  737|       |
  738|      0|      case BacktrackOp::EnterNonGreedyLoop: {
  ------------------
  |  Branch (738:7): [True: 0, False: 0]
  ------------------
  739|      0|        auto fields = binsn.enterNonGreedyLoop;
  740|      0|        bts.pop_back();
  741|      0|        auto res = performEnterNonGreedyLoop(
  742|      0|            s, fields.loopInsn, fields.bodyIp, fields.loopData, bts);
  743|      0|        if (res != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (743:13): [True: 0, False: 0]
  ------------------
  744|      0|          return res;
  745|      0|        }
  746|      0|        return true;
  747|      0|      }
  748|       |
  749|      0|      case BacktrackOp::GreedyWidth1Loop:
  ------------------
  |  Branch (749:7): [True: 0, False: 0]
  ------------------
  750|      0|      case BacktrackOp::NongreedyWidth1Loop: {
  ------------------
  |  Branch (750:7): [True: 0, False: 0]
  ------------------
  751|       |        // In both of these instructions, we have a range [min, max] containing
  752|       |        // possible match locations, and the match failed at the max location
  753|       |        // (if we are greedy) or the min location (nongreedy). Backtrack by
  754|       |        // decrementing the max (incrementing the min) if we are greedy
  755|       |        // (nongreedy), setting the IP to that location, and jumping to the loop
  756|       |        // exit. Note that if we are tracking backwards (lookbehind assertion)
  757|       |        // our maximum is before our minimum, so we have to reverse the
  758|       |        // direction of increment/decrement.
  759|      0|        bool forwards = s->cursor_.forwards();
  760|      0|        assert(
  761|      0|            (forwards ? binsn.width1Loop.min <= binsn.width1Loop.max
  762|      0|                      : binsn.width1Loop.min >= binsn.width1Loop.max) &&
  763|      0|            "Loop min should be <= max (or >= max if backwards)");
  764|      0|        if (binsn.width1Loop.min == binsn.width1Loop.max) {
  ------------------
  |  Branch (764:13): [True: 0, False: 0]
  ------------------
  765|       |          // We have backtracked as far as possible. Give up.
  766|      0|          bts.pop_back();
  767|      0|          break;
  768|      0|        }
  769|      0|        if (binsn.op == BacktrackOp::GreedyWidth1Loop) {
  ------------------
  |  Branch (769:13): [True: 0, False: 0]
  ------------------
  770|      0|          binsn.width1Loop.max += forwards ? -1 : 1;
  ------------------
  |  Branch (770:35): [True: 0, False: 0]
  ------------------
  771|      0|          s->cursor_.setCurrentPointer(binsn.width1Loop.max);
  772|      0|        } else {
  773|      0|          binsn.width1Loop.min += forwards ? 1 : -1;
  ------------------
  |  Branch (773:35): [True: 0, False: 0]
  ------------------
  774|      0|          s->cursor_.setCurrentPointer(binsn.width1Loop.min);
  775|      0|        }
  776|      0|        s->ip_ = binsn.width1Loop.continuation;
  777|      0|        return true;
  778|      0|      }
  779|      0|    }
  780|      0|  }
  781|       |  // Exhausted the backtracking stack.
  782|      1|  return false;
  783|      1|}
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE5atEndEv:
  142|  97.8k|  bool atEnd() const {
  143|  97.8k|    return current_ == end_;
  144|  97.8k|  }
_ZN6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE7consumeEv:
  192|  48.9k|  CodeUnit consume() {
  193|  48.9k|    CodeUnit result = current();
  194|  48.9k|    current_ += forwards_ ? 1 : -1;
  ------------------
  |  Branch (194:17): [True: 48.9k, False: 0]
  ------------------
  195|  48.9k|    return result;
  196|  48.9k|  }
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE7currentEv:
  174|  48.9k|  CodeUnit current() const {
  175|       |    // Access the character at index 0 if forwards, -1 if backwards.
  176|  48.9k|    assert(!atEnd() && "Cursor is at end");
  177|      0|    return current_[(int)forwards_ - 1];
  178|  48.9k|  }
_ZNK6hermes5regex7ContextINS0_16ASCIIRegexTraitsEE11matchWidth1ILNS0_12Width1OpcodeE5EEEbPKNS0_4InsnEc:
  787|  48.9k|bool Context<Traits>::matchWidth1(const Insn *base, CodeUnit c) const {
  788|       |  // Note this switch should resolve at compile time.
  789|  48.9k|  assert(
  790|  48.9k|      base->opcode == static_cast<Opcode>(w1opcode) &&
  791|  48.9k|      "Instruction has wrong opcode");
  792|      0|  switch (w1opcode) {
  ------------------
  |  Branch (792:11): [Folded - Ignored]
  ------------------
  793|      0|    case Width1Opcode::MatchChar8: {
  ------------------
  |  Branch (793:5): [True: 0, False: 48.9k]
  ------------------
  794|      0|      const auto *insn = llvh::cast<MatchChar8Insn>(base);
  795|      0|      return c == insn->c;
  796|      0|    }
  797|       |
  798|      0|    case Width1Opcode::MatchChar16: {
  ------------------
  |  Branch (798:5): [True: 0, False: 48.9k]
  ------------------
  799|      0|      const auto *insn = llvh::cast<MatchChar16Insn>(base);
  800|      0|      return c == insn->c;
  801|      0|    }
  802|       |
  803|      0|    case Width1Opcode::MatchCharICase8: {
  ------------------
  |  Branch (803:5): [True: 0, False: 48.9k]
  ------------------
  804|      0|      const auto *insn = llvh::cast<MatchCharICase8Insn>(base);
  805|      0|      return c == (CodePoint)insn->c ||
  ------------------
  |  Branch (805:14): [True: 0, False: 0]
  ------------------
  806|      0|          (CodePoint)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (806:11): [True: 0, False: 0]
  ------------------
  807|      0|          (CodePoint)insn->c;
  808|      0|    }
  809|       |
  810|      0|    case Width1Opcode::MatchCharICase16: {
  ------------------
  |  Branch (810:5): [True: 0, False: 48.9k]
  ------------------
  811|      0|      const auto *insn = llvh::cast<MatchCharICase16Insn>(base);
  812|      0|      return c == insn->c ||
  ------------------
  |  Branch (812:14): [True: 0, False: 0]
  ------------------
  813|      0|          (char32_t)traits_.canonicalize(c, syntaxFlags_.unicode) ==
  ------------------
  |  Branch (813:11): [True: 0, False: 0]
  ------------------
  814|      0|          (char32_t)insn->c;
  815|      0|    }
  816|       |
  817|      0|    case Width1Opcode::MatchAny:
  ------------------
  |  Branch (817:5): [True: 0, False: 48.9k]
  ------------------
  818|      0|      return true;
  819|       |
  820|  48.9k|    case Width1Opcode::MatchAnyButNewline:
  ------------------
  |  Branch (820:5): [True: 48.9k, False: 0]
  ------------------
  821|  48.9k|      return !isLineTerminator(c);
  822|       |
  823|      0|    case Width1Opcode::Bracket: {
  ------------------
  |  Branch (823:5): [True: 0, False: 48.9k]
  ------------------
  824|       |      // BracketInsn is followed by a list of BracketRange32s.
  825|      0|      assert(
  826|      0|          !(syntaxFlags_.unicode) &&
  827|      0|          "Unicode should not be set for Width 1 brackets");
  828|      0|      const BracketInsn *insn = llvh::cast<BracketInsn>(base);
  829|      0|      const BracketRange32 *ranges =
  830|      0|          reinterpret_cast<const BracketRange32 *>(insn + 1);
  831|      0|      return bracketMatchesChar<Traits>(*this, insn, ranges, c);
  832|      0|    }
  833|  48.9k|  }
  834|      0|  llvm_unreachable("Invalid width 1 opcode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  835|  48.9k|}
_ZNK6hermes5regex7ContextINS0_16ASCIIRegexTraitsEE18advanceStringIndexEPKcmm:
  937|      1|    size_t length) const {
  938|      1|  if (sizeof(CodeUnit) == 1) {
  ------------------
  |  Branch (938:7): [Folded - Ignored]
  ------------------
  939|       |    // The input string is ASCII and therefore cannot have surrogate pairs.
  940|      1|    return index + 1;
  941|      1|  }
  942|       |  // "If unicode is false, return index+1."
  943|       |  // "If index+1 >= length, return index+1."
  944|      0|  if (LLVM_LIKELY(!(syntaxFlags_.unicode)) || (index + 1 >= length))
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (944:47): [True: 0, False: 0]
  ------------------
  945|      0|    return index + 1;
  946|       |
  947|       |  // Let first be the code unit value at index index in S
  948|       |  // If first < 0xD800 or first > 0xDBFF, return index+1
  949|       |  // Let second be the code unit value at index index+1 in S.
  950|       |  // If second < 0xDC00 or second > 0xDFFF, return index+1.
  951|      0|  CodeUnit first = start[index];
  952|      0|  CodeUnit second = start[index + 1];
  953|      0|  if (LLVM_LIKELY(!isHighSurrogate(first)) ||
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  954|      0|      LLVM_LIKELY(!isLowSurrogate(second))) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  955|      0|    return index + 1;
  956|      0|  }
  957|       |  // Return index+2.
  958|      0|  return index + 2;
  959|      0|}
_ZNK6hermes5regex14ExecutorResultIPKcEcvbEv:
   55|  48.9k|  explicit operator bool() const {
   56|  48.9k|    return hasValue();
   57|  48.9k|  }
_ZNK6hermes5regex14ExecutorResultIPKcE8hasValueEv:
   51|  48.9k|  bool hasValue() const {
   52|  48.9k|    return status_ == ExecutionStatus::RETURNED;
   53|  48.9k|  }
_ZNK6hermes5regex14ExecutorResultIPKcE9getStatusEv:
   64|  48.9k|  ExecutionStatus getStatus() const {
   65|  48.9k|    return status_;
   66|  48.9k|  }
_ZNK6hermes5regex14ExecutorResultIPKcE8getValueEv:
   59|  48.9k|  const T &getValue() const {
   60|  48.9k|    assert(getStatus() == ExecutionStatus::RETURNED);
   61|      0|    return *reinterpret_cast<const T *>(&value_);
   62|  48.9k|  }
_ZNK6hermes5regex6CursorINS0_16ASCIIRegexTraitsEE14currentPointerEv:
  181|  97.8k|  const CodeUnit *currentPointer() const {
  182|  97.8k|    return current_;
  183|  97.8k|  }

_ZN6hermes5regex10parseRegexINS0_5RegexINS0_16UTF16RegexTraitsEEEEENS0_9constants9ErrorTypeEPKDsS8_PT_NS0_11SyntaxFlagsEjbPj:
 1239|  11.4k|    uint32_t *outMaxBackRef) {
 1240|  11.4k|  Parser<Receiver, const char16_t *> parser(
 1241|  11.4k|      receiver, start, end, flags, backRefLimit, hasNamedGroups);
 1242|  11.4k|  auto result = parser.performParse();
 1243|  11.4k|  *outMaxBackRef = parser.maxBackRef();
 1244|  11.4k|  return result;
 1245|  11.4k|}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsEC2EPS4_S6_S6_NS0_11SyntaxFlagsEjb:
 1216|  11.4k|        hasNamedGroups_(hasNamedGroups) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE12performParseEv:
 1218|  11.4k|  constants::ErrorType performParse() {
 1219|  11.4k|    consumeDisjunction();
 1220|  11.4k|    assert(
 1221|  11.4k|        current_ == end_ && "We should always consume all input even on error");
 1222|      0|    return error_;
 1223|  11.4k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE18consumeDisjunctionEv:
  357|  11.4k|  void consumeDisjunction() {
  358|  11.4k|    Node *const firstNode = re_->currentNode();
  359|  11.4k|    ParseStack stack;
  360|       |
  361|  22.9k|    while (current_ != end_) {
  ------------------
  |  Branch (361:12): [True: 11.5k, False: 11.4k]
  ------------------
  362|  11.5k|      switch (*current_) {
  ------------------
  |  Branch (362:15): [True: 11.2k, False: 276]
  ------------------
  363|    276|        case '|': {
  ------------------
  |  Branch (363:9): [True: 276, False: 11.2k]
  ------------------
  364|    276|          consume('|');
  365|    276|          auto *splicePoint =
  366|    276|              stack.empty() ? firstNode : stack.back().splicePoint;
  ------------------
  |  Branch (366:15): [True: 234, False: 42]
  ------------------
  367|    276|          auto nodes = re_->spliceOut(splicePoint);
  368|    276|          if (stack.empty() ||
  ------------------
  |  Branch (368:15): [True: 234, False: 42]
  ------------------
  369|    276|              stack.back().type != ParseStackElement::Alternation) {
  ------------------
  |  Branch (369:15): [True: 0, False: 42]
  ------------------
  370|       |            // Open a new alternation
  371|    234|            openAlternation(stack);
  372|    234|          }
  373|    276|          stack.back().alternatives.push_back(std::move(nodes));
  374|    276|          break;
  375|      0|        }
  376|       |
  377|      0|        case '(': {
  ------------------
  |  Branch (377:9): [True: 0, False: 11.5k]
  ------------------
  378|       |          // Open a new group of the right type.
  379|      0|          if (tryConsume("(?=")) {
  ------------------
  |  Branch (379:15): [True: 0, False: 0]
  ------------------
  380|       |            // Positive lookahead, negate = false, forwards = true
  381|      0|            openLookaround(stack, false, true);
  382|      0|          } else if (tryConsume("(?!")) {
  ------------------
  |  Branch (382:22): [True: 0, False: 0]
  ------------------
  383|       |            // Negative lookahead, negate = true, forwards = true
  384|      0|            openLookaround(stack, true, true);
  385|      0|          } else if (tryConsume("(?<=")) {
  ------------------
  |  Branch (385:22): [True: 0, False: 0]
  ------------------
  386|       |            // Positive lookbehind, negate = false, forwards = false
  387|      0|            openLookaround(stack, false, false);
  388|      0|          } else if (tryConsume("(?<!")) {
  ------------------
  |  Branch (388:22): [True: 0, False: 0]
  ------------------
  389|       |            // Negative lookbehind, negate = true, forwards = false
  390|      0|            openLookaround(stack, true, false);
  391|      0|          } else if (tryConsume("(?<")) {
  ------------------
  |  Branch (391:22): [True: 0, False: 0]
  ------------------
  392|      0|            openNamedCapturingGroup(stack);
  393|      0|          } else if (tryConsume("(?:")) {
  ------------------
  |  Branch (393:22): [True: 0, False: 0]
  ------------------
  394|      0|            openNonCapturingGroup(stack);
  395|      0|          } else {
  396|      0|            consume('(');
  397|      0|            openCapturingGroup(stack);
  398|      0|          }
  399|      0|          break;
  400|      0|        }
  401|       |
  402|      0|        case ')': {
  ------------------
  |  Branch (402:9): [True: 0, False: 11.5k]
  ------------------
  403|       |          // Close any in-flight alternation and pop a group stack
  404|       |          // element.
  405|      0|          consume(')');
  406|      0|          closeAlternation(stack);
  407|      0|          if (stack.empty()) {
  ------------------
  |  Branch (407:15): [True: 0, False: 0]
  ------------------
  408|      0|            setError(constants::ErrorType::UnbalancedParenthesis);
  409|      0|            return;
  410|      0|          }
  411|      0|          closeGroup(stack);
  412|      0|          break;
  413|      0|        }
  414|  11.5k|      }
  415|  11.5k|      consumeTerm();
  416|  11.5k|    }
  417|       |
  418|  11.4k|    assert(current_ == end_ && "Should have consumed all input");
  419|      0|    closeAlternation(stack);
  420|  11.4k|    if (!stack.empty()) {
  ------------------
  |  Branch (420:9): [True: 0, False: 11.4k]
  ------------------
  421|      0|      setError(constants::ErrorType::UnbalancedParenthesis);
  422|      0|    }
  423|  11.4k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE7consumeEDs:
  122|   883k|  CharT consume(CharT c) {
  123|   883k|    assert(check(c) && "Could not consume char");
  124|      0|    current_++;
  125|   883k|    return c;
  126|   883k|  }
_ZNK6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE5checkEDs:
  152|   883k|  bool check(CharT c) const {
  153|   883k|    return current_ != end_ && *current_ == c;
  ------------------
  |  Branch (153:12): [True: 883k, False: 0]
  |  Branch (153:32): [True: 883k, False: 608]
  ------------------
  154|   883k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE15openAlternationERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  226|    234|  void openAlternation(ParseStack &stack) {
  227|       |    // Should never have two adjacent alternations on the stack
  228|    234|    assert(
  229|    234|        stack.empty() || stack.back().type != ParseStackElement::Alternation);
  230|      0|    ParseStackElement elem(ParseStackElement::Alternation);
  231|    234|    elem.splicePoint = re_->currentNode();
  232|    234|    stack.push_back(std::move(elem));
  233|    234|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE17ParseStackElementC2ENS8_4TypeE:
  220|    234|    explicit ParseStackElement(Type type) : type(type) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE17prepareQuantifierEv:
   97|   882k|  Quantifier prepareQuantifier() {
   98|   882k|    Quantifier q;
   99|   882k|    q.startMarkedSubexprs_ = re_->markedCount();
  100|   882k|    q.quantifiedNodeStart_ = re_->currentNode();
  101|   882k|    return q;
  102|   882k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10tryConsumeEDs:
  143|    609|  bool tryConsume(CharT c) {
  144|    609|    if (!check(c))
  ------------------
  |  Branch (144:9): [True: 608, False: 1]
  ------------------
  145|    608|      return false;
  146|      1|    consume(c);
  147|      1|    return true;
  148|    609|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE16closeAlternationERN4llvh11SmallVectorINS7_17ParseStackElementELj4EEE:
  236|  11.4k|  void closeAlternation(ParseStack &stack) {
  237|  11.4k|    if (!stack.empty() && stack.back().type == ParseStackElement::Alternation) {
  ------------------
  |  Branch (237:9): [True: 234, False: 11.2k]
  |  Branch (237:27): [True: 234, False: 0]
  ------------------
  238|    234|      auto alternatives = std::move(stack.back().alternatives);
  239|    234|      auto last = re_->spliceOut(stack.back().splicePoint);
  240|    234|      stack.pop_back();
  241|    234|      alternatives.push_back(std::move(last));
  242|    234|      re_->pushAlternation(std::move(alternatives));
  243|    234|    }
  244|  11.4k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE20tryConsumeQuantifierEPNS7_10QuantifierE:
  653|   882k|  bool tryConsumeQuantifier(Quantifier *quantifier) {
  654|   882k|    if (!tryConsumeQuantifierPrefix(quantifier)) {
  ------------------
  |  Branch (654:9): [True: 882k, False: 3]
  ------------------
  655|   882k|      return false;
  656|   882k|    }
  657|      3|    quantifier->greedy_ = !tryConsume('?');
  658|      3|    return true;
  659|   882k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE26tryConsumeQuantifierPrefixEPNS7_10QuantifierE:
  662|   882k|  bool tryConsumeQuantifierPrefix(Quantifier *quantifier) {
  663|   882k|    if (current_ == end_) {
  ------------------
  |  Branch (663:9): [True: 11.2k, False: 871k]
  ------------------
  664|  11.2k|      return false;
  665|  11.2k|    }
  666|   871k|    constexpr uint32_t uintmax = std::numeric_limits<uint32_t>::max();
  667|   871k|    switch (*current_) {
  668|      3|      case '*':
  ------------------
  |  Branch (668:7): [True: 3, False: 871k]
  ------------------
  669|      3|        consume('*');
  670|      3|        quantifier->min_ = 0;
  671|      3|        quantifier->max_ = uintmax;
  672|      3|        return true;
  673|       |
  674|      0|      case '+':
  ------------------
  |  Branch (674:7): [True: 0, False: 871k]
  ------------------
  675|      0|        consume('+');
  676|      0|        quantifier->min_ = 1;
  677|      0|        quantifier->max_ = uintmax;
  678|      0|        return true;
  679|       |
  680|      0|      case '?':
  ------------------
  |  Branch (680:7): [True: 0, False: 871k]
  ------------------
  681|      0|        consume('?');
  682|      0|        quantifier->min_ = 0;
  683|      0|        quantifier->max_ = 1;
  684|      0|        return true;
  685|       |
  686|      0|      case '{': {
  ------------------
  |  Branch (686:7): [True: 0, False: 871k]
  ------------------
  687|      0|        auto saved = current_;
  688|      0|        consume('{');
  689|      0|        if (auto v1 = tryConsumeDecimalIntegerLiteral()) {
  ------------------
  |  Branch (689:18): [True: 0, False: 0]
  ------------------
  690|      0|          quantifier->min_ = *v1;
  691|      0|          if (!tryConsume(',')) {
  ------------------
  |  Branch (691:15): [True: 0, False: 0]
  ------------------
  692|       |            // Like {3}
  693|      0|            quantifier->max_ = *v1;
  694|      0|          } else if (auto v2 = tryConsumeDecimalIntegerLiteral()) {
  ------------------
  |  Branch (694:27): [True: 0, False: 0]
  ------------------
  695|       |            // Like {3,5}
  696|      0|            quantifier->max_ = *v2;
  697|      0|          } else {
  698|       |            // Like {3,}
  699|      0|            quantifier->max_ = uintmax;
  700|      0|          }
  701|      0|          if (tryConsume('}')) {
  ------------------
  |  Branch (701:15): [True: 0, False: 0]
  ------------------
  702|      0|            return true;
  703|      0|          }
  704|      0|        }
  705|      0|        current_ = saved;
  706|      0|        return false;
  707|      0|      }
  708|       |
  709|   871k|      default:
  ------------------
  |  Branch (709:7): [True: 871k, False: 3]
  ------------------
  710|   871k|        return false;
  711|   871k|    }
  712|   871k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE15applyQuantifierERKNS7_10QuantifierE:
  106|      3|  void applyQuantifier(const Quantifier &quant) {
  107|      3|    if (quant.min_ > quant.max_) {
  ------------------
  |  Branch (107:9): [True: 0, False: 3]
  ------------------
  108|      0|      setError(constants::ErrorType::BraceRange);
  109|      0|      return;
  110|      0|    }
  111|      3|    auto quantifiedExpression = re_->spliceOut(quant.quantifiedNodeStart_);
  112|      3|    re_->pushLoop(
  113|      3|        quant.min_,
  114|      3|        quant.max_,
  115|      3|        std::move(quantifiedExpression),
  116|      3|        quant.startMarkedSubexprs_,
  117|      3|        quant.greedy_);
  118|      3|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE11consumeTermEv:
  426|  11.5k|  void consumeTerm() {
  427|   894k|    while (current_ != end_) {
  ------------------
  |  Branch (427:12): [True: 882k, False: 11.4k]
  ------------------
  428|   882k|      Quantifier quant = prepareQuantifier();
  429|   882k|      bool quantifierAllowed = true;
  430|   882k|      const CharT c = *current_;
  431|   882k|      switch (c) {
  432|      0|        case '^':
  ------------------
  |  Branch (432:9): [True: 0, False: 882k]
  ------------------
  433|      0|          re_->pushLeftAnchor();
  434|      0|          consume('^');
  435|      0|          quantifierAllowed = false;
  436|      0|          break;
  437|       |
  438|      0|        case '$':
  ------------------
  |  Branch (438:9): [True: 0, False: 882k]
  ------------------
  439|      0|          re_->pushRightAnchor();
  440|      0|          consume('$');
  441|      0|          quantifierAllowed = false;
  442|      0|          break;
  443|       |
  444|      0|        case '\\': {
  ------------------
  |  Branch (444:9): [True: 0, False: 882k]
  ------------------
  445|      0|          consume('\\');
  446|       |          // This may be an ES6 21.2.2.6 Assertion (\b or \B) or an AtomeEscape.
  447|      0|          if (current_ == end_) {
  ------------------
  |  Branch (447:15): [True: 0, False: 0]
  ------------------
  448|      0|            setError(constants::ErrorType::EscapeIncomplete);
  449|      0|            return;
  450|      0|          } else if (*current_ == 'b' || *current_ == 'B') {
  ------------------
  |  Branch (450:22): [True: 0, False: 0]
  |  Branch (450:42): [True: 0, False: 0]
  ------------------
  451|      0|            re_->pushWordBoundary(*current_ == 'B' /* invert */);
  452|      0|            consume(*current_);
  453|      0|            quantifierAllowed = false;
  454|      0|          } else {
  455|      0|            consumeAtomEscape();
  456|      0|          }
  457|      0|          break;
  458|      0|        }
  459|       |
  460|      8|        case '.': {
  ------------------
  |  Branch (460:9): [True: 8, False: 882k]
  ------------------
  461|      8|          consume('.');
  462|      8|          re_->pushMatchAny();
  463|      8|          break;
  464|      0|        }
  465|       |
  466|      1|        case '[': {
  ------------------
  |  Branch (466:9): [True: 1, False: 882k]
  ------------------
  467|      1|          consumeCharacterClass();
  468|      1|          break;
  469|      0|        }
  470|       |
  471|      0|        case '*':
  ------------------
  |  Branch (471:9): [True: 0, False: 882k]
  ------------------
  472|      0|        case '+':
  ------------------
  |  Branch (472:9): [True: 0, False: 882k]
  ------------------
  473|      0|        case '?': {
  ------------------
  |  Branch (473:9): [True: 0, False: 882k]
  ------------------
  474|      0|          setError(constants::ErrorType::InvalidRepeat);
  475|      0|          return;
  476|      0|        }
  477|       |
  478|      0|        case '{': {
  ------------------
  |  Branch (478:9): [True: 0, False: 882k]
  ------------------
  479|       |          // Under Unicode, this is always an error.
  480|       |          // Without Unicode, it is an error if it is a valid quantifier.
  481|       |          // (extension from ES11 Annex B.1.4)
  482|      0|          Quantifier tmp;
  483|      0|          if (tryConsumeQuantifier(&tmp)) {
  ------------------
  |  Branch (483:15): [True: 0, False: 0]
  ------------------
  484|      0|            setError(constants::ErrorType::InvalidRepeat);
  485|      0|            return;
  486|      0|          } else if (flags_.unicode) {
  ------------------
  |  Branch (486:22): [True: 0, False: 0]
  ------------------
  487|      0|            setError(constants::ErrorType::InvalidQuantifierBracket);
  488|      0|            return;
  489|      0|          }
  490|      0|          re_->pushChar(consume('{'));
  491|      0|          break;
  492|      0|        }
  493|       |
  494|     48|        case '|':
  ------------------
  |  Branch (494:9): [True: 48, False: 882k]
  ------------------
  495|     48|        case '(':
  ------------------
  |  Branch (495:9): [True: 0, False: 882k]
  ------------------
  496|     48|        case ')': {
  ------------------
  |  Branch (496:9): [True: 0, False: 882k]
  ------------------
  497|       |          // This is a new alternation, or the beginning or end of a group or
  498|       |          // assertion. Transfer control back to consumeDisjunction() so it can
  499|       |          // act on it.
  500|     48|          return;
  501|     48|        }
  502|       |
  503|      0|        case '}':
  ------------------
  |  Branch (503:9): [True: 0, False: 882k]
  ------------------
  504|      0|        case ']': {
  ------------------
  |  Branch (504:9): [True: 0, False: 882k]
  ------------------
  505|       |          // These syntax characters are allowed as atoms in
  506|       |          // ExtendedPatternCharacter production of ES9 Annex B 1.4.
  507|       |          // However they are disallowed under Unicode, where Annex B does not
  508|       |          // apply.
  509|      0|          if (flags_.unicode) {
  ------------------
  |  Branch (509:15): [True: 0, False: 0]
  ------------------
  510|      0|            setError(
  511|      0|                c == '}' ? constants::ErrorType::InvalidQuantifierBracket
  ------------------
  |  Branch (511:17): [True: 0, False: 0]
  ------------------
  512|      0|                         : constants::ErrorType::UnbalancedBracket);
  513|      0|            return;
  514|      0|          }
  515|      0|        }
  516|       |          // Fall-through
  517|       |
  518|   882k|        default: {
  ------------------
  |  Branch (518:9): [True: 882k, False: 57]
  ------------------
  519|       |          // Ordinary character or surrogate pair.
  520|   882k|          if (auto cp = tryConsumeSurrogatePair()) {
  ------------------
  |  Branch (520:20): [True: 0, False: 882k]
  ------------------
  521|      0|            re_->pushChar(*cp);
  522|   882k|          } else {
  523|   882k|            re_->pushChar(consume(c));
  524|   882k|          }
  525|   882k|          break;
  526|      0|        }
  527|   882k|      }
  528|       |
  529|       |      // We just parsed one term. Try parsing a quantifier.
  530|   882k|      if (tryConsumeQuantifier(&quant)) {
  ------------------
  |  Branch (530:11): [True: 3, False: 882k]
  ------------------
  531|      3|        if (!quantifierAllowed) {
  ------------------
  |  Branch (531:13): [True: 0, False: 3]
  ------------------
  532|      0|          setError(constants::ErrorType::InvalidRepeat);
  533|      0|          return;
  534|      0|        }
  535|      3|        applyQuantifier(quant);
  536|      3|      }
  537|   882k|    }
  538|  11.5k|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE21consumeCharacterClassEv:
  715|      1|  void consumeCharacterClass() {
  716|      1|    consume('[');
  717|      1|    bool unicode = flags_.unicode;
  718|      1|    bool negate = tryConsume('^');
  719|      1|    auto bracket = re_->startBracketList(negate);
  720|       |
  721|       |    // Helper to add a ClassAtom to our bracket.
  722|      1|    auto addClassAtom = [&bracket](const ClassAtom &atom) {
  723|      1|      if (atom.charClass) {
  724|      1|        bracket->addClass(*atom.charClass);
  725|      1|      } else {
  726|      1|        bracket->addChar(atom.codePoint);
  727|      1|      }
  728|      1|    };
  729|       |
  730|    303|    for (;;) {
  731|    303|      if (current_ == end_) {
  ------------------
  |  Branch (731:11): [True: 0, False: 303]
  ------------------
  732|      0|        setError(constants::ErrorType::UnbalancedBracket);
  733|      0|        return;
  734|      0|      }
  735|       |
  736|    303|      if (tryConsume(']')) {
  ------------------
  |  Branch (736:11): [True: 1, False: 302]
  ------------------
  737|       |        // End of bracket.
  738|      1|        return;
  739|      1|      }
  740|       |
  741|       |      // Parse a code point or character class.
  742|    302|      Optional<ClassAtom> first = tryConsumeBracketClassAtom();
  743|    302|      if (!first)
  ------------------
  |  Branch (743:11): [True: 0, False: 302]
  ------------------
  744|      0|        continue;
  745|       |
  746|       |      // See if we have a dash.
  747|    302|      if (!tryConsume('-')) {
  ------------------
  |  Branch (747:11): [True: 302, False: 0]
  ------------------
  748|    302|        addClassAtom(*first);
  749|    302|        continue;
  750|    302|      }
  751|       |
  752|       |      // We have a dash; we may have a range.
  753|      0|      Optional<ClassAtom> second = tryConsumeBracketClassAtom();
  754|      0|      if (!second) {
  ------------------
  |  Branch (754:11): [True: 0, False: 0]
  ------------------
  755|       |        // No second atom. For example: [a-].
  756|      0|        addClassAtom(*first);
  757|      0|        addClassAtom(ClassAtom('-'));
  758|      0|        continue;
  759|      0|      }
  760|       |
  761|       |      // We have a range like [a-z].
  762|       |      // Ranges can't contain character classes: [\d-z] is invalid.
  763|      0|      if (first->charClass || second->charClass) {
  ------------------
  |  Branch (763:11): [True: 0, False: 0]
  |  Branch (763:31): [True: 0, False: 0]
  ------------------
  764|      0|        if (unicode) {
  ------------------
  |  Branch (764:13): [True: 0, False: 0]
  ------------------
  765|       |          // The unicode path is an error.
  766|      0|          setError(constants::ErrorType::CharacterRange);
  767|      0|          return;
  768|      0|        } else {
  769|       |          // The non-unicode path just pretends the range doesn't exist.
  770|       |          // /[\d-A]/ is the same as /[\dA-]/.
  771|       |          // Note we still have to process all three characters. For
  772|       |          // example:
  773|       |          // [\d-a-z] contains the atoms \d, -, a, -, z.
  774|       |          // It does NOT contain the range a-z.
  775|      0|          addClassAtom(*first);
  776|      0|          addClassAtom(ClassAtom('-'));
  777|      0|          addClassAtom(*second);
  778|      0|          continue;
  779|      0|        }
  780|      0|      }
  781|       |
  782|       |      // Here we know it's a real range: [a-z] and not [\d-f].
  783|       |      // However it could be out of order: [z-a]
  784|       |      // ES6 21.2.2.15.1 "If i > j, throw a SyntaxError exception"
  785|      0|      if (first->codePoint > second->codePoint) {
  ------------------
  |  Branch (785:11): [True: 0, False: 0]
  ------------------
  786|      0|        setError(constants::ErrorType::CharacterRange);
  787|      0|        return;
  788|      0|      }
  789|       |      // This range has been validated.
  790|      0|      bracket->addRange(first->codePoint, second->codePoint);
  791|      0|    }
  792|      1|  }
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE26tryConsumeBracketClassAtomEv:
  794|    302|  Optional<ClassAtom> tryConsumeBracketClassAtom() {
  795|    302|    if (current_ == end_) {
  ------------------
  |  Branch (795:9): [True: 0, False: 302]
  ------------------
  796|      0|      return llvh::None;
  797|      0|    }
  798|    302|    CharT c = *current_;
  799|    302|    switch (c) {
  800|      0|      case ']': {
  ------------------
  |  Branch (800:7): [True: 0, False: 302]
  ------------------
  801|       |        // End of bracket. Note we don't consume it here.
  802|      0|        return llvh::None;
  803|      0|      }
  804|       |
  805|      0|      case '\\': {
  ------------------
  |  Branch (805:7): [True: 0, False: 302]
  ------------------
  806|      0|        consume('\\');
  807|      0|        if (current_ == end_) {
  ------------------
  |  Branch (807:13): [True: 0, False: 0]
  ------------------
  808|      0|          setError(constants::ErrorType::EscapeIncomplete);
  809|      0|          return llvh::None;
  810|      0|        }
  811|      0|        CharT ec = *current_;
  812|      0|        switch (ec) {
  813|       |            /// ES6 21.2.2.12 CharacterClassEscape.
  814|       |            /// Note this is used inside brackets only, like /[\d]/.
  815|      0|          case 'd':
  ------------------
  |  Branch (815:11): [True: 0, False: 0]
  ------------------
  816|      0|          case 'D': {
  ------------------
  |  Branch (816:11): [True: 0, False: 0]
  ------------------
  817|      0|            consume(ec);
  818|      0|            return ClassAtom(CharacterClass::Digits, ec == 'D' /* invert */);
  819|      0|          }
  820|      0|          case 's':
  ------------------
  |  Branch (820:11): [True: 0, False: 0]
  ------------------
  821|      0|          case 'S': {
  ------------------
  |  Branch (821:11): [True: 0, False: 0]
  ------------------
  822|      0|            consume(ec);
  823|      0|            return ClassAtom(CharacterClass::Spaces, ec == 'S' /* invert */);
  824|      0|          }
  825|      0|          case 'w':
  ------------------
  |  Branch (825:11): [True: 0, False: 0]
  ------------------
  826|      0|          case 'W': {
  ------------------
  |  Branch (826:11): [True: 0, False: 0]
  ------------------
  827|      0|            consume(ec);
  828|      0|            return ClassAtom(CharacterClass::Words, ec == 'W' /* invert */);
  829|      0|          }
  830|       |
  831|      0|          case 'b': {
  ------------------
  |  Branch (831:11): [True: 0, False: 0]
  ------------------
  832|       |            // "Return the CharSet containing the single character <BS>
  833|       |            // U+0008 (BACKSPACE)"
  834|      0|            consume('b');
  835|      0|            return ClassAtom(0x08);
  836|      0|          }
  837|       |
  838|      0|          case '-':
  ------------------
  |  Branch (838:11): [True: 0, False: 0]
  ------------------
  839|       |            // ES6 21.2.1 ClassEscape: \- escapes -, in Unicode expressions
  840|       |            // only.
  841|      0|            if ((flags_.unicode) && tryConsume('-')) {
  ------------------
  |  Branch (841:17): [True: 0, False: 0]
  |  Branch (841:37): [True: 0, False: 0]
  ------------------
  842|      0|              return ClassAtom('-');
  843|      0|            }
  844|      0|            LLVM_FALLTHROUGH;
  ------------------
  |  |  245|      0|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
  845|       |
  846|      0|          default: {
  ------------------
  |  Branch (846:11): [True: 0, False: 0]
  ------------------
  847|      0|            return ClassAtom(consumeCharacterEscape());
  848|      0|          }
  849|      0|        }
  850|      0|      }
  851|       |
  852|    302|      default: {
  ------------------
  |  Branch (852:7): [True: 302, False: 0]
  ------------------
  853|       |        // Ordinary character or surrogate pair.
  854|    302|        if (auto cp = tryConsumeSurrogatePair()) {
  ------------------
  |  Branch (854:18): [True: 0, False: 302]
  ------------------
  855|      0|          return ClassAtom(*cp);
  856|    302|        } else {
  857|    302|          return ClassAtom(consume(c));
  858|    302|        }
  859|    302|      }
  860|    302|    }
  861|    302|  }
_ZZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE21consumeCharacterClassEvENKUlRKNS7_9ClassAtomEE_clESA_:
  722|    302|    auto addClassAtom = [&bracket](const ClassAtom &atom) {
  723|    302|      if (atom.charClass) {
  ------------------
  |  Branch (723:11): [True: 0, False: 302]
  ------------------
  724|      0|        bracket->addClass(*atom.charClass);
  725|    302|      } else {
  726|    302|        bracket->addChar(atom.codePoint);
  727|    302|      }
  728|    302|    };
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE9ClassAtomC2Ej:
   37|    302|    explicit ClassAtom(CodePoint cp) : codePoint(cp) {}
_ZN6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE23tryConsumeSurrogatePairEv:
  541|   882k|  Optional<CodePoint> tryConsumeSurrogatePair() {
  542|   882k|    if (!(flags_.unicode))
  ------------------
  |  Branch (542:9): [True: 882k, False: 0]
  ------------------
  543|   882k|      return llvh::None;
  544|      0|    auto saved = current_;
  545|      0|    auto hi = consumeCharIf(isHighSurrogate);
  546|      0|    auto lo = consumeCharIf(isLowSurrogate);
  547|      0|    if (hi && lo) {
  ------------------
  |  Branch (547:9): [True: 0, False: 0]
  |  Branch (547:15): [True: 0, False: 0]
  ------------------
  548|      0|      return decodeSurrogatePair(*hi, *lo);
  549|      0|    }
  550|      0|    current_ = saved;
  551|      0|    return llvh::None;
  552|      0|  }
_ZNK6hermes5regex6ParserINS0_5RegexINS0_16UTF16RegexTraitsEEEPKDsE10maxBackRefEv:
 1226|  11.4k|  uint32_t maxBackRef() const {
 1227|  11.4k|    return maxBackRef_;
 1228|  11.4k|  }

_ZN6hermes14CompiledRegExpC2EOS0_:
  316|  11.4k|CompiledRegExp::CompiledRegExp(CompiledRegExp &&) = default;
_ZN6hermes14CompiledRegExpD2Ev:
  318|  22.9k|CompiledRegExp::~CompiledRegExp() {}
_ZN6hermes14CompiledRegExpC2ENSt3__16vectorIhNS1_9allocatorIhEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS3_IcEEEESA_ONS1_5dequeIN4llvh11SmallVectorIDsLj5EEENS3_ISE_EEEEONSC_8DenseMapINSC_8ArrayRefIDsEEjNSC_12DenseMapInfoISK_EENSC_6detail12DenseMapPairISK_jEEEE:
  329|  11.4k|      mapping_(std::move(mapping)) {}
_ZN6hermes14CompiledRegExp10tryCompileEN4llvh9StringRefES2_PS2_:
  334|  11.4k|    llvh::StringRef *outError) {
  335|  11.4k|  using namespace regex::constants;
  336|       |
  337|       |  // We have to match the way strings are constructed by StringTable, which is
  338|       |  // by interpreting UTF-8 encoded surrogates as UTF-16 surrogates.
  339|  11.4k|  llvh::SmallVector<char16_t, 16> re16;
  340|  11.4k|  convertUTF8WithSurrogatesToUTF16(
  341|  11.4k|      std::back_inserter(re16), pattern.begin(), pattern.end());
  342|       |
  343|  11.4k|  llvh::SmallVector<char16_t, 6> flags16;
  344|  11.4k|  convertUTF8WithSurrogatesToUTF16(
  345|  11.4k|      std::back_inserter(flags16), flags.begin(), flags.end());
  346|       |  // Build and compile the regexp.
  347|  11.4k|  auto re = regex::Regex<regex::UTF16RegexTraits>(re16, flags16);
  348|  11.4k|  if (!re.valid()) {
  ------------------
  |  Branch (348:7): [True: 0, False: 11.4k]
  ------------------
  349|      0|    if (outError)
  ------------------
  |  Branch (349:9): [True: 0, False: 0]
  ------------------
  350|      0|      *outError = messageForError(re.getError());
  351|      0|    return llvh::None;
  352|      0|  }
  353|  11.4k|  return CompiledRegExp(
  354|  11.4k|      re.compile(),
  355|  11.4k|      pattern,
  356|  11.4k|      flags,
  357|  11.4k|      re.acquireOrderedGroupNames(),
  358|  11.4k|      re.acquireGroupNamesMapping());
  359|  11.4k|}
_ZNK6hermes14CompiledRegExp11getBytecodeEv:
  361|     56|llvh::ArrayRef<uint8_t> CompiledRegExp::getBytecode() const {
  362|     56|  return bytecode_;
  363|     56|}
_ZNK6hermes19UniquingRegExpTable12getEntryListEv:
  365|     56|std::vector<RegExpTableEntry> UniquingRegExpTable::getEntryList() const {
  366|     56|  std::vector<RegExpTableEntry> result;
  367|     56|  result.reserve(regexps_.size());
  368|     56|  uint32_t offset = 0;
  369|     56|  for (const auto &re : regexps_) {
  ------------------
  |  Branch (369:23): [True: 28, False: 56]
  ------------------
  370|     28|    uint32_t size = re->getBytecode().size();
  371|     28|    result.push_back(RegExpTableEntry{offset, size});
  372|     28|    offset += size;
  373|     28|  }
  374|     56|  return result;
  375|     56|}
_ZNK6hermes19UniquingRegExpTable17getBytecodeBufferEv:
  377|     56|RegExpBytecode UniquingRegExpTable::getBytecodeBuffer() const {
  378|     56|  RegExpBytecode result;
  379|     56|  for (const auto &re : regexps_) {
  ------------------
  |  Branch (379:23): [True: 28, False: 56]
  ------------------
  380|     28|    auto bytecode = re->getBytecode();
  381|     28|    result.insert(result.end(), bytecode.begin(), bytecode.end());
  382|     28|  }
  383|     56|  return result;
  384|     56|}

_ZN6hermes28BacktrackingBumpPtrAllocator15allocateNewSlabEmm:
   15|  1.94k|    size_t alignment) {
   16|  1.94k|  if (size > SlabSize) {
  ------------------
  |  Branch (16:7): [True: 12, False: 1.92k]
  ------------------
   17|     12|    return allocateHuge(size);
   18|     12|  }
   19|       |
   20|  1.92k|  state_->slab++;
   21|  1.92k|  state_->offset = 0;
   22|  1.92k|  if (state_->slab == slabs_.size()) {
  ------------------
  |  Branch (22:7): [True: 1.08k, False: 841]
  ------------------
   23|       |    // Use `new Slab` without parentheses to avoid zeroing out the memory
   24|       |    // for the new slab.
   25|  1.08k|    slabs_.emplace_back(new Slab);
   26|  1.08k|  }
   27|  1.92k|  auto currentSlab =
   28|  1.92k|      reinterpret_cast<uintptr_t>(&slabs_[state_->slab].get()->data);
   29|  1.92k|  state_->offset = alignOffset(currentSlab, state_->offset, alignment);
   30|       |
   31|  1.92k|  if (LLVM_UNLIKELY(state_->offset + size > SlabSize)) {
  ------------------
  |  |  189|  1.92k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.92k]
  |  |  ------------------
  ------------------
   32|      0|    return allocateHuge(size);
   33|      0|  }
   34|       |
   35|  1.92k|  auto *ptr = (void *)(currentSlab + state_->offset);
   36|  1.92k|  state_->offset += size;
   37|  1.92k|  return ptr;
   38|  1.92k|}

_ZNK6hermes6bigint19UniquingBigIntTable12getEntryListEv:
 2366|     56|std::vector<BigIntTableEntry> UniquingBigIntTable::getEntryList() const {
 2367|     56|  std::vector<BigIntTableEntry> result;
 2368|     56|  result.reserve(bigints_.size());
 2369|     56|  uint32_t offset = 0;
 2370|     56|  for (const ParsedBigInt &bigint : bigints_) {
  ------------------
  |  Branch (2370:35): [True: 0, False: 56]
  ------------------
 2371|      0|    const uint32_t size = bigint.getBytes().size();
 2372|      0|    result.push_back(BigIntTableEntry{offset, size});
 2373|      0|    offset += size;
 2374|      0|  }
 2375|     56|  return result;
 2376|     56|}
_ZNK6hermes6bigint19UniquingBigIntTable15getDigitsBufferEv:
 2378|     56|BigIntBytes UniquingBigIntTable::getDigitsBuffer() const {
 2379|     56|  BigIntBytes result;
 2380|     56|  for (const ParsedBigInt &bigint : bigints_) {
  ------------------
  |  Branch (2380:35): [True: 0, False: 56]
  ------------------
 2381|      0|    auto bytes = bigint.getBytes();
 2382|      0|    result.insert(result.end(), bytes.begin(), bytes.end());
 2383|      0|  }
 2384|     56|  return result;
 2385|     56|}

_ZN6hermes13checkedMallocEm:
   16|  7.31k|void *checkedMalloc(size_t sz) {
   17|  7.31k|  void *res = ::malloc(sz);
   18|  7.31k|  if (LLVM_UNLIKELY(!res)) {
  ------------------
  |  |  189|  7.31k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7.31k]
  |  |  ------------------
  ------------------
   19|      0|    hermes_fatal("malloc failure");
   20|      0|  }
   21|  7.31k|  return res;
   22|  7.31k|}
_ZN6hermes13checkedCallocEmm:
   24|    317|void *checkedCalloc(size_t count, size_t size) {
   25|    317|  void *res = ::calloc(count, size);
   26|    317|  if (LLVM_UNLIKELY(!res)) {
  ------------------
  |  |  189|    317|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 317]
  |  |  ------------------
  ------------------
   27|      0|    hermes_fatal("malloc failure");
   28|      0|  }
   29|    317|  return res;
   30|    317|}

_ZN6hermes23truncateToInt32SlowPathEd:
   22|    237|int32_t truncateToInt32SlowPath(double d) {
   23|    237|  double tmp = d; // Allow d to stay in a register.
   24|    237|  uint64_t bits = llvh::DoubleToBits(tmp);
   25|    237|  int exp = (int)(bits >> 52) & 0x7FF;
   26|       |  // A negative sign is turned into 2, a positive into 0. Subtracting from 1
   27|       |  // gives us what we need.
   28|    237|  int sign = 1 - ((int)((int64_t)bits >> 62) & 2);
   29|    237|  uint64_t m = bits & 0xFFFFFFFFFFFFFul;
   30|       |
   31|       |  // Check for a denormalized exponent. We can bail early in that case.
   32|    237|  if (!exp)
  ------------------
  |  Branch (32:7): [True: 0, False: 237]
  ------------------
   33|      0|    return 0;
   34|       |
   35|       |  // Subtract the IEEE bias (1023). Additionally, move the decimal point to
   36|       |  // the right of the mantissa by further decreasing the exponent by 52.
   37|    237|  exp -= 1023 + 52;
   38|       |  // Add the implied leading 1 bit.
   39|    237|  m |= 1ull << 52;
   40|       |
   41|       |  // The sign of the exponent tells us which way to shift.
   42|    237|  if (exp >= 0) {
  ------------------
  |  Branch (42:7): [True: 237, False: 0]
  ------------------
   43|       |    // Check if the shift would push all bits out. Additionally this catches
   44|       |    // Infinity and NaN.
   45|       |    // Cast to int64 here to avoid UB for the case where sign is negative one
   46|       |    // and m << exp is exactly INT32_MIN, since a 32-bit signed int cannot hold
   47|       |    // the resulting INT32_MAX + 1. When it is returned, it will be correctly
   48|       |    // set to INT32_MIN.
   49|    237|    return exp <= 31 ? sign * (int64_t)(m << exp) : 0;
  ------------------
  |  Branch (49:12): [True: 0, False: 237]
  ------------------
   50|    237|  } else {
   51|       |    // Check if the shift would push out the entire mantissa.
   52|       |    // We need to use int64_t here in case we are multiplying
   53|       |    // -1 and 2147483648.
   54|      0|    return exp > -53 ? sign * (int64_t)(m >> -exp) : 0;
  ------------------
  |  Branch (54:12): [True: 0, False: 0]
  ------------------
   55|      0|  }
   56|    237|}
_ZN6hermes14numberToStringEdPcm:
   59|  4.04k|size_t numberToString(double m, char *dest, size_t destSize) {
   60|  4.04k|  assert(destSize >= NUMBER_TO_STRING_BUF_SIZE);
   61|      0|  (void)destSize;
   62|  4.04k|  DtoaAllocator<> dalloc{};
   63|       |
   64|  4.04k|  if (std::isnan(m)) {
  ------------------
  |  Branch (64:7): [True: 0, False: 4.04k]
  ------------------
   65|      0|    strcpy(dest, "NaN");
   66|      0|    return 3;
   67|      0|  }
   68|       |
   69|  4.04k|  if (m == 0) {
  ------------------
  |  Branch (69:7): [True: 0, False: 4.04k]
  ------------------
   70|      0|    strcpy(dest, "0");
   71|      0|    return 1;
   72|      0|  }
   73|       |
   74|  4.04k|  if (m == std::numeric_limits<double>::infinity()) {
  ------------------
  |  Branch (74:7): [True: 0, False: 4.04k]
  ------------------
   75|      0|    strcpy(dest, "Infinity");
   76|      0|    return 8;
   77|      0|  }
   78|  4.04k|  if (m == -std::numeric_limits<double>::infinity()) {
  ------------------
  |  Branch (78:7): [True: 0, False: 4.04k]
  ------------------
   79|      0|    strcpy(dest, "-Infinity");
   80|      0|    return 9;
   81|      0|  }
   82|       |
   83|       |  // After special cases, run dtoa to convert.
   84|       |  // We do this manually because we need all of the output of dtoa.
   85|       |  // Note that n, k, s are defined per ES5.1 9.8.1
   86|       |
   87|       |  // Iterator for easier population.
   88|  4.04k|  char *destPtr = dest;
   89|       |
   90|       |  // Decimal point index.
   91|  4.04k|  int n;
   92|       |
   93|       |  // 1 if negative, 0 else.
   94|  4.04k|  int sign;
   95|       |
   96|       |  // Points to the end of the string s after it's populated.
   97|  4.04k|  char *sEnd;
   98|       |
   99|  4.04k|  char *s = ::g_dtoa(dalloc, m, 0, 0, &n, &sign, &sEnd);
  100|       |
  101|  4.04k|  if (sign)
  ------------------
  |  Branch (101:7): [True: 3.97k, False: 63]
  ------------------
  102|  3.97k|    *destPtr++ = '-';
  103|       |
  104|       |  // Length of decimal representation of s.
  105|  4.04k|  int k = sEnd - s;
  106|       |
  107|  4.04k|  if (k <= n && n <= 21) {
  ------------------
  |  Branch (107:7): [True: 4.04k, False: 0]
  |  Branch (107:17): [True: 4.02k, False: 18]
  ------------------
  108|       |    // Step 6 of 9.8.1.
  109|  67.3k|    for (int i = 0; i < k; ++i) {
  ------------------
  |  Branch (109:21): [True: 63.3k, False: 4.02k]
  ------------------
  110|  63.3k|      *destPtr++ = s[i];
  111|  63.3k|    }
  112|  11.9k|    for (int i = 0; i < n - k; ++i) {
  ------------------
  |  Branch (112:21): [True: 7.90k, False: 4.02k]
  ------------------
  113|  7.90k|      *destPtr++ = '0';
  114|  7.90k|    }
  115|  4.02k|  } else if (0 < n && n <= 21) {
  ------------------
  |  Branch (115:14): [True: 18, False: 0]
  |  Branch (115:23): [True: 0, False: 18]
  ------------------
  116|       |    // Step 7 of 9.8.1.
  117|      0|    for (int i = 0; i < n; ++i) {
  ------------------
  |  Branch (117:21): [True: 0, False: 0]
  ------------------
  118|      0|      *destPtr++ = s[i];
  119|      0|    }
  120|      0|    *destPtr++ = '.';
  121|      0|    for (int i = n; i < k; ++i) {
  ------------------
  |  Branch (121:21): [True: 0, False: 0]
  ------------------
  122|      0|      *destPtr++ = s[i];
  123|      0|    }
  124|     18|  } else if (-6 < n && n <= 0) {
  ------------------
  |  Branch (124:14): [True: 18, False: 0]
  |  Branch (124:24): [True: 0, False: 18]
  ------------------
  125|       |    // Step 8 of 9.8.1.
  126|      0|    *destPtr++ = '0';
  127|      0|    *destPtr++ = '.';
  128|      0|    for (int i = 0; i < -n; ++i) {
  ------------------
  |  Branch (128:21): [True: 0, False: 0]
  ------------------
  129|      0|      *destPtr++ = '0';
  130|      0|    }
  131|      0|    for (int i = 0; i < k; ++i) {
  ------------------
  |  Branch (131:21): [True: 0, False: 0]
  ------------------
  132|      0|      *destPtr++ = s[i];
  133|      0|    }
  134|     18|  } else if (k == 1) {
  ------------------
  |  Branch (134:14): [True: 0, False: 18]
  ------------------
  135|       |    // Step 9 of 9.8.1.
  136|      0|    char nBuf[NUMBER_TO_STRING_BUF_SIZE];
  137|      0|    int nLen = ::snprintf(nBuf, sizeof(nBuf), "%d", ::abs(n - 1));
  138|       |
  139|      0|    *destPtr++ = s[0];
  140|      0|    *destPtr++ = 'e';
  141|      0|    *destPtr++ = n - 1 < 0 ? '-' : '+';
  ------------------
  |  Branch (141:18): [True: 0, False: 0]
  ------------------
  142|      0|    for (int i = 0; i < nLen; ++i) {
  ------------------
  |  Branch (142:21): [True: 0, False: 0]
  ------------------
  143|      0|      *destPtr++ = nBuf[i];
  144|      0|    }
  145|     18|  } else {
  146|       |    // Step 10 of 9.8.1.
  147|     18|    char nBuf[NUMBER_TO_STRING_BUF_SIZE];
  148|     18|    int nLen = ::snprintf(nBuf, sizeof(nBuf), "%d", ::abs(n - 1));
  149|       |
  150|     18|    *destPtr++ = s[0];
  151|     18|    *destPtr++ = '.';
  152|    296|    for (int i = 1; i < k; ++i) {
  ------------------
  |  Branch (152:21): [True: 278, False: 18]
  ------------------
  153|    278|      *destPtr++ = s[i];
  154|    278|    }
  155|     18|    *destPtr++ = 'e';
  156|     18|    *destPtr++ = n - 1 < 0 ? '-' : '+';
  ------------------
  |  Branch (156:18): [True: 0, False: 18]
  ------------------
  157|     54|    for (int i = 0; i < nLen; ++i) {
  ------------------
  |  Branch (157:21): [True: 36, False: 18]
  ------------------
  158|     36|      *destPtr++ = nBuf[i];
  159|     36|    }
  160|     18|  }
  161|       |
  162|       |  // Null-terminate
  163|  4.04k|  *destPtr++ = '\0';
  164|  4.04k|  assert(static_cast<size_t>(destPtr - dest) < NUMBER_TO_STRING_BUF_SIZE);
  165|       |
  166|      0|  g_freedtoa(dalloc, s);
  167|  4.04k|  return destPtr - dest - 1;
  168|  4.04k|}

_ZN6hermes23InternalIdentifierMaker4nextEN4llvh9StringRefE:
   15|    137|Identifier InternalIdentifierMaker::next(llvh::StringRef hint) {
   16|    137|  llvh::SmallString<16> buf;
   17|    137|  llvh::raw_svector_ostream nameBuilder{buf};
   18|    137|  nameBuilder << "?anon_" << counter_++ << "_" << hint;
   19|    137|  return stringTable_.getIdentifier(nameBuilder.str());
   20|    137|}

_ZN6hermes18appendSignedLEB128ERNSt3__16vectorIhNS0_9allocatorIhEEEEl:
   52|  3.58M|void appendSignedLEB128(std::vector<uint8_t> &vector, int64_t value) {
   53|  3.58M|  llvh::SmallVector<char, 16> data;
   54|  3.58M|  llvh::raw_svector_ostream OS(data);
   55|  3.58M|  llvh::encodeSLEB128(value, OS);
   56|       |
   57|       |  // "Convert" from char to uint8_t.
   58|  7.77M|  for (int i = 0, e = data.size(); i < e; i++) {
  ------------------
  |  Branch (58:36): [True: 4.18M, False: 3.58M]
  ------------------
   59|  4.18M|    vector.push_back((uint8_t)data[i]);
   60|  4.18M|  }
   61|  3.58M|}
_ZN6hermes16readSignedLEB128EN4llvh8ArrayRefIhEEjPl:
   66|  98.6k|    int64_t *output) {
   67|  98.6k|  unsigned size;
   68|  98.6k|  *output = llvh::decodeSLEB128(&data[offset], &size);
   69|  98.6k|  return size;
   70|  98.6k|}

_ZN6hermes8oscompat9page_sizeEv:
   90|  1.00k|size_t page_size() {
   91|  1.00k|#ifndef NDEBUG
   92|  1.00k|  if (testPgSz != 0) {
  ------------------
  |  Branch (92:7): [True: 0, False: 1.00k]
  ------------------
   93|      0|    return testPgSz;
   94|      0|  }
   95|  1.00k|#endif
   96|  1.00k|  return page_size_real();
   97|  1.00k|}
_ZN6hermes8oscompat11vm_allocateEmPv:
  179|     99|llvh::ErrorOr<void *> vm_allocate(size_t sz, void *hint) {
  180|     99|  assert(sz % page_size() == 0);
  181|      0|#ifndef NDEBUG
  182|     99|  if (testPgSz != 0 && testPgSz > static_cast<size_t>(page_size_real())) {
  ------------------
  |  Branch (182:7): [True: 0, False: 99]
  |  Branch (182:24): [True: 0, False: 0]
  ------------------
  183|      0|    return vm_allocate_aligned(sz, testPgSz);
  184|      0|  }
  185|     99|#endif // !NDEBUG
  186|     99|  return vm_mmap(hint, sz, kVMAllocateProt, kVMAllocateFlags, true);
  187|     99|}
_ZN6hermes8oscompat7vm_freeEPvm:
  214|     99|void vm_free(void *p, size_t sz) {
  215|     99|  vm_munmap(p, sz);
  216|     99|}
_ZN6hermes8oscompat18vm_reserve_alignedEmmPv:
  227|     99|vm_reserve_aligned(size_t sz, size_t alignment, void *hint) {
  228|     99|  return vm_mmap_aligned(hint, sz, alignment, kVMReserveProt, kVMReserveFlags);
  229|     99|}
_ZN6hermes8oscompat18vm_release_alignedEPvm:
  231|     99|void vm_release_aligned(void *p, size_t sz) {
  232|     99|  vm_munmap(p, sz);
  233|     99|}
_ZN6hermes8oscompat9vm_commitEPvm:
  235|    302|llvh::ErrorOr<void *> vm_commit(void *p, size_t sz) {
  236|    302|  return vm_mmap(p, sz, kVMAllocateProt, kVMAllocateFlags | MAP_FIXED, false);
  237|    302|}
_ZN6hermes8oscompat11vm_uncommitEPvm:
  239|    302|void vm_uncommit(void *p, size_t sz) {
  240|    302|  auto res = vm_mmap(p, sz, kVMReserveProt, kVMReserveFlags | MAP_FIXED, false);
  241|    302|  (void)res;
  242|    302|  assert(res && "uncommit failed");
  243|    302|}
_ZN6hermes8oscompat7vm_nameEPvmPKc:
  294|    703|void vm_name(void *p, size_t sz, const char *name) {
  295|       |#ifdef __ANDROID__
  296|       |  prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME, p, sz, name);
  297|       |#else
  298|    703|  (void)p;
  299|    703|  (void)sz;
  300|    703|  (void)name;
  301|    703|#endif // __ANDROID__
  302|    703|}
_ZN6hermes8oscompat10vm_protectEPvmNS0_11ProtectModeE:
  304|    406|bool vm_protect(void *p, size_t sz, ProtectMode mode) {
  305|    406|  auto prot = PROT_NONE;
  306|    406|  if (mode == ProtectMode::ReadWrite) {
  ------------------
  |  Branch (306:7): [True: 203, False: 203]
  ------------------
  307|    203|    prot = PROT_WRITE | PROT_READ;
  308|    203|  }
  309|    406|  int err = mprotect(p, sz, prot);
  310|    406|  return err != -1;
  311|    406|}
_ZN6hermes8oscompat20get_vm_protect_modesEPKvm:
  532|     43|std::vector<std::string> get_vm_protect_modes(const void *p, size_t sz) {
  533|     43|  std::vector<std::string> modes;
  534|     43|#if defined(__linux__)
  535|     43|  unsigned long long begin;
  536|     43|  unsigned long long end;
  537|     43|  char mode[4 + 1];
  538|     43|  FILE *fp = fopen("/proc/self/maps", "r");
  539|     43|  if (!fp) {
  ------------------
  |  Branch (539:7): [True: 0, False: 43]
  ------------------
  540|      0|    modes.emplace_back("unknown");
  541|      0|    return modes;
  542|      0|  }
  543|  2.96k|  while (fscanf(fp, "%llx-%llx %4s", &begin, &end, mode) == 3) {
  ------------------
  |  Branch (543:10): [True: 2.92k, False: 43]
  ------------------
  544|  2.92k|    if (overlap(
  ------------------
  |  Branch (544:9): [True: 43, False: 2.87k]
  ------------------
  545|  2.92k|            reinterpret_cast<uintptr_t>(p),
  546|  2.92k|            sz,
  547|  2.92k|            static_cast<uintptr_t>(begin),
  548|  2.92k|            static_cast<size_t>(end - begin))) {
  549|     43|      modes.push_back(mode);
  550|     43|    }
  551|       |    // Discard remainder of the line.
  552|  2.92k|    int result;
  553|   178k|    do {
  554|   178k|      result = fgetc(fp);
  555|   178k|    } while (result != '\n' && result > 0);
  ------------------
  |  Branch (555:14): [True: 175k, False: 2.92k]
  |  Branch (555:32): [True: 175k, False: 0]
  ------------------
  556|  2.92k|  }
  557|     43|#endif
  558|     43|  return modes;
  559|     43|}
_ZN6hermes8oscompat15set_thread_nameEPKc:
  610|    198|void set_thread_name(const char *name) {
  611|       |  // Set the thread name for TSAN. It doesn't share the same name mapping as the
  612|       |  // OS does. This macro expands to nothing if TSAN isn't on.
  613|    198|  TsanThreadName(name);
  614|    198|#if defined(__linux__) || defined(__ANDROID__)
  615|    198|  prctl(PR_SET_NAME, name);
  616|       |#elif defined(__APPLE__)
  617|       |  ::pthread_setname_np(name);
  618|       |#endif
  619|       |  // Do nothing if the platform doesn't support it.
  620|    198|}
_ZN6hermes8oscompat15thread_cpu_timeEv:
  649|  1.15k|std::chrono::microseconds thread_cpu_time() {
  650|  1.15k|  using namespace std::chrono;
  651|       |
  652|  1.15k|  struct timespec ts;
  653|       |
  654|  1.15k|  if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) != 0) {
  ------------------
  |  Branch (654:7): [True: 0, False: 1.15k]
  ------------------
  655|      0|    return microseconds::max();
  656|      0|  }
  657|       |
  658|  1.15k|  microseconds::rep total = 0;
  659|  1.15k|  total += ts.tv_nsec / 1000;
  660|  1.15k|  total += ts.tv_sec * 1000000;
  661|  1.15k|  return microseconds(total);
  662|  1.15k|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL14page_size_realEv:
   86|  1.90k|static inline size_t page_size_real() {
   87|  1.90k|  return getpagesize();
   88|  1.90k|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL7vm_mmapEPvmiib:
  113|    802|vm_mmap(void *addr, size_t sz, int prot, int flags, bool checkDebugLimit) {
  114|    802|  assert(sz % page_size_real() == 0);
  115|      0|#ifndef NDEBUG
  116|    802|  if (checkDebugLimit) {
  ------------------
  |  Branch (116:7): [True: 198, False: 604]
  ------------------
  117|    198|    if (LLVM_UNLIKELY(sz > totalVMAllocLimit)) {
  ------------------
  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  118|      0|      return make_error_code(OOMError::TestVMLimitReached);
  119|    198|    } else if (LLVM_UNLIKELY(totalVMAllocLimit != unsetVMAllocLimit)) {
  ------------------
  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  ------------------
  ------------------
  120|      0|      totalVMAllocLimit -= sz;
  121|      0|    }
  122|    198|  }
  123|    802|#endif // !NDEBUG
  124|    802|  void *result = mmap(addr, sz, prot, flags, -1, 0);
  125|    802|  if (result == MAP_FAILED) {
  ------------------
  |  Branch (125:7): [True: 0, False: 802]
  ------------------
  126|       |    // Since mmap is a POSIX API, even on MacOS, errno should use the POSIX
  127|       |    // generic_category.
  128|      0|    return std::error_code(errno, std::generic_category());
  129|      0|  }
  130|    802|  return result;
  131|    802|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL10alignAllocEPvm:
  145|     99|static char *alignAlloc(void *p, size_t alignment) {
  146|     99|  return reinterpret_cast<char *>(
  147|     99|      llvh::alignTo(reinterpret_cast<uintptr_t>(p), alignment));
  148|     99|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL9vm_munmapEPvm:
  133|    297|static void vm_munmap(void *addr, size_t sz) {
  134|    297|  auto ret = munmap(addr, sz);
  135|    297|  assert(!ret && "Failed to free memory region.");
  136|      0|  (void)ret;
  137|       |
  138|    297|#ifndef NDEBUG
  139|    297|  if (LLVM_UNLIKELY(totalVMAllocLimit != unsetVMAllocLimit) && addr) {
  ------------------
  |  |  189|    594|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 297]
  |  |  ------------------
  ------------------
  |  Branch (139:64): [True: 0, False: 0]
  ------------------
  140|      0|    totalVMAllocLimit += sz;
  141|      0|  }
  142|    297|#endif
  143|    297|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL15vm_mmap_alignedEPvmmii:
  151|     99|vm_mmap_aligned(void *addr, size_t sz, size_t alignment, int prot, int flags) {
  152|     99|  assert(sz > 0 && sz % page_size() == 0);
  153|      0|  assert(alignment > 0 && alignment % page_size() == 0);
  154|       |
  155|       |  // Allocate a larger section to ensure that it contains  a subsection that
  156|       |  // satisfies the request. Use *real* page size here since that's what vm_mmap
  157|       |  // guarantees.
  158|      0|  const size_t excessSize = sz + alignment - page_size_real();
  159|     99|  auto result = vm_mmap(addr, excessSize, prot, flags, true);
  160|     99|  if (!result)
  ------------------
  |  Branch (160:7): [True: 0, False: 99]
  ------------------
  161|      0|    return result;
  162|       |
  163|     99|  void *raw = *result;
  164|     99|  char *aligned = alignAlloc(raw, alignment);
  165|     99|  size_t excessAtFront = aligned - static_cast<char *>(raw);
  166|     99|  size_t excessAtBack = excessSize - excessAtFront - sz;
  167|       |
  168|     99|  if (excessAtFront)
  ------------------
  |  Branch (168:7): [True: 0, False: 99]
  ------------------
  169|      0|    vm_munmap(raw, excessAtFront);
  170|     99|  if (excessAtBack)
  ------------------
  |  Branch (170:7): [True: 99, False: 0]
  ------------------
  171|     99|    vm_munmap(aligned + sz, excessAtBack);
  172|       |
  173|     99|  return aligned;
  174|     99|}
OSCompatPosix.cpp:_ZN6hermes8oscompatL7overlapEmmmm:
  520|  3.22k|static bool overlap(uintptr_t a, size_t asize, uintptr_t b, size_t bsize) {
  521|       |  // An empty interval has no overlap.
  522|  3.22k|  if (asize == 0 || bsize == 0)
  ------------------
  |  Branch (522:7): [True: 0, False: 3.22k]
  |  Branch (522:21): [True: 0, False: 3.22k]
  ------------------
  523|      0|    return false;
  524|       |  // Order by start address.
  525|  3.22k|  if (a > b)
  ------------------
  |  Branch (525:7): [True: 301, False: 2.92k]
  ------------------
  526|    301|    return overlap(b, bsize, a, asize);
  527|       |  // Overlap iff the first interval extends beyond the start of the second.
  528|  2.92k|  return a + asize > b;
  529|  3.22k|}

_ZN6hermes17SimpleDiagHandler11installIntoERNS_18SourceErrorManagerE:
   14|     99|void SimpleDiagHandler::installInto(hermes::SourceErrorManager &sm) {
   15|     99|  sm.setDiagHandler(handler, this);
   16|     99|}
_ZN6hermes17SimpleDiagHandler7handlerERKN4llvh12SMDiagnosticEPv:
   18|    248|void SimpleDiagHandler::handler(const llvh::SMDiagnostic &msg, void *ctx) {
   19|    248|  auto *mgr = static_cast<SimpleDiagHandler *>(ctx);
   20|    248|  if (msg.getKind() == llvh::SourceMgr::DK_Error) {
  ------------------
  |  Branch (20:7): [True: 86, False: 162]
  ------------------
   21|     86|    if (!mgr->haveErrors()) {
  ------------------
  |  Branch (21:9): [True: 43, False: 43]
  ------------------
   22|     43|      mgr->firstMessage_ = msg;
   23|     43|    }
   24|     86|  }
   25|    248|}
_ZNK6hermes17SimpleDiagHandler14getErrorStringEv:
   27|     43|std::string SimpleDiagHandler::getErrorString() const {
   28|     43|  const auto &msg = getFirstMessage();
   29|     43|  return (Twine(msg.getLineNo()) + ":" + Twine(msg.getColumnNo() + 1) + ":" +
   30|     43|          msg.getMessage())
   31|     43|      .str();
   32|     43|}
_ZN6hermes21SimpleDiagHandlerRAIIC2ERNS_18SourceErrorManagerE:
   39|     99|      oldErrorLimit_(sourceErrorManager.getErrorLimit()) {
   40|     99|  installInto(sourceErrorManager);
   41|     99|  sourceErrorManager.clearErrorLimitReached();
   42|     99|  sourceErrorManager.setErrorLimit(1);
   43|     99|}
_ZN6hermes21SimpleDiagHandlerRAIID2Ev:
   45|     99|SimpleDiagHandlerRAII::~SimpleDiagHandlerRAII() {
   46|     99|  sourceErrorManager_.clearErrorLimitReached();
   47|     99|  sourceErrorManager_.setErrorLimit(oldErrorLimit_);
   48|     99|  sourceErrorManager_.setDiagHandler(oldHandler_, oldContext_);
   49|     99|}

_ZN6hermes18SourceErrorManagerC2Ev:
   22|     99|      warningsAreErrors_((unsigned)Warning::_NumWarnings, false) {
   23|     99|  sm_.setDiagHandler(SourceErrorManager::printDiagnostic, this);
   24|     99|}
_ZNK6hermes18SourceErrorManager15BufferedMessage5notesERKNSt3__16vectorINS0_11MessageDataENS2_9allocatorIS4_EEEE:
   41|     18|    const std::vector<MessageData> &bufferedNotes) const {
   42|     18|  if (!noteCount_)
  ------------------
  |  Branch (42:7): [True: 18, False: 0]
  ------------------
   43|     18|    return {nullptr, nullptr};
   44|      0|  return {
   45|      0|      bufferedNotes.data() + firstNote_,
   46|      0|      bufferedNotes.data() + firstNote_ + noteCount_};
   47|     18|}
_ZN6hermes18SourceErrorManager15enableBufferingEv:
   49|     65|void SourceErrorManager::enableBuffering() {
   50|     65|  ++bufferingEnabled_;
   51|     65|  assert(bufferingEnabled_ != 0 && "unsigned counter overflow");
   52|     65|}
_ZN6hermes18SourceErrorManager16disableBufferingEv:
   54|     65|void SourceErrorManager::disableBuffering() {
   55|     65|  assert(bufferingEnabled_ != 0 && "unsigned counter underflow");
   56|       |
   57|     65|  if (--bufferingEnabled_ != 0)
  ------------------
  |  Branch (57:7): [True: 0, False: 65]
  ------------------
   58|      0|    return;
   59|       |
   60|       |  // Sort all messages.
   61|     65|  std::sort(
   62|     65|      bufferedMessages_.begin(),
   63|     65|      bufferedMessages_.end(),
   64|     65|      [](const BufferedMessage &a, const BufferedMessage &b) {
   65|       |        // Make sure the "too many errors" message is always last.
   66|     65|        if (a.dk == DK_Error && !a.loc.isValid() && a.msg == sTooManyErrors)
   67|     65|          return false;
   68|     65|        if (b.dk == DK_Error && !b.loc.isValid() && b.msg == sTooManyErrors)
   69|     65|          return true;
   70|     65|        return a.loc.getPointer() < b.loc.getPointer();
   71|     65|      });
   72|       |
   73|       |  // Print them.
   74|     65|  for (const auto &bm : bufferedMessages_) {
  ------------------
  |  Branch (74:23): [True: 18, False: 65]
  ------------------
   75|     18|    doPrintMessage(bm.dk, bm.loc, bm.sm, bm.msg);
   76|     18|    for (const auto &note : bm.notes(bufferedNotes_))
  ------------------
  |  Branch (76:27): [True: 0, False: 18]
  ------------------
   77|      0|      doPrintMessage(note.dk, note.loc, note.sm, note.msg);
   78|     18|  }
   79|       |
   80|       |  // Clean the buffer.
   81|     65|  bufferedMessages_.clear();
   82|     65|  bufferedNotes_.clear();
   83|     65|}
_ZN6hermes18SourceErrorManager18addNewSourceBufferENSt3__110unique_ptrIN4llvh12MemoryBufferENS1_14default_deleteIS4_EEEE:
   86|    198|    std::unique_ptr<llvh::MemoryBuffer> f) {
   87|    198|  unsigned bufId = sm_.AddNewSourceBuffer(std::move(f), SMLoc{});
   88|    198|  assert(
   89|    198|      !isVirtualBufferId(bufId) && "unexpected virtual buf id from SourceMgr");
   90|      0|  return bufId;
   91|    198|}
_ZNK6hermes18SourceErrorManager17getBufferFileNameEj:
  101|     56|llvh::StringRef SourceErrorManager::getBufferFileName(unsigned bufId) const {
  102|     56|  if (isVirtualBufferId(bufId))
  ------------------
  |  Branch (102:7): [True: 0, False: 56]
  ------------------
  103|      0|    return virtualBufferNames_[virtualBufferIdToIndex(bufId)];
  104|     56|  else
  105|     56|    return sm_.getMemoryBuffer(bufId)->getBufferIdentifier();
  106|     56|}
_ZN6hermes18SourceErrorManager18countAndGenMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  128|    205|    const Twine &msg) {
  129|    205|  ++messageCount_[dk];
  130|    205|  doGenMessage(dk, loc, sm, msg);
  131|       |
  132|    205|  if (LLVM_UNLIKELY(dk == DK_Error && messageCount_[DK_Error] == errorLimit_)) {
  ------------------
  |  |  189|    248|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 43, False: 162]
  |  |  |  Branch (189:53): [True: 43, False: 162]
  |  |  |  Branch (189:53): [True: 43, False: 0]
  |  |  ------------------
  ------------------
  133|     43|    errorLimitReached_ = true;
  134|     43|    doGenMessage(DK_Error, {}, {}, sTooManyErrors);
  135|     43|  }
  136|    205|}
_ZN6hermes18SourceErrorManager12doGenMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  142|    248|    llvh::Twine const &msg) {
  143|    248|  if (bufferingEnabled_) {
  ------------------
  |  Branch (143:7): [True: 18, False: 230]
  ------------------
  144|       |    // If this message is a note, try to associate it with the last message.
  145|       |    // Note that theoretically the first buffered message could be a note, so
  146|       |    // we play it safe here (even though it should never happen).
  147|     18|    if (dk == DK_Note && !bufferedMessages_.empty()) {
  ------------------
  |  Branch (147:9): [True: 0, False: 18]
  |  Branch (147:26): [True: 0, False: 0]
  ------------------
  148|      0|      bufferedMessages_.back().addNote(bufferedNotes_, dk, loc, sm, msg.str());
  149|     18|    } else {
  150|     18|      bufferedMessages_.emplace_back(dk, loc, sm, msg.str());
  151|     18|    }
  152|    230|  } else {
  153|    230|    doPrintMessage(dk, loc, sm, msg);
  154|    230|  }
  155|    248|}
_ZN6hermes18SourceErrorManager14doPrintMessageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineE:
  161|    248|    const Twine &msg) {
  162|    248|  sm_.PrintMessage(
  163|    248|      loc,
  164|    248|      static_cast<llvh::SourceMgr::DiagKind>(dk),
  165|    248|      msg,
  166|    248|      sm.isValid() ? llvh::ArrayRef<SMRange>(sm)
  ------------------
  |  Branch (166:7): [True: 174, False: 74]
  ------------------
  167|    248|                   : llvh::ArrayRef<SMRange>(llvh::None),
  168|    248|      llvh::None,
  169|    248|      outputOptions_.showColors);
  170|    248|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineENS_7WarningENS_9SubsystemE:
  178|  1.26k|    Subsystem subsystem) {
  179|  1.26k|  assert(dk <= DK_Note);
  180|  1.26k|  if (suppressMessages_) {
  ------------------
  |  Branch (180:7): [True: 1.02k, False: 241]
  ------------------
  181|  1.02k|    if (*suppressMessages_ == Subsystem::Unspecified) {
  ------------------
  |  Branch (181:9): [True: 1.02k, False: 0]
  ------------------
  182|  1.02k|      return;
  183|  1.02k|    }
  184|      0|    if (subsystem == *suppressMessages_) {
  ------------------
  |  Branch (184:9): [True: 0, False: 0]
  ------------------
  185|      0|      return;
  186|      0|    }
  187|      0|  }
  188|       |  // Suppress all messages once the error limit has been reached.
  189|    241|  if (LLVM_UNLIKELY(errorLimitReached_))
  ------------------
  |  |  189|    241|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 36, False: 205]
  |  |  ------------------
  ------------------
  190|     36|    return;
  191|    205|  if (dk == DK_Warning && !isWarningEnabled(w)) {
  ------------------
  |  Branch (191:7): [True: 162, False: 43]
  |  Branch (191:27): [True: 0, False: 162]
  ------------------
  192|      0|    lastMessageSuppressed_ = true;
  193|      0|    return;
  194|      0|  }
  195|       |  // Automatically suppress notes if the last message was suppressed.
  196|    205|  if (dk == DK_Note && lastMessageSuppressed_)
  ------------------
  |  Branch (196:7): [True: 0, False: 205]
  |  Branch (196:24): [True: 0, False: 0]
  ------------------
  197|      0|    return;
  198|    205|  lastMessageSuppressed_ = false;
  199|       |
  200|       |  /// Optionally upgrade warnings into errors.
  201|    205|  if (dk == DK_Warning && isWarningAnError(w)) {
  ------------------
  |  Branch (201:7): [True: 162, False: 43]
  |  Branch (201:27): [True: 0, False: 162]
  ------------------
  202|      0|    dk = DK_Error;
  203|      0|  }
  204|    205|  assert(static_cast<unsigned>(dk) < kMessageCountSize && "bounds check");
  205|       |
  206|    205|  if (externalMessageBuffer_) {
  ------------------
  |  Branch (206:7): [True: 0, False: 205]
  ------------------
  207|      0|    externalMessageBuffer_->addMessage(dk, loc, sm, msg);
  208|      0|    return;
  209|      0|  }
  210|       |
  211|    205|  countAndGenMessage(dk, loc, sm, msg);
  212|    205|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocENS2_7SMRangeERKNS2_5TwineENS_9SubsystemE:
  219|  1.10k|    Subsystem subsystem) {
  220|  1.10k|  message(dk, loc, sm, msg, Warning::NoWarning, subsystem);
  221|  1.10k|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh7SMRangeERKNS2_5TwineENS_9SubsystemE:
  227|     32|    Subsystem subsystem) {
  228|     32|  message(dk, sm.Start, sm, msg, subsystem);
  229|     32|}
_ZN6hermes18SourceErrorManager7messageENS0_8DiagKindEN4llvh5SMLocERKNS2_5TwineENS_9SubsystemE:
  235|  1.07k|    Subsystem subsystem) {
  236|  1.07k|  message(dk, loc, SMRange{}, msg, subsystem);
  237|  1.07k|}
_ZNK6hermes18SourceErrorManager17findBufferAndLineEN4llvh5SMLocE:
  240|  35.2k|    -> llvh::Optional<LineCoord> {
  241|  35.2k|  if (!loc.isValid())
  ------------------
  |  Branch (241:7): [True: 0, False: 35.2k]
  ------------------
  242|      0|    return llvh::None;
  243|       |
  244|  35.2k|  auto bufId = sm_.FindBufferContainingLoc(loc);
  245|  35.2k|  if (!bufId)
  ------------------
  |  Branch (245:7): [True: 0, False: 35.2k]
  ------------------
  246|      0|    return llvh::None;
  247|       |
  248|  35.2k|  auto lineRefAndNo = sm_.FindLine(loc, bufId);
  249|       |
  250|  35.2k|  return LineCoord{bufId, lineRefAndNo.second, lineRefAndNo.first};
  251|  35.2k|}
_ZN6hermes18SourceErrorManager20findBufferLineAndLocEN4llvh5SMLocERNS0_12SourceCoordsE:
  288|  1.00M|bool SourceErrorManager::findBufferLineAndLoc(SMLoc loc, SourceCoords &result) {
  289|  1.00M|  if (!loc.isValid()) {
  ------------------
  |  Branch (289:7): [True: 0, False: 1.00M]
  ------------------
  290|      0|    result.bufId = 0;
  291|      0|    return false;
  292|      0|  }
  293|       |
  294|  1.00M|  if (findLineCache_.bufferId) {
  ------------------
  |  Branch (294:7): [True: 1.00M, False: 63]
  ------------------
  295|       |    // Check the cache with the hope that the lookup is within the last line or
  296|       |    // the next line.
  297|  1.00M|    if (locInside(findLineCache_.lineRef, loc)) {
  ------------------
  |  Branch (297:9): [True: 896k, False: 105k]
  ------------------
  298|   896k|      findLineCache_.fillCoords(loc, result);
  299|   896k|      return true;
  300|   896k|    }
  301|   105k|    if (locInside(findLineCache_.nextLineRef, loc)) {
  ------------------
  |  Branch (301:9): [True: 69.8k, False: 35.2k]
  ------------------
  302|  69.8k|      ++findLineCache_.lineNo;
  303|  69.8k|      findLineCache_.lineRef = findLineCache_.nextLineRef;
  304|  69.8k|      findLineCache_.nextLineRef =
  305|  69.8k|          sm_.getLineRef(findLineCache_.lineNo + 1, findLineCache_.bufferId);
  306|       |
  307|  69.8k|      findLineCache_.fillCoords(loc, result);
  308|  69.8k|      return true;
  309|  69.8k|    }
  310|       |
  311|  35.2k|    findLineCache_.bufferId = 0;
  312|  35.2k|  }
  313|       |
  314|  35.2k|  auto lineCoord = findBufferAndLine(loc);
  315|  35.2k|  if (!lineCoord) {
  ------------------
  |  Branch (315:7): [True: 0, False: 35.2k]
  ------------------
  316|      0|    result.bufId = 0;
  317|      0|    return false;
  318|      0|  }
  319|       |
  320|       |  // Populate the cache.
  321|  35.2k|  findLineCache_.bufferId = lineCoord->bufId;
  322|  35.2k|  findLineCache_.lineNo = lineCoord->lineNo;
  323|  35.2k|  findLineCache_.lineRef = lineCoord->lineRef;
  324|  35.2k|  findLineCache_.nextLineRef =
  325|  35.2k|      sm_.getLineRef(findLineCache_.lineNo + 1, lineCoord->bufId);
  326|       |
  327|  35.2k|  findLineCache_.fillCoords(loc, result);
  328|  35.2k|  return true;
  329|  35.2k|}
_ZN6hermes18SourceErrorManager20findBufferLineAndLocEN4llvh5SMLocERNS0_12SourceCoordsEb:
  334|  1.00M|    bool translate) {
  335|  1.00M|  if (!findBufferLineAndLoc(loc, result))
  ------------------
  |  Branch (335:7): [True: 0, False: 1.00M]
  ------------------
  336|      0|    return false;
  337|  1.00M|  if (translate && translator_)
  ------------------
  |  Branch (337:7): [True: 1.00M, False: 0]
  |  Branch (337:20): [True: 0, False: 1.00M]
  ------------------
  338|      0|    translator_->translate(result);
  339|  1.00M|  return true;
  340|  1.00M|}
_ZN6hermes18SourceErrorManager20convertEndToLocationEN4llvh7SMRangeE:
  616|   114k|SMLoc SourceErrorManager::convertEndToLocation(SMRange range) {
  617|       |  // If the range is empty, return the starting point.
  618|   114k|  if (range.Start == range.End)
  ------------------
  |  Branch (618:7): [True: 0, False: 114k]
  ------------------
  619|      0|    return range.Start;
  620|       |
  621|   114k|  return SMLoc::getFromPointer(range.End.getPointer() - 1);
  622|   114k|}
SourceErrorManager.cpp:_ZN6hermesL9locInsideEN4llvh9StringRefENS0_5SMLocE:
  274|  1.10M|static bool locInside(llvh::StringRef str, SMLoc loc) {
  275|  1.10M|  const char *ptr = loc.getPointer();
  276|  1.10M|  return ptr >= str.begin() && ptr < str.end();
  ------------------
  |  Branch (276:10): [True: 1.07M, False: 30.7k]
  |  Branch (276:32): [True: 966k, False: 109k]
  ------------------
  277|  1.10M|}
_ZN6hermes18SourceErrorManager13FindLineCache10fillCoordsEN4llvh5SMLocERNS0_12SourceCoordsE:
  281|  1.00M|    SourceCoords &result) {
  282|  1.00M|  loc = adjustSourceLocation(lineRef.data(), loc);
  283|  1.00M|  result.bufId = bufferId;
  284|  1.00M|  result.line = lineNo;
  285|  1.00M|  result.col = loc.getPointer() - lineRef.data() + 1;
  286|  1.00M|}
SourceErrorManager.cpp:_ZN6hermesL20adjustSourceLocationEPKcN4llvh5SMLocE:
  255|  1.00M|static inline SMLoc adjustSourceLocation(const char *bufStart, SMLoc loc) {
  256|  1.00M|  const char *ptr = loc.getPointer();
  257|       |  // In the very unlikely case that `loc` points to a '\r', we skip backwards
  258|       |  // until we find another character, while being careful not to fall off the
  259|       |  // beginning of the buffer.
  260|  1.00M|  if (LLVM_UNLIKELY(*ptr == '\r') ||
  ------------------
  |  |  189|  2.00M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.00M]
  |  |  ------------------
  ------------------
  261|  1.00M|      LLVM_UNLIKELY(isUTF8ContinuationByte(*ptr))) {
  ------------------
  |  |  189|  1.00M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.00M]
  |  |  ------------------
  ------------------
  262|      0|    do {
  263|      0|      if (LLVM_UNLIKELY(ptr == bufStart)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  264|       |        // This is highly unlikely but theoretically possible. There were only
  265|       |        // '\r' between `loc` and the start of the buffer.
  266|      0|        break;
  267|      0|      }
  268|      0|      --ptr;
  269|      0|    } while (*ptr == '\r' || isUTF8ContinuationByte(*ptr));
  ------------------
  |  Branch (269:14): [True: 0, False: 0]
  |  Branch (269:30): [True: 0, False: 0]
  ------------------
  270|      0|  }
  271|      0|  return SMLoc::getFromPointer(ptr);
  272|  1.00M|}
SourceErrorManager.cpp:_ZZN6hermes18SourceErrorManager16disableBufferingEvENK3$_0clERKNS0_15BufferedMessageES4_:
   64|      9|      [](const BufferedMessage &a, const BufferedMessage &b) {
   65|       |        // Make sure the "too many errors" message is always last.
   66|      9|        if (a.dk == DK_Error && !a.loc.isValid() && a.msg == sTooManyErrors)
  ------------------
  |  Branch (66:13): [True: 9, False: 0]
  |  Branch (66:33): [True: 9, False: 0]
  |  Branch (66:53): [True: 9, False: 0]
  ------------------
   67|      9|          return false;
   68|      0|        if (b.dk == DK_Error && !b.loc.isValid() && b.msg == sTooManyErrors)
  ------------------
  |  Branch (68:13): [True: 0, False: 0]
  |  Branch (68:33): [True: 0, False: 0]
  |  Branch (68:53): [True: 0, False: 0]
  ------------------
   69|      0|          return true;
   70|      0|        return a.loc.getPointer() < b.loc.getPointer();
   71|      0|      });

_ZN6hermes10encodeUTF8ERPcj:
   12|   286k|void encodeUTF8(char *&dst, uint32_t cp) {
   13|   286k|  char *d = dst;
   14|   286k|  if (cp <= 0x7F) {
  ------------------
  |  Branch (14:7): [True: 226k, False: 59.6k]
  ------------------
   15|   226k|    *d = (char)cp;
   16|   226k|    ++d;
   17|   226k|  } else if (cp <= 0x7FF) {
  ------------------
  |  Branch (17:14): [True: 8.26k, False: 51.3k]
  ------------------
   18|  8.26k|    d[1] = (cp & 0x3F) | 0x80;
   19|  8.26k|    cp >>= 6;
   20|  8.26k|    d[0] = (cp & 0x1F) | 0xC0;
   21|  8.26k|    d += 2;
   22|  51.3k|  } else if (cp <= 0xFFFF) {
  ------------------
  |  Branch (22:14): [True: 51.3k, False: 45]
  ------------------
   23|  51.3k|    d[2] = (cp & 0x3F) | 0x80;
   24|  51.3k|    cp >>= 6;
   25|  51.3k|    d[1] = (cp & 0x3F) | 0x80;
   26|  51.3k|    cp >>= 6;
   27|  51.3k|    d[0] = (cp & 0x0F) | 0xE0;
   28|  51.3k|    d += 3;
   29|  51.3k|  } else if (cp <= 0x1FFFFF) {
  ------------------
  |  Branch (29:14): [True: 45, False: 0]
  ------------------
   30|     45|    d[3] = (cp & 0x3F) | 0x80;
   31|     45|    cp >>= 6;
   32|     45|    d[2] = (cp & 0x3F) | 0x80;
   33|     45|    cp >>= 6;
   34|     45|    d[1] = (cp & 0x3F) | 0x80;
   35|     45|    cp >>= 6;
   36|     45|    d[0] = (cp & 0x07) | 0xF0;
   37|     45|    d += 4;
   38|     45|  } else if (cp <= 0x3FFFFFF) {
  ------------------
  |  Branch (38:14): [True: 0, False: 0]
  ------------------
   39|      0|    d[4] = (cp & 0x3F) | 0x80;
   40|      0|    cp >>= 6;
   41|      0|    d[3] = (cp & 0x3F) | 0x80;
   42|      0|    cp >>= 6;
   43|      0|    d[2] = (cp & 0x3F) | 0x80;
   44|      0|    cp >>= 6;
   45|      0|    d[1] = (cp & 0x3F) | 0x80;
   46|      0|    cp >>= 6;
   47|      0|    d[0] = (cp & 0x03) | 0xF8;
   48|      0|    d += 5;
   49|      0|  } else {
   50|      0|    d[5] = (cp & 0x3F) | 0x80;
   51|      0|    cp >>= 6;
   52|      0|    d[4] = (cp & 0x3F) | 0x80;
   53|      0|    cp >>= 6;
   54|      0|    d[3] = (cp & 0x3F) | 0x80;
   55|      0|    cp >>= 6;
   56|      0|    d[2] = (cp & 0x3F) | 0x80;
   57|      0|    cp >>= 6;
   58|      0|    d[1] = (cp & 0x3F) | 0x80;
   59|      0|    cp >>= 6;
   60|      0|    d[0] = (cp & 0x01) | 0xFC;
   61|      0|    d += 6;
   62|      0|  }
   63|   286k|  dst = d;
   64|   286k|}
_ZN6hermes34convertUTF16ToUTF8WithReplacementsERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEN4llvh8ArrayRefIDsEEm:
   69|  67.1k|    size_t maxCharacters) {
   70|  67.1k|  out.clear();
   71|  67.1k|  out.reserve(input.size());
   72|       |  // Stop early if we've reached currNumCharacters worth of UTF-8 characters.
   73|  67.1k|  size_t currNumCharacters = 0;
   74|  67.1k|  if (!maxCharacters) {
  ------------------
  |  Branch (74:7): [True: 67.1k, False: 0]
  ------------------
   75|       |    // Condition checks are easier if this number is set to the max value.
   76|  67.1k|    maxCharacters = std::numeric_limits<size_t>::max();
   77|  67.1k|  }
   78|  67.1k|  for (auto cur = input.begin(), end = input.end();
   79|  8.14M|       cur < end && currNumCharacters < maxCharacters;
  ------------------
  |  Branch (79:8): [True: 8.08M, False: 67.1k]
  |  Branch (79:21): [True: 8.08M, False: 0]
  ------------------
   80|  8.08M|       ++cur, ++currNumCharacters) {
   81|  8.08M|    char16_t c = cur[0];
   82|       |    // ASCII fast-path.
   83|  8.08M|    if (LLVM_LIKELY(c <= 0x7F)) {
  ------------------
  |  |  188|  8.08M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 8.08M, False: 22]
  |  |  ------------------
  ------------------
   84|  8.08M|      out.push_back(static_cast<char>(c));
   85|  8.08M|      continue;
   86|  8.08M|    }
   87|       |
   88|     22|    char32_t c32;
   89|     22|    if (isLowSurrogate(cur[0])) {
  ------------------
  |  Branch (89:9): [True: 0, False: 22]
  ------------------
   90|       |      // Unpaired low surrogate.
   91|      0|      c32 = UNICODE_REPLACEMENT_CHARACTER;
   92|     22|    } else if (isHighSurrogate(cur[0])) {
  ------------------
  |  Branch (92:16): [True: 0, False: 22]
  ------------------
   93|       |      // Leading high surrogate. See if the next character is a low surrogate.
   94|      0|      if (cur + 1 == end || !isLowSurrogate(cur[1])) {
  ------------------
  |  Branch (94:11): [True: 0, False: 0]
  |  Branch (94:29): [True: 0, False: 0]
  ------------------
   95|       |        // Trailing or unpaired high surrogate.
   96|      0|        c32 = UNICODE_REPLACEMENT_CHARACTER;
   97|      0|      } else {
   98|       |        // Decode surrogate pair and increment, because we consumed two chars.
   99|      0|        c32 = decodeSurrogatePair(cur[0], cur[1]);
  100|      0|        ++cur;
  101|      0|      }
  102|     22|    } else {
  103|       |      // Not a surrogate.
  104|     22|      c32 = c;
  105|     22|    }
  106|       |
  107|     22|    char buff[UTF8CodepointMaxBytes];
  108|     22|    char *ptr = buff;
  109|     22|    encodeUTF8(ptr, c32);
  110|     22|    out.insert(out.end(), buff, ptr);
  111|     22|  }
  112|  67.1k|  return currNumCharacters < maxCharacters;
  113|  67.1k|}
_ZN6hermes38convertUTF16ToUTF8WithSingleSurrogatesERNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEN4llvh8ArrayRefIDsEE:
  117|    273|    llvh::ArrayRef<char16_t> input) {
  118|    273|  dest.clear();
  119|    273|  dest.reserve(input.size());
  120|  2.04M|  for (char16_t c : input) {
  ------------------
  |  Branch (120:19): [True: 2.04M, False: 273]
  ------------------
  121|       |    // ASCII fast-path.
  122|  2.04M|    if (LLVM_LIKELY(c <= 0x7F)) {
  ------------------
  |  |  188|  2.04M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 2.03M, False: 10.0k]
  |  |  ------------------
  ------------------
  123|  2.03M|      dest.push_back(static_cast<char>(c));
  124|  2.03M|      continue;
  125|  2.03M|    }
  126|  10.0k|    char32_t c32 = c;
  127|  10.0k|    char buff[UTF8CodepointMaxBytes];
  128|  10.0k|    char *ptr = buff;
  129|  10.0k|    encodeUTF8(ptr, c32);
  130|  10.0k|    dest.insert(dest.end(), buff, ptr);
  131|  10.0k|  }
  132|    273|}
_ZN6hermes10isAllASCIIEPKhS1_:
  134|  1.13k|bool isAllASCII(const uint8_t *start, const uint8_t *end) {
  135|  1.13k|  const uint8_t *cursor = start;
  136|  1.13k|  size_t len = end - start;
  137|  1.13k|  static_assert(
  138|  1.13k|      sizeof(uint32_t) == 4 && alignof(uint32_t) <= 4,
  139|  1.13k|      "uint32_t must be 4 bytes and cannot be more than 4 byte aligned");
  140|       |
  141|  1.13k|  if (len >= 4) {
  ------------------
  |  Branch (141:7): [True: 737, False: 394]
  ------------------
  142|       |    // Step by 1s until aligned for uint32_t.
  143|    737|    uint8_t mask = 0;
  144|  1.46k|    while ((uintptr_t)cursor % alignof(uint32_t)) {
  ------------------
  |  Branch (144:12): [True: 730, False: 737]
  ------------------
  145|    730|      mask |= *cursor++;
  146|    730|      len -= 1;
  147|    730|    }
  148|    737|    if (mask & 0x80u) {
  ------------------
  |  Branch (148:9): [True: 19, False: 718]
  ------------------
  149|     19|      return false;
  150|     19|    }
  151|       |
  152|       |    // Now that we are aligned, step by 4s.
  153|  1.75M|    while (len >= 4) {
  ------------------
  |  Branch (153:12): [True: 1.75M, False: 460]
  ------------------
  154|  1.75M|      uint32_t val = *(const uint32_t *)cursor;
  155|  1.75M|      if (val & 0x80808080u) {
  ------------------
  |  Branch (155:11): [True: 258, False: 1.75M]
  ------------------
  156|    258|        return false;
  157|    258|      }
  158|  1.75M|      cursor += 4;
  159|  1.75M|      len -= 4;
  160|  1.75M|    }
  161|    718|  }
  162|    854|  assert(len < 4 && "Length should now be less than 4");
  163|      0|  uint8_t mask = 0;
  164|  2.09k|  while (len--) {
  ------------------
  |  Branch (164:10): [True: 1.24k, False: 854]
  ------------------
  165|  1.24k|    mask |= *cursor++;
  166|  1.24k|  }
  167|    854|  if (mask & 0x80u)
  ------------------
  |  Branch (167:7): [True: 0, False: 854]
  ------------------
  168|      0|    return false;
  169|    854|  return true;
  170|    854|}

_ZN6hermes2vm16ArrayStorageBaseINS0_11HermesValueEE17_trimSizeCallbackEPKNS0_6GCCellE:
  251|    133|gcheapsize_t ArrayStorageBase<HVType>::_trimSizeCallback(const GCCell *cell) {
  252|    133|  const auto *self = reinterpret_cast<const ArrayStorageBase<HVType> *>(cell);
  253|    133|  return allocationSize(self->size());
  254|    133|}
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE20resizeWithinCapacityEPS3_RNS0_7HadesGCEj:
  121|   674k|    size_type newSize) {
  122|   674k|  assert(
  123|   674k|      newSize <= self->capacity() &&
  124|   674k|      "newSize must be <= capacity in resizeWithinCapacity()");
  125|       |  // If enlarging, clear the new elements.
  126|      0|  const auto sz = self->size();
  127|   674k|  if (newSize > sz) {
  ------------------
  |  Branch (127:7): [True: 674k, False: 0]
  ------------------
  128|       |    // Treat the memory as uninitialized when growing.
  129|       |    // This applies even in the case where the length has been decreased and
  130|       |    // increased again. When the length is decreased, it executes a write
  131|       |    // barrier to mark all of the values between the new length and the old
  132|       |    // length as unreachable. Since the GC will then be aware of those values,
  133|       |    // it doesn't matter if we overwrite them here again.
  134|   674k|    GCHVType::uninitialized_fill(
  135|   674k|        self->data() + sz,
  136|   674k|        self->data() + newSize,
  137|   674k|        HVType::encodeEmptyValue(),
  138|   674k|        gc);
  139|   674k|  } else if (newSize < sz) {
  ------------------
  |  Branch (139:14): [True: 0, False: 0]
  ------------------
  140|       |    // Execute write barriers on elements about to be conceptually changed to
  141|       |    // null.
  142|       |    // This also means if an array is refilled, it can treat the memory here
  143|       |    // as uninitialized safely.
  144|      0|    GCHVType::rangeUnreachableWriteBarrier(
  145|      0|        self->data() + newSize, self->data() + sz, gc);
  146|      0|  }
  147|   674k|  self->size_.store(newSize, std::memory_order_release);
  148|   674k|}
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE17_trimSizeCallbackEPKNS0_6GCCellE:
  251|  66.6k|gcheapsize_t ArrayStorageBase<HVType>::_trimSizeCallback(const GCCell *cell) {
  252|  66.6k|  const auto *self = reinterpret_cast<const ArrayStorageBase<HVType> *>(cell);
  253|  66.6k|  return allocationSize(self->size());
  254|  66.6k|}
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE18reallocateToLargerERNS0_13MutableHandleIS3_EERNS0_7RuntimeEjjjj:
   68|  5.76k|    size_type toLast) {
   69|  5.76k|  assert(capacity <= maxElements() && "capacity overflows 32-bit storage");
   70|       |
   71|      0|  assert(
   72|  5.76k|      capacity > selfHandle->capacity() &&
   73|  5.76k|      "reallocateToLarger must be called with a larger capacity");
   74|       |
   75|      0|  auto arrRes = create(runtime, capacity);
   76|  5.76k|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  5.76k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.76k]
  |  |  ------------------
  ------------------
   77|      0|    return ExecutionStatus::EXCEPTION;
   78|      0|  }
   79|  5.76k|  auto newSelfHandle = runtime.makeHandle<ArrayStorageBase<HVType>>(*arrRes);
   80|       |
   81|  5.76k|  auto *newSelf = newSelfHandle.get();
   82|       |
   83|       |  // Copy the existing data.
   84|  5.76k|  auto *self = selfHandle.get();
   85|  5.76k|  size_type copySize = std::min(self->size() - fromFirst, toLast - toFirst);
   86|       |
   87|  5.76k|  {
   88|  5.76k|    GCHVType *from = self->data() + fromFirst;
   89|  5.76k|    GCHVType *to = newSelf->data() + toFirst;
   90|  5.76k|    GCHVType::uninitialized_copy(from, from + copySize, to, runtime.getHeap());
   91|  5.76k|  }
   92|       |
   93|       |  // Initialize the elements before the first copied element.
   94|  5.76k|  GCHVType::uninitialized_fill(
   95|  5.76k|      newSelf->data(),
   96|  5.76k|      newSelf->data() + toFirst,
   97|  5.76k|      HVType::encodeEmptyValue(),
   98|  5.76k|      runtime.getHeap());
   99|       |
  100|       |  // Initialize the elements after the last copied element and toLast.
  101|  5.76k|  if (toFirst + copySize < toLast) {
  ------------------
  |  Branch (101:7): [True: 5.76k, False: 0]
  ------------------
  102|  5.76k|    GCHVType::uninitialized_fill(
  103|  5.76k|        newSelf->data() + toFirst + copySize,
  104|  5.76k|        newSelf->data() + toLast,
  105|  5.76k|        HVType::encodeEmptyValue(),
  106|  5.76k|        runtime.getHeap());
  107|  5.76k|  }
  108|       |
  109|  5.76k|  newSelf->size_.store(toLast, std::memory_order_release);
  110|       |
  111|       |  // Update the handle.
  112|  5.76k|  selfHandle = newSelfHandle.get();
  113|       |
  114|  5.76k|  return ExecutionStatus::RETURNED;
  115|  5.76k|}
_ZN6hermes2vm16ArrayStorageBaseINS0_13HermesValue32EE5shiftERNS0_13MutableHandleIS3_EERNS0_7RuntimeEjjj:
  156|  5.78k|    size_type toLast) {
  157|  5.78k|  assert(toLast <= maxElements() && "size overflows 32-bit storage");
  158|      0|  assert(toFirst <= toLast && "First must be before last");
  159|      0|  assert(fromFirst <= selfHandle->size() && "fromFirst must be before size");
  160|       |
  161|       |  // If we don't need to expand the capacity.
  162|  5.78k|  if (toLast <= selfHandle->capacity()) {
  ------------------
  |  Branch (162:7): [True: 24, False: 5.76k]
  ------------------
  163|     24|    auto *self = selfHandle.get();
  164|     24|    size_type copySize = std::min(self->size() - fromFirst, toLast - toFirst);
  165|       |
  166|       |    // Copy the values to their final destination.
  167|     24|    if (fromFirst > toFirst) {
  ------------------
  |  Branch (167:9): [True: 0, False: 24]
  ------------------
  168|      0|      GCHVType::copy(
  169|      0|          self->data() + fromFirst,
  170|      0|          self->data() + fromFirst + copySize,
  171|      0|          self->data() + toFirst,
  172|      0|          runtime.getHeap());
  173|     24|    } else if (fromFirst < toFirst) {
  ------------------
  |  Branch (173:16): [True: 0, False: 24]
  ------------------
  174|       |      // Copying to the right, need to copy backwards to avoid overwriting what
  175|       |      // is being copied.
  176|      0|      GCHVType::copy_backward(
  177|      0|          self->data() + fromFirst,
  178|      0|          self->data() + fromFirst + copySize,
  179|      0|          self->data() + toFirst + copySize,
  180|      0|          runtime.getHeap());
  181|      0|    }
  182|       |
  183|       |    // Initialize the elements which were emptied in front.
  184|     24|    GCHVType::fill(
  185|     24|        self->data(),
  186|     24|        self->data() + toFirst,
  187|     24|        HVType::encodeEmptyValue(),
  188|     24|        runtime.getHeap());
  189|       |
  190|       |    // Initialize the elements between the last copied element and toLast.
  191|     24|    if (toFirst + copySize < toLast) {
  ------------------
  |  Branch (191:9): [True: 24, False: 0]
  ------------------
  192|     24|      GCHVType::uninitialized_fill(
  193|     24|          self->data() + toFirst + copySize,
  194|     24|          self->data() + toLast,
  195|     24|          HVType::encodeEmptyValue(),
  196|     24|          runtime.getHeap());
  197|     24|    }
  198|     24|    if (toLast < self->size()) {
  ------------------
  |  Branch (198:9): [True: 0, False: 24]
  ------------------
  199|       |      // Some elements are becoming unreachable, let the GC know.
  200|      0|      GCHVType::rangeUnreachableWriteBarrier(
  201|      0|          self->data() + toLast,
  202|      0|          self->data() + self->size(),
  203|      0|          runtime.getHeap());
  204|      0|    }
  205|     24|    self->size_.store(toLast, std::memory_order_release);
  206|     24|    return ExecutionStatus::RETURNED;
  207|     24|  }
  208|       |
  209|       |  // Calculate the new capacity.
  210|  5.76k|  size_type capacity = selfHandle->capacity();
  211|  5.76k|  if (capacity < maxElements() / 2)
  ------------------
  |  Branch (211:7): [True: 5.76k, False: 0]
  ------------------
  212|  5.76k|    capacity = std::max(capacity * 2, toLast);
  213|      0|  else
  214|      0|    capacity = maxElements();
  215|       |
  216|  5.76k|  return reallocateToLarger(
  217|  5.76k|      selfHandle, runtime, capacity, fromFirst, toFirst, toLast);
  218|  5.78k|}
_ZN6hermes2vm21ArrayStorageBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   34|      1|void ArrayStorageBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   35|      1|  const auto *self = static_cast<const ArrayStorage *>(cell);
   36|      1|  mb.setVTable(&ArrayStorage::vt);
   37|      1|  mb.addArray("storage", self->data(), &self->size_, sizeof(GCHermesValue));
   38|      1|}
_ZN6hermes2vm26ArrayStorageSmallBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   40|      1|void ArrayStorageSmallBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   41|      1|  const auto *self = static_cast<const ArrayStorageSmall *>(cell);
   42|      1|  mb.setVTable(&ArrayStorageSmall::vt);
   43|      1|  mb.addArray(
   44|      1|      "storage", self->data(), &self->size_, sizeof(GCSmallHermesValue));
   45|      1|}

_ZN6hermes2vm24BigIntPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   30|      1|void BigIntPrimitiveBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   31|      1|  mb.setVTable(&BigIntPrimitive::vt);
   32|      1|}

_ZN6hermes2vm20BoxedDoubleBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   17|      1|void BoxedDoubleBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   18|      1|  mb.setVTable(&BoxedDouble::vt);
   19|      1|}

_ZN6hermes2vm13buildMetadataENS0_8CellKindEPFvPKNS0_6GCCellERNS0_8Metadata7BuilderEE:
   20|     79|Metadata buildMetadata(CellKind kind, BuildMetadataCallback *builder) {
   21|     79|  const GCCell *base;
   22|       |#ifdef HERMES_UBSAN
   23|       |  // Using members on a nullptr is UB, but using a pointer to static memory is
   24|       |  // not.
   25|       |  static const int64_t buf[128]{};
   26|       |  base = reinterpret_cast<const GCCell *>(&buf);
   27|       |#else
   28|       |  // Use nullptr when not building with UBSAN to ensure fast failures.
   29|     79|  base = nullptr;
   30|     79|#endif
   31|       |  // This memory should not be read or written to
   32|     79|  Metadata::Builder mb(base);
   33|     79|  builder(base, mb);
   34|     79|  Metadata meta = mb.build();
   35|     79|  LLVM_DEBUG(
  ------------------
  |  |  123|     79|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     79|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 79]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     79|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
   36|     79|      llvh::dbgs() << "Initialized metadata for cell kind " << cellKindStr(kind)
   37|     79|                   << ": " << meta << "\n");
   38|     79|  return meta;
   39|     79|}
_ZN6hermes2vm18buildMetadataTableEv:
   41|     99|void buildMetadataTable() {
   42|       |  // Once the storage is initialized, also initialize the global array of VTable
   43|       |  // pointers using the new metadata.
   44|     99|  static std::once_flag flag;
   45|     99|  std::call_once(flag, [] {
   46|       |    // For each class of object, initialize its metadata
   47|       |    // Only run this once per class, not once per Runtime instantiation.
   48|     99|    Metadata::metadataTable = {
   49|     99|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
   50|     99|#include "hermes/VM/CellKinds.def"
   51|     99|#undef CELL_KIND
   52|     99|    };
   53|       |
   54|     99|    assert(
   55|     99|        !VTable::vtableArray[0] &&
   56|     99|        "VTable array should not be initialized before this point.");
   57|     99|    VTable::vtableArray = {
   58|     99|#define CELL_KIND(name) \
   59|     99|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
   60|     99|#include "hermes/VM/CellKinds.def"
   61|     99|#undef CELL_KIND
   62|     99|    };
   63|     99|  });
   64|     99|}
BuildMetadata.cpp:_ZZN6hermes2vm18buildMetadataTableEvENK3$_0clEv:
   45|      1|  std::call_once(flag, [] {
   46|       |    // For each class of object, initialize its metadata
   47|       |    // Only run this once per class, not once per Runtime instantiation.
   48|      1|    Metadata::metadataTable = {
   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
   50|      1|#include "hermes/VM/CellKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file defines all possible kinds of objects that are known to the
  |  |    9|       |// garbage collector.
  |  |   10|       |
  |  |   11|       |#ifndef CELL_KIND
  |  |   12|       |#define CELL_KIND(name)
  |  |   13|       |#endif
  |  |   14|       |
  |  |   15|      1|#ifndef CELL_JS_NAME
  |  |   16|      1|#define CELL_JS_NAME(name, jsClassName)
  |  |   17|      1|#endif
  |  |   18|       |
  |  |   19|      1|#ifndef CELL_RANGE
  |  |   20|      1|#define CELL_RANGE(rangeName, first, last)
  |  |   21|      1|#endif
  |  |   22|       |
  |  |   23|       |// Helper macro for defining a CellKind which 1:1 corresponds with a JS Class.
  |  |   24|       |// Defines both the kind and the JS Class name.
  |  |   25|      1|#define CELL_CLASS(name, jsClassName) \
  |  |   26|      1|  CELL_KIND(name)                     \
  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |   28|       |
  |  |   29|      1|CELL_KIND(Uninitialized)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   30|      1|CELL_KIND(FillerCell)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   31|      1|#if defined(HERMESVM_GC_HADES) || defined(HERMESVM_GC_RUNTIME)
  |  |   32|      1|CELL_KIND(Freelist)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   33|      1|#endif
  |  |   34|      1|CELL_KIND(DynamicUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   35|      1|CELL_KIND(DynamicASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   36|      1|CELL_KIND(BufferedUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   37|      1|CELL_KIND(BufferedASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   38|      1|CELL_KIND(DynamicUniquedUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   39|      1|CELL_KIND(DynamicUniquedASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   40|      1|CELL_KIND(ExternalUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   41|      1|CELL_KIND(ExternalASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   42|      1|CELL_KIND(DictPropertyMap)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   43|      1|CELL_KIND(Domain)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   44|      1|CELL_KIND(HiddenClass)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   45|      1|CELL_KIND(ArrayStorage)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   46|      1|CELL_KIND(ArrayStorageSmall)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   47|      1|CELL_KIND(SegmentedArray)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   48|      1|CELL_KIND(SegmentedArraySmall)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   49|      1|CELL_KIND(Segment)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   50|      1|CELL_KIND(SegmentSmall)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   51|      1|CELL_KIND(PropertyAccessor)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   52|      1|CELL_KIND(Environment)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   53|      1|CELL_KIND(HashMapEntry)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   54|      1|CELL_KIND(OrderedHashMap)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   55|      1|CELL_KIND(BoxedDouble)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   56|      1|CELL_KIND(NativeState)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   57|       |
  |  |   58|      1|CELL_CLASS(JSObject, "Object")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   59|      1|CELL_CLASS(DecoratedObject, "DecoratedObject")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   60|      1|CELL_KIND(HostObject)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   61|       |
  |  |   62|      1|CELL_CLASS(JSError, "Error")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   63|      1|CELL_CLASS(JSCallSite, "CallSite")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   64|      1|CELL_CLASS(Arguments, "Arguments")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   65|      1|CELL_CLASS(JSArray, "Array")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   66|      1|CELL_CLASS(JSArrayBuffer, "ArrayBuffer")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   67|      1|CELL_CLASS(JSDataView, "DataView")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |   69|      1|#include "hermes/VM/TypedArrays.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |    9|       |
  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |   12|       |#endif
  |  |  |  |   13|       |
  |  |  |  |   14|      1|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|      1|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|      1|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|      1|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|      1|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|      1|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|      1|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|      1|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|      1|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|      1|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      1|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|      1|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|      1|#undef TYPED_ARRAY
  |  |  ------------------
  |  |   70|      1|CELL_CLASS(JSArrayIterator, "Array Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   71|      1|CELL_CLASS(JSSet, "Set")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   72|      1|CELL_CLASS(JSMap, "Map")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   73|      1|CELL_CLASS(JSSetIterator, "Set Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   74|      1|CELL_CLASS(JSMapIterator, "Map Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   75|      1|CELL_CLASS(JSWeakMap, "WeakMap")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   76|      1|CELL_CLASS(JSWeakSet, "WeakSet")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   77|      1|CELL_CLASS(JSWeakRef, "WeakRef")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   78|      1|CELL_CLASS(JSBoolean, "Boolean")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   79|      1|CELL_CLASS(JSString, "String")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   80|      1|CELL_CLASS(JSNumber, "Number")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   81|      1|CELL_CLASS(JSSymbol, "Symbol")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   82|      1|CELL_CLASS(JSStringIterator, "String Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   83|      1|CELL_CLASS(JSJSON, "JSON")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   84|      1|CELL_CLASS(JSMath, "Math")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   85|      1|CELL_CLASS(JSDate, "Date")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   86|      1|CELL_CLASS(JSRegExp, "RegExp")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   87|      1|CELL_CLASS(JSRegExpStringIterator, "RegExp String Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   88|      1|CELL_CLASS(RequireContext, "RequireContext")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   89|      1|CELL_CLASS(JSGenerator, "Generator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   90|      1|CELL_CLASS(JSProxy, "Proxy")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   91|      1|CELL_CLASS(JSBigInt, "BigInt")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   92|       |
  |  |   93|      1|CELL_KIND(BoundFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   94|      1|CELL_KIND(NativeFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   95|      1|CELL_KIND(NativeConstructor)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   96|      1|CELL_CLASS(JSCallableProxy, "CallableProxy")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   97|      1|CELL_KIND(FinalizableNativeFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   98|      1|CELL_KIND(JSGeneratorFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |   99|      1|CELL_KIND(GeneratorInnerFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |  100|      1|CELL_KIND(JSAsyncFunction)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |  101|      1|CELL_CLASS(JSFunction, "Function")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |  102|       |
  |  |  103|      1|CELL_KIND(BigIntPrimitive)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |  104|       |
  |  |  105|       |// Dummy object used only in tests.
  |  |  106|      1|CELL_KIND(DummyObject)
  |  |  ------------------
  |  |  |  |   49|      1|#define CELL_KIND(name) buildMetadata(CellKind::name##Kind, name##BuildMeta),
  |  |  ------------------
  |  |  107|       |
  |  |  108|       |// Update AllCells, below, if new CellKinds are added.
  |  |  109|       |// (AllCells is useful for checking that a CellKind is valid.)
  |  |  110|       |
  |  |  111|       |// Define inheritance ranges.
  |  |  112|      1|CELL_RANGE(AllCells, Uninitialized, DummyObject)
  |  |  113|      1|CELL_RANGE(Object, JSObject, JSFunction)
  |  |  114|      1|CELL_RANGE(DecoratedObject, DecoratedObject, HostObject)
  |  |  115|      1|CELL_RANGE(ArrayImpl, Arguments, JSArray)
  |  |  116|      1|CELL_RANGE(Callable, BoundFunction, JSFunction)
  |  |  117|      1|CELL_RANGE(CodeBlockFunction, JSGeneratorFunction, JSFunction)
  |  |  118|      1|CELL_RANGE(NativeFunction, NativeFunction, FinalizableNativeFunction)
  |  |  119|      1|CELL_RANGE(TypedArrayBase, Int8Array, BigUint64Array)
  |  |  120|      1|CELL_RANGE(WeakMapImplBase, JSWeakMap, JSWeakSet)
  |  |  121|      1|CELL_RANGE(
  |  |  122|      1|    StringPrimitive,
  |  |  123|      1|    DynamicUTF16StringPrimitive,
  |  |  124|      1|    ExternalASCIIStringPrimitive)
  |  |  125|       |
  |  |  126|      1|#undef CELL_KIND
  |  |  127|      1|#undef CELL_JS_NAME
  |  |  128|      1|#undef CELL_RANGE
  |  |  129|      1|#undef CELL_CLASS
  ------------------
   51|      1|#undef CELL_KIND
   52|      1|    };
   53|       |
   54|      1|    assert(
   55|      1|        !VTable::vtableArray[0] &&
   56|      1|        "VTable array should not be initialized before this point.");
   57|      0|    VTable::vtableArray = {
   58|      1|#define CELL_KIND(name) \
   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
   60|      1|#include "hermes/VM/CellKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file defines all possible kinds of objects that are known to the
  |  |    9|       |// garbage collector.
  |  |   10|       |
  |  |   11|       |#ifndef CELL_KIND
  |  |   12|       |#define CELL_KIND(name)
  |  |   13|       |#endif
  |  |   14|       |
  |  |   15|      1|#ifndef CELL_JS_NAME
  |  |   16|      1|#define CELL_JS_NAME(name, jsClassName)
  |  |   17|      1|#endif
  |  |   18|       |
  |  |   19|      1|#ifndef CELL_RANGE
  |  |   20|      1|#define CELL_RANGE(rangeName, first, last)
  |  |   21|      1|#endif
  |  |   22|       |
  |  |   23|       |// Helper macro for defining a CellKind which 1:1 corresponds with a JS Class.
  |  |   24|       |// Defines both the kind and the JS Class name.
  |  |   25|      1|#define CELL_CLASS(name, jsClassName) \
  |  |   26|      1|  CELL_KIND(name)                     \
  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |   28|       |
  |  |   29|      1|CELL_KIND(Uninitialized)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   30|      1|CELL_KIND(FillerCell)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   31|      1|#if defined(HERMESVM_GC_HADES) || defined(HERMESVM_GC_RUNTIME)
  |  |   32|      1|CELL_KIND(Freelist)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   33|      1|#endif
  |  |   34|      1|CELL_KIND(DynamicUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   35|      1|CELL_KIND(DynamicASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   36|      1|CELL_KIND(BufferedUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   37|      1|CELL_KIND(BufferedASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   38|      1|CELL_KIND(DynamicUniquedUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   39|      1|CELL_KIND(DynamicUniquedASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   40|      1|CELL_KIND(ExternalUTF16StringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   41|      1|CELL_KIND(ExternalASCIIStringPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   42|      1|CELL_KIND(DictPropertyMap)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   43|      1|CELL_KIND(Domain)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   44|      1|CELL_KIND(HiddenClass)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   45|      1|CELL_KIND(ArrayStorage)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   46|      1|CELL_KIND(ArrayStorageSmall)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   47|      1|CELL_KIND(SegmentedArray)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   48|      1|CELL_KIND(SegmentedArraySmall)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   49|      1|CELL_KIND(Segment)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   50|      1|CELL_KIND(SegmentSmall)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   51|      1|CELL_KIND(PropertyAccessor)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   52|      1|CELL_KIND(Environment)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   53|      1|CELL_KIND(HashMapEntry)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   54|      1|CELL_KIND(OrderedHashMap)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   55|      1|CELL_KIND(BoxedDouble)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   56|      1|CELL_KIND(NativeState)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   57|       |
  |  |   58|      1|CELL_CLASS(JSObject, "Object")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   59|      1|CELL_CLASS(DecoratedObject, "DecoratedObject")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   60|      1|CELL_KIND(HostObject)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   61|       |
  |  |   62|      1|CELL_CLASS(JSError, "Error")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   63|      1|CELL_CLASS(JSCallSite, "CallSite")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   64|      1|CELL_CLASS(Arguments, "Arguments")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   65|      1|CELL_CLASS(JSArray, "Array")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   66|      1|CELL_CLASS(JSArrayBuffer, "ArrayBuffer")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   67|      1|CELL_CLASS(JSDataView, "DataView")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |   69|      1|#include "hermes/VM/TypedArrays.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |    9|       |
  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |   12|       |#endif
  |  |  |  |   13|       |
  |  |  |  |   14|      1|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|      1|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|      1|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|      1|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|      1|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|      1|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|      1|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|      1|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|      1|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|      1|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|      1|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|      1|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      1|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|      1|#undef TYPED_ARRAY
  |  |  ------------------
  |  |   70|      1|CELL_CLASS(JSArrayIterator, "Array Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   71|      1|CELL_CLASS(JSSet, "Set")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   72|      1|CELL_CLASS(JSMap, "Map")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   73|      1|CELL_CLASS(JSSetIterator, "Set Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   74|      1|CELL_CLASS(JSMapIterator, "Map Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   75|      1|CELL_CLASS(JSWeakMap, "WeakMap")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   76|      1|CELL_CLASS(JSWeakSet, "WeakSet")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   77|      1|CELL_CLASS(JSWeakRef, "WeakRef")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   78|      1|CELL_CLASS(JSBoolean, "Boolean")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   79|      1|CELL_CLASS(JSString, "String")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   80|      1|CELL_CLASS(JSNumber, "Number")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   81|      1|CELL_CLASS(JSSymbol, "Symbol")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   82|      1|CELL_CLASS(JSStringIterator, "String Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   83|      1|CELL_CLASS(JSJSON, "JSON")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   84|      1|CELL_CLASS(JSMath, "Math")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   85|      1|CELL_CLASS(JSDate, "Date")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   86|      1|CELL_CLASS(JSRegExp, "RegExp")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   87|      1|CELL_CLASS(JSRegExpStringIterator, "RegExp String Iterator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   88|      1|CELL_CLASS(RequireContext, "RequireContext")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   89|      1|CELL_CLASS(JSGenerator, "Generator")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   90|      1|CELL_CLASS(JSProxy, "Proxy")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   91|      1|CELL_CLASS(JSBigInt, "BigInt")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   92|       |
  |  |   93|      1|CELL_KIND(BoundFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   94|      1|CELL_KIND(NativeFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   95|      1|CELL_KIND(NativeConstructor)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   96|      1|CELL_CLASS(JSCallableProxy, "CallableProxy")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |   97|      1|CELL_KIND(FinalizableNativeFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   98|      1|CELL_KIND(JSGeneratorFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |   99|      1|CELL_KIND(GeneratorInnerFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |  100|      1|CELL_KIND(JSAsyncFunction)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |  101|      1|CELL_CLASS(JSFunction, "Function")
  |  |  ------------------
  |  |  |  |   26|      1|  CELL_KIND(name)                     \
  |  |  |  |  ------------------
  |  |  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  |  |  ------------------
  |  |  |  |   27|      1|  CELL_JS_NAME(name, jsClassName)
  |  |  ------------------
  |  |  102|       |
  |  |  103|      1|CELL_KIND(BigIntPrimitive)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |  104|       |
  |  |  105|       |// Dummy object used only in tests.
  |  |  106|      1|CELL_KIND(DummyObject)
  |  |  ------------------
  |  |  |  |   59|      1|  Metadata::metadataTable[static_cast<uint8_t>(CellKind::name##Kind)].vtp,
  |  |  ------------------
  |  |  107|       |
  |  |  108|       |// Update AllCells, below, if new CellKinds are added.
  |  |  109|       |// (AllCells is useful for checking that a CellKind is valid.)
  |  |  110|       |
  |  |  111|       |// Define inheritance ranges.
  |  |  112|      1|CELL_RANGE(AllCells, Uninitialized, DummyObject)
  |  |  113|      1|CELL_RANGE(Object, JSObject, JSFunction)
  |  |  114|      1|CELL_RANGE(DecoratedObject, DecoratedObject, HostObject)
  |  |  115|      1|CELL_RANGE(ArrayImpl, Arguments, JSArray)
  |  |  116|      1|CELL_RANGE(Callable, BoundFunction, JSFunction)
  |  |  117|      1|CELL_RANGE(CodeBlockFunction, JSGeneratorFunction, JSFunction)
  |  |  118|      1|CELL_RANGE(NativeFunction, NativeFunction, FinalizableNativeFunction)
  |  |  119|      1|CELL_RANGE(TypedArrayBase, Int8Array, BigUint64Array)
  |  |  120|      1|CELL_RANGE(WeakMapImplBase, JSWeakMap, JSWeakSet)
  |  |  121|      1|CELL_RANGE(
  |  |  122|      1|    StringPrimitive,
  |  |  123|      1|    DynamicUTF16StringPrimitive,
  |  |  124|      1|    ExternalASCIIStringPrimitive)
  |  |  125|       |
  |  |  126|      1|#undef CELL_KIND
  |  |  127|      1|#undef CELL_JS_NAME
  |  |  128|      1|#undef CELL_RANGE
  |  |  129|      1|#undef CELL_CLASS
  ------------------
   61|      1|#undef CELL_KIND
   62|      1|    };
   63|      1|  });

_ZN6hermes2vm20EnvironmentBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   42|      1|void EnvironmentBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   43|      1|  const auto *self = static_cast<const Environment *>(cell);
   44|      1|  mb.setVTable(&Environment::vt);
   45|      1|  mb.addField("parentEnvironment", &self->parentEnvironment_);
   46|      1|  mb.addArray(self->getSlots(), &self->size_, sizeof(GCHermesValue));
   47|      1|}
_ZN6hermes2vm17CallableBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   52|      9|void CallableBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   53|      9|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<Callable>());
   54|      9|  JSObjectBuildMeta(cell, mb);
   55|      9|  const auto *self = static_cast<const Callable *>(cell);
   56|      9|  mb.setVTable(&Callable::vt);
   57|      9|  mb.addField("environment", &self->environment_);
   58|      9|}
_ZN6hermes2vm8Callable14_newObjectImplENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_8JSObjectEEE:
   70|    594|    Handle<JSObject> parentHandle) {
   71|    594|  return JSObject::create(runtime, parentHandle);
   72|    594|}
_ZN6hermes2vm8Callable20defineLazyPropertiesENS0_6HandleIS1_EERNS0_7RuntimeE:
   74|    222|void Callable::defineLazyProperties(Handle<Callable> fn, Runtime &runtime) {
   75|       |  // lazy functions can be Bound or JS Functions.
   76|    222|  if (auto jsFun = Handle<JSFunction>::dyn_vmcast(fn)) {
  ------------------
  |  Branch (76:12): [True: 222, False: 0]
  ------------------
   77|    222|    const CodeBlock *codeBlock = jsFun->getCodeBlock(runtime);
   78|       |    // Create empty object for prototype.
   79|    222|    auto prototypeParent = vmisa<JSGeneratorFunction>(*jsFun)
  ------------------
  |  Branch (79:28): [True: 0, False: 222]
  ------------------
   80|    222|        ? Handle<JSObject>::vmcast(&runtime.generatorPrototype)
   81|    222|        : Handle<JSObject>::vmcast(&runtime.objectPrototype);
   82|       |
   83|       |    // According to ES12 26.7.4, AsyncFunction instances do not have a
   84|       |    // 'prototype' property, hence we need to set an null handle here.
   85|       |    // Functions that cannot be used with `new` should also not define a
   86|       |    // 'prototype' property, such as arrow functions per 15.3.4, except for
   87|       |    // generator functions.
   88|    222|    auto prototypeObjectHandle =
   89|    222|        codeBlock->getHeaderFlags().isCallProhibited(/* construct */ true) &&
  ------------------
  |  Branch (89:9): [True: 0, False: 222]
  ------------------
   90|    222|            !vmisa<JSGeneratorFunction>(*jsFun)
  ------------------
  |  Branch (90:13): [True: 0, False: 0]
  ------------------
   91|    222|        ? Runtime::makeNullHandle<JSObject>()
   92|    222|        : runtime.makeHandle(JSObject::create(runtime, prototypeParent));
   93|       |
   94|    222|    auto cr = Callable::defineNameLengthAndPrototype(
   95|    222|        fn,
   96|    222|        runtime,
   97|    222|        codeBlock->getNameMayAllocate(),
   98|    222|        codeBlock->getParamCount() - 1,
   99|    222|        prototypeObjectHandle,
  100|    222|        Callable::WritablePrototype::Yes,
  101|    222|        codeBlock->isStrictMode());
  102|    222|    assert(
  103|    222|        cr != ExecutionStatus::EXCEPTION && "failed to define length and name");
  104|      0|    (void)cr;
  105|    222|  } else if (vmisa<BoundFunction>(fn.get())) {
  ------------------
  |  Branch (105:14): [True: 0, False: 0]
  ------------------
  106|      0|    Handle<BoundFunction> boundfn = Handle<BoundFunction>::vmcast(fn);
  107|      0|    Handle<Callable> target = runtime.makeHandle(boundfn->getTarget(runtime));
  108|      0|    unsigned int argsWithThis = boundfn->getArgCountWithThis(runtime);
  109|       |
  110|      0|    auto res = BoundFunction::initializeLengthAndName(
  111|      0|        boundfn, runtime, target, argsWithThis == 0 ? 0 : argsWithThis - 1);
  ------------------
  |  Branch (111:35): [True: 0, False: 0]
  ------------------
  112|      0|    assert(
  113|      0|        res != ExecutionStatus::EXCEPTION &&
  114|      0|        "failed to define length and name of bound function");
  115|      0|    (void)res;
  116|      0|  } else {
  117|       |    // no other kind of function can be lazy currently
  118|      0|    assert(false && "invalid lazy function");
  119|      0|  }
  120|    222|}
_ZN6hermes2vm8Callable28defineNameLengthAndPrototypeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDEjNS2_INS0_8JSObjectEEENS1_17WritablePrototypeEb:
  129|  46.7k|    bool strictMode) {
  130|  46.7k|  PropertyFlags pf;
  131|  46.7k|  pf.clear();
  132|  46.7k|  pf.enumerable = 0;
  133|  46.7k|  pf.writable = 0;
  134|  46.7k|  pf.configurable = 1;
  135|       |
  136|  46.7k|  GCScope scope{runtime, "defineNameLengthAndPrototype"};
  137|       |
  138|  46.7k|  namespace P = Predefined;
  139|       |/// Adds a property to the object in \p OBJ_HANDLE.  \p SYMBOL provides its name
  140|       |/// as a \c Predefined enum value, and its value is  rooted in \p HANDLE.  If
  141|       |/// property definition fails, the exceptional execution status will be
  142|       |/// propagated to the outer function.
  143|  46.7k|#define DEFINE_PROP(OBJ_HANDLE, SYMBOL, HANDLE)                            \
  144|  46.7k|  do {                                                                     \
  145|  46.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  146|  46.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  147|  46.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  148|  46.7k|      return ExecutionStatus::EXCEPTION;                                   \
  149|  46.7k|    }                                                                      \
  150|  46.7k|  } while (false)
  151|       |
  152|  46.7k|  assert(name.isValid() && "A name must always be provided");
  153|       |
  154|       |  // Length is the number of formal arguments.
  155|       |  // 10.2.9 SetFunctionLength is performed during 10.2.3 OrdinaryFunctionCreate.
  156|      0|  auto lengthHandle =
  157|  46.7k|      runtime.makeHandle(HermesValue::encodeDoubleValue(paramCount));
  158|  46.7k|  DEFINE_PROP(selfHandle, P::length, lengthHandle);
  ------------------
  |  |  144|  46.7k|  do {                                                                     \
  |  |  145|  46.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|  46.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|  46.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  46.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 46.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|  46.7k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  159|       |
  160|       |  // Define the name.
  161|       |  // 10.2.8 SetFunctionName is performed after 10.2.3 OrdinaryFunctionCreate.
  162|  46.7k|  auto nameHandle = runtime.makeHandle(runtime.getStringPrimFromSymbolID(name));
  163|  46.7k|  DEFINE_PROP(selfHandle, P::name, nameHandle);
  ------------------
  |  |  144|  46.7k|  do {                                                                     \
  |  |  145|  46.7k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|  46.7k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|  46.7k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  46.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 46.7k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|  46.7k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  164|       |
  165|  46.7k|  if (strictMode) {
  ------------------
  |  Branch (165:7): [True: 198, False: 46.5k]
  ------------------
  166|       |    // Define .callee and .arguments properties: throw always in strict mode.
  167|    198|    auto accessor =
  168|    198|        Handle<PropertyAccessor>::vmcast(&runtime.throwTypeErrorAccessor);
  169|       |
  170|    198|    pf.clear();
  171|    198|    pf.enumerable = 0;
  172|    198|    pf.configurable = 0;
  173|    198|    pf.accessor = 1;
  174|       |
  175|    198|    DEFINE_PROP(selfHandle, P::caller, accessor);
  ------------------
  |  |  144|    198|  do {                                                                     \
  |  |  145|    198|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|    198|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|    198|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|    198|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  176|    198|    DEFINE_PROP(selfHandle, P::arguments, accessor);
  ------------------
  |  |  144|    198|  do {                                                                     \
  |  |  145|    198|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|    198|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|    198|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|    198|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 198]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|    198|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  177|    198|  }
  178|       |
  179|  46.7k|  if (prototypeObjectHandle) {
  ------------------
  |  Branch (179:7): [True: 4.18k, False: 42.5k]
  ------------------
  180|       |    // Set its 'prototype' property.
  181|  4.18k|    pf.clear();
  182|  4.18k|    pf.enumerable = 0;
  183|       |    /// System constructors have read-only prototypes.
  184|  4.18k|    pf.writable = (uint8_t)writablePrototype;
  185|  4.18k|    pf.configurable = 0;
  186|  4.18k|    DEFINE_PROP(selfHandle, P::prototype, prototypeObjectHandle);
  ------------------
  |  |  144|  4.18k|  do {                                                                     \
  |  |  145|  4.18k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|  4.18k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|  4.18k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  4.18k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 4.18k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|  4.18k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  187|       |
  188|  4.18k|    if (LLVM_LIKELY(!vmisa<JSGeneratorFunction>(*selfHandle))) {
  ------------------
  |  |  188|  4.18k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4.18k, False: 0]
  |  |  ------------------
  ------------------
  189|       |      // Set the 'constructor' property in the prototype object.
  190|       |      // This must not be set for GeneratorFunctions, because
  191|       |      // prototypes must not point back to their constructors.
  192|       |      // See the diagram: ES9.0 25.2 (GeneratorFunction objects).
  193|  4.18k|      pf.clear();
  194|  4.18k|      pf.enumerable = 0;
  195|  4.18k|      pf.writable = 1;
  196|  4.18k|      pf.configurable = 1;
  197|  4.18k|      DEFINE_PROP(prototypeObjectHandle, P::constructor, selfHandle);
  ------------------
  |  |  144|  4.18k|  do {                                                                     \
  |  |  145|  4.18k|    auto status = JSObject::defineNewOwnProperty(                          \
  |  |  146|  4.18k|        OBJ_HANDLE, runtime, Predefined::getSymbolID(SYMBOL), pf, HANDLE); \
  |  |  147|  4.18k|    if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {             \
  |  |  ------------------
  |  |  |  |  189|  4.18k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 4.18k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|      0|      return ExecutionStatus::EXCEPTION;                                   \
  |  |  149|      0|    }                                                                      \
  |  |  150|  4.18k|  } while (false)
  |  |  ------------------
  |  |  |  Branch (150:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  198|  4.18k|    }
  199|  4.18k|  }
  200|       |
  201|  46.7k|  return ExecutionStatus::RETURNED;
  202|       |
  203|  46.7k|#undef DEFINE_PROP
  204|  46.7k|}
_ZN6hermes2vm8Callable12executeCall0ENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEEb:
  212|  2.71k|    bool construct) {
  213|  2.71k|  ScopedNativeCallFrame newFrame{
  214|  2.71k|      runtime,
  215|  2.71k|      0,
  216|  2.71k|      selfHandle.getHermesValue(),
  217|  2.71k|      construct ? selfHandle.getHermesValue()
  ------------------
  |  Branch (217:7): [True: 0, False: 2.71k]
  ------------------
  218|  2.71k|                : HermesValue::encodeUndefinedValue(),
  219|  2.71k|      *thisArgHandle};
  220|  2.71k|  if (LLVM_UNLIKELY(newFrame.overflowed()))
  ------------------
  |  |  189|  2.71k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2.71k]
  |  |  ------------------
  ------------------
  221|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  222|  2.71k|  return call(selfHandle, runtime);
  223|  2.71k|}
_ZN6hermes2vm8Callable12executeCall1ENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES6_b:
  232|   404k|    bool construct) {
  233|   404k|  ScopedNativeCallFrame newFrame{
  234|   404k|      runtime,
  235|   404k|      1,
  236|   404k|      selfHandle.getHermesValue(),
  237|   404k|      construct ? selfHandle.getHermesValue()
  ------------------
  |  Branch (237:7): [True: 0, False: 404k]
  ------------------
  238|   404k|                : HermesValue::encodeUndefinedValue(),
  239|   404k|      *thisArgHandle};
  240|   404k|  if (LLVM_UNLIKELY(newFrame.overflowed()))
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  241|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  242|   404k|  newFrame->getArgRef(0) = param1;
  243|   404k|  return call(selfHandle, runtime);
  244|   404k|}
_ZN6hermes2vm8Callable28extractOwnLengthProperty_RJSENS0_6HandleIS1_EERNS0_7RuntimeE:
  412|     99|    Runtime &runtime) {
  413|     99|  CallResult<PseudoHandle<>> propRes{
  414|     99|      createPseudoHandle(HermesValue::encodeUndefinedValue())};
  415|     99|  NamedPropertyDescriptor desc;
  416|     99|  if (JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (416:7): [True: 99, False: 0]
  ------------------
  417|     99|          selfHandle,
  418|     99|          runtime,
  419|     99|          Predefined::getSymbolID(Predefined::length),
  420|     99|          desc)) {
  421|     99|    propRes = JSObject::getNamedPropertyValue_RJS(
  422|     99|        selfHandle, runtime, selfHandle, desc);
  423|     99|  } else if (selfHandle->isProxyObject()) {
  ------------------
  |  Branch (423:14): [True: 0, False: 0]
  ------------------
  424|      0|    ComputedPropertyDescriptor desc;
  425|      0|    CallResult<bool> hasLength = JSProxy::getOwnProperty(
  426|      0|        selfHandle,
  427|      0|        runtime,
  428|      0|        runtime.getPredefinedStringHandle(Predefined::length),
  429|      0|        desc,
  430|      0|        nullptr);
  431|      0|    if (LLVM_UNLIKELY(hasLength == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  432|      0|      return ExecutionStatus::EXCEPTION;
  433|      0|    }
  434|      0|    if (*hasLength) {
  ------------------
  |  Branch (434:9): [True: 0, False: 0]
  ------------------
  435|      0|      propRes = JSProxy::getNamed(
  436|      0|          selfHandle,
  437|      0|          runtime,
  438|      0|          Predefined::getSymbolID(Predefined::length),
  439|      0|          selfHandle);
  440|      0|    }
  441|      0|  }
  442|       |
  443|     99|  {
  444|     99|    NoAllocScope naScope{runtime};
  445|       |
  446|     99|    if (propRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (446:9): [True: 0, False: 99]
  ------------------
  447|      0|      return ExecutionStatus::EXCEPTION;
  448|      0|    }
  449|       |
  450|     99|    if (!(*propRes)->isNumber()) {
  ------------------
  |  Branch (450:9): [True: 0, False: 99]
  ------------------
  451|      0|      return 0.0;
  452|      0|    }
  453|     99|  }
  454|       |
  455|     99|  auto intRes =
  456|     99|      toIntegerOrInfinity(runtime, runtime.makeHandle(std::move(*propRes)));
  457|     99|  if (intRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (457:7): [True: 0, False: 99]
  ------------------
  458|      0|    return ExecutionStatus::EXCEPTION;
  459|      0|  }
  460|       |
  461|     99|  return intRes->getNumber();
  462|     99|}
_ZN6hermes2vm22BoundFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  495|      1|void BoundFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  496|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<BoundFunction>());
  497|      1|  CallableBuildMeta(cell, mb);
  498|      1|  const auto *self = static_cast<const BoundFunction *>(cell);
  499|      1|  mb.setVTable(&BoundFunction::vt);
  500|      1|  mb.addField("target", &self->target_);
  501|      1|  mb.addField("argStorage", &self->argStorage_);
  502|      1|}
_ZN6hermes2vm13BoundFunction6createERNS0_7RuntimeENS0_6HandleINS0_8CallableEEEjNSt3__116reverse_iteratorIPKNS0_17PinnedHermesValueEEE:
  508|     99|    ConstArgIterator argsWithThis) {
  509|     99|  unsigned argCount = argCountWithThis > 0 ? argCountWithThis - 1 : 0;
  ------------------
  |  Branch (509:23): [True: 99, False: 0]
  ------------------
  510|       |
  511|       |  // Copy the arguments. If we don't have any, we must at least initialize
  512|       |  // 'this' to 'undefined'.
  513|     99|  auto arrRes = ArrayStorage::create(runtime, argCount + 1);
  514|     99|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  515|      0|    return ExecutionStatus::EXCEPTION;
  516|      0|  }
  517|     99|  auto arrHandle = runtime.makeMutableHandle(vmcast<ArrayStorage>(*arrRes));
  518|       |
  519|     99|  if (argCountWithThis) {
  ------------------
  |  Branch (519:7): [True: 99, False: 0]
  ------------------
  520|    198|    for (unsigned i = 0; i != argCountWithThis; ++i) {
  ------------------
  |  Branch (520:26): [True: 99, False: 99]
  ------------------
  521|     99|      ArrayStorage::push_back(arrHandle, runtime, Handle<>(&argsWithThis[i]));
  522|     99|    }
  523|     99|  } else {
  524|       |    // Don't need to worry about resizing since it was created with a capacity
  525|       |    // of at least 1.
  526|      0|    ArrayStorage::push_back(arrHandle, runtime, Runtime::getUndefinedValue());
  527|      0|  }
  528|       |
  529|     99|  auto *cell = runtime.makeAFixed<BoundFunction>(
  530|     99|      runtime,
  531|     99|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  532|     99|      runtime.getHiddenClassForPrototype(
  533|     99|          runtime.functionPrototypeRawPtr, numOverlapSlots<BoundFunction>()),
  534|     99|      target,
  535|     99|      arrHandle);
  536|     99|  auto selfHandle = JSObjectInit::initToHandle(runtime, cell);
  537|       |
  538|     99|  if (target->isLazy()) {
  ------------------
  |  Branch (538:7): [True: 0, False: 99]
  ------------------
  539|       |    // If the target is lazy we can make the bound function lazy.
  540|       |    // If the target is NOT lazy, it might have getter/setters on length that
  541|       |    // throws and we also need to throw.
  542|      0|    selfHandle->flags_.lazyObject = 1;
  543|     99|  } else {
  544|     99|    if (initializeLengthAndName(selfHandle, runtime, target, argCount) ==
  ------------------
  |  Branch (544:9): [True: 0, False: 99]
  ------------------
  545|     99|        ExecutionStatus::EXCEPTION) {
  546|      0|      return ExecutionStatus::EXCEPTION;
  547|      0|    }
  548|     99|  }
  549|     99|  return selfHandle.getHermesValue();
  550|     99|}
_ZN6hermes2vm13BoundFunction23initializeLengthAndNameENS0_6HandleINS0_8CallableEEERNS0_7RuntimeES4_j:
  556|     99|    unsigned argCount) {
  557|     99|  if (LLVM_UNLIKELY(target->isLazy())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  558|      0|    Callable::initializeLazyObject(runtime, target);
  559|      0|  }
  560|       |
  561|       |  // Extract target.length.
  562|     99|  auto targetLength = Callable::extractOwnLengthProperty_RJS(target, runtime);
  563|     99|  if (targetLength == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (563:7): [True: 0, False: 99]
  ------------------
  564|      0|    return ExecutionStatus::EXCEPTION;
  565|       |
  566|       |  // Define .length
  567|     99|  PropertyFlags pf{};
  568|     99|  pf.enumerable = 0;
  569|     99|  pf.writable = 0;
  570|     99|  pf.configurable = 1;
  571|       |
  572|       |  // Length is the number of formal arguments.
  573|     99|  auto length = runtime.makeHandle(HermesValue::encodeNumberValue(
  574|     99|      argCount >= *targetLength ? 0.0 : *targetLength - argCount));
  ------------------
  |  Branch (574:7): [True: 0, False: 99]
  ------------------
  575|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  576|     99|          JSObject::defineNewOwnProperty(
  577|     99|              selfHandle,
  578|     99|              runtime,
  579|     99|              Predefined::getSymbolID(Predefined::length),
  580|     99|              pf,
  581|     99|              length) == ExecutionStatus::EXCEPTION)) {
  582|      0|    return ExecutionStatus::EXCEPTION;
  583|      0|  }
  584|       |
  585|       |  // Set the name by prepending "bound ".
  586|     99|  auto propRes = JSObject::getNamed_RJS(
  587|     99|      target, runtime, Predefined::getSymbolID(Predefined::name));
  588|     99|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  589|      0|    return ExecutionStatus::EXCEPTION;
  590|      0|  }
  591|     99|  auto nameHandle = (*propRes)->isString()
  ------------------
  |  Branch (591:21): [True: 99, False: 0]
  ------------------
  592|     99|      ? runtime.makeHandle<StringPrimitive>(propRes->getHermesValue())
  593|     99|      : runtime.getPredefinedStringHandle(Predefined::emptyString);
  594|     99|  auto nameView = StringPrimitive::createStringView(runtime, nameHandle);
  595|     99|  llvh::SmallU16String<32> boundName{"bound "};
  596|     99|  boundName.append(nameView.begin(), nameView.end());
  597|       |  // Share name strings for repeatedly bound functions by using the
  598|       |  // identifier table. If a new symbol is created, it will disappear
  599|       |  // after the name string dies, since nothing else refers to it.
  600|     99|  auto &identifierTable = runtime.getIdentifierTable();
  601|     99|  auto boundNameSym = identifierTable.getSymbolHandle(runtime, boundName);
  602|     99|  if (LLVM_UNLIKELY(boundNameSym == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  603|      0|    return ExecutionStatus::EXCEPTION;
  604|      0|  }
  605|     99|  Handle<StringPrimitive> boundNameHandle(
  606|     99|      runtime, identifierTable.getStringPrim(runtime, **boundNameSym));
  607|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  608|     99|  dpf.writable = 0;
  609|     99|  dpf.enumerable = 0;
  610|       |
  611|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  612|     99|          JSObject::defineOwnProperty(
  613|     99|              selfHandle,
  614|     99|              runtime,
  615|     99|              Predefined::getSymbolID(Predefined::name),
  616|     99|              dpf,
  617|     99|              boundNameHandle) == ExecutionStatus::EXCEPTION)) {
  618|      0|    return ExecutionStatus::EXCEPTION;
  619|      0|  }
  620|       |
  621|       |  // Define .callee and .arguments properties: throw always in bound functions.
  622|     99|  auto accessor =
  623|     99|      Handle<PropertyAccessor>::vmcast(&runtime.throwTypeErrorAccessor);
  624|       |
  625|     99|  pf.clear();
  626|     99|  pf.enumerable = 0;
  627|     99|  pf.configurable = 0;
  628|     99|  pf.accessor = 1;
  629|       |
  630|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  631|     99|          JSObject::defineNewOwnProperty(
  632|     99|              selfHandle,
  633|     99|              runtime,
  634|     99|              Predefined::getSymbolID(Predefined::caller),
  635|     99|              pf,
  636|     99|              accessor) == ExecutionStatus::EXCEPTION)) {
  637|      0|    return ExecutionStatus::EXCEPTION;
  638|      0|  }
  639|       |
  640|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  641|     99|          JSObject::defineNewOwnProperty(
  642|     99|              selfHandle,
  643|     99|              runtime,
  644|     99|              Predefined::getSymbolID(Predefined::arguments),
  645|     99|              pf,
  646|     99|              accessor) == ExecutionStatus::EXCEPTION)) {
  647|      0|    return ExecutionStatus::EXCEPTION;
  648|      0|  }
  649|       |
  650|     99|  return ExecutionStatus::RETURNED;
  651|     99|}
_ZN6hermes2vm23NativeFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  850|      4|void NativeFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  851|      4|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<NativeFunction>());
  852|      4|  CallableBuildMeta(cell, mb);
  853|      4|  mb.setVTable(&NativeFunction::vt);
  854|      4|}
_ZN6hermes2vm14NativeFunction6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S3_NS0_10NativeArgsEENS0_8SymbolIDEjS6_j:
  871|  42.4k|    unsigned additionalSlotCount) {
  872|  42.4k|  size_t reservedSlots =
  873|  42.4k|      numOverlapSlots<NativeFunction>() + additionalSlotCount;
  874|  42.4k|  auto *cell = runtime.makeAFixed<NativeFunction>(
  875|  42.4k|      runtime,
  876|  42.4k|      parentHandle,
  877|  42.4k|      runtime.getHiddenClassForPrototype(*parentHandle, reservedSlots),
  878|  42.4k|      context,
  879|  42.4k|      functionPtr);
  880|  42.4k|  auto selfHandle = JSObjectInit::initToHandle(runtime, cell);
  881|       |
  882|       |  // Allocate a propStorage if the number of additional slots requires it.
  883|  42.4k|  runtime.ignoreAllocationFailure(
  884|  42.4k|      JSObject::allocatePropStorage(selfHandle, runtime, reservedSlots));
  885|       |
  886|  42.4k|  auto st = defineNameLengthAndPrototype(
  887|  42.4k|      selfHandle,
  888|  42.4k|      runtime,
  889|  42.4k|      name,
  890|  42.4k|      paramCount,
  891|  42.4k|      prototypeObjectHandle,
  892|  42.4k|      Callable::WritablePrototype::Yes,
  893|  42.4k|      false);
  894|  42.4k|  (void)st;
  895|  42.4k|  assert(
  896|  42.4k|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
  897|       |
  898|      0|  return selfHandle;
  899|  42.4k|}
_ZN6hermes2vm14NativeFunction9_callImplENS0_6HandleINS0_8CallableEEERNS0_7RuntimeE:
  939|   407k|    Runtime &runtime) {
  940|   407k|  return _nativeCall(vmcast<NativeFunction>(selfHandle.get()), runtime);
  941|   407k|}
_ZN6hermes2vm26NativeConstructorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1025|      1|void NativeConstructorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1026|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<NativeConstructor>());
 1027|      1|  NativeFunctionBuildMeta(cell, mb);
 1028|      1|  mb.setVTable(&NativeConstructor::vt);
 1029|      1|}
_ZN6hermes2vm19JSFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1080|      4|void JSFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1081|      4|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSFunction>());
 1082|      4|  CallableBuildMeta(cell, mb);
 1083|      4|  const auto *self = static_cast<const JSFunction *>(cell);
 1084|      4|  mb.addField("domain", &self->domain_);
 1085|      4|  mb.setVTable(&JSFunction::vt);
 1086|      4|}
_ZN6hermes2vm10JSFunction6createERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS4_INS0_8JSObjectEEENS4_INS0_11EnvironmentEEEPNS0_9CodeBlockE:
 1093|  4.50k|    CodeBlock *codeBlock) {
 1094|  4.50k|  auto *cell = runtime.makeAFixed<JSFunction, kHasFinalizer>(
 1095|  4.50k|      runtime,
 1096|  4.50k|      domain,
 1097|  4.50k|      parentHandle,
 1098|  4.50k|      runtime.getHiddenClassForPrototype(
 1099|  4.50k|          *parentHandle, numOverlapSlots<JSFunction>()),
 1100|  4.50k|      envHandle,
 1101|  4.50k|      codeBlock);
 1102|  4.50k|  auto self = JSObjectInit::initToPseudoHandle(runtime, cell);
 1103|  4.50k|  self->flags_.lazyObject = 1;
 1104|  4.50k|  return self;
 1105|  4.50k|}
_ZN6hermes2vm24JSAsyncFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1200|      1|void JSAsyncFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1201|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSAsyncFunction>());
 1202|      1|  JSFunctionBuildMeta(cell, mb);
 1203|      1|  mb.setVTable(&JSAsyncFunction::vt);
 1204|      1|}
_ZN6hermes2vm28JSGeneratorFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1257|      1|void JSGeneratorFunctionBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
 1258|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSGeneratorFunction>());
 1259|      1|  JSFunctionBuildMeta(cell, mb);
 1260|      1|  mb.setVTable(&JSGeneratorFunction::vt);
 1261|      1|}
_ZN6hermes2vm31GeneratorInnerFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
 1317|      1|    Metadata::Builder &mb) {
 1318|      1|  mb.addJSObjectOverlapSlots(
 1319|      1|      JSObject::numOverlapSlots<GeneratorInnerFunction>());
 1320|      1|  JSFunctionBuildMeta(cell, mb);
 1321|      1|  const auto *self = static_cast<const GeneratorInnerFunction *>(cell);
 1322|      1|  mb.setVTable(&GeneratorInnerFunction::vt);
 1323|      1|  mb.addField("savedContext", &self->savedContext_);
 1324|      1|  mb.addField("result", &self->result_);
 1325|      1|}

_ZN6hermes2vm27CheckHeapWellFormedAcceptorC2ERNS0_6GCBaseE:
   21|    745|      gc(gc) {}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor6acceptERPNS0_6GCCellE:
   23|  10.7M|void CheckHeapWellFormedAcceptor::accept(GCCell *&ptr) {
   24|  10.7M|  accept(static_cast<const GCCell *>(ptr));
   25|  10.7M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor6acceptEPKNS0_6GCCellE:
   27|  11.8M|void CheckHeapWellFormedAcceptor::accept(const GCCell *ptr) {
   28|  11.8M|  assert(
   29|  11.8M|      (!ptr || gc.validPointer(ptr)) &&
   30|  11.8M|      "A pointer is pointing outside of the valid region");
   31|  11.8M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor10acceptWeakERPNS0_6GCCellE:
   33|   451k|void CheckHeapWellFormedAcceptor::acceptWeak(GCCell *&ptr) {
   34|       |  // A weak pointer has the same well-formed-ness checks as a normal pointer.
   35|   451k|  accept(ptr);
   36|   451k|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor8acceptHVERNS0_11HermesValueE:
   38|   340k|void CheckHeapWellFormedAcceptor::acceptHV(HermesValue &hv) {
   39|   340k|  assert(!hv.isInvalid() && "HermesValue with InvalidTag encountered by GC.");
   40|   340k|  if (hv.isPointer()) {
  ------------------
  |  Branch (40:7): [True: 309k, False: 30.7k]
  ------------------
   41|   309k|    GCCell *cell = static_cast<GCCell *>(hv.getPointer());
   42|   309k|    accept(cell);
   43|   309k|  } else if (hv.isSymbol()) {
  ------------------
  |  Branch (43:14): [True: 95, False: 30.6k]
  ------------------
   44|     95|    acceptSym(hv.getSymbol());
   45|     95|  }
   46|   340k|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor9acceptSHVERNS0_13HermesValue32E:
   48|  6.34M|void CheckHeapWellFormedAcceptor::acceptSHV(SmallHermesValue &hv) {
   49|  6.34M|  if (hv.isPointer()) {
  ------------------
  |  Branch (49:7): [True: 4.75M, False: 1.59M]
  ------------------
   50|  4.75M|    GCCell *cell = static_cast<GCCell *>(hv.getPointer(pointerBase_));
   51|  4.75M|    accept(cell);
   52|  4.75M|  } else if (hv.isSymbol()) {
  ------------------
  |  Branch (52:14): [True: 7.47k, False: 1.58M]
  ------------------
   53|  7.47k|    acceptSym(hv.getSymbol());
   54|  7.47k|  }
   55|  6.34M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor9acceptSymENS0_8SymbolIDE:
   57|  1.05M|void CheckHeapWellFormedAcceptor::acceptSym(SymbolID sym) {
   58|  1.05M|  if (!sym.isValid()) {
  ------------------
  |  Branch (58:7): [True: 749, False: 1.05M]
  ------------------
   59|    749|    return;
   60|    749|  }
   61|  1.05M|  assert(
   62|  1.05M|      gc.getCallbacks().isSymbolLive(sym) &&
   63|  1.05M|      "Symbol is marked but is not live");
   64|       |  // Check that the string used by this symbol is valid.
   65|      0|  accept(
   66|  1.05M|      static_cast<const GCCell *>(gc.getCallbacks().getStringForSymbol(sym)));
   67|  1.05M|}
_ZN6hermes2vm27CheckHeapWellFormedAcceptor6acceptERNS0_11WeakRefBaseE:
   69|   423k|void CheckHeapWellFormedAcceptor::accept(WeakRefBase &wr) {
   70|       |  // Cannot check if the weak ref is valid, since it is allowed to mark an
   71|       |  // empty weak ref.
   72|   423k|  const WeakRefSlot *slot = wr.unsafeGetSlot();
   73|       |  // If the weak value is a pointer, check that it's within the valid region.
   74|   423k|  if (slot->state() != WeakSlotState::Free && slot->hasValue()) {
  ------------------
  |  Branch (74:7): [True: 423k, False: 0]
  |  Branch (74:47): [True: 422k, False: 693]
  ------------------
   75|   422k|    GCCell *cell = slot->getNoBarrierUnsafe(gc.getPointerBase());
   76|   422k|    accept(cell);
   77|   422k|  }
   78|   423k|}

_ZN6hermes2vm9CodeBlock15createCodeBlockEPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhj:
  127|  4.69k|    uint32_t functionID) {
  128|  4.69k|#ifdef HERMES_SLOW_DEBUG
  129|  4.69k|  validateInstructions(
  130|  4.69k|      {bytecode, header.bytecodeSizeInBytes()}, header.frameSize());
  131|  4.69k|#endif
  132|       |
  133|       |  // Compute size needed for caching from the highest accessed indices.
  134|       |  // If the highest access index is 0, that function does not use this cache at
  135|       |  // all so there is no reason to allocate it. If the function does access the
  136|       |  // cache we need to allocate an extra slot for the no-cache indicator.
  137|  4.69k|  auto sizeComputer = [](uint8_t highest) -> uint32_t {
  138|  4.69k|    return highest == 0 ? 0 : highest + 1;
  139|  4.69k|  };
  140|       |
  141|  4.69k|  uint32_t readCacheSize = sizeComputer(header.highestReadCacheIndex());
  142|  4.69k|  uint32_t cacheSize =
  143|  4.69k|      readCacheSize + sizeComputer(header.highestWriteCacheIndex());
  144|       |
  145|  4.69k|#ifndef HERMESVM_LEAN
  146|  4.69k|  bool isCodeBlockLazy = !bytecode;
  147|  4.69k|  if (!runtimeModule->isInitialized() || isCodeBlockLazy) {
  ------------------
  |  Branch (147:7): [True: 674, False: 4.02k]
  |  Branch (147:42): [True: 0, False: 4.02k]
  ------------------
  148|    674|    readCacheSize = sizeComputer(std::numeric_limits<uint8_t>::max());
  149|    674|    cacheSize = 2 * readCacheSize;
  150|    674|  }
  151|  4.69k|#endif
  152|       |
  153|  4.69k|  return CodeBlock::create(
  154|  4.69k|      runtimeModule, header, bytecode, functionID, cacheSize, readCacheSize);
  155|  4.69k|}
_ZN6hermes2vm9CodeBlock21findCatchTargetOffsetEj:
  157|     24|int32_t CodeBlock::findCatchTargetOffset(uint32_t exceptionOffset) {
  158|     24|  return runtimeModule_->getBytecode()->findCatchTargetOffset(
  159|     24|      functionID_, exceptionOffset);
  160|     24|}
_ZNK6hermes2vm9CodeBlock18getArrayBufferIterEjj:
  163|  10.9k|    const {
  164|  10.9k|  return SLP{
  165|  10.9k|      runtimeModule_->getBytecode()->getArrayBuffer().slice(idx),
  166|  10.9k|      numLiterals,
  167|  10.9k|      runtimeModule_};
  168|  10.9k|}
_ZNK6hermes2vm9CodeBlock22getObjectBufferKeyIterEjj:
  171|  1.10k|    const {
  172|  1.10k|  return SLP{
  173|  1.10k|      runtimeModule_->getBytecode()->getObjectKeyBuffer().slice(idx),
  174|  1.10k|      numLiterals,
  175|  1.10k|      nullptr};
  176|  1.10k|}
_ZNK6hermes2vm9CodeBlock24getObjectBufferValueIterEjj:
  179|    877|    const {
  180|    877|  return SLP{
  181|    877|      runtimeModule_->getBytecode()->getObjectValueBuffer().slice(idx),
  182|    877|      numLiterals,
  183|    877|      runtimeModule_};
  184|    877|}
_ZNK6hermes2vm9CodeBlock18getNameMayAllocateEv:
  186|    222|SymbolID CodeBlock::getNameMayAllocate() const {
  187|    222|#ifndef HERMESVM_LEAN
  188|    222|  if (isLazy()) {
  ------------------
  |  Branch (188:7): [True: 0, False: 222]
  ------------------
  189|      0|    return runtimeModule_->getLazyName();
  190|      0|  }
  191|    222|#endif
  192|    222|  return runtimeModule_->getSymbolIDFromStringIDMayAllocate(
  193|    222|      functionHeader_.functionName());
  194|    222|}
_ZNK6hermes2vm9CodeBlock29getDebugSourceLocationsOffsetEv:
  205|     24|OptValue<uint32_t> CodeBlock::getDebugSourceLocationsOffset() const {
  206|     24|  auto *debugOffsets =
  207|     24|      runtimeModule_->getBytecode()->getDebugOffsets(functionID_);
  208|     24|  if (!debugOffsets)
  ------------------
  |  Branch (208:7): [True: 0, False: 24]
  ------------------
  209|      0|    return llvh::None;
  210|     24|  uint32_t ret = debugOffsets->sourceLocations;
  211|     24|  if (ret == hbc::DebugOffsets::NO_OFFSET)
  ------------------
  |  Branch (211:7): [True: 0, False: 24]
  ------------------
  212|      0|    return llvh::None;
  213|     24|  return ret;
  214|     24|}
_ZNK6hermes2vm9CodeBlock24getTextifiedCalleeOffsetEv:
  292|      4|OptValue<uint32_t> CodeBlock::getTextifiedCalleeOffset() const {
  293|      4|  auto *debugOffsets =
  294|      4|      runtimeModule_->getBytecode()->getDebugOffsets(functionID_);
  295|      4|  if (!debugOffsets)
  ------------------
  |  Branch (295:7): [True: 0, False: 4]
  ------------------
  296|      0|    return llvh::None;
  297|      4|  uint32_t ret = debugOffsets->textifiedCallees;
  298|      4|  if (ret == hbc::DebugOffsets::NO_OFFSET)
  ------------------
  |  Branch (298:7): [True: 0, False: 4]
  ------------------
  299|      0|    return llvh::None;
  300|      4|  return ret;
  301|      4|}
_ZN6hermes2vm9CodeBlock23markCachedHiddenClassesERNS0_7RuntimeERNS0_16WeakRootAcceptorE:
  378|  46.1k|    WeakRootAcceptor &acceptor) {
  379|  46.1k|  for (auto &prop :
  ------------------
  |  Branch (379:19): [True: 4.97M, False: 46.1k]
  ------------------
  380|  4.97M|       llvh::makeMutableArrayRef(propertyCache(), propertyCacheSize_)) {
  381|  4.97M|    if (prop.clazz) {
  ------------------
  |  Branch (381:9): [True: 17.7k, False: 4.95M]
  ------------------
  382|  17.7k|      acceptor.acceptWeak(prop.clazz);
  383|  17.7k|    }
  384|  4.97M|  }
  385|  46.1k|}
CodeBlock.cpp:_ZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEj:
   34|  4.69k|static void validateInstructions(ArrayRef<uint8_t> list, unsigned frameSize) {
   35|  4.69k|  const OperandAddr32 listSize = (OperandAddr32)list.size();
   36|  4.69k|  assert((size_t)listSize == list.size() && "more than 2GB instructions!");
   37|       |
   38|      0|  auto validateUInt8 = [](...) {};
   39|  4.69k|  auto validateUInt16 = [](...) {};
   40|  4.69k|  auto validateUInt32 = [](...) {};
   41|  4.69k|  auto validateImm32 = [](...) {};
   42|  4.69k|  auto validateDouble = [](...) {};
   43|  4.69k|  auto validateReg8 = [&](OperandAddr32, OperandReg8 reg8) {
   44|  4.69k|    assert(reg8 < frameSize && "invalid register index");
   45|  4.69k|  };
   46|  4.69k|  auto validateReg32 = [&](OperandAddr32, OperandReg32 reg32) {
   47|  4.69k|    assert(reg32 < frameSize && "invalid register index");
   48|  4.69k|  };
   49|  4.69k|  auto validateAddr32 = [&](OperandAddr32 ip, OperandAddr32 offset) {
   50|       |    // Check the offset while avoiding overflow.
   51|  4.69k|    assert(
   52|  4.69k|        (offset < 0 ? ip + offset >= 0 : offset < listSize - ip) &&
   53|  4.69k|        "invalid jmp offset");
   54|  4.69k|  };
   55|  4.69k|  auto validateAddr8 = [&](OperandAddr32 ip, OperandAddr8 offset) {
   56|  4.69k|    validateAddr32(ip, offset);
   57|  4.69k|  };
   58|       |
   59|   857k|  for (OperandAddr32 ip = 0; ip != listSize;) {
  ------------------
  |  Branch (59:30): [True: 852k, False: 4.69k]
  ------------------
   60|   852k|    assert(ip < listSize);
   61|      0|    auto *inst = reinterpret_cast<const Inst *>(&list[ip]);
   62|   852k|    switch (inst->opCode) {
   63|      0|#define DEFINE_OPCODE_0(name)    \
   64|      0|  case OpCode::name:             \
   65|      0|    ip += sizeof(inst->i##name); \
   66|      0|    break;
   67|      0|#define DEFINE_OPCODE_1(name, op1type)        \
   68|      0|  case OpCode::name:                          \
   69|      0|    validate##op1type(ip, inst->i##name.op1); \
   70|      0|    ip += sizeof(inst->i##name);              \
   71|      0|    break;
   72|      0|#define DEFINE_OPCODE_2(name, op1type, op2type) \
   73|      0|  case OpCode::name:                            \
   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
   76|      0|    ip += sizeof(inst->i##name);                \
   77|      0|    break;
   78|      0|#define DEFINE_OPCODE_3(name, op1type, op2type, op3type) \
   79|      0|  case OpCode::name:                                     \
   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
   83|      0|    ip += sizeof(inst->i##name);                         \
   84|      0|    break;
   85|      0|#define DEFINE_OPCODE_4(name, op1type, op2type, op3type, op4type) \
   86|      0|  case OpCode::name:                                              \
   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
   91|      0|    ip += sizeof(inst->i##name);                                  \
   92|      0|    break;
   93|      0|#define DEFINE_OPCODE_5(name, op1type, op2type, op3type, op4type, op5type) \
   94|      0|  case OpCode::name:                                                       \
   95|      0|    validate##op1type(ip, inst->i##name.op1);                              \
   96|      0|    validate##op2type(ip, inst->i##name.op2);                              \
   97|      0|    validate##op3type(ip, inst->i##name.op3);                              \
   98|      0|    validate##op4type(ip, inst->i##name.op4);                              \
   99|      0|    validate##op5type(ip, inst->i##name.op5);                              \
  100|      0|    ip += sizeof(inst->i##name);                                           \
  101|      0|    break;
  102|      0|#define DEFINE_OPCODE_6(                                        \
  103|      0|    name, op1type, op2type, op3type, op4type, op5type, op6type) \
  104|      0|  case OpCode::name:                                            \
  105|      0|    validate##op1type(ip, inst->i##name.op1);                   \
  106|      0|    validate##op2type(ip, inst->i##name.op2);                   \
  107|      0|    validate##op3type(ip, inst->i##name.op3);                   \
  108|      0|    validate##op4type(ip, inst->i##name.op4);                   \
  109|      0|    validate##op5type(ip, inst->i##name.op5);                   \
  110|      0|    validate##op6type(ip, inst->i##name.op6);                   \
  111|      0|    ip += sizeof(inst->i##name);                                \
  112|      0|    break;
  113|       |
  114|      0|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|      0|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|      0|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|      0|#endif
  |  |   12|       |#ifndef DEFINE_OPCODE_0
  |  |   13|       |#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|       |#endif
  |  |   15|       |#ifndef DEFINE_OPCODE_1
  |  |   16|       |#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|       |#endif
  |  |   18|       |#ifndef DEFINE_OPCODE_2
  |  |   19|       |#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|       |#endif
  |  |   21|       |#ifndef DEFINE_OPCODE_3
  |  |   22|       |#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|       |#endif
  |  |   24|       |#ifndef DEFINE_OPCODE_4
  |  |   25|       |#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|       |#endif
  |  |   27|       |#ifndef DEFINE_OPCODE_5
  |  |   28|       |#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|       |#endif
  |  |   30|       |#ifndef DEFINE_OPCODE_6
  |  |   31|       |#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|       |#endif
  |  |   33|      0|#ifndef DEFINE_OPCODE
  |  |   34|      0|#define DEFINE_OPCODE(...)
  |  |   35|      0|#endif
  |  |   36|      0|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|      0|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|      0|#endif
  |  |   39|      0|#ifndef DEFINE_RET_TARGET
  |  |   40|      0|#define DEFINE_RET_TARGET(...)
  |  |   41|      0|#endif
  |  |   42|      0|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|      0|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|      0|#endif
  |  |   45|      0|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|      0|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|      0|#endif
  |  |   48|      0|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|      0|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|      0|#endif
  |  |   51|      0|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|      0|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|      0|#endif
  |  |   54|      0|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|      0|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|      0|#endif
  |  |   57|      0|#ifndef OPERAND_BIGINT_ID
  |  |   58|      0|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|      0|#endif
  |  |   60|      0|#ifndef OPERAND_FUNCTION_ID
  |  |   61|      0|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|      0|#endif
  |  |   63|      0|#ifndef OPERAND_STRING_ID
  |  |   64|      0|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|      0|#endif
  |  |   66|       |
  |  |   67|      0|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|      0|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|      0|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|      0|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|      0|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|      0|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|      0|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|      0|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|      0|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|      0|DEFINE_OPCODE_0(Unreachable)
  |  |  ------------------
  |  |  |  |   64|      0|  case OpCode::name:             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (64:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   65|      0|    ip += sizeof(inst->i##name); \
  |  |  |  |   66|      0|    break;
  |  |  ------------------
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|    880|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   94|    880|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 880, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   95|    880|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|    880|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|    880|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|    880|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|    880|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|    880|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|    880|    break;
  |  |  ------------------
  |  |   89|      0|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   94|      0|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   95|      0|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|      0|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|      0|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|      0|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|      0|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|      0|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|      0|    break;
  |  |  ------------------
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  4.95k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |  ------------------
  |  |  |  |   68|  4.95k|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 4.95k, False: 847k]
  |  |  |  |  ------------------
  |  |  |  |   69|  4.95k|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|  4.95k|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|  4.95k|    break;
  |  |  ------------------
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|      0|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  20.1k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   86|  20.1k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 20.1k, False: 832k]
  |  |  |  |  ------------------
  |  |  |  |   87|  20.1k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  20.1k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  20.1k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  20.1k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  20.1k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  20.1k|    break;
  |  |  ------------------
  |  |  110|      0|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  13.4k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   73|  13.4k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 13.4k, False: 839k]
  |  |  |  |  ------------------
  |  |  |  |   74|  13.4k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  13.4k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  13.4k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  13.4k|    break;
  |  |  ------------------
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|   133k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|   133k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 133k, False: 719k]
  |  |  |  |  ------------------
  |  |  |  |   74|   133k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|   133k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|   133k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|   133k|    break;
  |  |  ------------------
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|   137k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  ------------------
  |  |  |  |   73|   137k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 137k, False: 715k]
  |  |  |  |  ------------------
  |  |  |  |   74|   137k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|   137k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|   137k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|   137k|    break;
  |  |  ------------------
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  3.98k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|  3.98k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 3.98k, False: 848k]
  |  |  |  |  ------------------
  |  |  |  |   74|  3.98k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  3.98k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  3.98k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  3.98k|    break;
  |  |  ------------------
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|      7|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      7|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 7, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      7|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      7|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      7|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      7|    break;
  |  |  ------------------
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|      4|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      4|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 4, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      4|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      4|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      4|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      4|    break;
  |  |  ------------------
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.18k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|  1.18k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 1.18k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   74|  1.18k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  1.18k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  1.18k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  1.18k|    break;
  |  |  ------------------
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|      1|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      1|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 1, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      1|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      1|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      1|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      1|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      1|    break;
  |  |  ------------------
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|      6|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      6|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 6, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      6|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      6|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      6|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      6|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      6|    break;
  |  |  ------------------
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|      0|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|      0|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  3.73k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  3.73k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 3.73k, False: 849k]
  |  |  |  |  ------------------
  |  |  |  |   80|  3.73k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  3.73k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  3.73k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  3.73k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  3.73k|    break;
  |  |  ------------------
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|      0|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  4.03k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  4.03k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 4.03k, False: 848k]
  |  |  |  |  ------------------
  |  |  |  |   80|  4.03k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  4.03k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  4.03k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  4.03k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  4.03k|    break;
  |  |  ------------------
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|      0|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  41.3k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  41.3k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 41.3k, False: 811k]
  |  |  |  |  ------------------
  |  |  |  |   80|  41.3k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  41.3k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  41.3k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  41.3k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  41.3k|    break;
  |  |  ------------------
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|      0|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|    190|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    190|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 190, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    190|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    190|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    190|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    190|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    190|    break;
  |  |  ------------------
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|      0|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  7.57k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  7.57k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 7.57k, False: 845k]
  |  |  |  |  ------------------
  |  |  |  |   80|  7.57k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  7.57k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  7.57k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  7.57k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  7.57k|    break;
  |  |  ------------------
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|      8|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      8|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 8, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      8|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      8|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      8|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      8|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      8|    break;
  |  |  ------------------
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  7.03k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  7.03k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 7.03k, False: 845k]
  |  |  |  |  ------------------
  |  |  |  |   80|  7.03k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  7.03k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  7.03k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  7.03k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  7.03k|    break;
  |  |  ------------------
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|      2|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      2|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 2, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      2|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      2|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      2|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      2|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      2|    break;
  |  |  ------------------
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|      0|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|      0|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|      1|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      1|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 1, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      1|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      1|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      1|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      1|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      1|    break;
  |  |  ------------------
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|      0|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|      6|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      6|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 6, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      6|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      6|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      6|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      6|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      6|    break;
  |  |  ------------------
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|      0|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|    222|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    222|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 222, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    222|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    222|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    222|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    222|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    222|    break;
  |  |  ------------------
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|    101|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|    101|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 101, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|    101|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|    101|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|    101|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|    101|    break;
  |  |  ------------------
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|      0|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|    297|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    297|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 297, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    297|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    297|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    297|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    297|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    297|    break;
  |  |  ------------------
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|      0|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  2.87k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   73|  2.87k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 2.87k, False: 850k]
  |  |  |  |  ------------------
  |  |  |  |   74|  2.87k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  2.87k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  2.87k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  2.87k|    break;
  |  |  ------------------
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  6.15k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  6.15k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 6.15k, False: 846k]
  |  |  |  |  ------------------
  |  |  |  |   80|  6.15k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  6.15k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  6.15k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  6.15k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  6.15k|    break;
  |  |  ------------------
  |  |  227|      0|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  228|    799|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    799|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 799, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    799|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    799|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    799|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    799|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    799|    break;
  |  |  ------------------
  |  |  229|      0|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  6.93k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   79|  6.93k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 6.93k, False: 845k]
  |  |  |  |  ------------------
  |  |  |  |   80|  6.93k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  6.93k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  6.93k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  6.93k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  6.93k|    break;
  |  |  ------------------
  |  |  236|      0|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.32k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  ------------------
  |  |  |  |   68|  1.32k|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 1.32k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   69|  1.32k|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|  1.32k|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|  1.32k|    break;
  |  |  ------------------
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|      5|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  ------------------
  |  |  |  |   68|      5|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 5, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      5|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      5|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      5|    break;
  |  |  ------------------
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.94k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  ------------------
  |  |  |  |   68|  1.94k|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 1.94k, False: 850k]
  |  |  |  |  ------------------
  |  |  |  |   69|  1.94k|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|  1.94k|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|  1.94k|    break;
  |  |  ------------------
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|      2|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  ------------------
  |  |  |  |   68|      2|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 2, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      2|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      2|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      2|    break;
  |  |  ------------------
  |  |  251|      0|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  8.03k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   86|  8.03k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 8.03k, False: 844k]
  |  |  |  |  ------------------
  |  |  |  |   87|  8.03k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  8.03k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  8.03k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  8.03k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  8.03k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  8.03k|    break;
  |  |  ------------------
  |  |  257|      0|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  258|      0|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  259|      0|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|      0|OPERAND_STRING_ID(GetById, 4)
  |  |  261|      0|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  72.3k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   86|  72.3k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 72.3k, False: 780k]
  |  |  |  |  ------------------
  |  |  |  |   87|  72.3k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  72.3k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  72.3k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  72.3k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  72.3k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  72.3k|    break;
  |  |  ------------------
  |  |  267|      0|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  268|      0|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|      0|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  7.06k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   86|  7.06k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 7.06k, False: 845k]
  |  |  |  |  ------------------
  |  |  |  |   87|  7.06k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  7.06k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  7.06k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  7.06k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  7.06k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  7.06k|    break;
  |  |  ------------------
  |  |  274|      0|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  275|      0|OPERAND_STRING_ID(PutById, 4)
  |  |  276|      0|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|      0|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  282|      0|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  283|      0|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|      0|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  4.75k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   79|  4.75k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 4.75k, False: 848k]
  |  |  |  |  ------------------
  |  |  |  |   80|  4.75k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  4.75k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  4.75k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  4.75k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  4.75k|    break;
  |  |  ------------------
  |  |  295|      0|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  296|      0|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  297|      0|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|      0|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|      0|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|      0|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  308|      0|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  309|      0|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|      0|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|      0|ASSERT_MONOTONE_INCREASING(
  |  |  314|      0|    PutNewOwnByIdShort,
  |  |  315|      0|    PutNewOwnById,
  |  |  316|      0|    PutNewOwnByIdLong,
  |  |  317|      0|    PutNewOwnNEById,
  |  |  318|      0|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  4.24k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   79|  4.24k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 4.24k, False: 848k]
  |  |  |  |  ------------------
  |  |  |  |   80|  4.24k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  4.24k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  4.24k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  4.24k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  4.24k|    break;
  |  |  ------------------
  |  |  325|   226k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|   226k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 226k, False: 626k]
  |  |  |  |  ------------------
  |  |  |  |   80|   226k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|   226k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|   226k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|   226k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|   226k|    break;
  |  |  ------------------
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|      0|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|      0|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  339|      0|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  340|      0|OPERAND_STRING_ID(DelById, 3)
  |  |  341|      0|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|    101|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    101|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 101, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    101|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    101|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    101|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    101|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    101|    break;
  |  |  ------------------
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|      0|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|      0|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|      0|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   94|      0|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   95|      0|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|      0|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|      0|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|      0|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|      0|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|      0|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|      0|    break;
  |  |  ------------------
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|      0|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   86|      0|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   87|      0|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|      0|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|      0|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|      0|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|      0|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|      0|    break;
  |  |  ------------------
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|      0|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   94|      0|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   95|      0|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|      0|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|      0|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|      0|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|      0|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|      0|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|      0|    break;
  |  |  ------------------
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|    286|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   79|    286|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 286, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    286|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    286|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    286|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    286|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    286|    break;
  |  |  ------------------
  |  |  394|      0|DEFINE_RET_TARGET(Call)
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.68k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   79|  1.68k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 1.68k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   80|  1.68k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  1.68k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  1.68k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  1.68k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  1.68k|    break;
  |  |  ------------------
  |  |  403|      0|DEFINE_RET_TARGET(Construct)
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|    693|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|    693|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 693, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    693|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    693|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    693|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    693|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    693|    break;
  |  |  ------------------
  |  |  410|      0|DEFINE_RET_TARGET(Call1)
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|      0|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  420|      0|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|      0|DEFINE_RET_TARGET(CallDirect)
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  3.06k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   86|  3.06k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 3.06k, False: 849k]
  |  |  |  |  ------------------
  |  |  |  |   87|  3.06k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  3.06k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  3.06k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  3.06k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  3.06k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  3.06k|    break;
  |  |  ------------------
  |  |  429|      0|DEFINE_RET_TARGET(Call2)
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   94|  1.48k|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 1.48k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   95|  1.48k|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|  1.48k|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|  1.48k|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|  1.48k|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|  1.48k|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|  1.48k|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|  1.48k|    break;
  |  |  ------------------
  |  |  438|      0|DEFINE_RET_TARGET(Call3)
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|    198|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |  104|    198|  case OpCode::name:                                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (104:3): [True: 198, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |  105|    198|    validate##op1type(ip, inst->i##name.op1);                   \
  |  |  |  |  106|    198|    validate##op2type(ip, inst->i##name.op2);                   \
  |  |  |  |  107|    198|    validate##op3type(ip, inst->i##name.op3);                   \
  |  |  |  |  108|    198|    validate##op4type(ip, inst->i##name.op4);                   \
  |  |  |  |  109|    198|    validate##op5type(ip, inst->i##name.op5);                   \
  |  |  |  |  110|    198|    validate##op6type(ip, inst->i##name.op6);                   \
  |  |  |  |  111|    198|    ip += sizeof(inst->i##name);                                \
  |  |  |  |  112|    198|    break;
  |  |  ------------------
  |  |  448|      0|DEFINE_RET_TARGET(Call4)
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|      5|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      5|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 5, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      5|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      5|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      5|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      5|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      5|    break;
  |  |  ------------------
  |  |  452|      0|DEFINE_RET_TARGET(CallLong)
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|      0|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  456|      0|DEFINE_RET_TARGET(ConstructLong)
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|      0|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  460|      0|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|      0|ASSERT_MONOTONE_INCREASING(
  |  |  464|      0|    Call,
  |  |  465|      0|    Construct,
  |  |  466|      0|    Call1,
  |  |  467|      0|    CallDirect,
  |  |  468|      0|    Call2,
  |  |  469|      0|    Call3,
  |  |  470|      0|    Call4,
  |  |  471|      0|    CallLong,
  |  |  472|      0|    ConstructLong,
  |  |  473|      0|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|    278|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   79|    278|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 278, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|    278|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|    278|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|    278|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|    278|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|    278|    break;
  |  |  ------------------
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|      5|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      5|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 5, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      5|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      5|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      5|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      5|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      5|    break;
  |  |  ------------------
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|      0|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  6.49k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  ------------------
  |  |  |  |   68|  6.49k|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 6.49k, False: 846k]
  |  |  |  |  ------------------
  |  |  |  |   69|  6.49k|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|  6.49k|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|  6.49k|    break;
  |  |  ------------------
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|    408|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  ------------------
  |  |  |  |   68|    408|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 408, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|    408|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    408|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    408|    break;
  |  |  ------------------
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|      0|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|    204|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  ------------------
  |  |  |  |   68|    204|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 204, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|    204|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    204|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    204|    break;
  |  |  ------------------
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|      0|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|      0|DEFINE_OPCODE_0(Debugger)
  |  |  ------------------
  |  |  |  |   64|      0|  case OpCode::name:             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (64:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   65|      0|    ip += sizeof(inst->i##name); \
  |  |  |  |   66|      0|    break;
  |  |  ------------------
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|    164|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  ------------------
  |  |  |  |   64|    164|  case OpCode::name:             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (64:3): [True: 164, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   65|    164|    ip += sizeof(inst->i##name); \
  |  |  |  |   66|    164|    break;
  |  |  ------------------
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|      0|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  ------------------
  |  |  |  |   68|      0|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      0|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      0|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      0|    break;
  |  |  ------------------
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  77.6k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|  77.6k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 77.6k, False: 775k]
  |  |  |  |  ------------------
  |  |  |  |   80|  77.6k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  77.6k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  77.6k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  77.6k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  77.6k|    break;
  |  |  ------------------
  |  |  542|      0|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  543|      0|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|      0|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|      0|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  551|      0|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  552|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|      0|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  560|      0|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  561|      0|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|      0|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.68k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  1.68k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 1.68k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   80|  1.68k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  1.68k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  1.68k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  1.68k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  1.68k|    break;
  |  |  ------------------
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.68k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|  1.68k|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 1.68k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   80|  1.68k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|  1.68k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|  1.68k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|  1.68k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|  1.68k|    break;
  |  |  ------------------
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  5.35k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   73|  5.35k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 5.35k, False: 847k]
  |  |  |  |  ------------------
  |  |  |  |   74|  5.35k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  5.35k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  5.35k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  5.35k|    break;
  |  |  ------------------
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|      0|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.23k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   73|  1.23k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 1.23k, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   74|  1.23k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  1.23k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  1.23k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  1.23k|    break;
  |  |  ------------------
  |  |  587|    131|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  ------------------
  |  |  |  |   73|    131|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 131, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|    131|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|    131|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|    131|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|    131|    break;
  |  |  ------------------
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|     80|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  ------------------
  |  |  |  |   73|     80|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 80, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|     80|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|     80|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|     80|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|     80|    break;
  |  |  ------------------
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|      0|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  594|      0|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  595|      0|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|      0|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  2.88k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   73|  2.88k|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 2.88k, False: 850k]
  |  |  |  |  ------------------
  |  |  |  |   74|  2.88k|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|  2.88k|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|  2.88k|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|  2.88k|    break;
  |  |  ------------------
  |  |  600|      0|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  601|      0|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|      0|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|      0|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  ------------------
  |  |  |  |   68|      0|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      0|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      0|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      0|    break;
  |  |  ------------------
  |  |  606|  3.82k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  ------------------
  |  |  |  |   68|  3.82k|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 3.82k, False: 849k]
  |  |  |  |  ------------------
  |  |  |  |   69|  3.82k|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|  3.82k|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|  3.82k|    break;
  |  |  ------------------
  |  |  607|    990|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  ------------------
  |  |  |  |   68|    990|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 990, False: 851k]
  |  |  |  |  ------------------
  |  |  |  |   69|    990|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    990|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    990|    break;
  |  |  ------------------
  |  |  608|    408|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  ------------------
  |  |  |  |   68|    408|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 408, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|    408|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    408|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    408|    break;
  |  |  ------------------
  |  |  609|    408|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  ------------------
  |  |  |  |   68|    408|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 408, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|    408|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    408|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    408|    break;
  |  |  ------------------
  |  |  610|    626|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  ------------------
  |  |  |  |   68|    626|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 626, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|    626|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|    626|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|    626|    break;
  |  |  ------------------
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|      0|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|      5|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  ------------------
  |  |  |  |   68|      5|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 5, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      5|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      5|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      5|    break;
  |  |  ------------------
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|      4|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      4|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 4, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      4|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      4|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      4|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      4|    break;
  |  |  ------------------
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|      2|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      2|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 2, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      2|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      2|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      2|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      2|    break;
  |  |  ------------------
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|      0|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|     99|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|     99|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 99, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|     99|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|     99|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|     99|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|     99|    break;
  |  |  ------------------
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|      0|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|      0|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|      2|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  ------------------
  |  |  |  |   68|      2|  case OpCode::name:                          \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (68:3): [True: 2, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   69|      2|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |   70|      2|    ip += sizeof(inst->i##name);              \
  |  |  |  |   71|      2|    break;
  |  |  ------------------
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  11.4k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   86|  11.4k|  case OpCode::name:                                              \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (86:3): [True: 11.4k, False: 841k]
  |  |  |  |  ------------------
  |  |  |  |   87|  11.4k|    validate##op1type(ip, inst->i##name.op1);                     \
  |  |  |  |   88|  11.4k|    validate##op2type(ip, inst->i##name.op2);                     \
  |  |  |  |   89|  11.4k|    validate##op3type(ip, inst->i##name.op3);                     \
  |  |  |  |   90|  11.4k|    validate##op4type(ip, inst->i##name.op4);                     \
  |  |  |  |   91|  11.4k|    ip += sizeof(inst->i##name);                                  \
  |  |  |  |   92|  11.4k|    break;
  |  |  ------------------
  |  |  672|      0|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|      0|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|      0|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   94|      0|  case OpCode::name:                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (94:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   95|      0|    validate##op1type(ip, inst->i##name.op1);                              \
  |  |  |  |   96|      0|    validate##op2type(ip, inst->i##name.op2);                              \
  |  |  |  |   97|      0|    validate##op3type(ip, inst->i##name.op3);                              \
  |  |  |  |   98|      0|    validate##op4type(ip, inst->i##name.op4);                              \
  |  |  |  |   99|      0|    validate##op5type(ip, inst->i##name.op5);                              \
  |  |  |  |  100|      0|    ip += sizeof(inst->i##name);                                           \
  |  |  |  |  101|      0|    break;
  |  |  ------------------
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|      0|DEFINE_OPCODE_0(StartGenerator)
  |  |  ------------------
  |  |  |  |   64|      0|  case OpCode::name:             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (64:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   65|      0|    ip += sizeof(inst->i##name); \
  |  |  |  |   66|      0|    break;
  |  |  ------------------
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|      0|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|      0|    break;
  |  |  ------------------
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|      0|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  ------------------
  |  |  |  |   64|      0|  case OpCode::name:             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (64:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   65|      0|    ip += sizeof(inst->i##name); \
  |  |  |  |   66|      0|    break;
  |  |  ------------------
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|      0|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  712|      0|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      0|    break;
  |  |  ------------------
  |  |  713|      0|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|      0|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|     12|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   73|     12|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 12, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|     12|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|     12|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|     12|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|     12|    break;
  |  |  ------------------
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|      6|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   79|      6|  case OpCode::name:                                     \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (79:3): [True: 6, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   80|      6|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |   81|      6|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |   82|      6|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |   83|      6|    ip += sizeof(inst->i##name);                         \
  |  |  |  |   84|      6|    break;
  |  |  ------------------
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|     18|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   73|     18|  case OpCode::name:                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (73:3): [True: 18, False: 852k]
  |  |  |  |  ------------------
  |  |  |  |   74|     18|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |   75|     18|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |   76|     18|    ip += sizeof(inst->i##name);                \
  |  |  |  |   77|     18|    break;
  |  |  ------------------
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|      0|#define DEFINE_JUMP_1(name)           \
  |  |  751|      0|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|      0|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|      0|#define DEFINE_JUMP_2(name)                 \
  |  |  756|      0|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|      0|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|      0|#define DEFINE_JUMP_3(name)                       \
  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|     18|DEFINE_JUMP_1(Jmp)
  |  |  ------------------
  |  |  |  |  751|    238|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|    238|  case OpCode::name:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (68:3): [True: 238, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   69|    238|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |  |  |   70|    238|    ip += sizeof(inst->i##name);              \
  |  |  |  |  |  |   71|    238|    break;
  |  |  |  |  ------------------
  |  |  |  |  752|    238|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      0|  case OpCode::name:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (68:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   69|      0|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |  |  |   70|      0|    ip += sizeof(inst->i##name);              \
  |  |  |  |  |  |   71|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  753|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|    102|DEFINE_JUMP_2(JmpTrue)
  |  |  ------------------
  |  |  |  |  756|    659|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|    659|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 659, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|    659|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|    659|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|    659|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|    659|    break;
  |  |  |  |  ------------------
  |  |  |  |  757|    659|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|    102|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 102, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|    102|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|    102|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|    102|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|    102|    break;
  |  |  |  |  ------------------
  |  |  |  |  758|    102|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  769|    102|DEFINE_JUMP_2(JmpFalse)
  |  |  ------------------
  |  |  |  |  756|    795|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|    795|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 795, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|    795|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|    795|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|    795|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|    795|    break;
  |  |  |  |  ------------------
  |  |  |  |  757|    795|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  758|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|      0|DEFINE_JUMP_2(JmpUndefined)
  |  |  ------------------
  |  |  |  |  756|      0|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  757|      0|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   73|      0|  case OpCode::name:                            \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (73:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   74|      0|    validate##op1type(ip, inst->i##name.op1);   \
  |  |  |  |  |  |   75|      0|    validate##op2type(ip, inst->i##name.op2);   \
  |  |  |  |  |  |   76|      0|    ip += sizeof(inst->i##name);                \
  |  |  |  |  |  |   77|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  758|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|      0|DEFINE_JUMP_1(SaveGenerator)
  |  |  ------------------
  |  |  |  |  751|      0|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      0|  case OpCode::name:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (68:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   69|      0|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |  |  |   70|      0|    ip += sizeof(inst->i##name);              \
  |  |  |  |  |  |   71|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  752|      0|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   68|      0|  case OpCode::name:                          \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (68:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   69|      0|    validate##op1type(ip, inst->i##name.op1); \
  |  |  |  |  |  |   70|      0|    ip += sizeof(inst->i##name);              \
  |  |  |  |  |  |   71|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  753|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|      0|DEFINE_JUMP_3(JLess)
  |  |  ------------------
  |  |  |  |  761|     99|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|     99|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 99, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     99|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|     99|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|     99|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|     99|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|     99|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|     99|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  785|      0|DEFINE_JUMP_3(JNotLess)
  |  |  ------------------
  |  |  |  |  761|     99|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|     99|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 99, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|     99|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|     99|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|     99|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|     99|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|     99|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|     99|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  786|      0|DEFINE_JUMP_3(JLessN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  787|      0|DEFINE_JUMP_3(JNotLessN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  788|      0|DEFINE_JUMP_3(JLessEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  789|      0|DEFINE_JUMP_3(JNotLessEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  790|      0|DEFINE_JUMP_3(JLessEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  791|      0|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  792|      0|DEFINE_JUMP_3(JGreater)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  793|      0|DEFINE_JUMP_3(JNotGreater)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  794|      0|DEFINE_JUMP_3(JGreaterN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  795|      0|DEFINE_JUMP_3(JNotGreaterN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  796|      0|DEFINE_JUMP_3(JGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  797|      0|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  798|      0|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  799|      0|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  800|      0|DEFINE_JUMP_3(JEqual)
  |  |  ------------------
  |  |  |  |  761|    594|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|    594|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 594, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|    594|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|    594|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|    594|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|    594|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|    594|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|    594|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  801|      0|DEFINE_JUMP_3(JNotEqual)
  |  |  ------------------
  |  |  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  802|    693|DEFINE_JUMP_3(JStrictEqual)
  |  |  ------------------
  |  |  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|  1.48k|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 1.48k, False: 851k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|  1.48k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|  1.48k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|  1.48k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|  1.48k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|  1.48k|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|    693|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 693, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|    693|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|    693|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|    693|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|    693|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|    693|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|    693|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  803|      0|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  ------------------
  |  |  |  |  761|  1.28k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|  1.28k|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 1.28k, False: 851k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|  1.28k|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|  1.28k|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|  1.28k|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|  1.28k|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|  1.28k|    break;
  |  |  |  |  ------------------
  |  |  |  |  762|  1.28k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   79|      0|  case OpCode::name:                                     \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (79:3): [True: 0, False: 852k]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   80|      0|    validate##op1type(ip, inst->i##name.op1);            \
  |  |  |  |  |  |   81|      0|    validate##op2type(ip, inst->i##name.op2);            \
  |  |  |  |  |  |   82|      0|    validate##op3type(ip, inst->i##name.op3);            \
  |  |  |  |  |  |   83|      0|    ip += sizeof(inst->i##name);                         \
  |  |  |  |  |  |   84|      0|    break;
  |  |  |  |  ------------------
  |  |  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|      0|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|      0|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|      0|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|      0|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|      0|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|      0|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|      0|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|      0|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|      0|#undef DEFINE_JUMP_1
  |  |  854|      0|#undef DEFINE_JUMP_2
  |  |  855|      0|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|      0|#undef DEFINE_OPERAND_TYPE
  |  |  859|      0|#undef DEFINE_OPCODE_0
  |  |  860|      0|#undef DEFINE_OPCODE_1
  |  |  861|      0|#undef DEFINE_OPCODE_2
  |  |  862|      0|#undef DEFINE_OPCODE_3
  |  |  863|      0|#undef DEFINE_OPCODE_4
  |  |  864|      0|#undef DEFINE_OPCODE_5
  |  |  865|      0|#undef DEFINE_OPCODE_6
  |  |  866|      0|#undef DEFINE_OPCODE
  |  |  867|      0|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|      0|#undef DEFINE_RET_TARGET
  |  |  869|      0|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|      0|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|      0|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|      0|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|      0|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|      0|#undef OPERAND_BIGINT_ID
  |  |  875|      0|#undef OPERAND_FUNCTION_ID
  |  |  876|      0|#undef OPERAND_STRING_ID
  ------------------
  115|      0|      default:
  ------------------
  |  Branch (115:7): [True: 0, False: 852k]
  ------------------
  116|      0|        llvm_unreachable("invalid opcode");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  117|   852k|    }
  118|   852k|  }
  119|  4.69k|}
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_7clEih:
   43|  1.42M|  auto validateReg8 = [&](OperandAddr32, OperandReg8 reg8) {
   44|  1.42M|    assert(reg8 < frameSize && "invalid register index");
   45|  1.42M|  };
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_3clEz:
   39|   237k|  auto validateUInt16 = [](...) {};
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_4clEz:
   40|   261k|  auto validateUInt32 = [](...) {};
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_8clEij:
   46|   274k|  auto validateReg32 = [&](OperandAddr32, OperandReg32 reg32) {
   47|   274k|    assert(reg32 < frameSize && "invalid register index");
   48|   274k|  };
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_2clEz:
   38|   130k|  auto validateUInt8 = [](...) {};
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_5clEz:
   41|    131|  auto validateImm32 = [](...) {};
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_6clEz:
   42|     80|  auto validateDouble = [](...) {};
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK3$_9clEii:
   49|  6.05k|  auto validateAddr32 = [&](OperandAddr32 ip, OperandAddr32 offset) {
   50|       |    // Check the offset while avoiding overflow.
   51|  6.05k|    assert(
   52|  6.05k|        (offset < 0 ? ip + offset >= 0 : offset < listSize - ip) &&
   53|  6.05k|        "invalid jmp offset");
   54|  6.05k|  };
CodeBlock.cpp:_ZZN6hermes2vmL20validateInstructionsEN4llvh8ArrayRefIhEEjENK4$_10clEia:
   55|  5.25k|  auto validateAddr8 = [&](OperandAddr32 ip, OperandAddr8 offset) {
   56|  5.25k|    validateAddr32(ip, offset);
   57|  5.25k|  };
CodeBlock.cpp:_ZZN6hermes2vm9CodeBlock15createCodeBlockEPNS0_13RuntimeModuleENS_3hbc21RuntimeFunctionHeaderEPKhjENK3$_0clEh:
  137|  10.0k|  auto sizeComputer = [](uint8_t highest) -> uint32_t {
  138|  10.0k|    return highest == 0 ? 0 : highest + 1;
  ------------------
  |  Branch (138:12): [True: 5.27k, False: 4.79k]
  ------------------
  139|  10.0k|  };

_ZN6hermes2vm8Debugger17willExecuteModuleEPNS0_13RuntimeModuleEPNS0_9CodeBlockE:
  462|    155|void Debugger::willExecuteModule(RuntimeModule *module, CodeBlock *codeBlock) {
  463|       |  // This function should only be called on the main RuntimeModule and not on
  464|       |  // any "child" RuntimeModules it may create through lazy compilation.
  465|    155|  assert(
  466|    155|      module == module->getLazyRootModule() &&
  467|    155|      "Expected to only run on lazy root module");
  468|       |
  469|    155|  if (!getShouldPauseOnScriptLoad())
  ------------------
  |  Branch (469:7): [True: 155, False: 0]
  ------------------
  470|    155|    return;
  471|       |  // We want to pause on the first instruction of this module.
  472|       |  // Add a breakpoint on the first opcode of its global function.
  473|      0|  auto globalFunctionIndex = module->getBytecode()->getGlobalFunctionIndex();
  474|      0|  auto globalCode = module->getCodeBlockMayAllocate(globalFunctionIndex);
  475|      0|  setOnLoadBreakpoint(globalCode, 0);
  476|      0|}
_ZN6hermes2vm8Debugger16willUnloadModuleEPNS0_13RuntimeModuleE:
  478|    928|void Debugger::willUnloadModule(RuntimeModule *module) {
  479|    928|  if (tempBreakpoints_.size() == 0 && userBreakpoints_.size() == 0) {
  ------------------
  |  Branch (479:7): [True: 928, False: 0]
  |  Branch (479:39): [True: 928, False: 0]
  ------------------
  480|    928|    return;
  481|    928|  }
  482|       |
  483|      0|  llvh::DenseSet<CodeBlock *> unloadingBlocks;
  484|      0|  for (auto *block : module->getFunctionMap()) {
  ------------------
  |  Branch (484:20): [True: 0, False: 0]
  ------------------
  485|      0|    if (block) {
  ------------------
  |  Branch (485:9): [True: 0, False: 0]
  ------------------
  486|      0|      unloadingBlocks.insert(block);
  487|      0|    }
  488|      0|  }
  489|       |
  490|      0|  for (auto &bp : userBreakpoints_) {
  ------------------
  |  Branch (490:17): [True: 0, False: 0]
  ------------------
  491|      0|    if (unloadingBlocks.count(bp.second.codeBlock)) {
  ------------------
  |  Branch (491:9): [True: 0, False: 0]
  ------------------
  492|      0|      unresolveBreakpointLocation(bp.second);
  493|      0|    }
  494|      0|  }
  495|       |
  496|      0|  auto cleanTempBreakpoint = [&](Breakpoint &bp) {
  497|      0|    if (!unloadingBlocks.count(bp.codeBlock))
  498|      0|      return false;
  499|       |
  500|      0|    auto *ptr = bp.codeBlock->getOffsetPtr(bp.offset);
  501|      0|    auto it = breakpointLocations_.find(ptr);
  502|      0|    if (it != breakpointLocations_.end()) {
  503|      0|      auto &location = it->second;
  504|      0|      assert(!location.user.hasValue() && "Unexpected user breakpoint");
  505|      0|      bp.codeBlock->uninstallBreakpointAtOffset(bp.offset, location.opCode);
  506|      0|      breakpointLocations_.erase(it);
  507|      0|    }
  508|      0|    return true;
  509|      0|  };
  510|       |
  511|      0|  tempBreakpoints_.erase(
  512|      0|      std::remove_if(
  513|      0|          tempBreakpoints_.begin(),
  514|      0|          tempBreakpoints_.end(),
  515|      0|          cleanTempBreakpoint),
  516|      0|      tempBreakpoints_.end());
  517|      0|}

_ZN6hermes2vm24DecoratedObjectBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   41|      1|void DecoratedObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   42|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<DecoratedObject>());
   43|      1|  JSObjectBuildMeta(cell, mb);
   44|      1|  mb.setVTable(&DecoratedObject::vt);
   45|      1|}
_ZN6hermes2vm15DecoratedObject13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
   68|     99|void DecoratedObject::_finalizeImpl(GCCell *cell, GC &) {
   69|     99|  auto *self = vmcast<DecoratedObject>(cell);
   70|     99|  self->~DecoratedObject();
   71|     99|}

_ZN6hermes2vm24DictPropertyMapBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   55|      1|void DictPropertyMapBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   56|      1|  const auto *self = static_cast<const DictPropertyMap *>(cell);
   57|      1|  mb.setVTable(&DictPropertyMap::vt);
   58|      1|  mb.addArray(
   59|      1|      &self->getDescriptorPairs()->first,
   60|      1|      &self->numDescriptors_,
   61|      1|      sizeof(DictPropertyMap::DescriptorPair));
   62|      1|}
_ZN6hermes2vm15DictPropertyMap14getMaxCapacityEv:
   64|  9.45k|DictPropertyMap::size_type DictPropertyMap::getMaxCapacity() {
   65|  9.45k|  return detail::kMaxCapacity;
   66|  9.45k|}
_ZN6hermes2vm15DictPropertyMap6createERNS0_7RuntimeEj:
   70|  19.2k|    size_type capacity) {
   71|  19.2k|  if (LLVM_UNLIKELY(capacity > detail::kMaxCapacity)) {
  ------------------
  |  |  189|  19.2k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 19.2k]
  |  |  ------------------
  ------------------
   72|      0|    return runtime.raiseRangeError(
   73|      0|        TwineChar16("Property storage exceeds ") + detail::kMaxCapacity +
   74|      0|        " properties");
   75|      0|  }
   76|  19.2k|  size_type hashCapacity = calcHashCapacity(capacity);
   77|  19.2k|  auto *cell = runtime.makeAVariable<DictPropertyMap>(
   78|  19.2k|      allocationSize(capacity, hashCapacity), capacity, hashCapacity);
   79|  19.2k|  return createPseudoHandle(cell);
   80|  19.2k|}
_ZN6hermes2vm15DictPropertyMap14lookupEntryForEPS1_NS0_8SymbolIDE:
   84|  2.98M|    SymbolID symbolID) {
   85|  2.98M|  ++NumDictLookups;
   86|       |
   87|  2.98M|  size_type const mask = self->hashCapacity_ - 1;
   88|  2.98M|  size_type index = hash(symbolID) & mask;
   89|       |
   90|       |  // Probing step.
   91|  2.98M|  size_type step = 1;
   92|       |  // Save the address of the start of the table to avoid recalculating it.
   93|  2.98M|  HashPair *const tableStart = self->getHashPairs();
   94|       |  // The first deleted entry we found.
   95|  2.98M|  HashPair *deleted = nullptr;
   96|       |
   97|  2.98M|  assert(symbolID.isValid() && "looking for an invalid SymbolID");
   98|       |
   99|  5.63M|  for (;;) {
  100|  5.63M|    HashPair *curEntry = tableStart + index;
  101|       |
  102|  5.63M|    if (curEntry->isValid()) {
  ------------------
  |  Branch (102:9): [True: 4.49M, False: 1.14M]
  ------------------
  103|  4.49M|      if (self->isMatch(curEntry, symbolID))
  ------------------
  |  Branch (103:11): [True: 1.84M, False: 2.64M]
  ------------------
  104|  1.84M|        return {true, curEntry};
  105|  4.49M|    } else if (curEntry->isEmpty()) {
  ------------------
  |  Branch (105:16): [True: 1.14M, False: 0]
  ------------------
  106|       |      // If we encountered an empty pair, the search is over - we failed.
  107|       |      // Return either this entry or a deleted one, if we encountered one.
  108|       |
  109|  1.14M|      return {false, deleted ? deleted : curEntry};
  ------------------
  |  Branch (109:22): [True: 0, False: 1.14M]
  ------------------
  110|  1.14M|    } else {
  111|      0|      assert(curEntry->isDeleted() && "unexpected HashPair state");
  112|       |      // The first time we encounter a deleted entry, record it so we can
  113|       |      // potentially reuse it for insertion.
  114|      0|      if (!deleted)
  ------------------
  |  Branch (114:11): [True: 0, False: 0]
  ------------------
  115|      0|        deleted = curEntry;
  116|      0|    }
  117|       |
  118|  2.64M|    ++NumExtraHashProbes;
  119|  2.64M|    index = (index + step) & mask;
  120|  2.64M|    ++step;
  121|  2.64M|  }
  122|  2.98M|}
_ZN6hermes2vm15DictPropertyMap4growERNS0_13MutableHandleIS1_EERNS0_7RuntimeEj:
  127|  9.82k|    size_type newCapacity) {
  128|  9.82k|  auto res = create(runtime, newCapacity);
  129|  9.82k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  9.82k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.82k]
  |  |  ------------------
  ------------------
  130|      0|    return ExecutionStatus::EXCEPTION;
  131|      0|  }
  132|  9.82k|  auto *newSelf = res->get();
  133|  9.82k|  auto *self = *selfHandleRef;
  134|       |
  135|  9.82k|  selfHandleRef = newSelf;
  136|       |
  137|  9.82k|  auto *dst = newSelf->getDescriptorPairs();
  138|  9.82k|  size_type count = 0;
  139|       |
  140|  9.82k|  for (auto *src = self->getDescriptorPairs(),
  141|  9.82k|            *e = src + self->numDescriptors_.load(std::memory_order_relaxed);
  142|   250k|       src != e;
  ------------------
  |  Branch (142:8): [True: 240k, False: 9.82k]
  ------------------
  143|   240k|       ++src) {
  144|   240k|    if (src->first.isInvalid())
  ------------------
  |  Branch (144:9): [True: 0, False: 240k]
  ------------------
  145|      0|      continue;
  146|       |
  147|   240k|    const SymbolID key = src->first;
  148|       |
  149|       |    // The new property map doesn't have any valid symbols in it yet, use a
  150|       |    // constructor instead of assignment to avoid an invalid write barrier.
  151|   240k|    new (&dst->first) GCSymbolID(key);
  152|   240k|    dst->second = src->second;
  153|       |
  154|   240k|    auto result = lookupEntryFor(newSelf, key);
  155|   240k|    assert(!result.first && "found duplicate entry while growing");
  156|      0|    result.second->setDescIndex(count, key);
  157|       |
  158|   240k|    ++dst;
  159|   240k|    ++count;
  160|   240k|  }
  161|       |
  162|  9.82k|  assert(
  163|  9.82k|      count == self->numProperties_ && "numProperties mismatch when growing");
  164|       |
  165|      0|  newSelf->numProperties_ = count;
  166|       |
  167|       |  // Transfer the deleted list to the new instance.
  168|  9.82k|  auto deletedIndex = self->deletedListHead_;
  169|  9.82k|  if (deletedIndex != END_OF_LIST) {
  ------------------
  |  Branch (169:7): [True: 0, False: 9.82k]
  ------------------
  170|      0|    newSelf->deletedListHead_ = count;
  171|      0|    newSelf->deletedListSize_ = self->deletedListSize_;
  172|       |
  173|      0|    do {
  174|      0|      const auto *src = self->getDescriptorPairs() + deletedIndex;
  175|      0|      assert(
  176|      0|          src->first == SymbolID::deleted() &&
  177|      0|          "pair in the deleted list is not marked as deleted");
  178|       |
  179|       |      // The new property map doesn't have any valid symbols in it yet, use a
  180|       |      // constructor instead of assignment to avoid an invalid write barrier.
  181|      0|      new (&dst->first) GCSymbolID(SymbolID::deleted());
  182|      0|      dst->second.slot = src->second.slot;
  183|       |
  184|      0|      deletedIndex = getNextDeletedIndex(src);
  185|      0|      setNextDeletedIndex(
  186|      0|          dst, deletedIndex != END_OF_LIST ? count + 1 : END_OF_LIST);
  ------------------
  |  Branch (186:16): [True: 0, False: 0]
  ------------------
  187|       |
  188|      0|      ++dst;
  189|      0|      ++count;
  190|      0|    } while (deletedIndex != END_OF_LIST);
  ------------------
  |  Branch (190:14): [True: 0, False: 0]
  ------------------
  191|      0|  }
  192|       |
  193|      0|  newSelf->numDescriptors_.store(count, std::memory_order_release);
  194|  9.82k|  assert(count <= newSelf->descriptorCapacity_);
  195|      0|  return ExecutionStatus::RETURNED;
  196|  9.82k|}
_ZN6hermes2vm15DictPropertyMap9findOrAddERNS0_13MutableHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDE:
  202|   228k|    SymbolID id) {
  203|   228k|  auto *self = *selfHandleRef;
  204|   228k|  auto numDescriptors = self->numDescriptors_.load(std::memory_order_relaxed);
  205|   228k|  auto found = lookupEntryFor(self, id);
  206|   228k|  if (found.first) {
  ------------------
  |  Branch (206:7): [True: 0, False: 228k]
  ------------------
  207|      0|    return std::make_pair(
  208|      0|        &self->getDescriptorPairs()[found.second->getDescIndex()].second,
  209|      0|        false);
  210|      0|  }
  211|       |
  212|       |  // We want to grow the hash table if the number of occupied hash entries
  213|       |  // exceeds 75% of capacity or if the descriptor array is full. Since the
  214|       |  // capacity of the table is 4/3 of the capacity of the descriptor array, it is
  215|       |  // sufficient to only check for the latter.
  216|       |
  217|   228k|  if (numDescriptors == self->descriptorCapacity_) {
  ------------------
  |  Branch (217:7): [True: 9.82k, False: 218k]
  ------------------
  218|  9.82k|    size_type newCapacity;
  219|  9.82k|    if (self->numProperties_ == self->descriptorCapacity_) {
  ------------------
  |  Branch (219:9): [True: 9.82k, False: 0]
  ------------------
  220|       |      // Double the new capacity, up to kMaxCapacity. However make sure that
  221|       |      // we try to allocate at least one extra property. If we are already
  222|       |      // exactly at kMaxCapacity, there is nothing we can do, so grow() will
  223|       |      // simply fail.
  224|  9.82k|      newCapacity = self->numProperties_ * 2;
  225|  9.82k|      if (newCapacity > detail::kMaxCapacity)
  ------------------
  |  Branch (225:11): [True: 0, False: 9.82k]
  ------------------
  226|      0|        newCapacity =
  227|      0|            std::max(toRValue(detail::kMaxCapacity), self->numProperties_ + 1);
  228|  9.82k|    } else {
  229|       |      // Calculate the new capacity to be exactly as much as we need to
  230|       |      // accommodate the deleted list plus one extra property. It it happens
  231|       |      // to exceed kMaxCapacity, there is nothing we can do, so grow() will
  232|       |      // raise an exception.
  233|      0|      newCapacity = self->numProperties_ + 1 + self->deletedListSize_;
  234|      0|    }
  235|       |
  236|  9.82k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  9.82k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 9.82k]
  |  |  ------------------
  ------------------
  237|  9.82k|            grow(selfHandleRef, runtime, newCapacity) ==
  238|  9.82k|            ExecutionStatus::EXCEPTION)) {
  239|      0|      return ExecutionStatus::EXCEPTION;
  240|      0|    }
  241|       |
  242|  9.82k|    self = *selfHandleRef;
  243|  9.82k|    numDescriptors = self->numDescriptors_.load(std::memory_order_relaxed);
  244|       |
  245|  9.82k|    found = lookupEntryFor(self, id);
  246|  9.82k|  }
  247|       |
  248|   228k|  ++self->numProperties_;
  249|   228k|  if (found.second->isDeleted())
  ------------------
  |  Branch (249:7): [True: 0, False: 228k]
  ------------------
  250|      0|    self->decDeletedHashCount();
  251|       |
  252|   228k|  found.second->setDescIndex(numDescriptors, id);
  253|       |
  254|   228k|  auto *descPair = self->getDescriptorPairs() + numDescriptors;
  255|       |
  256|   228k|  descPair->first.set(id, runtime.getHeap());
  257|   228k|  self->numDescriptors_.fetch_add(1, std::memory_order_acq_rel);
  258|       |
  259|   228k|  return std::make_pair(&descPair->second, true);
  260|   228k|}
_ZN6hermes2vm15DictPropertyMap20allocatePropertySlotEPS1_RNS0_7RuntimeE:
  291|   133k|    Runtime &runtime) {
  292|       |  // If there are no deleted properties, the number of properties corresponds
  293|       |  // exactly to the number of slots.
  294|   133k|  if (self->deletedListHead_ == END_OF_LIST)
  ------------------
  |  Branch (294:7): [True: 133k, False: 0]
  ------------------
  295|   133k|    return self->numProperties_;
  296|       |
  297|      0|  auto *deletedPair = self->getDescriptorPairs() + self->deletedListHead_;
  298|      0|  assert(
  299|      0|      deletedPair->first == SymbolID::deleted() &&
  300|      0|      "Head of deleted list is not deleted");
  301|       |
  302|       |  // Remove the first element from the deleted list.
  303|      0|  self->deletedListHead_ = getNextDeletedIndex(deletedPair);
  304|      0|  --self->deletedListSize_;
  305|       |
  306|       |  // Mark the pair as "invalid" instead of "deleted".
  307|       |  // No need for symbol write barrier because the previous value was deleted.
  308|      0|  new (&deletedPair->first) GCSymbolID(SymbolID::empty());
  309|       |
  310|      0|  return deletedPair->second.slot;
  311|   133k|}

_ZN6hermes2vm15DomainBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   40|      1|void DomainBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   41|      1|  const auto *self = static_cast<const Domain *>(cell);
   42|      1|  mb.setVTable(&Domain::vt);
   43|      1|  mb.addField("cjsModules", &self->cjsModules_);
   44|      1|  mb.addField("throwingRequire", &self->throwingRequire_);
   45|      1|}
_ZN6hermes2vm6Domain6createERNS0_7RuntimeE:
   47|    254|PseudoHandle<Domain> Domain::create(Runtime &runtime) {
   48|    254|  auto *cell = runtime.makeAFixed<Domain, HasFinalizer::Yes>();
   49|    254|  auto self = createPseudoHandle(cell);
   50|    254|  return self;
   51|    254|}
_ZN6hermes2vm6Domain13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
   53|    254|void Domain::_finalizeImpl(GCCell *cell, GC &gc) {
   54|    254|  auto *self = vmcast<Domain>(cell);
   55|    928|  for (RuntimeModule *rm : self->runtimeModules_) {
  ------------------
  |  Branch (55:26): [True: 928, False: 254]
  ------------------
   56|    928|    gc.getIDTracker().untrackNative(rm);
   57|    928|  }
   58|    254|  self->~Domain();
   59|    254|}
_ZN6hermes2vm6DomainD2Ev:
   61|    254|Domain::~Domain() {
   62|    928|  for (RuntimeModule *rm : runtimeModules_) {
  ------------------
  |  Branch (62:26): [True: 928, False: 254]
  ------------------
   63|    928|    delete rm;
   64|    928|  }
   65|    254|}
_ZN6hermes2vm6Domain20importCJSModuleTableENS0_6HandleIS1_EERNS0_7RuntimeEPNS0_13RuntimeModuleE:
  111|    155|    RuntimeModule *runtimeModule) {
  112|    155|  if (runtimeModule->getBytecode()->getCJSModuleTable().empty() &&
  ------------------
  |  Branch (112:7): [True: 155, False: 0]
  |  Branch (112:7): [True: 155, False: 0]
  ------------------
  113|    155|      runtimeModule->getBytecode()->getCJSModuleTableStatic().empty()) {
  ------------------
  |  Branch (113:7): [True: 155, False: 0]
  ------------------
  114|       |    // Nothing to do, avoid allocating and simply return.
  115|    155|    return ExecutionStatus::RETURNED;
  116|    155|  }
  117|       |
  118|      0|  static_assert(
  119|      0|      CJSModuleSize < 10, "CJSModuleSize must be small to avoid overflow");
  120|       |
  121|      0|  MutableHandle<ArrayStorage> cjsModules{runtime};
  122|       |
  123|      0|  if (!self->cjsModules_) {
  ------------------
  |  Branch (123:7): [True: 0, False: 0]
  ------------------
  124|       |    // Create the module table on first import.
  125|       |    // If module IDs are contiguous and start from 0, we won't need to resize
  126|       |    // for this RuntimeModule.
  127|       |
  128|      0|    const uint64_t firstSegmentModules =
  129|      0|        runtimeModule->getBytecode()->getCJSModuleTable().size() +
  130|      0|        runtimeModule->getBytecode()->getCJSModuleTableStatic().size();
  131|       |
  132|      0|    assert(
  133|      0|        firstSegmentModules <= std::numeric_limits<uint32_t>::max() &&
  134|      0|        "number of modules is 32 bits due to the bytecode format");
  135|       |
  136|       |    // Use uint64_t to allow us to check for overflow.
  137|      0|    const uint64_t requiredSize = firstSegmentModules * CJSModuleSize;
  138|      0|    if (requiredSize > std::numeric_limits<uint32_t>::max()) {
  ------------------
  |  Branch (138:9): [True: 0, False: 0]
  ------------------
  139|      0|      return runtime.raiseRangeError("Loaded module count exceeded limit");
  140|      0|    }
  141|       |
  142|      0|    auto cjsModulesRes = ArrayStorage::create(runtime, requiredSize);
  143|      0|    if (LLVM_UNLIKELY(cjsModulesRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  144|      0|      return ExecutionStatus::EXCEPTION;
  145|      0|    }
  146|      0|    cjsModules = vmcast<ArrayStorage>(*cjsModulesRes);
  147|      0|    self->cjsRuntimeModules_.reserve(firstSegmentModules);
  148|      0|    for (size_t i = self->cjsRuntimeModules_.size(); i < firstSegmentModules;
  ------------------
  |  Branch (148:54): [True: 0, False: 0]
  ------------------
  149|      0|         i++) {
  150|      0|      self->cjsRuntimeModules_.push_back(nullptr, runtime.getHeap());
  151|      0|    }
  152|       |
  153|      0|    auto requireFn = NativeFunction::create(
  154|      0|        runtime,
  155|      0|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  156|      0|        (void *)TypeErrorKind::InvalidDynamicRequire,
  157|      0|        throwTypeError,
  158|      0|        Predefined::getSymbolID(Predefined::emptyString),
  159|      0|        0,
  160|      0|        Runtime::makeNullHandle<JSObject>());
  161|       |
  162|      0|    auto context = RequireContext::create(
  163|      0|        runtime,
  164|      0|        self,
  165|      0|        runtime.getPredefinedStringHandle(Predefined::emptyString));
  166|       |
  167|       |    // Set the require.context property.
  168|      0|    PropertyFlags pf = PropertyFlags::defaultNewNamedPropertyFlags();
  169|      0|    pf.writable = 0;
  170|      0|    pf.configurable = 0;
  171|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  172|      0|            JSObject::defineNewOwnProperty(
  173|      0|                requireFn,
  174|      0|                runtime,
  175|      0|                Predefined::getSymbolID(Predefined::context),
  176|      0|                pf,
  177|      0|                context) == ExecutionStatus::EXCEPTION)) {
  178|      0|      return ExecutionStatus::EXCEPTION;
  179|      0|    }
  180|       |
  181|      0|    self->throwingRequire_.set(runtime, *requireFn, runtime.getHeap());
  182|      0|  } else {
  183|      0|    cjsModules = self->cjsModules_.get(runtime);
  184|      0|  }
  185|       |
  186|      0|  assert(cjsModules && "cjsModules not set");
  187|       |
  188|       |  // Find the maximum module ID so we can resize cjsModules at most once per
  189|       |  // RuntimeModule.
  190|      0|  uint64_t maxModuleID = cjsModules->size() / CJSModuleSize;
  191|       |
  192|       |  // The non-static module table does not store module IDs. They are assigned
  193|       |  // during registration by counting insertions to cjsModuleTable_. Count the
  194|       |  // insertions up front.
  195|      0|  for (const auto &pair : runtimeModule->getBytecode()->getCJSModuleTable()) {
  ------------------
  |  Branch (195:25): [True: 0, False: 0]
  ------------------
  196|      0|    SymbolID symbolId =
  197|      0|        runtimeModule->getSymbolIDFromStringIDMayAllocate(pair.first);
  198|      0|    if (self->cjsModuleTable_.find(symbolId) == self->cjsModuleTable_.end()) {
  ------------------
  |  Branch (198:9): [True: 0, False: 0]
  ------------------
  199|      0|      ++maxModuleID;
  200|      0|    }
  201|      0|  }
  202|       |
  203|       |  // The static module table stores module IDs in an arbitrary order. Scan for
  204|       |  // the maximum ID.
  205|      0|  for (const auto &pair :
  ------------------
  |  Branch (205:25): [True: 0, False: 0]
  ------------------
  206|      0|       runtimeModule->getBytecode()->getCJSModuleTableStatic()) {
  207|      0|    const auto &moduleID = pair.first;
  208|      0|    if (moduleID > maxModuleID) {
  ------------------
  |  Branch (208:9): [True: 0, False: 0]
  ------------------
  209|      0|      maxModuleID = moduleID;
  210|      0|    }
  211|      0|  }
  212|       |
  213|      0|  assert(
  214|      0|      maxModuleID <= std::numeric_limits<uint32_t>::max() &&
  215|      0|      "number of modules is 32 bits due to the bytecode format");
  216|       |
  217|       |  // Use uint64_t to allow us to check for overflow.
  218|      0|  const uint64_t requiredSize = (maxModuleID + 1) * CJSModuleSize;
  219|      0|  if (requiredSize > std::numeric_limits<uint32_t>::max()) {
  ------------------
  |  Branch (219:7): [True: 0, False: 0]
  ------------------
  220|      0|    return runtime.raiseRangeError("Loaded module count exceeded limit");
  221|      0|  }
  222|       |
  223|       |  // Resize the array to allow for the new modules, if necessary.
  224|      0|  if (requiredSize > cjsModules->size()) {
  ------------------
  |  Branch (224:7): [True: 0, False: 0]
  ------------------
  225|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  226|      0|            ArrayStorage::resize(cjsModules, runtime, requiredSize) ==
  227|      0|            ExecutionStatus::EXCEPTION)) {
  228|      0|      return ExecutionStatus::EXCEPTION;
  229|      0|    }
  230|      0|    self->cjsRuntimeModules_.reserve(maxModuleID + 1);
  231|      0|    for (size_t i = self->cjsRuntimeModules_.size(); i <= maxModuleID; i++) {
  ------------------
  |  Branch (231:54): [True: 0, False: 0]
  ------------------
  232|      0|      self->cjsRuntimeModules_.push_back(nullptr, runtime.getHeap());
  233|      0|    }
  234|      0|  }
  235|       |
  236|       |  /// \return Whether the module with ID \param moduleID has been registered in
  237|       |  /// cjsModules. \pre Space has been allocated for this module's record in
  238|       |  /// cjsModules.
  239|      0|  const auto isModuleRegistered = [&cjsModules,
  240|      0|                                   maxModuleID](uint32_t moduleID) -> bool {
  241|      0|    assert(
  242|      0|        moduleID <= maxModuleID &&
  243|      0|        "CJS module ID exceeds maximum known module ID");
  244|      0|    (void)maxModuleID;
  245|      0|    uint32_t index = moduleID * CJSModuleSize;
  246|      0|    uint32_t requiredSize = index + CJSModuleSize;
  247|      0|    assert(
  248|      0|        cjsModules->size() >= requiredSize &&
  249|      0|        "CJS module ID exceeds allocated storage");
  250|      0|    (void)requiredSize;
  251|      0|    return !cjsModules->at(index + FunctionIndexOffset).isEmpty();
  252|      0|  };
  253|       |
  254|       |  /// Register CJS module \param moduleID in the runtime module table.
  255|       |  /// \return The index into cjsModules where this module's record begins.
  256|       |  /// \pre Space has been allocated for this module's record in cjsModules.
  257|       |  /// \pre Space has been allocated for this module's RuntimeModule* in
  258|       |  /// cjsRuntimeModules_.
  259|       |  /// \pre There is no module already registered under moduleID.
  260|      0|  auto &cjsEntryModuleID = self->cjsEntryModuleID_;
  261|      0|  auto &cjsRuntimeModules = self->cjsRuntimeModules_;
  262|      0|  const auto registerModule =
  263|      0|      [&runtime,
  264|      0|       &cjsModules,
  265|      0|       &cjsRuntimeModules,
  266|      0|       runtimeModule,
  267|      0|       &isModuleRegistered,
  268|      0|       &cjsEntryModuleID](uint32_t moduleID, uint32_t functionID) -> uint32_t {
  269|      0|    assert(!isModuleRegistered(moduleID) && "CJS module ID collision occurred");
  270|      0|    (void)isModuleRegistered;
  271|      0|    if (LLVM_UNLIKELY(!cjsEntryModuleID.hasValue())) {
  272|      0|      cjsEntryModuleID = moduleID;
  273|      0|    }
  274|      0|    uint32_t index = moduleID * CJSModuleSize;
  275|      0|    cjsModules->set(
  276|      0|        index + CachedExportsOffset,
  277|      0|        HermesValue::encodeEmptyValue(),
  278|      0|        runtime.getHeap());
  279|      0|    cjsModules->set(
  280|      0|        index + ModuleOffset,
  281|      0|        HermesValue::encodeNullValue(),
  282|      0|        runtime.getHeap());
  283|      0|    cjsModules->set(
  284|      0|        index + FunctionIndexOffset,
  285|      0|        HermesValue::encodeNativeUInt32(functionID),
  286|      0|        runtime.getHeap());
  287|      0|    cjsRuntimeModules[moduleID] = runtimeModule;
  288|      0|    assert(isModuleRegistered(moduleID) && "CJS module was not registered");
  289|      0|    return index;
  290|      0|  };
  291|       |
  292|       |  // Import full table that allows dynamic requires.
  293|      0|  for (const auto &pair : runtimeModule->getBytecode()->getCJSModuleTable()) {
  ------------------
  |  Branch (293:25): [True: 0, False: 0]
  ------------------
  294|      0|    SymbolID symbolId =
  295|      0|        runtimeModule->getSymbolIDFromStringIDMayAllocate(pair.first);
  296|      0|    auto emplaceRes = self->cjsModuleTable_.try_emplace(symbolId, 0xffffffff);
  297|      0|    if (emplaceRes.second) {
  ------------------
  |  Branch (297:9): [True: 0, False: 0]
  ------------------
  298|       |      // This module has not been registered before.
  299|       |      // Assign it an arbitrary unused module ID, because nothing will be
  300|       |      // referencing that ID from outside Domain.
  301|       |      // Counting insertions to cjsModuleTable_ is a valid source of unique IDs
  302|       |      // since a given Domain uses either dynamic requires or statically
  303|       |      // resolved requires.
  304|      0|      uint32_t moduleID = self->cjsModuleTable_.size() - 1;
  305|      0|      const auto functionID = pair.second;
  306|      0|      auto index = registerModule(moduleID, functionID);
  307|       |      // Update the mapping from symbolId to an index into cjsModules.
  308|      0|      emplaceRes.first->second = index;
  309|      0|    }
  310|      0|  }
  311|       |
  312|       |  // Import table to be used for requireFast.
  313|      0|  for (const auto &pair :
  ------------------
  |  Branch (313:25): [True: 0, False: 0]
  ------------------
  314|      0|       runtimeModule->getBytecode()->getCJSModuleTableStatic()) {
  315|      0|    const auto &moduleID = pair.first;
  316|      0|    const auto &functionID = pair.second;
  317|      0|    if (!isModuleRegistered(moduleID)) {
  ------------------
  |  Branch (317:9): [True: 0, False: 0]
  ------------------
  318|      0|      registerModule(moduleID, functionID);
  319|      0|    }
  320|      0|  }
  321|       |
  322|      0|  self->cjsModules_.set(runtime, cjsModules.get(), runtime.getHeap());
  323|      0|  return ExecutionStatus::RETURNED;
  324|      0|}
_ZN6hermes2vm23RequireContextBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  337|      1|void RequireContextBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  338|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<RequireContext>());
  339|      1|  JSObjectBuildMeta(cell, mb);
  340|      1|  const auto *self = static_cast<const RequireContext *>(cell);
  341|      1|  mb.setVTable(&RequireContext::vt);
  342|      1|  mb.addField(&self->domain_);
  343|      1|  mb.addField(&self->dirname_);
  344|      1|}

_ZN6hermes2vm20DummyObjectBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   89|      1|void DummyObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   90|      1|  const auto *self = static_cast<const testhelpers::DummyObject *>(cell);
   91|      1|  mb.setVTable(&testhelpers::DummyObject::vt);
   92|      1|  mb.addField("HermesBool", &self->hvBool);
   93|      1|  mb.addField("HermesDouble", &self->hvDouble);
   94|      1|  mb.addField("HermesUndefined", &self->hvUndefined);
   95|      1|  mb.addField("HermesEmpty", &self->hvEmpty);
   96|      1|  mb.addField("HermesNative", &self->hvNative);
   97|      1|  mb.addField("HermesNull", &self->hvNull);
   98|      1|  mb.addField("other", &self->other);
   99|      1|}

_ZN6hermes2vm6GCBaseC2ERNS1_11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENS1_8HeapKindE:
   68|     99|      tripwireLimit_(gcConfig.getTripwireConfig().getLimit()) {
   69|    297|  for (unsigned i = 0; i < (unsigned)XorPtrKeyID::_NumKeys; ++i) {
  ------------------
  |  Branch (69:24): [True: 198, False: 99]
  ------------------
   70|    198|    pointerEncryptionKey_[i] = std::random_device()();
   71|    198|    if constexpr (sizeof(uintptr_t) >= 8) {
  ------------------
  |  Branch (71:19): [Folded - Ignored]
  ------------------
   72|       |      // std::random_device() yields an unsigned int, so combine two.
   73|    198|      pointerEncryptionKey_[i] =
   74|    198|          (pointerEncryptionKey_[i] << 32) | std::random_device()();
   75|    198|    }
   76|    198|  }
   77|     99|  buildMetadataTable();
   78|       |#ifdef HERMESVM_PLATFORM_LOGGING
   79|       |  hermesLog(
   80|       |      "HermesGC",
   81|       |      "Initialisation (Init: %dMB, Max: %dMB, Tripwire: %dMB)",
   82|       |      gcConfig.getInitHeapSize() >> 20,
   83|       |      gcConfig.getMaxHeapSize() >> 20,
   84|       |      gcConfig.getTripwireConfig().getLimit() >> 20);
   85|       |#endif // HERMESVM_PLATFORM_LOGGING
   86|       |#ifdef HERMESVM_SANITIZE_HANDLES
   87|       |  const std::minstd_rand::result_type seed =
   88|       |      gcConfig.getSanitizeConfig().getRandomSeed() >= 0
   89|       |      ? gcConfig.getSanitizeConfig().getRandomSeed()
   90|       |      : std::random_device()();
   91|       |  if (sanitizeRate_ > 0.0 && sanitizeRate_ < 1.0) {
   92|       |    llvh::errs()
   93|       |        << "Warning: you are using handle sanitization with random sampling.\n"
   94|       |        << "Sanitize Rate: ";
   95|       |    llvh::write_double(llvh::errs(), sanitizeRate_, llvh::FloatStyle::Percent);
   96|       |    llvh::errs() << "\n"
   97|       |                 << "Sanitize Rate Seed: " << seed << "\n"
   98|       |                 << "Re-run with -gc-sanitize-handles-random-seed=" << seed
   99|       |                 << " for deterministic crashes.\n";
  100|       |  }
  101|       |  randomEngine_.seed(seed);
  102|       |#endif
  103|     99|}
_ZN6hermes2vm6GCBase7GCCycleC2ERS1_NSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEE:
  106|    434|    : gc_(gc), extraInfo_(std::move(extraInfo)), previousInGC_(gc_.inGC_) {
  107|    434|  if (!previousInGC_) {
  ------------------
  |  Branch (107:7): [True: 434, False: 0]
  ------------------
  108|    434|    gc_.getCallbacks().onGCEvent(GCEventKind::CollectionStart, extraInfo_);
  109|    434|    gc_.inGC_ = true;
  110|    434|  }
  111|    434|}
_ZN6hermes2vm6GCBase7GCCycleD2Ev:
  113|    434|GCBase::GCCycle::~GCCycle() {
  114|    434|  if (!previousInGC_) {
  ------------------
  |  Branch (114:7): [True: 434, False: 0]
  ------------------
  115|    434|    gc_.inGC_ = false;
  116|    434|    gc_.getCallbacks().onGCEvent(GCEventKind::CollectionEnd, extraInfo_);
  117|    434|  }
  118|    434|}
_ZN6hermes2vm6GCBase18runtimeWillExecuteEv:
  120|    155|void GCBase::runtimeWillExecute() {
  121|    155|  if (recordGcStats_ && !execStartTimeRecorded_) {
  ------------------
  |  Branch (121:7): [True: 0, False: 155]
  |  Branch (121:25): [True: 0, False: 0]
  ------------------
  122|      0|    execStartTime_ = std::chrono::steady_clock::now();
  123|      0|    execStartCPUTime_ = oscompat::thread_cpu_time();
  124|      0|    oscompat::num_context_switches(
  125|      0|        startNumVoluntaryContextSwitches_, startNumInvoluntaryContextSwitches_);
  126|      0|    execStartTimeRecorded_ = true;
  127|      0|  }
  128|    155|}
_ZN6hermes2vm6GCBase13checkTripwireEm:
  643|    137|void GCBase::checkTripwire(size_t dataSize) {
  644|    137|  if (LLVM_LIKELY(!tripwireCallback_) ||
  ------------------
  |  |  188|    274|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 137, False: 0]
  |  |  ------------------
  ------------------
  645|    137|      LLVM_LIKELY(dataSize < tripwireLimit_) || tripwireCalled_) {
  ------------------
  |  |  188|    137|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (645:49): [True: 0, False: 0]
  ------------------
  646|    137|    return;
  647|    137|  }
  648|       |
  649|      0|#ifdef HERMES_MEMORY_INSTRUMENTATION
  650|      0|  class Ctx : public GCTripwireContext {
  651|      0|   public:
  652|      0|    Ctx(GCBase *gc) : gc_(gc) {}
  653|       |
  654|      0|    std::error_code createSnapshotToFile(const std::string &path) override {
  655|      0|      return gc_->createSnapshotToFile(path);
  656|      0|    }
  657|       |
  658|      0|    std::error_code createSnapshot(std::ostream &os) override {
  659|      0|      llvh::raw_os_ostream ros(os);
  660|      0|      gc_->createSnapshot(ros);
  661|      0|      return std::error_code{};
  662|      0|    }
  663|       |
  664|      0|   private:
  665|      0|    GCBase *gc_;
  666|      0|  } ctx(this);
  667|       |#else // !defined(HERMES_MEMORY_INSTRUMENTATION)
  668|       |  class Ctx : public GCTripwireContext {
  669|       |   public:
  670|       |    std::error_code createSnapshotToFile(const std::string &path) override {
  671|       |      return std::error_code(ENOSYS, std::system_category());
  672|       |    }
  673|       |
  674|       |    std::error_code createSnapshot(std::ostream &os) override {
  675|       |      return std::error_code(ENOSYS, std::system_category());
  676|       |    }
  677|       |  } ctx;
  678|       |#endif // !defined(HERMES_MEMORY_INSTRUMENTATION)
  679|       |
  680|      0|  tripwireCalled_ = true;
  681|      0|  tripwireCallback_(ctx);
  682|      0|}
_ZN6hermes2vm6GCBase13recordGCStatsERKNS0_16GCAnalyticsEventEPNS1_19CumulativeHeapStatsEb:
  852|  1.00k|    bool onMutator) {
  853|       |  // Hades OG collections do not block the mutator, and so do not contribute to
  854|       |  // the max pause time or the total execution time.
  855|  1.00k|  if (onMutator)
  ------------------
  |  Branch (855:7): [True: 735, False: 274]
  ------------------
  856|    735|    stats->gcWallTime.record(
  857|    735|        std::chrono::duration<double>(event.duration).count());
  858|  1.00k|  stats->gcCPUTime.record(
  859|  1.00k|      std::chrono::duration<double>(event.cpuDuration).count());
  860|  1.00k|  stats->finalHeapSize = event.size.after;
  861|  1.00k|  stats->usedBefore.record(event.allocated.before);
  862|  1.00k|  stats->usedAfter.record(event.allocated.after);
  863|  1.00k|  stats->numCollections++;
  864|  1.00k|}
_ZN6hermes2vm6GCBase13recordGCStatsERKNS0_16GCAnalyticsEventEb:
  866|    571|void GCBase::recordGCStats(const GCAnalyticsEvent &event, bool onMutator) {
  867|    571|  if (analyticsCallback_) {
  ------------------
  |  Branch (867:7): [True: 0, False: 571]
  ------------------
  868|      0|    analyticsCallback_(event);
  869|      0|  }
  870|    571|  if (recordGcStats_) {
  ------------------
  |  Branch (870:7): [True: 0, False: 571]
  ------------------
  871|      0|    analyticsEvents_.push_back(event);
  872|      0|  }
  873|    571|  recordGCStats(event, &cumStats_, onMutator);
  874|    571|}
_ZN6hermes2vm6GCBase13allocWeakSlotENS0_17CompressedPointerE:
  983|  58.1k|WeakRefSlot *GCBase::allocWeakSlot(CompressedPointer ptr) {
  984|       |  // The weak ref mutex doesn't need to be held since we are only accessing free
  985|       |  // slots, which the background thread cannot access.
  986|  58.1k|  if (auto *slot = firstFreeWeak_) {
  ------------------
  |  Branch (986:13): [True: 20, False: 58.1k]
  ------------------
  987|     20|    assert(slot->state() == WeakSlotState::Free && "invalid free slot state");
  988|      0|    firstFreeWeak_ = firstFreeWeak_->nextFree();
  989|     20|    slot->reset(ptr);
  990|     20|    return slot;
  991|     20|  }
  992|  58.1k|  weakSlots_.push_back({ptr});
  993|  58.1k|  return &weakSlots_.back();
  994|  58.1k|}
_ZN6hermes2vm6GCBase8newAllocEPKNS0_6GCCellEj:
 1028|  2.29M|void GCBase::newAlloc(const GCCell *ptr, uint32_t sz) {
 1029|  2.29M|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1030|  2.29M|  allocationLocationTracker_.newAlloc(ptr, sz);
 1031|  2.29M|  samplingAllocationTracker_.newAlloc(ptr, sz);
 1032|  2.29M|#endif
 1033|  2.29M|}
_ZN6hermes2vm6GCBase12nextObjectIDEv:
 1065|  2.29M|uint64_t GCBase::nextObjectID() {
 1066|  2.29M|  return debugAllocationCounter_++;
 1067|  2.29M|}
_ZN6hermes2vm6GCBase11GCCallbacksD2Ev:
 1104|     99|GCBase::GCCallbacks::~GCCallbacks() {}
_ZN6hermes2vm6GCBase9IDTrackerC2Ev:
 1106|     99|GCBase::IDTracker::IDTracker() {
 1107|     99|  assert(lastID_ % 2 == 1 && "First JS object ID isn't odd");
 1108|     99|}
_ZN6hermes2vm6GCBase9IDTracker12hasNativeIDsEv:
 1183|     99|bool GCBase::IDTracker::hasNativeIDs() {
 1184|     99|  std::lock_guard<Mutex> lk{mtx_};
 1185|     99|  return !nativeIDMap_.empty();
 1186|     99|}
_ZN6hermes2vm6GCBase9IDTracker13isTrackingIDsEv:
 1188|    888|bool GCBase::IDTracker::isTrackingIDs() {
 1189|    888|  std::lock_guard<Mutex> lk{mtx_};
 1190|    888|  return !objectIDMap_.empty();
 1191|    888|}
_ZN6hermes2vm6GCBase9IDTracker13untrackNativeEPKv:
 1254|  8.24k|void GCBase::IDTracker::untrackNative(const void *mem) {
 1255|  8.24k|  std::lock_guard<Mutex> lk{mtx_};
 1256|  8.24k|  nativeIDMap_.erase(mem);
 1257|  8.24k|}
_ZN6hermes2vm6GCBase25AllocationLocationTrackerC2EPS1_:
 1294|     99|    : gc_(gc) {}
_ZNK6hermes2vm6GCBase25AllocationLocationTracker9isEnabledEv:
 1296|    747|bool GCBase::AllocationLocationTracker::isEnabled() const {
 1297|    747|  return enabled_;
 1298|    747|}
_ZN6hermes2vm6GCBase25AllocationLocationTracker8newAllocEPKNS0_6GCCellEj:
 1352|  2.29M|    uint32_t sz) {
 1353|       |  // Note we always get the current IP even if allocation tracking is not
 1354|       |  // enabled as it allows us to assert this feature works across many tests.
 1355|       |  // Note it's not very slow, it's slower than the non-virtual version
 1356|       |  // in Runtime though.
 1357|  2.29M|  const auto *ip = gc_->gcCallbacks_.getCurrentIPSlow();
 1358|  2.29M|  if (!enabled_) {
  ------------------
  |  Branch (1358:7): [True: 2.29M, False: 0]
  ------------------
 1359|  2.29M|    return;
 1360|  2.29M|  }
 1361|      0|  std::lock_guard<Mutex> lk{mtx_};
 1362|       |  // This is stateful and causes the object to have an ID assigned.
 1363|      0|  const auto id = gc_->getObjectID(ptr);
 1364|      0|  HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1365|      0|      &findFragmentForID(id) == &fragments_.back() &&
 1366|      0|      "Should only ever be allocating into the newest fragment");
 1367|      0|  Fragment &lastFrag = fragments_.back();
 1368|      0|  assert(
 1369|      0|      lastFrag.lastSeenObjectID_ == IDTracker::kInvalidNode &&
 1370|      0|      "Last fragment should not have an ID assigned yet");
 1371|      0|  lastFrag.numObjects_++;
 1372|      0|  lastFrag.numBytes_ += sz;
 1373|      0|  lastFrag.touchedSinceLastFlush_ = true;
 1374|      0|  if (lastFrag.numBytes_ >= kFlushThreshold) {
  ------------------
  |  Branch (1374:7): [True: 0, False: 0]
  ------------------
 1375|      0|    flushCallback();
 1376|      0|  }
 1377|      0|  if (auto node = gc_->gcCallbacks_.getCurrentStackTracesTreeNode(ip)) {
  ------------------
  |  Branch (1377:12): [True: 0, False: 0]
  ------------------
 1378|      0|    auto itAndDidInsert = stackMap_.try_emplace(id, node);
 1379|      0|    assert(itAndDidInsert.second && "Failed to create a new node");
 1380|      0|    (void)itAndDidInsert;
 1381|      0|  }
 1382|      0|}
_ZN6hermes2vm6GCBase33SamplingAllocationLocationTracker8newAllocEPKNS0_6GCCellEj:
 1527|  2.29M|    uint32_t sz) {
 1528|       |  // If the sampling profiler isn't enabled, don't check anything else.
 1529|  2.29M|  if (!isEnabled()) {
  ------------------
  |  Branch (1529:7): [True: 2.29M, False: 0]
  ------------------
 1530|  2.29M|    return;
 1531|  2.29M|  }
 1532|      0|  if (sz <= limit_) {
  ------------------
  |  Branch (1532:7): [True: 0, False: 0]
  ------------------
 1533|       |    // Exit if it's not time for a sample yet.
 1534|      0|    limit_ -= sz;
 1535|      0|    return;
 1536|      0|  }
 1537|      0|  const auto *ip = gc_->gcCallbacks_.getCurrentIPSlow();
 1538|       |  // This is stateful and causes the object to have an ID assigned.
 1539|      0|  const auto id = gc_->getObjectID(ptr);
 1540|      0|  if (StackTracesTreeNode *node =
  ------------------
  |  Branch (1540:28): [True: 0, False: 0]
  ------------------
 1541|      0|          gc_->gcCallbacks_.getCurrentStackTracesTreeNode(ip)) {
 1542|       |    // Hold a lock while modifying samples_.
 1543|      0|    std::lock_guard<Mutex> lk{mtx_};
 1544|      0|    auto sampleItAndDidInsert =
 1545|      0|        samples_.try_emplace(id, Sample{sz, node, nextSampleID_++});
 1546|      0|    assert(sampleItAndDidInsert.second && "Failed to create a sample");
 1547|      0|    (void)sampleItAndDidInsert;
 1548|      0|  }
 1549|       |  // Reset the limit.
 1550|      0|  limit_ = nextSample();
 1551|      0|}

_ZN6hermes2vm15HandleRootOwner12markGCScopesERNS0_12RootAcceptorE:
   36|  1.18k|void HandleRootOwner::markGCScopes(RootAcceptor &acceptor) {
   37|  4.89k|  for (GCScope *gcScope = topGCScope_; gcScope; gcScope = gcScope->prevScope_)
  ------------------
  |  Branch (37:40): [True: 3.70k, False: 1.18k]
  ------------------
   38|  3.70k|    gcScope->mark(acceptor);
   39|  1.18k|}
_ZN6hermes2vm7GCScopeD2Ev:
   44|   720k|GCScope::~GCScope() {
   45|       |  // Pop ourselves from the scope list.
   46|   720k|  runtime_.topGCScope_ = prevScope_;
   47|       |
   48|       |  // Free the dynamically allocated chunks, which are all chunks except the
   49|       |  // first one.
   50|   720k|  auto it = chunks_.begin();
   51|   720k|  auto e = chunks_.end();
   52|       |
   53|   720k|  assert(it != e && "must have at least one chunk");
   54|      0|  ++it; // Skip the first chunk
   55|       |  // Invalidate all the values outside of the chunk in case they are used.
   56|   720k|  invalidateFreedHandleValues(0, chunks_[0]);
   57|   722k|  for (; it != e; ++it)
  ------------------
  |  Branch (57:10): [True: 2.08k, False: 720k]
  ------------------
   58|  2.08k|    ::free(*it); // The chunk was allocated with malloc()
   59|       |
   60|       |#ifdef HERMESVM_DEBUG_TRACK_GCSCOPE_HANDLES
   61|       |  gcScopeHandleTracker.record(name_, maxAllocatedHandles_);
   62|       |#endif
   63|   720k|}
_ZN6hermes2vm7GCScope15_newChunkAndPHVENS0_11HermesValueE:
   65|  70.7k|PinnedHermesValue *GCScope::_newChunkAndPHV(HermesValue value) {
   66|  70.7k|  assert(next_ == curChunkEnd_ && "current chunk is not exhausted");
   67|       |
   68|       |  // Move to the next chunk.
   69|      0|  ++curChunkIndex_;
   70|       |
   71|       |  // Do we need to allocate a new chunk?
   72|  70.7k|  if (curChunkIndex_ == chunks_.size()) {
  ------------------
  |  Branch (72:7): [True: 2.08k, False: 68.6k]
  ------------------
   73|       |    // Allocate memory with malloc() to prevent initialization.
   74|  2.08k|    void *mem = checkedMalloc2(CHUNK_SIZE, sizeof(PinnedHermesValue));
   75|  2.08k|    chunks_.push_back(static_cast<PinnedHermesValue *>(mem));
   76|       |
   77|       |    // Initialize the new chunk.
   78|  2.08k|    next_ = chunks_.back();
   79|  68.6k|  } else {
   80|       |    // Point to the start of the next chunk.
   81|  68.6k|    next_ = chunks_[curChunkIndex_];
   82|  68.6k|  }
   83|       |
   84|  70.7k|  curChunkEnd_ = next_ + CHUNK_SIZE;
   85|       |
   86|       |  /// Initialize the new handle with the specified value and return.
   87|  70.7k|  return new (next_++) PinnedHermesValue(value);
   88|  70.7k|}
_ZN6hermes2vm7GCScope4markERNS0_12RootAcceptorE:
   90|  3.70k|void GCScope::mark(RootAcceptor &acceptor) {
   91|  7.40k|  for (auto it = chunks_.begin(), e = it + curChunkIndex_ + 1; it != e; ++it) {
  ------------------
  |  Branch (91:64): [True: 3.70k, False: 3.70k]
  ------------------
   92|  3.70k|    PinnedHermesValue *first = *it;
   93|  3.70k|    PinnedHermesValue *last = *it + CHUNK_SIZE;
   94|       |
   95|       |    // If this is the current chunk, it is not yet full.
   96|  3.70k|    if (curChunkEnd_ == last)
  ------------------
  |  Branch (96:9): [True: 3.70k, False: 0]
  ------------------
   97|  3.70k|      last = next_;
   98|       |
   99|       |    // Mark the handles.
  100|  8.52k|    for (; first != last; ++first)
  ------------------
  |  Branch (100:12): [True: 4.82k, False: 3.70k]
  ------------------
  101|  4.82k|      acceptor.acceptNullable(*first);
  102|  3.70k|  }
  103|  3.70k|}
_ZN6hermes2vm7GCScope27invalidateFreedHandleValuesEjPNS0_17PinnedHermesValueE:
  108|  2.08M|    PinnedHermesValue *valueStart) {
  109|  2.08M|  std::fill(
  110|  2.08M|      valueStart,
  111|  2.08M|      chunks_[chunkStart] + CHUNK_SIZE,
  112|  2.08M|      HermesValue::encodeInvalidValue());
  113|  2.08M|  for (auto i = chunkStart + 1; i < curChunkIndex_; ++i) {
  ------------------
  |  Branch (113:33): [True: 2.37k, False: 2.08M]
  ------------------
  114|  2.37k|    std::fill(
  115|  2.37k|        chunks_[i], chunks_[i] + CHUNK_SIZE, HermesValue::encodeInvalidValue());
  116|  2.37k|  }
  117|  2.08M|}

_ZN6hermes2vm6detail13TransitionMap21snapshotUntrackMemoryERNS0_7HadesGCE:
   59|  56.9k|void TransitionMap::snapshotUntrackMemory(GC &gc) {
   60|       |  // Untrack the memory ID in case one was created.
   61|  56.9k|  if (isLarge()) {
  ------------------
  |  Branch (61:7): [True: 1.32k, False: 55.6k]
  ------------------
   62|  1.32k|    gc.getIDTracker().untrackNative(large());
   63|  1.32k|  }
   64|  56.9k|}
_ZN6hermes2vm6detail13TransitionMap16uncleanMakeLargeERNS0_7RuntimeE:
   72|  1.32k|void TransitionMap::uncleanMakeLarge(Runtime &runtime) {
   73|  1.32k|  assert(!isClean() && "must not still be clean");
   74|      0|  assert(!isLarge() && "must not yet be large");
   75|      0|  auto large = new WeakValueMap<Transition, HiddenClass>();
   76|       |  // Move any valid entry into the allocated map.
   77|  1.32k|  if (auto value = smallValue().get(runtime))
  ------------------
  |  Branch (77:12): [True: 1.32k, False: 0]
  ------------------
   78|  1.32k|    large->insertNewLocked(runtime, smallKey_, runtime.makeHandle(value));
   79|  1.32k|  u.large_ = large;
   80|  1.32k|  smallKey_.symbolID = SymbolID::deleted();
   81|  1.32k|  assert(isLarge());
   82|  1.32k|}
_ZN6hermes2vm20HiddenClassBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  104|      1|void HiddenClassBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  105|      1|  const auto *self = static_cast<const HiddenClass *>(cell);
  106|      1|  mb.setVTable(&HiddenClass::vt);
  107|      1|  mb.addField("symbol", &self->symbolID_);
  108|      1|  mb.addField("parent", &self->parent_);
  109|      1|  mb.addField("propertyMap", &self->propertyMap_);
  110|      1|  mb.addField("forInCache", &self->forInCache_);
  111|      1|}
_ZN6hermes2vm11HiddenClass13_markWeakImplEPNS0_6GCCellERNS0_15WeakRefAcceptorE:
  113|   503k|void HiddenClass::_markWeakImpl(GCCell *cell, WeakRefAcceptor &acceptor) {
  114|   503k|  auto *self = reinterpret_cast<HiddenClass *>(cell);
  115|   503k|  self->transitionMap_.markWeakRefs(acceptor);
  116|   503k|}
_ZN6hermes2vm11HiddenClass13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  118|  56.9k|void HiddenClass::_finalizeImpl(GCCell *cell, GC &gc) {
  119|  56.9k|  auto *self = vmcast<HiddenClass>(cell);
  120|  56.9k|#ifdef HERMES_MEMORY_INSTRUMENTATION
  121|  56.9k|  self->transitionMap_.snapshotUntrackMemory(gc);
  122|  56.9k|#endif
  123|  56.9k|  self->~HiddenClass();
  124|  56.9k|}
_ZN6hermes2vm11HiddenClass10createRootERNS0_7RuntimeE:
  158|     99|CallResult<HermesValue> HiddenClass::createRoot(Runtime &runtime) {
  159|     99|  return create(
  160|     99|      runtime,
  161|     99|      ClassFlags{},
  162|     99|      Runtime::makeNullHandle<HiddenClass>(),
  163|     99|      SymbolID{},
  164|     99|      PropertyFlags{},
  165|     99|      0);
  166|     99|}
_ZN6hermes2vm11HiddenClass6createERNS0_7RuntimeENS0_10ClassFlagsENS0_6HandleIS1_EENS0_8SymbolIDENS0_13PropertyFlagsEj:
  174|  56.9k|    unsigned numProperties) {
  175|  56.9k|  assert(
  176|  56.9k|      (flags.dictionaryMode || numProperties == 0 || *parent) &&
  177|  56.9k|      "non-empty non-dictionary orphan");
  178|      0|  auto *obj =
  179|  56.9k|      runtime.makeAFixed<HiddenClass, HasFinalizer::Yes, LongLived::Yes>(
  180|  56.9k|          runtime, flags, parent, symbolID, propertyFlags, numProperties);
  181|  56.9k|  return HermesValue::encodeObjectValue(obj);
  182|  56.9k|}
_ZN6hermes2vm11HiddenClass19copyToNewDictionaryENS0_6HandleIS1_EERNS0_7RuntimeEb:
  187|     20|    bool noCache) {
  188|     20|  assert(
  189|     20|      !selfHandle->isDictionaryNoCache() && "class already in no-cache mode");
  190|       |
  191|      0|  auto newFlags = selfHandle->flags_;
  192|     20|  newFlags.dictionaryMode = true;
  193|       |  // If the requested, transition to no-cache mode.
  194|     20|  if (noCache) {
  ------------------
  |  Branch (194:7): [True: 10, False: 10]
  ------------------
  195|     10|    newFlags.dictionaryNoCacheMode = true;
  196|     10|  }
  197|       |
  198|       |  /// Allocate a new class without a parent.
  199|     20|  auto newClassHandle = runtime.makeHandle<HiddenClass>(
  200|     20|      runtime.ignoreAllocationFailure(HiddenClass::create(
  201|     20|          runtime,
  202|     20|          newFlags,
  203|     20|          Runtime::makeNullHandle<HiddenClass>(),
  204|     20|          SymbolID{},
  205|     20|          PropertyFlags{},
  206|     20|          selfHandle->numProperties_)));
  207|       |
  208|       |  // Optionally allocate the property map and move it to the new class.
  209|     20|  if (LLVM_UNLIKELY(!selfHandle->propertyMap_))
  ------------------
  |  |  189|     20|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 20]
  |  |  ------------------
  ------------------
  210|      0|    initializeMissingPropertyMap(selfHandle, runtime);
  211|       |
  212|     20|  newClassHandle->propertyMap_.set(
  213|     20|      runtime, selfHandle->propertyMap_, runtime.getHeap());
  214|     20|  selfHandle->propertyMap_.setNull(runtime.getHeap());
  215|       |
  216|     20|  LLVM_DEBUG(
  ------------------
  |  |  123|     20|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     20|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 20]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     20|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  217|     20|      dbgs() << "Converted Class:" << selfHandle->getDebugAllocationId()
  218|     20|             << " to dictionary Class:"
  219|     20|             << newClassHandle->getDebugAllocationId() << "\n");
  220|       |
  221|     20|  return newClassHandle;
  222|     20|}
_ZN6hermes2vm11HiddenClass12findPropertyENS0_12PseudoHandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
  266|  2.45M|    NamedPropertyDescriptor &desc) {
  267|       |  // Lazily create the property map.
  268|  2.45M|  if (LLVM_UNLIKELY(!self->propertyMap_)) {
  ------------------
  |  |  189|  2.45M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 11.4k, False: 2.44M]
  |  |  ------------------
  ------------------
  269|       |    // If expectedFlags is valid, we can check if there is an outgoing
  270|       |    // transition with name and the flags. The presence of such a transition
  271|       |    // indicates that this is a new property and we don't have to build the map
  272|       |    // in order to look for it (since we wouldn't find it anyway).
  273|  11.4k|    if (expectedFlags.isValid()) {
  ------------------
  |  Branch (273:9): [True: 2.61k, False: 8.82k]
  ------------------
  274|  2.61k|      Transition t{name, expectedFlags};
  275|  2.61k|      if (self->transitionMap_.containsKey(t, runtime.getHeap())) {
  ------------------
  |  Branch (275:11): [True: 1.98k, False: 635]
  ------------------
  276|  1.98k|        LLVM_DEBUG(
  ------------------
  |  |  123|  1.98k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.98k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.98k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.98k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  277|  1.98k|            dbgs()
  278|  1.98k|            << "Property " << runtime.formatSymbolID(name)
  279|  1.98k|            << " NOT FOUND in Class:" << self->getDebugAllocationId()
  280|  1.98k|            << " due to existing transition to Class:"
  281|  1.98k|            << self->transitionMap_.lookup(runtime, t)->getDebugAllocationId()
  282|  1.98k|            << "\n");
  283|  1.98k|        return llvh::None;
  284|  1.98k|      }
  285|  2.61k|    }
  286|       |
  287|  9.45k|    auto selfHandle = runtime.makeHandle(std::move(self));
  288|  9.45k|    initializeMissingPropertyMap(selfHandle, runtime);
  289|  9.45k|    self = selfHandle;
  290|  9.45k|  }
  291|       |
  292|  2.44M|  auto *propMap = self->propertyMap_.getNonNull(runtime);
  293|  2.44M|  {
  294|       |    // propMap is a raw pointer.  We assume that find does no allocation.
  295|  2.44M|    NoAllocScope noAlloc(runtime);
  296|  2.44M|    auto found = DictPropertyMap::find(propMap, name);
  297|  2.44M|    if (!found)
  ------------------
  |  Branch (297:9): [True: 608k, False: 1.84M]
  ------------------
  298|   608k|      return llvh::None;
  299|       |    // Technically, the last use of propMap occurs before the call here, so
  300|       |    // it would be legal for the call to allocate.  If that were ever the case,
  301|       |    // we would move "found" out of scope, and terminate the NoAllocScope here.
  302|  1.84M|    desc = DictPropertyMap::getDescriptorPair(propMap, *found)->second;
  303|  1.84M|    return *found;
  304|  2.44M|  }
  305|  2.44M|}
_ZN6hermes2vm11HiddenClass22debugIsPropertyDefinedEPS1_RNS0_11PointerBaseENS0_8SymbolIDE:
  337|   106k|    SymbolID name) {
  338|   648k|  do {
  339|       |    // If we happen to have a property map, use it.
  340|   648k|    if (self->propertyMap_)
  ------------------
  |  Branch (340:9): [True: 2.75k, False: 645k]
  ------------------
  341|  2.75k|      return DictPropertyMap::find(self->propertyMap_.getNonNull(base), name)
  342|  2.75k|          .hasValue();
  343|       |    // Is the property defined in this class?
  344|   645k|    if (self->symbolID_ == name)
  ------------------
  |  Branch (344:9): [True: 0, False: 645k]
  ------------------
  345|      0|      return true;
  346|   645k|    self = self->parent_.get(base);
  347|   645k|  } while (self);
  ------------------
  |  Branch (347:12): [True: 541k, False: 104k]
  ------------------
  348|   104k|  return false;
  349|   106k|}
_ZN6hermes2vm11HiddenClass11addPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsE:
  378|   302k|    PropertyFlags propertyFlags) {
  379|   302k|  assert(propertyFlags.isValid() && "propertyFlags must be valid");
  380|       |
  381|   302k|  if (LLVM_UNLIKELY(selfHandle->isDictionary())) {
  ------------------
  |  |  189|   302k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 133k, False: 168k]
  |  |  ------------------
  ------------------
  382|   133k|    auto isIndexLike =
  383|   133k|        toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  384|   133k|            .hasValue();
  385|   133k|    selfHandle->flags_ =
  386|   133k|        computeFlags(selfHandle->flags_, propertyFlags, isIndexLike);
  387|       |
  388|       |    // Allocate a new slot.
  389|       |    // TODO: this changes the property map, so if we want to support OOM
  390|       |    // handling in the future, and the following operation fails, we would have
  391|       |    // to somehow be able to undo it, or use an approach where we peek the slot
  392|       |    // but not consume until we are sure (which is less efficient, but more
  393|       |    // robust). T31555339.
  394|   133k|    SlotIndex newSlot = DictPropertyMap::allocatePropertySlot(
  395|   133k|        selfHandle->propertyMap_.get(runtime), runtime);
  396|       |
  397|   133k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   133k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 133k]
  |  |  ------------------
  ------------------
  398|   133k|            addToPropertyMap(
  399|   133k|                selfHandle,
  400|   133k|                runtime,
  401|   133k|                name,
  402|   133k|                NamedPropertyDescriptor(propertyFlags, newSlot)) ==
  403|   133k|            ExecutionStatus::EXCEPTION)) {
  404|      0|      return ExecutionStatus::EXCEPTION;
  405|      0|    }
  406|       |
  407|   133k|    ++selfHandle->numProperties_;
  408|   133k|    return std::make_pair(selfHandle, newSlot);
  409|   133k|  }
  410|       |
  411|       |  // Do we already have a transition for that property+flags pair?
  412|   168k|  auto existingChild =
  413|   168k|      selfHandle->transitionMap_.lookup(runtime, {name, propertyFlags});
  414|   168k|  if (LLVM_LIKELY(existingChild)) {
  ------------------
  |  |  188|   168k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 112k, False: 56.6k]
  |  |  ------------------
  ------------------
  415|   112k|    auto childHandle = runtime.makeHandle(existingChild);
  416|       |    // If the child doesn't have a property map, but we do, update our map and
  417|       |    // move it to the child.
  418|   112k|    if (!childHandle->propertyMap_ && selfHandle->propertyMap_) {
  ------------------
  |  Branch (418:9): [True: 107k, False: 4.36k]
  |  Branch (418:39): [True: 3.37k, False: 104k]
  ------------------
  419|  3.37k|      LLVM_DEBUG(
  ------------------
  |  |  123|  3.37k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.37k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.37k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.37k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  420|  3.37k|          dbgs() << "Adding property " << runtime.formatSymbolID(name)
  421|  3.37k|                 << " to Class:" << selfHandle->getDebugAllocationId()
  422|  3.37k|                 << " transitions Map to existing Class:"
  423|  3.37k|                 << childHandle->getDebugAllocationId() << "\n");
  424|       |
  425|  3.37k|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  3.37k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.37k]
  |  |  ------------------
  ------------------
  426|  3.37k|              addToPropertyMap(
  427|  3.37k|                  selfHandle,
  428|  3.37k|                  runtime,
  429|  3.37k|                  name,
  430|  3.37k|                  NamedPropertyDescriptor(
  431|  3.37k|                      propertyFlags, selfHandle->numProperties_)) ==
  432|  3.37k|              ExecutionStatus::EXCEPTION)) {
  433|      0|        return ExecutionStatus::EXCEPTION;
  434|      0|      }
  435|  3.37k|      childHandle->propertyMap_.set(
  436|  3.37k|          runtime, selfHandle->propertyMap_, runtime.getHeap());
  437|   108k|    } else {
  438|   108k|      LLVM_DEBUG(
  ------------------
  |  |  123|   108k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   108k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 108k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   108k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  439|   108k|          dbgs() << "Adding property " << runtime.formatSymbolID(name)
  440|   108k|                 << " to Class:" << selfHandle->getDebugAllocationId()
  441|   108k|                 << " transitions to existing Class:"
  442|   108k|                 << childHandle->getDebugAllocationId() << "\n");
  443|   108k|    }
  444|       |
  445|       |    // In any case, clear our own map.
  446|   112k|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  447|       |
  448|   112k|    return std::make_pair(childHandle, selfHandle->numProperties_);
  449|   112k|  }
  450|       |
  451|       |  // Do we need to convert to dictionary?
  452|  56.6k|  if (LLVM_UNLIKELY(selfHandle->numProperties_ == kDictionaryThreshold)) {
  ------------------
  |  |  189|  56.6k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 10, False: 56.6k]
  |  |  ------------------
  ------------------
  453|       |    // Do it.
  454|     10|    auto childHandle = copyToNewDictionary(selfHandle, runtime);
  455|       |
  456|     10|    auto isIndexLike =
  457|     10|        toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  458|     10|            .hasValue();
  459|     10|    childHandle->flags_ =
  460|     10|        computeFlags(childHandle->flags_, propertyFlags, isIndexLike);
  461|       |
  462|       |    // Add the property to the child.
  463|     10|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     10|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10]
  |  |  ------------------
  ------------------
  464|     10|            addToPropertyMap(
  465|     10|                childHandle,
  466|     10|                runtime,
  467|     10|                name,
  468|     10|                NamedPropertyDescriptor(
  469|     10|                    propertyFlags, childHandle->numProperties_)) ==
  470|     10|            ExecutionStatus::EXCEPTION)) {
  471|      0|      return ExecutionStatus::EXCEPTION;
  472|      0|    }
  473|     10|    return std::make_pair(childHandle, childHandle->numProperties_++);
  474|     10|  }
  475|       |
  476|  56.6k|  auto isIndexLike =
  477|  56.6k|      toArrayIndex(runtime.getIdentifierTable().getStringView(runtime, name))
  478|  56.6k|          .hasValue();
  479|  56.6k|  auto newFlags = computeFlags(selfHandle->flags_, propertyFlags, isIndexLike);
  480|       |
  481|       |  // Allocate the child.
  482|  56.6k|  auto childHandle = runtime.makeHandle<HiddenClass>(
  483|  56.6k|      runtime.ignoreAllocationFailure(HiddenClass::create(
  484|  56.6k|          runtime,
  485|  56.6k|          newFlags,
  486|  56.6k|          selfHandle,
  487|  56.6k|          name,
  488|  56.6k|          propertyFlags,
  489|  56.6k|          selfHandle->numProperties_ + 1)));
  490|       |
  491|       |  // Add it to the transition table.
  492|  56.6k|  auto inserted = selfHandle->transitionMap_.insertNew(
  493|  56.6k|      runtime, Transition(name, propertyFlags), childHandle);
  494|  56.6k|  (void)inserted;
  495|  56.6k|  assert(
  496|  56.6k|      inserted &&
  497|  56.6k|      "transition already exists when adding a new property to hidden class");
  498|       |
  499|  56.6k|  if (selfHandle->propertyMap_) {
  ------------------
  |  Branch (499:7): [True: 53.8k, False: 2.76k]
  ------------------
  500|  53.8k|    assert(
  501|  53.8k|        !DictPropertyMap::find(selfHandle->propertyMap_.get(runtime), name) &&
  502|  53.8k|        "Adding an existing property to hidden class");
  503|       |
  504|  53.8k|    LLVM_DEBUG(
  ------------------
  |  |  123|  53.8k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  53.8k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 53.8k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  53.8k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  505|  53.8k|        dbgs() << "Adding property " << runtime.formatSymbolID(name)
  506|  53.8k|               << " to Class:" << selfHandle->getDebugAllocationId()
  507|  53.8k|               << " transitions Map to new Class:"
  508|  53.8k|               << childHandle->getDebugAllocationId() << "\n");
  509|       |
  510|       |    // Move the map to the child class.
  511|  53.8k|    childHandle->propertyMap_.set(
  512|  53.8k|        runtime, selfHandle->propertyMap_, runtime.getHeap());
  513|  53.8k|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  514|       |
  515|  53.8k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  53.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 53.8k]
  |  |  ------------------
  ------------------
  516|  53.8k|            addToPropertyMap(
  517|  53.8k|                childHandle,
  518|  53.8k|                runtime,
  519|  53.8k|                name,
  520|  53.8k|                NamedPropertyDescriptor(
  521|  53.8k|                    propertyFlags, selfHandle->numProperties_)) ==
  522|  53.8k|            ExecutionStatus::EXCEPTION)) {
  523|      0|      return ExecutionStatus::EXCEPTION;
  524|      0|    }
  525|  53.8k|  } else {
  526|  2.76k|    LLVM_DEBUG(
  ------------------
  |  |  123|  2.76k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  2.76k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.76k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  2.76k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  527|  2.76k|        dbgs() << "Adding property " << runtime.formatSymbolID(name)
  528|  2.76k|               << " to Class:" << selfHandle->getDebugAllocationId()
  529|  2.76k|               << " transitions to new Class:"
  530|  2.76k|               << childHandle->getDebugAllocationId() << "\n");
  531|  2.76k|  }
  532|       |
  533|  56.6k|  return std::make_pair(childHandle, selfHandle->numProperties_);
  534|  56.6k|}
_ZN6hermes2vm11HiddenClass14updatePropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_15DictPropertyMap11PropertyPosENS0_13PropertyFlagsE:
  540|    459|    PropertyFlags newFlags) {
  541|    459|  assert(newFlags.isValid() && "newFlags must be valid");
  542|       |
  543|       |  // In dictionary mode we simply update our map (which must exist).
  544|    459|  if (LLVM_UNLIKELY(selfHandle->isDictionary())) {
  ------------------
  |  |  189|    459|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 10, False: 449]
  |  |  ------------------
  ------------------
  545|     10|    assert(
  546|     10|        selfHandle->propertyMap_ &&
  547|     10|        "propertyMap must exist in dictionary mode");
  548|      0|    selfHandle->flags_ = computeFlags(selfHandle->flags_, newFlags, false);
  549|     10|    DictPropertyMap::getDescriptorPair(
  550|     10|        selfHandle->propertyMap_.getNonNull(runtime), pos)
  551|     10|        ->second.flags = newFlags;
  552|       |    // If it's still cacheable, make it non-cacheable.
  553|     10|    if (!selfHandle->isDictionaryNoCache()) {
  ------------------
  |  Branch (553:9): [True: 10, False: 0]
  ------------------
  554|     10|      selfHandle = copyToNewDictionary(selfHandle, runtime, /*noCache*/ true);
  555|     10|    }
  556|     10|    return selfHandle;
  557|     10|  }
  558|       |
  559|    449|  assert(
  560|    449|      selfHandle->propertyMap_ && "propertyMap must exist in updateProperty()");
  561|       |
  562|      0|  auto *descPair = DictPropertyMap::getDescriptorPair(
  563|    449|      selfHandle->propertyMap_.get(runtime), pos);
  564|       |  // If the property flags didn't change, do nothing.
  565|    449|  if (descPair->second.flags == newFlags)
  ------------------
  |  Branch (565:7): [True: 0, False: 449]
  ------------------
  566|      0|    return selfHandle;
  567|       |
  568|    449|  auto name = descPair->first;
  569|       |
  570|       |  // The transition flags must indicate that it is a "flags transition".
  571|    449|  PropertyFlags transitionFlags = newFlags;
  572|    449|  transitionFlags.flagsTransition = 1;
  573|       |
  574|       |  // Do we already have a transition for that property+flags pair?
  575|    449|  auto existingChild =
  576|    449|      selfHandle->transitionMap_.lookup(runtime, {name, transitionFlags});
  577|    449|  if (LLVM_LIKELY(existingChild)) {
  ------------------
  |  |  188|    449|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 213, False: 236]
  |  |  ------------------
  ------------------
  578|       |    // If the child doesn't have a property map, but we do, update our map and
  579|       |    // move it to the child.
  580|    213|    if (!existingChild->propertyMap_) {
  ------------------
  |  Branch (580:9): [True: 99, False: 114]
  ------------------
  581|     99|      LLVM_DEBUG(
  ------------------
  |  |  123|     99|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     99|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 99]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     99|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  582|     99|          dbgs() << "Updating property " << runtime.formatSymbolID(name)
  583|     99|                 << " in Class:" << selfHandle->getDebugAllocationId()
  584|     99|                 << " transitions Map to existing Class:"
  585|     99|                 << existingChild->getDebugAllocationId() << "\n");
  586|       |
  587|     99|      descPair->second.flags = newFlags;
  588|     99|      existingChild->propertyMap_.set(
  589|     99|          runtime, selfHandle->propertyMap_, runtime.getHeap());
  590|    114|    } else {
  591|    114|      LLVM_DEBUG(
  ------------------
  |  |  123|    114|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    114|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 114]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    114|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  592|    114|          dbgs() << "Updating property " << runtime.formatSymbolID(name)
  593|    114|                 << " in Class:" << selfHandle->getDebugAllocationId()
  594|    114|                 << " transitions to existing Class:"
  595|    114|                 << existingChild->getDebugAllocationId() << "\n");
  596|    114|    }
  597|       |
  598|       |    // In any case, clear our own map.
  599|    213|    selfHandle->propertyMap_.setNull(runtime.getHeap());
  600|       |
  601|    213|    return runtime.makeHandle(existingChild);
  602|    213|  }
  603|       |
  604|       |  // We are updating the existing property and adding a transition to a new
  605|       |  // hidden class.
  606|    236|  descPair->second.flags = newFlags;
  607|       |
  608|       |  // Allocate the child.
  609|    236|  auto childHandle = runtime.makeHandle<HiddenClass>(
  610|    236|      runtime.ignoreAllocationFailure(HiddenClass::create(
  611|    236|          runtime,
  612|    236|          computeFlags(selfHandle->flags_, newFlags, false),
  613|    236|          selfHandle,
  614|    236|          name,
  615|    236|          transitionFlags,
  616|    236|          selfHandle->numProperties_)));
  617|       |
  618|       |  // Add it to the transition table.
  619|    236|  auto inserted = selfHandle->transitionMap_.insertNew(
  620|    236|      runtime, Transition(name, transitionFlags), childHandle);
  621|    236|  (void)inserted;
  622|    236|  assert(
  623|    236|      inserted &&
  624|    236|      "transition already exists when updating a property in hidden class");
  625|       |
  626|    236|  LLVM_DEBUG(
  ------------------
  |  |  123|    236|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    236|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 236]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    236|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  627|    236|      dbgs() << "Updating property " << runtime.formatSymbolID(name)
  628|    236|             << " in Class:" << selfHandle->getDebugAllocationId()
  629|    236|             << " transitions Map to new Class:"
  630|    236|             << childHandle->getDebugAllocationId() << "\n");
  631|       |
  632|       |  // Move the updated map to the child class.
  633|    236|  childHandle->propertyMap_.set(
  634|    236|      runtime, selfHandle->propertyMap_, runtime.getHeap());
  635|    236|  selfHandle->propertyMap_.setNull(runtime.getHeap());
  636|       |
  637|    236|  return childHandle;
  638|    449|}
_ZN6hermes2vm11HiddenClass11reserveSlotENS0_6HandleIS1_EERNS0_7RuntimeE:
  769|    693|    Runtime &runtime) {
  770|    693|  assert(
  771|    693|      !selfHandle->isDictionary() &&
  772|    693|      "Reserved slots can only be added in class mode");
  773|      0|  SlotIndex index = selfHandle->numProperties_;
  774|    693|  assert(
  775|    693|      index < InternalProperty::NumAnonymousInternalProperties &&
  776|    693|      "Reserved slot index is too large");
  777|       |
  778|      0|  return HiddenClass::addProperty(
  779|    693|      selfHandle,
  780|    693|      runtime,
  781|    693|      InternalProperty::getSymbolID(index),
  782|    693|      PropertyFlags{});
  783|    693|}
_ZN6hermes2vm11HiddenClass16addToPropertyMapENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorE:
  813|   190k|    NamedPropertyDescriptor desc) {
  814|   190k|  assert(selfHandle->propertyMap_ && "the property map must be initialized");
  815|       |
  816|       |  // Add the new field to the property map.
  817|      0|  MutableHandle<DictPropertyMap> updatedMap{
  818|   190k|      runtime, selfHandle->propertyMap_.get(runtime)};
  819|       |
  820|   190k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   190k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 190k]
  |  |  ------------------
  ------------------
  821|   190k|          DictPropertyMap::add(updatedMap, runtime, name, desc) ==
  822|   190k|          ExecutionStatus::EXCEPTION)) {
  823|      0|    return ExecutionStatus::EXCEPTION;
  824|      0|  }
  825|       |
  826|   190k|  selfHandle->propertyMap_.setNonNull(runtime, *updatedMap, runtime.getHeap());
  827|   190k|  return ExecutionStatus::RETURNED;
  828|   190k|}
_ZN6hermes2vm11HiddenClass28initializeMissingPropertyMapENS0_6HandleIS1_EERNS0_7RuntimeE:
  832|  9.45k|    Runtime &runtime) {
  833|  9.45k|  assert(!selfHandle->propertyMap_ && "property map is already initialized");
  834|       |
  835|       |  // Check whether we can steal our parent's map. If we can, we only need
  836|       |  // to add or update a single property.
  837|  9.45k|  if (selfHandle->parent_ &&
  ------------------
  |  Branch (837:7): [True: 6.48k, False: 2.97k]
  ------------------
  838|  9.45k|      selfHandle->parent_.getNonNull(runtime)->propertyMap_)
  ------------------
  |  Branch (838:7): [True: 0, False: 6.48k]
  ------------------
  839|      0|    return stealPropertyMapFromParent(selfHandle, runtime);
  840|       |
  841|  9.45k|  LLVM_DEBUG(
  ------------------
  |  |  123|  9.45k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  9.45k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 9.45k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  9.45k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  842|  9.45k|      dbgs() << "Class:" << selfHandle->getDebugAllocationId()
  843|  9.45k|             << " allocating new map\n");
  844|       |
  845|       |  // First collect all entries in reverse order. This avoids recursion.
  846|  9.45k|  using MapEntry = std::pair<SymbolID, PropertyFlags>;
  847|  9.45k|  llvh::SmallVector<MapEntry, 4> entries;
  848|  9.45k|  entries.reserve(selfHandle->numProperties_);
  849|  9.45k|  {
  850|       |    // Walk chain of parents using raw pointers.
  851|  9.45k|    NoAllocScope _(runtime);
  852|  47.4k|    for (auto *cur = *selfHandle; cur->numProperties_ > 0;
  ------------------
  |  Branch (852:35): [True: 37.9k, False: 9.45k]
  ------------------
  853|  37.9k|         cur = cur->parent_.getNonNull(runtime)) {
  854|  37.9k|      auto tmpFlags = cur->propertyFlags_;
  855|  37.9k|      tmpFlags.flagsTransition = 0;
  856|  37.9k|      entries.emplace_back(cur->symbolID_, tmpFlags);
  857|  37.9k|    }
  858|  9.45k|  }
  859|       |
  860|  9.45k|  assert(
  861|  9.45k|      entries.size() <= DictPropertyMap::getMaxCapacity() &&
  862|  9.45k|      "There shouldn't ever be this many properties");
  863|       |  // Allocate the map with the correct size.
  864|      0|  auto res = DictPropertyMap::create(
  865|  9.45k|      runtime,
  866|  9.45k|      std::max(
  867|  9.45k|          (DictPropertyMap::size_type)entries.size(),
  868|  9.45k|          toRValue(DictPropertyMap::DEFAULT_CAPACITY)));
  869|  9.45k|  assert(
  870|  9.45k|      res != ExecutionStatus::EXCEPTION &&
  871|  9.45k|      "Since the entries would fit, there shouldn't be an exception");
  872|      0|  MutableHandle<DictPropertyMap> mapHandle{runtime, res->get()};
  873|       |
  874|       |  // Add the collected entries in reverse order. Note that there could be
  875|       |  // duplicates.
  876|  9.45k|  SlotIndex slotIndex = 0;
  877|  47.4k|  for (auto it = entries.rbegin(), e = entries.rend(); it != e; ++it) {
  ------------------
  |  Branch (877:56): [True: 37.9k, False: 9.45k]
  ------------------
  878|  37.9k|    auto inserted = DictPropertyMap::findOrAdd(mapHandle, runtime, it->first);
  879|  37.9k|    assert(
  880|  37.9k|        inserted != ExecutionStatus::EXCEPTION &&
  881|  37.9k|        "Space was already reserved, this couldn't have grown");
  882|       |
  883|      0|    inserted->first->flags = it->second;
  884|       |    // If it is a new property, allocate the next slot.
  885|  37.9k|    if (LLVM_LIKELY(inserted->second))
  ------------------
  |  |  188|  37.9k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 37.9k, False: 0]
  |  |  ------------------
  ------------------
  886|  37.9k|      inserted->first->slot = slotIndex++;
  887|  37.9k|  }
  888|       |
  889|  9.45k|  selfHandle->propertyMap_.setNonNull(runtime, *mapHandle, runtime.getHeap());
  890|  9.45k|}

_ZN6hermes2vm34FinalizableNativeFunctionBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   37|      1|    Metadata::Builder &mb) {
   38|      1|  mb.addJSObjectOverlapSlots(
   39|      1|      JSObject::numOverlapSlots<FinalizableNativeFunction>());
   40|      1|  NativeFunctionBuildMeta(cell, mb);
   41|      1|  mb.setVTable(&FinalizableNativeFunction::vt);
   42|      1|}
_ZN6hermes2vm15HostObjectProxyD2Ev:
   80|     99|HostObjectProxy::~HostObjectProxy() {}
_ZN6hermes2vm19HostObjectBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   96|      1|void HostObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   97|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<HostObject>());
   98|      1|  JSObjectBuildMeta(cell, mb);
   99|      1|  mb.setVTable(&HostObject::vt);
  100|      1|}
_ZN6hermes2vm10HostObject22createWithoutPrototypeERNS0_7RuntimeENSt3__110unique_ptrINS0_15HostObjectProxyENS4_14default_deleteIS6_EEEE:
  104|     99|    std::unique_ptr<HostObjectProxy> proxy) {
  105|     99|  auto parentHandle = Handle<JSObject>::vmcast(&runtime.objectPrototype);
  106|       |
  107|     99|  HostObject *hostObj = runtime.makeAFixed<HostObject, HasFinalizer::Yes>(
  108|     99|      runtime,
  109|     99|      parentHandle,
  110|     99|      runtime.getHiddenClassForPrototype(
  111|     99|          *parentHandle, numOverlapSlots<HostObject>()),
  112|     99|      std::move(proxy));
  113|       |
  114|     99|  hostObj->flags_.hostObject = true;
  115|       |
  116|     99|  return JSObjectInit::initToHermesValue(runtime, hostObj);
  117|     99|}

_ZN6hermes2vm15IdentifierTable11LookupEntryC2EPNS0_15StringPrimitiveEb:
   32|  71.0k|      num_(NON_LAZY_STRING_PRIM_TAG) {
   33|  71.0k|  assert(str && "Invalid string primitive pointer");
   34|      0|  llvh::SmallVector<char16_t, 32> storage{};
   35|  71.0k|  str->appendUTF16String(storage);
   36|  71.0k|  hash_ = hermes::hashString(llvh::ArrayRef<char16_t>(storage));
   37|  71.0k|}
_ZN6hermes2vm15IdentifierTableC2Ev:
   39|     99|IdentifierTable::IdentifierTable() {
   40|     99|  hashTable_.setIdentifierTable(this);
   41|     99|}
_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIDsEEj:
   46|     99|    uint32_t hash) {
   47|     99|  auto cr = getOrCreateIdentifier(
   48|     99|      runtime, str, Runtime::makeNullHandle<StringPrimitive>(), hash);
   49|     99|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   50|      0|    return ExecutionStatus::EXCEPTION;
   51|     99|  return runtime.makeHandle(*cr);
   52|     99|}
_ZN6hermes2vm15IdentifierTable15getSymbolHandleERNS0_7RuntimeEN4llvh8ArrayRefIcEEj:
   57|     99|    uint32_t hash) {
   58|     99|  auto cr = getOrCreateIdentifier(
   59|     99|      runtime, str, Runtime::makeNullHandle<StringPrimitive>(), hash);
   60|     99|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   61|      0|    return ExecutionStatus::EXCEPTION;
   62|     99|  return runtime.makeHandle(*cr);
   63|     99|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIcEE:
   65|    297|SymbolID IdentifierTable::registerLazyIdentifier(ASCIIRef str) {
   66|    297|  return registerLazyIdentifierImpl(str, hermes::hashString(str));
   67|    297|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIcEEj:
   69|  60.4k|SymbolID IdentifierTable::registerLazyIdentifier(ASCIIRef str, uint32_t hash) {
   70|  60.4k|  return registerLazyIdentifierImpl(str, hash);
   71|  60.4k|}
_ZN6hermes2vm15IdentifierTable22registerLazyIdentifierEN4llvh8ArrayRefIDsEEj:
   77|    273|SymbolID IdentifierTable::registerLazyIdentifier(UTF16Ref str, uint32_t hash) {
   78|    273|  return registerLazyIdentifierImpl(str, hash);
   79|    273|}
_ZN6hermes2vm15IdentifierTable28getSymbolHandleFromPrimitiveERNS0_7RuntimeENS0_12PseudoHandleINS0_15StringPrimitiveEEE:
   83|   206k|    PseudoHandle<StringPrimitive> str) {
   84|   206k|  assert(str && "null string primitive");
   85|   206k|  if (str->isUniqued()) {
  ------------------
  |  Branch (85:7): [True: 288, False: 205k]
  ------------------
   86|       |    // If the string was already uniqued, we can return directly.
   87|    288|    SymbolID id = str->getUniqueID();
   88|    288|    symbolReadBarrier(id.unsafeGetIndex());
   89|    288|    return runtime.makeHandle(id);
   90|    288|  }
   91|   205k|  auto handle = runtime.makeHandle(std::move(str));
   92|       |  // Force the string primitive to flatten if it's a rope.
   93|   205k|  handle = StringPrimitive::ensureFlat(runtime, handle);
   94|   205k|  auto cr = handle->isASCII()
  ------------------
  |  Branch (94:13): [True: 205k, False: 0]
  ------------------
   95|   205k|      ? getOrCreateIdentifier(runtime, handle->castToASCIIRef(), handle)
   96|   205k|      : getOrCreateIdentifier(runtime, handle->castToUTF16Ref(), handle);
   97|   205k|  if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   205k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 205k]
  |  |  ------------------
  ------------------
   98|      0|    return ExecutionStatus::EXCEPTION;
   99|   205k|  return runtime.makeHandle(*cr);
  100|   205k|}
_ZN6hermes2vm15IdentifierTable13getStringPrimERNS0_7RuntimeENS0_8SymbolIDE:
  102|  78.6k|StringPrimitive *IdentifierTable::getStringPrim(Runtime &runtime, SymbolID id) {
  103|  78.6k|  auto &entry = getLookupTableEntry(id);
  104|  78.6k|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (104:7): [True: 44.5k, False: 34.1k]
  ------------------
  105|  44.5k|    return entry.getStringPrimRef();
  106|  44.5k|  }
  107|       |
  108|       |  // This is a lazy identifier, since a string primitive is requested, we must
  109|       |  // materialize it.
  110|  34.1k|  return materializeLazyIdentifier(runtime, id);
  111|  78.6k|}
_ZNK6hermes2vm15IdentifierTable13getStringViewERNS0_7RuntimeENS0_8SymbolIDE:
  113|   252k|StringView IdentifierTable::getStringView(Runtime &runtime, SymbolID id) const {
  114|   252k|  auto &entry = getLookupTableEntry(id);
  115|   252k|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (115:7): [True: 214k, False: 38.3k]
  ------------------
  116|       |    // The const_cast is a mechanical requirement as it's not worth it to
  117|       |    // add const version constructors for Handle.
  118|   214k|    Handle<StringPrimitive> handle{
  119|   214k|        runtime, const_cast<StringPrimitive *>(entry.getStringPrim())};
  120|       |    // We know that this string already exists in the identifier table,
  121|       |    // and hence it's safe to call the const version of getStringView.
  122|   214k|    return StringPrimitive::createStringViewMustBeFlat(handle);
  123|   214k|  }
  124|  38.3k|  if (entry.isLazyASCII()) {
  ------------------
  |  Branch (124:7): [True: 38.0k, False: 222]
  ------------------
  125|  38.0k|    return StringView(entry.getLazyASCIIRef());
  126|  38.0k|  }
  127|    222|  return StringView(entry.getLazyUTF16Ref());
  128|  38.3k|}
_ZNK6hermes2vm15IdentifierTable19getStringViewForDevERNS0_7RuntimeENS0_8SymbolIDE:
  131|     20|    const {
  132|     20|  if (id == SymbolID::empty()) {
  ------------------
  |  Branch (132:7): [True: 0, False: 20]
  ------------------
  133|      0|    assert(false && "getStringViewForDev on empty SymbolID");
  134|      0|    return "<<empty>>";
  135|      0|  }
  136|     20|  if (id == SymbolID::deleted()) {
  ------------------
  |  Branch (136:7): [True: 0, False: 20]
  ------------------
  137|      0|    assert(false && "getStringViewForDev on deleted SymbolID");
  138|      0|    return "<<deleted>>";
  139|      0|  }
  140|     20|  if (id.isInvalid()) {
  ------------------
  |  Branch (140:7): [True: 0, False: 20]
  ------------------
  141|      0|    assert(false && "getStringViewForDev on invalid SymbolID");
  142|      0|    return "<<invalid>>";
  143|      0|  }
  144|     20|  return getStringView(runtime, id);
  145|     20|}
_ZN6hermes2vm15IdentifierTable15markIdentifiersERNS0_12RootAcceptorERNS0_7HadesGCE:
  171|    888|void IdentifierTable::markIdentifiers(RootAcceptor &acceptor, GC &gc) {
  172|   579k|  for (auto &vectorEntry : lookupVector_) {
  ------------------
  |  Branch (172:26): [True: 579k, False: 888]
  ------------------
  173|   579k|    if (!vectorEntry.isFreeSlot() && vectorEntry.isStringPrim()) {
  ------------------
  |  Branch (173:9): [True: 547k, False: 32.2k]
  |  Branch (173:38): [True: 326k, False: 221k]
  ------------------
  174|   326k|      assert(
  175|   326k|          !gc.inYoungGen(vectorEntry.getStringPrimRef()) &&
  176|   326k|          "Identifiers must be allocated in the old gen");
  177|      0|      acceptor.acceptPtr(vectorEntry.getStringPrimRef());
  178|   326k|    }
  179|   579k|  }
  180|    888|}
_ZN6hermes2vm15IdentifierTable17symbolReadBarrierEj:
  288|   138k|void IdentifierTable::symbolReadBarrier(uint32_t id) {
  289|       |  // Set the mark bool inside the symbol table entry so that this symbol isn't
  290|       |  // garbage collected.
  291|       |  // The reason this exists is that a Symbol can be retrieved via a string hash
  292|       |  // that doesn't otherwise keep the symbol alive while in the middle of a GC.
  293|   138k|  markedSymbols_.set(id);
  294|   138k|}
_ZN6hermes2vm15IdentifierTable16allocIDAndInsertEjPNS0_15StringPrimitiveE:
  298|  71.0k|    StringPrimitive *strPrim) {
  299|  71.0k|  uint32_t nextId = allocNextID();
  300|  71.0k|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  301|  71.0k|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  302|      0|  strPrim->convertToUniqued(symbolId);
  303|       |
  304|       |  // We must assign strPrim to the lookupVector before inserting to
  305|       |  // hashTable_, because inserting to hashTable_ could trigger a grow/rehash,
  306|       |  // which requires accessing the newly inserted string primitive.
  307|  71.0k|  new (&lookupVector_[nextId]) LookupEntry(strPrim);
  308|       |
  309|  71.0k|  hashTable_.insert(hashTableIndex, symbolId);
  310|       |
  311|  71.0k|  LLVM_DEBUG(
  ------------------
  |  |  123|  71.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  71.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 71.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  71.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  312|  71.0k|      llvh::dbgs() << "allocated symbol " << nextId << " '" << strPrim
  313|  71.0k|                   << "'\n");
  314|       |
  315|  71.0k|  return nextId;
  316|  71.0k|}
_ZN6hermes2vm15IdentifierTable25materializeLazyIdentifierERNS0_7RuntimeENS0_8SymbolIDE:
  413|  34.1k|    SymbolID id) {
  414|  34.1k|  auto &entry = getLookupTableEntry(id);
  415|  34.1k|  assert(
  416|  34.1k|      (entry.isLazyASCII() || entry.isLazyUTF16()) && "identifier is not lazy");
  417|       |  // This in theory can throw if running out of memory. However there are only
  418|       |  // finite number of persistent identifiers, and we should always have enough
  419|       |  // memory to hold them.
  420|      0|  PseudoHandle<StringPrimitive> strPrim = runtime.ignoreAllocationFailure(
  421|  34.1k|      entry.isLazyASCII() ? allocateDynamicString(
  ------------------
  |  Branch (421:7): [True: 34.1k, False: 46]
  ------------------
  422|  34.1k|                                runtime,
  423|  34.1k|                                entry.getLazyASCIIRef(),
  424|  34.1k|                                Runtime::makeNullHandle<StringPrimitive>())
  425|  34.1k|                          : allocateDynamicString(
  426|     46|                                runtime,
  427|     46|                                entry.getLazyUTF16Ref(),
  428|     46|                                Runtime::makeNullHandle<StringPrimitive>()));
  429|  34.1k|  if (id.isUniqued())
  ------------------
  |  Branch (429:7): [True: 34.1k, False: 0]
  ------------------
  430|  34.1k|    strPrim->convertToUniqued(id);
  431|  34.1k|  LLVM_DEBUG(llvh::dbgs() << "Materializing lazy identifier " << id << "\n");
  ------------------
  |  |  123|  34.1k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  34.1k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 34.1k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  34.1k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  432|  34.1k|  entry.materialize(strPrim.get());
  433|  34.1k|  return strPrim.get();
  434|  34.1k|}
_ZN6hermes2vm15IdentifierTable10freeSymbolEj:
  436|    273|void IdentifierTable::freeSymbol(uint32_t index) {
  437|    273|  assert(index < lookupVector_.size() && "Invalid symbol index to free");
  438|      0|  assert(
  439|    273|      lookupVector_[index].isNonLazyStringPrim() &&
  440|    273|      "The specified symbol cannot be freed");
  441|       |
  442|    273|  LLVM_DEBUG(
  ------------------
  |  |  123|    273|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    273|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 273]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    273|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  443|    273|      llvh::dbgs() << "Freeing symbol index " << index << " '"
  444|    273|                   << lookupVector_[index].getStringPrim() << "'\n");
  445|       |
  446|    273|  if (LLVM_LIKELY(!lookupVector_[index].isNotUniqued())) {
  ------------------
  |  |  188|    273|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 273, False: 0]
  |  |  ------------------
  ------------------
  447|    273|    auto *strPrim =
  448|    273|        const_cast<StringPrimitive *>(lookupVector_[index].getStringPrim());
  449|    273|    strPrim->clearUniquedBit();
  450|    273|    hashTable_.remove(strPrim);
  451|    273|  }
  452|    273|  freeID(index);
  453|    273|}
_ZN6hermes2vm15IdentifierTable11allocNextIDEv:
  455|   130k|uint32_t IdentifierTable::allocNextID() {
  456|       |  // If the free list is empty, grow the array.
  457|   130k|  if (firstFreeID_ == LookupEntry::FREE_LIST_END) {
  ------------------
  |  Branch (457:7): [True: 130k, False: 8]
  ------------------
  458|   130k|    uint32_t newID = lookupVector_.size();
  459|   130k|    if (LLVM_UNLIKELY(newID > LookupEntry::MAX_IDENTIFIER)) {
  ------------------
  |  |  189|   130k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 130k]
  |  |  ------------------
  ------------------
  460|      0|      hermes_fatal("Failed to allocate Identifier: IdentifierTable is full");
  461|      0|    }
  462|   130k|    lookupVector_.emplace_back();
  463|   130k|    markedSymbols_.push_back(true);
  464|   130k|    LLVM_DEBUG(
  ------------------
  |  |  123|   130k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|   130k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 130k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|   130k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  465|   130k|        llvh::dbgs() << "Allocated new symbol id at end " << newID << "\n");
  466|       |    // Don't need to tell the GC about this ID, it will assume any growth is
  467|       |    // live.
  468|   130k|    return newID;
  469|   130k|  }
  470|       |
  471|       |  // Allocate from the free list.
  472|      8|  uint32_t nextId = firstFreeID_;
  473|      8|  auto &entry = getLookupTableEntry(nextId);
  474|      8|  assert(entry.isFreeSlot() && "firstFreeID_ is not a free slot");
  475|      0|  firstFreeID_ = entry.getNextFreeSlot();
  476|      8|  markedSymbols_.set(nextId);
  477|      8|  LLVM_DEBUG(llvh::dbgs() << "Allocated freed symbol id " << nextId << "\n");
  ------------------
  |  |  123|      8|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      8|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 8]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      8|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  478|      8|  return nextId;
  479|   130k|}
_ZN6hermes2vm15IdentifierTable6freeIDEj:
  481|    273|void IdentifierTable::freeID(uint32_t id) {
  482|    273|  assert(
  483|    273|      lookupVector_[id].isStringPrim() &&
  484|    273|      "The specified symbol cannot be freed");
  485|       |
  486|       |  // Add the freed index to the free list.
  487|      0|  lookupVector_[id].free(firstFreeID_);
  488|    273|  firstFreeID_ = id;
  489|    273|  LLVM_DEBUG(llvh::dbgs() << "Freeing ID " << id << "\n");
  ------------------
  |  |  123|    273|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    273|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 273]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    273|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  490|    273|}
_ZN6hermes2vm15IdentifierTable13unmarkSymbolsEv:
  492|    143|void IdentifierTable::unmarkSymbols() {
  493|    143|  markedSymbols_.reset();
  494|    143|}
_ZN6hermes2vm15IdentifierTable19freeUnmarkedSymbolsERKN4llvh9BitVectorERNS0_6GCBase9IDTrackerE:
  498|    141|    GC::IDTracker &tracker) {
  499|    141|  assert(
  500|    141|      markedSymbols.size() <= lookupVector_.size() &&
  501|    141|      "Size of markedSymbols must be less than the current lookupVector");
  502|      0|  assert(
  503|    141|      markedSymbols_.size() == lookupVector_.size() &&
  504|    141|      "Size of markedSymbols_ must be the same as the lookupVector");
  505|      0|  markedSymbols_ |= markedSymbols;
  506|       |  // Flip and find set bits, which will correspond to symbols that weren't
  507|       |  // marked.
  508|    141|  markedSymbols_.flip();
  509|    141|  const bool isTrackingIDs = tracker.isTrackingIDs();
  510|    141|  const uint32_t markedSymbolsSize = markedSymbols.size();
  511|  26.6k|  for (const uint32_t i : markedSymbols_.set_bits()) {
  ------------------
  |  Branch (511:25): [True: 26.6k, False: 141]
  ------------------
  512|       |    // Don't check any bits after the passed-in bits, which represent the number
  513|       |    // of symbols alive at the start of the collection.
  514|  26.6k|    if (i >= markedSymbolsSize) {
  ------------------
  |  Branch (514:9): [True: 0, False: 26.6k]
  ------------------
  515|      0|      break;
  516|      0|    }
  517|       |    // We never free StringPrimitives that are materialized from a lazy
  518|       |    // identifier.
  519|  26.6k|    if (lookupVector_[i].isNonLazyStringPrim()) {
  ------------------
  |  Branch (519:9): [True: 273, False: 26.3k]
  ------------------
  520|    273|      if (isTrackingIDs) {
  ------------------
  |  Branch (520:11): [True: 0, False: 273]
  ------------------
  521|      0|        tracker.untrackSymbol(i);
  522|      0|      }
  523|    273|      freeSymbol(i);
  524|    273|    }
  525|  26.6k|  }
  526|    141|  markedSymbols_.reset();
  527|    141|}
_ZNK6hermes2vm15IdentifierTable12isSymbolLiveENS0_8SymbolIDE:
  530|  1.05M|bool IdentifierTable::isSymbolLive(SymbolID id) const {
  531|  1.05M|  auto &entry = getLookupTableEntry(id);
  532|       |  // If the entry is not a free slot, then it is live.
  533|  1.05M|  return !entry.isFreeSlot();
  534|  1.05M|}
_ZNK6hermes2vm15IdentifierTable18getStringForSymbolENS0_8SymbolIDE:
  536|  1.05M|const StringPrimitive *IdentifierTable::getStringForSymbol(SymbolID id) const {
  537|  1.05M|  auto &entry = getLookupTableEntry(id);
  538|  1.05M|  if (entry.isStringPrim()) {
  ------------------
  |  Branch (538:7): [True: 649k, False: 409k]
  ------------------
  539|   649k|    return entry.getStringPrim();
  540|   649k|  }
  541|   409k|  return nullptr;
  542|  1.05M|}
_ZN6hermes2vm15IdentifierTable26createNotUniquedLazySymbolEN4llvh8ArrayRefIcEE:
  545|  2.17k|SymbolID IdentifierTable::createNotUniquedLazySymbol(ASCIIRef desc) {
  546|  2.17k|  uint32_t nextID = allocNextID();
  547|  2.17k|  new (&lookupVector_[nextID]) LookupEntry(desc, 0, true);
  548|  2.17k|  return SymbolID::unsafeCreateNotUniqued(nextID);
  549|  2.17k|}
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIDsEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEEj:
  323|     99|    uint32_t hash) {
  324|     99|  assert(
  325|     99|      !(maybeIncomingPrimHandle && maybeIncomingPrimHandle->isUniqued()) &&
  326|     99|      "Should not call getOrCreateIdentifier with a uniqued StrPrim");
  327|      0|  assert(
  328|     99|      (!maybeIncomingPrimHandle || maybeIncomingPrimHandle->isFlat()) &&
  329|     99|      "StringPrimitive must be flat");
  330|       |
  331|      0|  auto idx = hashTable_.lookupString(str, hash);
  332|     99|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (332:7): [True: 0, False: 99]
  ------------------
  333|      0|    NoAllocScope scope{runtime};
  334|      0|    const auto id = hashTable_.get(idx);
  335|       |    // Read barrier here because a symbol value is getting read out of the hash
  336|       |    // map.
  337|      0|    symbolReadBarrier(id);
  338|      0|    return SymbolID::unsafeCreate(id);
  339|      0|  }
  340|       |
  341|       |  // It is tempting here to check whether the incoming StringPrimitive can be
  342|       |  // uniqued, and use it instead of allocating a new one. The problem is that
  343|       |  // identifiers must always be allocated in "long-lived" memory, but we don't
  344|       |  // (yet) have a way of checking whether that is the case. If in the future we
  345|       |  // did get that GC API, the check would look something like this:
  346|       |  // \code
  347|       |  // if (maybeIncomingPrimHandle &&
  348|       |  //     LLVM_UNLIKELY(maybeIncomingPrimHandle->canBeUniqued()) &&
  349|       |  //     runtime.getHeap().isLongLived(*maybeIncomingPrimHandle)) {
  350|       |  //   return SymbolID::unsafeCreate(
  351|       |  //       allocIDAndInsert(idx, maybeIncomingPrimHandle.get()));
  352|       |  // }
  353|       |  // \endcode
  354|       |
  355|     99|  CallResult<PseudoHandle<StringPrimitive>> cr =
  356|     99|      allocateDynamicString(runtime, str, maybeIncomingPrimHandle);
  357|     99|  if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (357:7): [True: 0, False: 99]
  ------------------
  358|      0|    return ExecutionStatus::EXCEPTION;
  359|      0|  }
  360|       |
  361|       |  // Allocate the id after we have performed memory allocations because a GC
  362|       |  // would have freed id.
  363|     99|  return SymbolID::unsafeCreate(allocIDAndInsert(idx, cr->get()));
  364|     99|}
_ZN6hermes2vm15IdentifierTable21getOrCreateIdentifierIcEENS0_10CallResultINS0_8SymbolIDELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleINS0_15StringPrimitiveEEEj:
  323|   205k|    uint32_t hash) {
  324|   205k|  assert(
  325|   205k|      !(maybeIncomingPrimHandle && maybeIncomingPrimHandle->isUniqued()) &&
  326|   205k|      "Should not call getOrCreateIdentifier with a uniqued StrPrim");
  327|      0|  assert(
  328|   205k|      (!maybeIncomingPrimHandle || maybeIncomingPrimHandle->isFlat()) &&
  329|   205k|      "StringPrimitive must be flat");
  330|       |
  331|      0|  auto idx = hashTable_.lookupString(str, hash);
  332|   205k|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (332:7): [True: 134k, False: 70.9k]
  ------------------
  333|   134k|    NoAllocScope scope{runtime};
  334|   134k|    const auto id = hashTable_.get(idx);
  335|       |    // Read barrier here because a symbol value is getting read out of the hash
  336|       |    // map.
  337|   134k|    symbolReadBarrier(id);
  338|   134k|    return SymbolID::unsafeCreate(id);
  339|   134k|  }
  340|       |
  341|       |  // It is tempting here to check whether the incoming StringPrimitive can be
  342|       |  // uniqued, and use it instead of allocating a new one. The problem is that
  343|       |  // identifiers must always be allocated in "long-lived" memory, but we don't
  344|       |  // (yet) have a way of checking whether that is the case. If in the future we
  345|       |  // did get that GC API, the check would look something like this:
  346|       |  // \code
  347|       |  // if (maybeIncomingPrimHandle &&
  348|       |  //     LLVM_UNLIKELY(maybeIncomingPrimHandle->canBeUniqued()) &&
  349|       |  //     runtime.getHeap().isLongLived(*maybeIncomingPrimHandle)) {
  350|       |  //   return SymbolID::unsafeCreate(
  351|       |  //       allocIDAndInsert(idx, maybeIncomingPrimHandle.get()));
  352|       |  // }
  353|       |  // \endcode
  354|       |
  355|  70.9k|  CallResult<PseudoHandle<StringPrimitive>> cr =
  356|  70.9k|      allocateDynamicString(runtime, str, maybeIncomingPrimHandle);
  357|  70.9k|  if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (357:7): [True: 0, False: 70.9k]
  ------------------
  358|      0|    return ExecutionStatus::EXCEPTION;
  359|      0|  }
  360|       |
  361|       |  // Allocate the id after we have performed memory allocations because a GC
  362|       |  // would have freed id.
  363|  70.9k|  return SymbolID::unsafeCreate(allocIDAndInsert(idx, cr->get()));
  364|  70.9k|}
_ZN6hermes2vm15IdentifierTable26registerLazyIdentifierImplIcEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEj:
  392|  60.7k|    uint32_t hash) {
  393|  60.7k|  auto idx = hashTable_.lookupString(str, hash);
  394|  60.7k|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (394:7): [True: 3.63k, False: 57.0k]
  ------------------
  395|       |    // If the string is already in the table, return it.
  396|  3.63k|    const auto id = hashTable_.get(idx);
  397|  3.63k|    symbolReadBarrier(id);
  398|  3.63k|    return SymbolID::unsafeCreate(id);
  399|  3.63k|  }
  400|  57.0k|  uint32_t nextId = allocNextID();
  401|  57.0k|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  402|  57.0k|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  403|      0|  new (&lookupVector_[nextId]) LookupEntry(str, hash);
  404|  57.0k|  hashTable_.insert(idx, symbolId);
  405|  57.0k|  LLVM_DEBUG(
  ------------------
  |  |  123|  57.0k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  57.0k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 57.0k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  57.0k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|  57.0k|      llvh::dbgs() << "Allocated lazy identifier: " << nextId << " " << str
  407|  57.0k|                   << "\n");
  408|  57.0k|  return symbolId;
  409|  60.7k|}
_ZN6hermes2vm15IdentifierTable26registerLazyIdentifierImplIDsEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEj:
  392|    273|    uint32_t hash) {
  393|    273|  auto idx = hashTable_.lookupString(str, hash);
  394|    273|  if (hashTable_.isValid(idx)) {
  ------------------
  |  Branch (394:7): [True: 0, False: 273]
  ------------------
  395|       |    // If the string is already in the table, return it.
  396|      0|    const auto id = hashTable_.get(idx);
  397|      0|    symbolReadBarrier(id);
  398|      0|    return SymbolID::unsafeCreate(id);
  399|      0|  }
  400|    273|  uint32_t nextId = allocNextID();
  401|    273|  SymbolID symbolId = SymbolID::unsafeCreate(nextId);
  402|    273|  assert(lookupVector_[nextId].isFreeSlot() && "Allocated a non-free slot");
  403|      0|  new (&lookupVector_[nextId]) LookupEntry(str, hash);
  404|    273|  hashTable_.insert(idx, symbolId);
  405|    273|  LLVM_DEBUG(
  ------------------
  |  |  123|    273|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    273|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 273]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    273|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  406|    273|      llvh::dbgs() << "Allocated lazy identifier: " << nextId << " " << str
  407|    273|                   << "\n");
  408|    273|  return symbolId;
  409|    273|}
_ZN6hermes2vm15IdentifierTable21allocateDynamicStringIcLb1EEENS0_10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleIS5_EE:
  248|   105k|    Handle<StringPrimitive> primHandle) {
  249|   105k|  size_t length = str.size();
  250|       |
  251|   105k|  assert(
  252|   105k|      (!primHandle || primHandle->isFlat()) && "StringPrimitive must be flat");
  253|       |
  254|      0|  GCScope gcScope(runtime);
  255|       |
  256|   105k|  PseudoHandle<StringPrimitive> result;
  257|   105k|  if (StringPrimitive::isExternalLength(length)) {
  ------------------
  |  Branch (257:7): [True: 5, False: 105k]
  ------------------
  258|      5|    if (LLVM_UNLIKELY(length > StringPrimitive::MAX_STRING_LENGTH)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  259|      0|      return runtime.raiseRangeError("String length exceeds limit");
  260|      0|    }
  261|      5|    std::basic_string<T> stdString(str.begin(), str.end());
  262|      5|    auto cr = ExternalStringPrimitive<T>::createLongLived(
  263|      5|        runtime, std::move(stdString));
  264|      5|    if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  265|      0|      return ExecutionStatus::EXCEPTION;
  266|      0|    }
  267|      5|    result = createPseudoHandle(vmcast<StringPrimitive>(*cr));
  268|   105k|  } else {
  269|   105k|    auto *tmp = runtime.makeAVariable<
  270|   105k|        DynamicStringPrimitive<T, Unique>,
  271|   105k|        HasFinalizer::No,
  272|   105k|        LongLived::Yes>(
  273|   105k|        DynamicStringPrimitive<T, Unique>::allocationSize((uint32_t)length),
  274|   105k|        length);
  275|       |    // Since we keep a raw pointer to mem, no more JS heap allocations after
  276|       |    // this point.
  277|   105k|    NoAllocScope _(runtime);
  278|   105k|    if (primHandle) {
  ------------------
  |  Branch (278:9): [True: 70.9k, False: 34.1k]
  ------------------
  279|  70.9k|      str = primHandle->getStringRef<T>();
  280|  70.9k|    }
  281|   105k|    std::copy(str.begin(), str.end(), tmp->getRawPointerForWrite());
  282|   105k|    result = createPseudoHandle<StringPrimitive>(tmp);
  283|   105k|  }
  284|       |
  285|   105k|  return result;
  286|   105k|}
_ZN6hermes2vm15IdentifierTable21allocateDynamicStringIDsLb1EEENS0_10CallResultINS0_12PseudoHandleINS0_15StringPrimitiveEEELNS0_6detail20CallResultSpecializeE6EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EENS0_6HandleIS5_EE:
  248|    145|    Handle<StringPrimitive> primHandle) {
  249|    145|  size_t length = str.size();
  250|       |
  251|    145|  assert(
  252|    145|      (!primHandle || primHandle->isFlat()) && "StringPrimitive must be flat");
  253|       |
  254|      0|  GCScope gcScope(runtime);
  255|       |
  256|    145|  PseudoHandle<StringPrimitive> result;
  257|    145|  if (StringPrimitive::isExternalLength(length)) {
  ------------------
  |  Branch (257:7): [True: 13, False: 132]
  ------------------
  258|     13|    if (LLVM_UNLIKELY(length > StringPrimitive::MAX_STRING_LENGTH)) {
  ------------------
  |  |  189|     13|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  259|      0|      return runtime.raiseRangeError("String length exceeds limit");
  260|      0|    }
  261|     13|    std::basic_string<T> stdString(str.begin(), str.end());
  262|     13|    auto cr = ExternalStringPrimitive<T>::createLongLived(
  263|     13|        runtime, std::move(stdString));
  264|     13|    if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     13|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  265|      0|      return ExecutionStatus::EXCEPTION;
  266|      0|    }
  267|     13|    result = createPseudoHandle(vmcast<StringPrimitive>(*cr));
  268|    132|  } else {
  269|    132|    auto *tmp = runtime.makeAVariable<
  270|    132|        DynamicStringPrimitive<T, Unique>,
  271|    132|        HasFinalizer::No,
  272|    132|        LongLived::Yes>(
  273|    132|        DynamicStringPrimitive<T, Unique>::allocationSize((uint32_t)length),
  274|    132|        length);
  275|       |    // Since we keep a raw pointer to mem, no more JS heap allocations after
  276|       |    // this point.
  277|    132|    NoAllocScope _(runtime);
  278|    132|    if (primHandle) {
  ------------------
  |  Branch (278:9): [True: 0, False: 132]
  ------------------
  279|      0|      str = primHandle->getStringRef<T>();
  280|      0|    }
  281|    132|    std::copy(str.begin(), str.end(), tmp->getRawPointerForWrite());
  282|    132|    result = createPseudoHandle<StringPrimitive>(tmp);
  283|    132|  }
  284|       |
  285|    145|  return result;
  286|    145|}

_ZN6hermes2vm8doBitAndEii:
   95|      2|inline int32_t doBitAnd(int32_t x, int32_t y) {
   96|      2|  return x & y;
   97|      2|}
_ZN6hermes2vm7doBitOrEii:
   99|    222|inline int32_t doBitOr(int32_t x, int32_t y) {
  100|    222|  return x | y;
  101|    222|}

_ZN6hermes2vm17doBitOperSlowPathIXadL_ZNS0_7doBitOrEiiEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EESA_:
  479|    222|doBitOperSlowPath(Runtime &runtime, Handle<> lhs, Handle<> rhs) {
  480|    222|  CallResult<HermesValue> res =
  481|    222|      toPrimitive_RJS(runtime, lhs, PreferredType::NUMBER);
  482|    222|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 222]
  |  |  ------------------
  ------------------
  483|      0|    return ExecutionStatus::EXCEPTION;
  484|      0|  }
  485|    222|  if (LLVM_LIKELY(!res->isBigInt())) {
  ------------------
  |  |  188|    222|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 222, False: 0]
  |  |  ------------------
  ------------------
  486|    222|    res = toInt32_RJS(runtime, runtime.makeHandle(*res));
  487|    222|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 222]
  |  |  ------------------
  ------------------
  488|      0|      return ExecutionStatus::EXCEPTION;
  489|      0|    }
  490|    222|    const int32_t left = res->getNumberAs<int32_t>();
  491|    222|    res = toInt32_RJS(runtime, std::move(rhs));
  492|    222|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 222]
  |  |  ------------------
  ------------------
  493|      0|      return ExecutionStatus::EXCEPTION;
  494|      0|    }
  495|    222|    return HermesValue::encodeNumberValue(
  496|    222|        Oper(left, res->getNumberAs<int32_t>()));
  497|    222|  }
  498|      0|  return doBigIntBinOp(
  499|      0|      runtime, BigIntOper<Oper>, runtime.makeHandle(res->getBigInt()), rhs);
  500|    222|}
_ZN6hermes2vm11Interpreter15implCallBuiltinERNS0_7RuntimeEPNS0_17PinnedHermesValueEPNS0_9CodeBlockEj:
  310|    283|    uint32_t op3) {
  311|    283|  const Inst *ip = runtime.getCurrentIP();
  312|    283|  uint8_t methodIndex = ip->iCallBuiltin.op2;
  313|    283|  Callable *callable = runtime.getBuiltinCallable(methodIndex);
  314|    283|  assert(
  315|    283|      isNativeBuiltin(methodIndex) &&
  316|    283|      "CallBuiltin must take a native builtin.");
  317|      0|  NativeFunction *nf = vmcast<NativeFunction>(callable);
  318|       |
  319|    283|  auto newFrame = StackFramePtr::initFrame(
  320|    283|      runtime.stackPointer_, FRAME, ip, curCodeBlock, op3 - 1, nf, false);
  ------------------
  |  |   39|    283|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  321|       |  // "thisArg" is implicitly assumed to "undefined".
  322|    283|  newFrame.getThisArgRef() = HermesValue::encodeUndefinedValue();
  323|       |
  324|    283|  SLOW_DEBUG(dumpCallArguments(llvh::dbgs(), runtime, newFrame));
  ------------------
  |  |   18|    283|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|    283|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|    283|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 283]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|    283|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  325|       |
  326|    283|  auto resPH = NativeFunction::_nativeCall(nf, runtime);
  327|    283|  if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    283|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 283]
  |  |  ------------------
  ------------------
  328|      0|    return ExecutionStatus::EXCEPTION;
  329|    283|  O1REG(CallBuiltin) = std::move(resPH->get());
  ------------------
  |  |   31|    283|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    566|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  330|    283|  SLOW_DEBUG(
  ------------------
  |  |   18|    283|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|    283|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|    283|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 283]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|    283|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  331|    283|      llvh::dbgs() << "native return value r" << (unsigned)ip->iCallBuiltin.op1
  332|    283|                   << "=" << DumpHermesValue(O1REG(CallBuiltin)) << "\n");
  333|    283|  return ExecutionStatus::RETURNED;
  334|    283|}
_ZN6hermes2vm11Interpreter20declareGlobalVarImplERNS0_7RuntimeEPNS0_9CodeBlockEPKNS_4inst4InstE:
  339|      2|    const Inst *ip) {
  340|      2|  GCScopeMarkerRAII mark{runtime};
  341|      2|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  342|      2|  dpf.configurable = 0;
  343|       |  // Do not overwrite existing globals with undefined.
  344|      2|  dpf.setValue = 0;
  345|       |
  346|      2|  CallResult<bool> res = JSObject::defineOwnProperty(
  347|      2|      runtime.getGlobal(),
  348|      2|      runtime,
  349|      2|      ID(ip->iDeclareGlobalVar.op1),
  ------------------
  |  |   49|      2|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
  350|      2|      dpf,
  351|      2|      Runtime::getUndefinedValue(),
  352|      2|      PropOpFlags().plusThrowOnError());
  353|      2|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
  354|      0|    assert(
  355|      0|        !runtime.getGlobal()->isProxyObject() &&
  356|      0|        "global can't be a proxy object");
  357|       |    // If the property already exists, this should be a noop.
  358|       |    // Instead of incurring the cost to check every time, do it
  359|       |    // only if an exception is thrown, and swallow the exception
  360|       |    // if it exists, since we didn't want to make the call,
  361|       |    // anyway.  This most likely means the property is
  362|       |    // non-configurable.
  363|      0|    NamedPropertyDescriptor desc;
  364|      0|    if (!JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (364:9): [True: 0, False: 0]
  ------------------
  365|      0|            runtime.getGlobal(),
  366|      0|            runtime,
  367|      0|            ID(ip->iDeclareGlobalVar.op1),
  ------------------
  |  |   49|      0|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
  368|      0|            desc)) {
  369|      0|      return ExecutionStatus::EXCEPTION;
  370|      0|    }
  371|      0|    runtime.clearThrownValue();
  372|      0|  }
  373|      2|  return ExecutionStatus::RETURNED;
  374|      2|}
_ZN6hermes2vm16doBitNotSlowPathERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  595|      3|CallResult<HermesValue> doBitNotSlowPath(Runtime &runtime, Handle<> src) {
  596|       |  // Try converting src to a numeric.
  597|      3|  auto numRes = toNumeric_RJS(runtime, src);
  598|      3|  if (LLVM_UNLIKELY(numRes == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  599|      0|    return ExecutionStatus::EXCEPTION;
  600|       |  // Test for BigInt since it is cheaper than testing for number. If it is a
  601|       |  // number, truncate it and perform bitwise not.
  602|      3|  if (LLVM_LIKELY(!numRes->isBigInt()))
  ------------------
  |  |  188|      3|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3, False: 0]
  |  |  ------------------
  ------------------
  603|      3|    return HermesValue::encodeDoubleValue(
  604|      3|        ~hermes::truncateToInt32(numRes->getNumber()));
  605|       |
  606|       |  // The result is a BigInt, perform a BigInt bitwise not.
  607|      0|  auto bigint = runtime.makeHandle(numRes->getBigInt());
  608|      0|  return BigIntPrimitive::unaryNOT(runtime, bigint);
  609|      3|}

_ZN6hermes2vm11Interpreter18handleCallSlowPathERNS0_7RuntimeEPNS0_17PinnedHermesValueE:
  270|    786|    PinnedHermesValue *callTarget) {
  271|    786|  if (auto *native = dyn_vmcast<NativeFunction>(*callTarget)) {
  ------------------
  |  Branch (271:13): [True: 782, False: 4]
  ------------------
  272|    782|    ++NumNativeFunctionCalls;
  273|       |    // Call the native function directly
  274|    782|    return NativeFunction::_nativeCall(native, runtime);
  275|    782|  } else if (auto *bound = dyn_vmcast<BoundFunction>(*callTarget)) {
  ------------------
  |  Branch (275:20): [True: 0, False: 4]
  ------------------
  276|      0|    ++NumBoundFunctionCalls;
  277|       |    // Call the bound function.
  278|      0|    return BoundFunction::_boundCall(bound, runtime.getCurrentIP(), runtime);
  279|      4|  } else {
  280|      4|    return runtime.raiseTypeErrorForCallable(Handle<>(callTarget));
  281|      4|  }
  282|    786|}
_ZN6hermes2vm11Interpreter20getByIdTransient_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_8SymbolIDE:
  298|     14|    SymbolID id) {
  299|       |  // This is similar to what ES5.1 8.7.1 special [[Get]] internal
  300|       |  // method did, but that section doesn't exist in ES9 anymore.
  301|       |  // Instead, the [[Get]] Receiver argument serves a similar purpose.
  302|       |
  303|       |  // Fast path: try to get primitive own property directly first.
  304|     14|  PseudoHandle<> valOpt = tryGetPrimitiveOwnPropertyById(runtime, base, id);
  305|     14|  if (!valOpt->isEmpty()) {
  ------------------
  |  Branch (305:7): [True: 0, False: 14]
  ------------------
  306|      0|    return valOpt;
  307|      0|  }
  308|       |
  309|       |  // get the property descriptor from primitive prototype without
  310|       |  // boxing with vm::toObject().  This is where any properties will
  311|       |  // be.
  312|     14|  CallResult<Handle<JSObject>> primitivePrototypeResult =
  313|     14|      getPrimitivePrototype(runtime, base);
  314|     14|  if (primitivePrototypeResult == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (314:7): [True: 0, False: 14]
  ------------------
  315|       |    // If an exception is thrown, likely we are trying to read property on
  316|       |    // undefined/null. Passing over the name of the property
  317|       |    // so that we could emit more meaningful error messages.
  318|      0|    return amendPropAccessErrorMsgWithPropName(runtime, base, "read", id);
  319|      0|  }
  320|       |
  321|     14|  return JSObject::getNamedWithReceiver_RJS(
  322|     14|      *primitivePrototypeResult, runtime, id, base);
  323|     14|}
_ZN6hermes2vm11Interpreter22createObjectFromBufferERNS0_7RuntimeEPNS0_9CodeBlockEjjj:
  558|    877|    unsigned valBufferIndex) {
  559|       |  // Create a new object using the built-in constructor or cached hidden class.
  560|       |  // Note that the built-in constructor is empty, so we don't actually need to
  561|       |  // call it.
  562|    877|  auto clazz = getHiddenClassForBuffer(
  563|    877|      runtime, curCodeBlock, numLiterals, keyBufferIndex);
  564|    877|  auto obj = runtime.makeHandle(JSObject::create(runtime, clazz));
  565|       |
  566|    877|  auto valGen =
  567|    877|      curCodeBlock->getObjectBufferValueIter(valBufferIndex, numLiterals);
  568|       |
  569|    877|#ifndef NDEBUG
  570|    877|  auto keyGen =
  571|    877|      curCodeBlock->getObjectBufferKeyIter(keyBufferIndex, numLiterals);
  572|    877|#endif
  573|       |
  574|    877|  uint32_t propIndex = 0;
  575|       |  // keyGen should always have the same amount of elements as valGen
  576|  2.68k|  while (valGen.hasNext()) {
  ------------------
  |  Branch (576:10): [True: 1.81k, False: 877]
  ------------------
  577|  1.81k|#ifndef NDEBUG
  578|  1.81k|    {
  579|  1.81k|      GCScopeMarkerRAII marker{runtime};
  580|       |      // keyGen points to an element in the key buffer, which means it will
  581|       |      // only ever generate a Number or a Symbol. This means it will never
  582|       |      // allocate memory, and it is safe to not use a Handle.
  583|  1.81k|      SymbolID stringIdResult{};
  584|  1.81k|      auto key = keyGen.get(runtime);
  585|  1.81k|      if (key.isSymbol()) {
  ------------------
  |  Branch (585:11): [True: 1.81k, False: 0]
  ------------------
  586|  1.81k|        stringIdResult = ID(key.getSymbol().unsafeGetIndex());
  ------------------
  |  |   49|  1.81k|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
  587|  1.81k|      } else {
  588|      0|        auto keyHandle =
  589|      0|            runtime.makeHandle(HermesValue::encodeDoubleValue(key.getNumber()));
  590|      0|        auto idRes = valueToSymbolID(runtime, keyHandle);
  591|      0|        assert(
  592|      0|            idRes != ExecutionStatus::EXCEPTION &&
  593|      0|            "valueToIdentifier() failed for uint32_t value");
  594|      0|        stringIdResult = **idRes;
  595|      0|      }
  596|      0|      NamedPropertyDescriptor desc;
  597|  1.81k|      auto pos = HiddenClass::findProperty(
  598|  1.81k|          clazz,
  599|  1.81k|          runtime,
  600|  1.81k|          stringIdResult,
  601|  1.81k|          PropertyFlags::defaultNewNamedPropertyFlags(),
  602|  1.81k|          desc);
  603|  1.81k|      assert(
  604|  1.81k|          pos &&
  605|  1.81k|          "Should find this property in cached hidden class property table.");
  606|      0|      assert(
  607|  1.81k|          desc.slot == propIndex &&
  608|  1.81k|          "propIndex should be the same as recorded in hidden class table.");
  609|  1.81k|    }
  610|      0|#endif
  611|       |    // Explicitly make sure valGen.get() is called before obj.get() so that
  612|       |    // any allocation in valGen.get() won't invalidate the raw pointer
  613|       |    // returned from obj.get().
  614|      0|    auto val = valGen.get(runtime);
  615|  1.81k|    auto shv = SmallHermesValue::encodeHermesValue(val, runtime);
  616|       |    // We made this object, it's not a Proxy.
  617|  1.81k|    JSObject::setNamedSlotValueUnsafe(obj.get(), runtime, propIndex, shv);
  618|  1.81k|    ++propIndex;
  619|  1.81k|  }
  620|       |
  621|    877|  return createPseudoHandle(HermesValue::encodeObjectValue(*obj));
  622|    877|}
_ZN6hermes2vm11Interpreter21createArrayFromBufferERNS0_7RuntimeEPNS0_9CodeBlockEjjj:
  629|  10.9k|    unsigned bufferIndex) {
  630|       |  // Create a new array using the built-in constructor, and initialize
  631|       |  // the elements from a literal array buffer.
  632|  10.9k|  auto arrRes = JSArray::create(runtime, numElements, numElements);
  633|  10.9k|  if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (633:7): [True: 0, False: 10.9k]
  ------------------
  634|      0|    return ExecutionStatus::EXCEPTION;
  635|      0|  }
  636|       |  // Resize the array storage in advance.
  637|  10.9k|  auto arr = *arrRes;
  638|  10.9k|  JSArray::setStorageEndIndex(arr, runtime, numElements);
  639|       |
  640|  10.9k|  auto iter = curCodeBlock->getArrayBufferIter(bufferIndex, numLiterals);
  641|  10.9k|  JSArray::size_type i = 0;
  642|   468k|  while (iter.hasNext()) {
  ------------------
  |  Branch (642:10): [True: 457k, False: 10.9k]
  ------------------
  643|       |    // NOTE: we must get the value in a separate step to guarantee ordering.
  644|   457k|    const auto value =
  645|   457k|        SmallHermesValue::encodeHermesValue(iter.get(runtime), runtime);
  646|   457k|    JSArray::unsafeSetExistingElementAt(*arr, runtime, i++, value);
  647|   457k|  }
  648|       |
  649|  10.9k|  return createPseudoHandle(HermesValue::encodeObjectValue(*arr));
  650|  10.9k|}
_ZN6hermes2vm7Runtime21interpretFunctionImplEPNS0_9CodeBlockE:
  786|    155|    CodeBlock *newCodeBlock) {
  787|    155|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    155|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155]
  |  |  ------------------
  ------------------
  788|    155|          newCodeBlock->lazyCompile(*this) == ExecutionStatus::EXCEPTION)) {
  789|      0|    return ExecutionStatus::EXCEPTION;
  790|      0|  }
  791|       |
  792|    155|#if defined(HERMES_MEMORY_INSTRUMENTATION) || !defined(NDEBUG)
  793|       |  // We always call getCurrentIP() in a debug build as this has the effect
  794|       |  // of asserting the IP is correctly set (not invalidated) at this point.
  795|       |  // This allows us to leverage our whole test-suite to find missing cases
  796|       |  // of CAPTURE_IP* macros in the interpreter loop.
  797|    155|  const inst::Inst *ip = getCurrentIP();
  798|    155|  (void)ip;
  799|    155|#endif
  800|    155|#ifdef HERMES_MEMORY_INSTRUMENTATION
  801|    155|  if (ip) {
  ------------------
  |  Branch (801:7): [True: 0, False: 155]
  ------------------
  802|      0|    const CodeBlock *codeBlock;
  803|      0|    std::tie(codeBlock, ip) = getCurrentInterpreterLocation(ip);
  804|       |    // All functions end in a Ret so we must match this with a pushCallStack()
  805|       |    // before executing.
  806|      0|    if (codeBlock) {
  ------------------
  |  Branch (806:9): [True: 0, False: 0]
  ------------------
  807|       |      // Push a call entry at the last location we were executing bytecode.
  808|       |      // This will correctly attribute things like eval().
  809|      0|      pushCallStack(codeBlock, ip);
  810|      0|    } else {
  811|       |      // Push a call entry at the entry at the top of interpreted code.
  812|      0|      pushCallStack(newCodeBlock, (const Inst *)newCodeBlock->begin());
  813|      0|    }
  814|    155|  } else {
  815|       |    // Push a call entry at the entry at the top of interpreted code.
  816|    155|    pushCallStack(newCodeBlock, (const Inst *)newCodeBlock->begin());
  817|    155|  }
  818|    155|#endif
  819|       |
  820|    155|  InterpreterState state{newCodeBlock, 0};
  821|    155|  if (HERMESVM_CRASH_TRACE &&
  ------------------
  |  |  188|    310|#define HERMESVM_CRASH_TRACE 0
  |  |  ------------------
  |  |  |  Branch (188:30): [Folded - Ignored]
  |  |  ------------------
  ------------------
  822|    155|      (getVMExperimentFlags() & experiments::CrashTrace)) {
  ------------------
  |  Branch (822:7): [True: 0, False: 0]
  ------------------
  823|      0|    return Interpreter::interpretFunction<false, true>(*this, state);
  824|    155|  } else {
  825|    155|    return Interpreter::interpretFunction<false, false>(*this, state);
  826|    155|  }
  827|    155|}
_ZN6hermes2vm7Runtime17interpretFunctionEPNS0_9CodeBlockE:
  829|    155|CallResult<HermesValue> Runtime::interpretFunction(CodeBlock *newCodeBlock) {
  830|    155|  return interpretFunctionImpl(newCodeBlock);
  831|    155|}
_ZN6hermes2vm11Interpreter30tryGetPrimitiveOwnPropertyByIdERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_8SymbolIDE:
  287|     14|    SymbolID id) {
  288|     14|  if (base->isString() && id == Predefined::getSymbolID(Predefined::length)) {
  ------------------
  |  Branch (288:7): [True: 14, False: 0]
  |  Branch (288:27): [True: 0, False: 14]
  ------------------
  289|      0|    return createPseudoHandle(
  290|      0|        HermesValue::encodeNumberValue(base->getString()->getStringLength()));
  291|      0|  }
  292|     14|  return createPseudoHandle(HermesValue::encodeEmptyValue());
  293|     14|}
Interpreter.cpp:_ZN6hermes2vmL23getHiddenClassForBufferERNS0_7RuntimeEPNS0_9CodeBlockEjj:
  505|    877|    unsigned keyBufferIndex) {
  506|    877|  RuntimeModule *runtimeModule = curCodeBlock->getRuntimeModule();
  507|    877|  if (auto clazzOpt = runtimeModule->findCachedLiteralHiddenClass(
  ------------------
  |  Branch (507:12): [True: 645, False: 232]
  ------------------
  508|    877|          runtime, keyBufferIndex, numLiterals))
  509|    645|    return *clazzOpt;
  510|       |
  511|    232|  MutableHandle<> tmpHandleKey{runtime};
  512|    232|  MutableHandle<HiddenClass> clazz =
  513|    232|      runtime.makeMutableHandle(*runtime.getHiddenClassForPrototype(
  514|    232|          vmcast<JSObject>(runtime.objectPrototype),
  515|    232|          JSObject::numOverlapSlots<JSObject>()));
  516|       |
  517|    232|  GCScopeMarkerRAII marker{runtime};
  518|    232|  auto keyGen =
  519|    232|      curCodeBlock->getObjectBufferKeyIter(keyBufferIndex, numLiterals);
  520|    712|  while (keyGen.hasNext()) {
  ------------------
  |  Branch (520:10): [True: 480, False: 232]
  ------------------
  521|    480|    auto key = keyGen.get(runtime);
  522|    480|    SymbolID sym = [&] {
  523|    480|      if (key.isSymbol())
  524|    480|        return ID(key.getSymbol().unsafeGetIndex());
  525|       |
  526|    480|      assert(key.isNumber() && "Key must be symbol or number");
  527|    480|      tmpHandleKey = key;
  528|       |      // Note that since this handle has been created, the associated symbol
  529|       |      // will be automatically kept alive until we flush the marker.
  530|       |      // valueToSymbolID cannot fail because the key is known to be uint32.
  531|    480|      Handle<SymbolID> symHandle = *valueToSymbolID(runtime, tmpHandleKey);
  532|    480|      return *symHandle;
  533|    480|    }();
  534|    480|    auto addResult = HiddenClass::addProperty(
  535|    480|        clazz, runtime, sym, PropertyFlags::defaultNewNamedPropertyFlags());
  536|    480|    clazz = addResult->first;
  537|    480|    marker.flush();
  538|    480|  }
  539|       |
  540|    232|  if (LLVM_LIKELY(!clazz->isDictionary())) {
  ------------------
  |  |  188|    232|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 232, False: 0]
  |  |  ------------------
  ------------------
  541|    232|    assert(
  542|    232|        numLiterals == clazz->getNumProperties() &&
  543|    232|        "numLiterals should match hidden class property count.");
  544|      0|    assert(
  545|    232|        clazz->getNumProperties() < 256 &&
  546|    232|        "cached hidden class should have property count less than 256");
  547|      0|    runtimeModule->tryCacheLiteralHiddenClass(runtime, keyBufferIndex, *clazz);
  548|    232|  }
  549|       |
  550|      0|  return {clazz};
  551|    877|}
Interpreter.cpp:_ZZN6hermes2vmL23getHiddenClassForBufferERNS0_7RuntimeEPNS0_9CodeBlockEjjENK3$_1clEv:
  522|    480|    SymbolID sym = [&] {
  523|    480|      if (key.isSymbol())
  ------------------
  |  Branch (523:11): [True: 480, False: 0]
  ------------------
  524|    480|        return ID(key.getSymbol().unsafeGetIndex());
  ------------------
  |  |   49|    480|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
  525|       |
  526|      0|      assert(key.isNumber() && "Key must be symbol or number");
  527|      0|      tmpHandleKey = key;
  528|       |      // Note that since this handle has been created, the associated symbol
  529|       |      // will be automatically kept alive until we flush the marker.
  530|       |      // valueToSymbolID cannot fail because the key is known to be uint32.
  531|      0|      Handle<SymbolID> symHandle = *valueToSymbolID(runtime, tmpHandleKey);
  532|      0|      return *symHandle;
  533|    480|    }();
_ZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateE:
  847|    155|    InterpreterState &state) {
  848|       |  // The interpreter is re-entrant and also saves/restores its IP via the
  849|       |  // runtime whenever a call out is made (see the CAPTURE_IP_* macros). As such,
  850|       |  // failure to preserve the IP across calls to interpreterFunction() disrupt
  851|       |  // interpreter calls further up the C++ callstack. The RAII utility class
  852|       |  // below makes sure we always do this correctly.
  853|       |  //
  854|       |  // TODO: The IPs stored in the C++ callstack via this holder will generally be
  855|       |  // the same as in the JS stack frames via the Saved IP field. We can probably
  856|       |  // get rid of one of these redundant stores. Doing this isn't completely
  857|       |  // trivial as there are currently cases where we re-enter the interpreter
  858|       |  // without calling Runtime::saveCallerIPInStackFrame(), and there are features
  859|       |  // (I think mostly the debugger + stack traces) which implicitly rely on
  860|       |  // this behavior. At least their tests break if this behavior is not
  861|       |  // preserved.
  862|    155|  struct IPSaver {
  863|    155|    IPSaver(Runtime &runtime)
  864|    155|        : ip_(runtime.getCurrentIP()), runtime_(runtime) {}
  865|       |
  866|    155|    ~IPSaver() {
  867|    155|      runtime_.setCurrentIP(ip_);
  868|    155|    }
  869|       |
  870|    155|   private:
  871|    155|    const Inst *ip_;
  872|    155|    Runtime &runtime_;
  873|    155|  };
  874|    155|  IPSaver ipSaver(runtime);
  875|       |
  876|       |#ifndef HERMES_ENABLE_DEBUGGER
  877|       |  static_assert(!SingleStep, "can't use single-step mode without the debugger");
  878|       |#endif
  879|       |  // Make sure that the cache can use an optimization by avoiding a branch to
  880|       |  // access the property storage.
  881|    155|  static_assert(
  882|    155|      HiddenClass::kDictionaryThreshold <=
  883|    155|          SegmentedArray::kValueToSegmentThreshold,
  884|    155|      "Cannot avoid branches in cache check if the dictionary "
  885|    155|      "crossover point is larger than the inline storage");
  886|       |
  887|    155|  CodeBlock *curCodeBlock = state.codeBlock;
  888|    155|  const Inst *ip = nullptr;
  889|       |  // Points to the first local register in the current frame.
  890|       |  // This eliminates the indirect load from Runtime and the -1 offset.
  891|    155|  PinnedHermesValue *frameRegs;
  892|       |  // Strictness of current function.
  893|    155|  bool strictMode;
  894|       |  // Default flags when accessing properties.
  895|    155|  PropOpFlags defaultPropOpFlags;
  896|       |
  897|       |// These CAPTURE_IP* macros should wrap around any major calls out of the
  898|       |// interpreter loop. They stash and retrieve the IP via the current Runtime
  899|       |// allowing the IP to be externally observed and even altered to change the flow
  900|       |// of execution. Explicitly saving AND restoring the IP from the Runtime in this
  901|       |// way means the C++ compiler will keep IP in a register within the rest of the
  902|       |// interpreter loop.
  903|       |//
  904|       |// When assertions are enabled we take the extra step of "invalidating" the IP
  905|       |// between captures so we can detect if it's erroneously accessed.
  906|       |//
  907|       |#ifdef NDEBUG
  908|       |
  909|       |#define CAPTURE_IP(expr)    \
  910|       |  runtime.setCurrentIP(ip); \
  911|       |  (void)(expr);             \
  912|       |  ip = runtime.getCurrentIP();
  913|       |
  914|       |// Used when we want to declare a new variable and assign the expression to it.
  915|       |#define CAPTURE_IP_ASSIGN(decl, expr) \
  916|       |  runtime.setCurrentIP(ip);           \
  917|       |  decl = (expr);                      \
  918|       |  ip = runtime.getCurrentIP();
  919|       |
  920|       |#else // !NDEBUG
  921|       |
  922|    155|#define CAPTURE_IP(expr)       \
  923|    155|  runtime.setCurrentIP(ip);    \
  924|    155|  (void)(expr);                \
  925|    155|  ip = runtime.getCurrentIP(); \
  926|    155|  runtime.invalidateCurrentIP();
  927|       |
  928|       |// Used when we want to declare a new variable and assign the expression to it.
  929|    155|#define CAPTURE_IP_ASSIGN(decl, expr) \
  930|    155|  runtime.setCurrentIP(ip);           \
  931|    155|  decl = (expr);                      \
  932|    155|  ip = runtime.getCurrentIP();        \
  933|    155|  runtime.invalidateCurrentIP();
  934|       |
  935|    155|#endif // NDEBUG
  936|       |
  937|       |/// \def DONT_CAPTURE_IP(expr)
  938|       |/// \param expr A call expression to a function external to the interpreter. The
  939|       |///   expression should not make any allocations and the IP should be set
  940|       |///   immediately following this macro.
  941|    155|#define DONT_CAPTURE_IP(expr)      \
  942|    155|  do {                             \
  943|    155|    NoAllocScope noAlloc(runtime); \
  944|    155|    (void)expr;                    \
  945|    155|  } while (false)
  946|       |
  947|       |// When performing a tail call, we need to set the runtime IP and leave it set.
  948|    155|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  949|       |
  950|    155|  LLVM_DEBUG(dbgs() << "interpretFunction() called\n");
  ------------------
  |  |  123|    155|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|    155|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 155]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|    155|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  951|       |
  952|    155|  ScopedNativeDepthTracker depthTracker{runtime};
  953|    155|  if (LLVM_UNLIKELY(depthTracker.overflowed())) {
  ------------------
  |  |  189|    155|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155]
  |  |  ------------------
  ------------------
  954|      0|    return runtime.raiseStackOverflow(Runtime::StackOverflowKind::NativeStack);
  955|      0|  }
  956|       |
  957|    155|  GCScope gcScope(runtime);
  958|       |  // Avoid allocating a handle dynamically by reusing this one.
  959|    155|  MutableHandle<> tmpHandle(runtime);
  960|    155|  CallResult<HermesValue> res{ExecutionStatus::EXCEPTION};
  961|    155|  CallResult<PseudoHandle<>> resPH{ExecutionStatus::EXCEPTION};
  962|    155|  CallResult<Handle<Arguments>> resArgs{ExecutionStatus::EXCEPTION};
  963|    155|  CallResult<bool> boolRes{ExecutionStatus::EXCEPTION};
  964|       |  // Start of the bytecode file, used to calculate IP offset in crash traces.
  965|    155|  const uint8_t *bytecodeFileStart;
  966|       |
  967|       |  // Mark the gcScope so we can clear all allocated handles.
  968|       |  // Remember how many handles the scope has so we can clear them in the loop.
  969|    155|  static constexpr unsigned KEEP_HANDLES = 1;
  970|    155|  assert(
  971|    155|      gcScope.getHandleCountDbg() == KEEP_HANDLES &&
  972|    155|      "scope has unexpected number of handles");
  973|       |
  974|      0|  INIT_OPCODE_PROFILER;
  975|       |
  976|  1.64k|tailCall:
  977|  1.64k|  PROFILER_ENTER_FUNCTION(curCodeBlock);
  978|       |
  979|  1.64k|#ifdef HERMES_ENABLE_DEBUGGER
  980|  1.64k|  runtime.getDebugger().willEnterCodeBlock(curCodeBlock);
  981|  1.64k|#endif
  982|       |
  983|  1.64k|  runtime.getCodeCoverageProfiler().markExecuted(curCodeBlock);
  984|       |
  985|  1.64k|  if (!SingleStep) {
  ------------------
  |  Branch (985:7): [Folded - Ignored]
  ------------------
  986|  1.64k|    auto newFrame = runtime.setCurrentFrameToTopOfStack();
  987|  1.64k|    runtime.saveCallerIPInStackFrame();
  988|  1.64k|#ifndef NDEBUG
  989|  1.64k|    runtime.invalidateCurrentIP();
  990|  1.64k|#endif
  991|       |
  992|       |    // Point frameRegs to the first register in the new frame. Note that at this
  993|       |    // moment technically it points above the top of the stack, but we are never
  994|       |    // going to access it.
  995|  1.64k|    frameRegs = &newFrame.getFirstLocalRef();
  996|       |
  997|  1.64k|#ifndef NDEBUG
  998|  1.64k|    LLVM_DEBUG(
  ------------------
  |  |  123|  1.64k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.64k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.64k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.64k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  999|  1.64k|        dbgs() << "function entry: stackLevel=" << runtime.getStackLevel()
 1000|  1.64k|               << ", argCount=" << runtime.getCurrentFrame().getArgCount()
 1001|  1.64k|               << ", frameSize=" << curCodeBlock->getFrameSize() << "\n");
 1002|       |
 1003|  1.64k|    LLVM_DEBUG(
  ------------------
  |  |  123|  1.64k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.64k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.64k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.64k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1004|  1.64k|        dbgs() << " callee "
 1005|  1.64k|               << DumpHermesValue(
 1006|  1.64k|                      runtime.getCurrentFrame().getCalleeClosureOrCBRef())
 1007|  1.64k|               << "\n");
 1008|  1.64k|    LLVM_DEBUG(
  ------------------
  |  |  123|  1.64k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.64k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.64k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.64k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1009|  1.64k|        dbgs() << "   this "
 1010|  1.64k|               << DumpHermesValue(runtime.getCurrentFrame().getThisArgRef())
 1011|  1.64k|               << "\n");
 1012|  2.82k|    for (uint32_t i = 0; i != runtime.getCurrentFrame()->getArgCount(); ++i) {
  ------------------
  |  Branch (1012:26): [True: 1.18k, False: 1.64k]
  ------------------
 1013|  1.18k|      LLVM_DEBUG(
  ------------------
  |  |  123|  1.18k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  1.18k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.18k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  1.18k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1014|  1.18k|          dbgs() << "   " << llvh::format_decimal(i, 4) << " "
 1015|  1.18k|                 << DumpHermesValue(runtime.getCurrentFrame().getArgRef(i))
 1016|  1.18k|                 << "\n");
 1017|  1.18k|    }
 1018|  1.64k|#endif
 1019|       |
 1020|       |    // Allocate the registers for the new frame.
 1021|  1.64k|    if (LLVM_UNLIKELY(!runtime.checkAndAllocStack(
  ------------------
  |  |  189|  1.64k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.64k]
  |  |  ------------------
  ------------------
 1022|  1.64k|            curCodeBlock->getFrameSize() +
 1023|  1.64k|                StackFrameLayout::CalleeExtraRegistersAtStart,
 1024|  1.64k|            HermesValue::encodeUndefinedValue())))
 1025|      0|      goto stackOverflow;
 1026|       |
 1027|  1.64k|    ip = (Inst const *)curCodeBlock->begin();
 1028|       |
 1029|       |    // Check for invalid invocation.
 1030|  1.64k|    if (LLVM_UNLIKELY(curCodeBlock->getHeaderFlags().isCallProhibited(
  ------------------
  |  |  189|  1.64k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.64k]
  |  |  ------------------
  ------------------
 1031|  1.64k|            newFrame.isConstructorCall()))) {
 1032|      0|      if (!newFrame.isConstructorCall()) {
  ------------------
  |  Branch (1032:11): [True: 0, False: 0]
  ------------------
 1033|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 1034|      0|            runtime.raiseTypeError("Class constructor invoked without new"));
 1035|      0|      } else {
 1036|      0|        CAPTURE_IP(runtime.raiseTypeError("Function is not a constructor"));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 1037|      0|      }
 1038|      0|      goto handleExceptionInParent;
 1039|      0|    }
 1040|  1.64k|  } else {
 1041|       |    // Point frameRegs to the first register in the frame.
 1042|      0|    frameRegs = &runtime.getCurrentFrame().getFirstLocalRef();
 1043|      0|    ip = (Inst const *)(curCodeBlock->begin() + state.offset);
 1044|      0|  }
 1045|       |
 1046|  1.64k|  assert((const uint8_t *)ip < curCodeBlock->end() && "CodeBlock is empty");
 1047|       |
 1048|  1.64k|  INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|  1.64k|  do {                                                           \
  |  |  117|  1.64k|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|  1.64k|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|  1.64k|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 1.48k, False: 155]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|  1.64k|    if (EnableCrashTrace) {                                      \
  |  |  ------------------
  |  |  |  Branch (119:9): [Folded - Ignored]
  |  |  ------------------
  |  |  120|      0|      auto *bc = (codeBlock)->getRuntimeModule()->getBytecode(); \
  |  |  121|      0|      bytecodeFileStart = bc->getRawBuffer().data();             \
  |  |  122|      0|      auto hash = bc->getSourceHash();                           \
  |  |  123|      0|      runtime.crashTrace_.recordModule(                          \
  |  |  124|      0|          bc->getSegmentID(),                                    \
  |  |  125|      0|          (codeBlock)->getRuntimeModule()->getSourceURL(),       \
  |  |  126|      0|          llvh::StringRef((const char *)&hash, sizeof(hash)));   \
  |  |  127|      0|    }                                                            \
  |  |  128|  1.64k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1049|       |
 1050|  1.64k|#define BEFORE_OP_CODE                                                       \
 1051|  1.64k|  {                                                                          \
 1052|  1.64k|    UPDATE_OPCODE_TIME_SPENT;                                                \
 1053|  1.64k|    HERMES_SLOW_ASSERT(                                                      \
 1054|  1.64k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
 1055|  1.64k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
 1056|  1.64k|    HERMES_SLOW_ASSERT(                                                      \
 1057|  1.64k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
 1058|  1.64k|        "unaccounted handles were created");                                 \
 1059|  1.64k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
 1060|  1.64k|    RECORD_OPCODE_START_TIME;                                                \
 1061|  1.64k|    INC_OPCODE_COUNT;                                                        \
 1062|  1.64k|    if (EnableCrashTrace) {                                                  \
 1063|  1.64k|      runtime.crashTrace_.recordInst(                                        \
 1064|  1.64k|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
 1065|  1.64k|    }                                                                        \
 1066|  1.64k|  }
 1067|       |
 1068|  1.64k|#ifdef HERMESVM_INDIRECT_THREADING
 1069|  1.64k|  static void *opcodeDispatch[] = {
 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
 1071|  1.64k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.64k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.64k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.64k|#endif
  |  |   12|  1.64k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.64k|#endif
  |  |   15|  1.64k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.64k|#endif
  |  |   18|  1.64k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.64k|#endif
  |  |   21|  1.64k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.64k|#endif
  |  |   24|  1.64k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.64k|#endif
  |  |   27|  1.64k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.64k|#endif
  |  |   30|  1.64k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.64k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.64k|#endif
  |  |   33|       |#ifndef DEFINE_OPCODE
  |  |   34|       |#define DEFINE_OPCODE(...)
  |  |   35|       |#endif
  |  |   36|  1.64k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.64k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.64k|#endif
  |  |   39|  1.64k|#ifndef DEFINE_RET_TARGET
  |  |   40|  1.64k|#define DEFINE_RET_TARGET(...)
  |  |   41|  1.64k|#endif
  |  |   42|  1.64k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.64k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.64k|#endif
  |  |   45|  1.64k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.64k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.64k|#endif
  |  |   48|  1.64k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.64k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.64k|#endif
  |  |   51|  1.64k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.64k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.64k|#endif
  |  |   54|  1.64k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.64k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.64k|#endif
  |  |   57|  1.64k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.64k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.64k|#endif
  |  |   60|  1.64k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.64k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.64k|#endif
  |  |   63|  1.64k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.64k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.64k|#endif
  |  |   66|       |
  |  |   67|  1.64k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.64k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.64k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.64k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.64k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.64k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.64k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.64k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.64k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.64k|DEFINE_OPCODE_0(Unreachable)
  |  |  ------------------
  |  |  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.64k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   89|  1.64k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.64k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.64k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.64k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  110|  1.64k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.64k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.64k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.64k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.64k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.64k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.64k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.64k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.64k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.64k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.64k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.64k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.64k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.64k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.64k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.64k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.64k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.64k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.64k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.64k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.64k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.64k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.64k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.64k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.64k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.64k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.64k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.64k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.64k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.64k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.64k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.64k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.64k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.64k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.64k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.64k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.64k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  227|  1.64k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  228|  1.64k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  229|  1.64k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.64k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  236|  1.64k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.64k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.64k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.64k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.64k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  251|  1.64k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.64k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  257|  1.64k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  258|  1.64k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  259|  1.64k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.64k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.64k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.64k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  267|  1.64k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  268|  1.64k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.64k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.64k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  274|  1.64k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  275|  1.64k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.64k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.64k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  282|  1.64k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  283|  1.64k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.64k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.64k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  295|  1.64k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  296|  1.64k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  297|  1.64k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.64k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.64k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.64k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  308|  1.64k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  309|  1.64k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.64k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.64k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.64k|    PutNewOwnByIdShort,
  |  |  315|  1.64k|    PutNewOwnById,
  |  |  316|  1.64k|    PutNewOwnByIdLong,
  |  |  317|  1.64k|    PutNewOwnNEById,
  |  |  318|  1.64k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.64k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  325|  1.64k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.64k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.64k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  339|  1.64k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  340|  1.64k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.64k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.64k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.64k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.64k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.64k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.64k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.64k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.64k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  394|  1.64k|DEFINE_RET_TARGET(Call)
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.64k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  403|  1.64k|DEFINE_RET_TARGET(Construct)
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.64k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  410|  1.64k|DEFINE_RET_TARGET(Call1)
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.64k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  420|  1.64k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.64k|DEFINE_RET_TARGET(CallDirect)
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.64k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  429|  1.64k|DEFINE_RET_TARGET(Call2)
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.64k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  438|  1.64k|DEFINE_RET_TARGET(Call3)
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.64k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   31|  1.64k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  448|  1.64k|DEFINE_RET_TARGET(Call4)
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.64k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  452|  1.64k|DEFINE_RET_TARGET(CallLong)
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.64k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  456|  1.64k|DEFINE_RET_TARGET(ConstructLong)
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.64k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  460|  1.64k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.64k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.64k|    Call,
  |  |  465|  1.64k|    Construct,
  |  |  466|  1.64k|    Call1,
  |  |  467|  1.64k|    CallDirect,
  |  |  468|  1.64k|    Call2,
  |  |  469|  1.64k|    Call3,
  |  |  470|  1.64k|    Call4,
  |  |  471|  1.64k|    CallLong,
  |  |  472|  1.64k|    ConstructLong,
  |  |  473|  1.64k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.64k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.64k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.64k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.64k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.64k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.64k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.64k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.64k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.64k|DEFINE_OPCODE_0(Debugger)
  |  |  ------------------
  |  |  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.64k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  ------------------
  |  |  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.64k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.64k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  542|  1.64k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  543|  1.64k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.64k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.64k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  551|  1.64k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  552|  1.64k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.64k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.64k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  560|  1.64k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  561|  1.64k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.64k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.64k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.64k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.64k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.64k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.64k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  587|  1.64k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.64k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.64k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  594|  1.64k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  595|  1.64k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.64k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.64k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  600|  1.64k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  601|  1.64k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.64k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.64k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  606|  1.64k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  607|  1.64k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  608|  1.64k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  609|  1.64k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  610|  1.64k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.64k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.64k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.64k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.64k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.64k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.64k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.64k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.64k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.64k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  ------------------
  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.64k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   25|  1.64k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  672|  1.64k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.64k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.64k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  ------------------
  |  |  |  |   28|  1.64k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.64k|DEFINE_OPCODE_0(StartGenerator)
  |  |  ------------------
  |  |  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.64k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.64k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  ------------------
  |  |  |  |   13|  1.64k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.64k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  712|  1.64k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  713|  1.64k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.64k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.64k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.64k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  ------------------
  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.64k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  ------------------
  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.64k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.64k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.64k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.64k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.64k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.64k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.64k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.64k|DEFINE_JUMP_1(Jmp)
  |  |  ------------------
  |  |  |  |  751|  1.64k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  752|  1.64k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  753|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.64k|DEFINE_JUMP_2(JmpTrue)
  |  |  ------------------
  |  |  |  |  756|  1.64k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  757|  1.64k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  758|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  769|  1.64k|DEFINE_JUMP_2(JmpFalse)
  |  |  ------------------
  |  |  |  |  756|  1.64k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  757|  1.64k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  758|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.64k|DEFINE_JUMP_2(JmpUndefined)
  |  |  ------------------
  |  |  |  |  756|  1.64k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  757|  1.64k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   19|  1.64k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  758|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.64k|DEFINE_JUMP_1(SaveGenerator)
  |  |  ------------------
  |  |  |  |  751|  1.64k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  752|  1.64k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.64k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  753|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.64k|DEFINE_JUMP_3(JLess)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  785|  1.64k|DEFINE_JUMP_3(JNotLess)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  786|  1.64k|DEFINE_JUMP_3(JLessN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  787|  1.64k|DEFINE_JUMP_3(JNotLessN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  788|  1.64k|DEFINE_JUMP_3(JLessEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  789|  1.64k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  790|  1.64k|DEFINE_JUMP_3(JLessEqualN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  791|  1.64k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  792|  1.64k|DEFINE_JUMP_3(JGreater)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  793|  1.64k|DEFINE_JUMP_3(JNotGreater)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  794|  1.64k|DEFINE_JUMP_3(JGreaterN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  795|  1.64k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  796|  1.64k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  797|  1.64k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  798|  1.64k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  799|  1.64k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  800|  1.64k|DEFINE_JUMP_3(JEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  801|  1.64k|DEFINE_JUMP_3(JNotEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  802|  1.64k|DEFINE_JUMP_3(JStrictEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  803|  1.64k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  ------------------
  |  |  |  |  761|  1.64k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  762|  1.64k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  |  |  ------------------
  |  |  |  |  |  |   22|  1.64k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1070|  1.64k|#define DEFINE_OPCODE(name) &&case_##name,
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  763|  1.64k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  ------------------
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.64k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.64k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.64k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.64k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.64k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.64k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.64k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.64k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.64k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.64k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.64k|#undef DEFINE_JUMP_1
  |  |  854|  1.64k|#undef DEFINE_JUMP_2
  |  |  855|  1.64k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.64k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.64k|#undef DEFINE_OPCODE_0
  |  |  860|  1.64k|#undef DEFINE_OPCODE_1
  |  |  861|  1.64k|#undef DEFINE_OPCODE_2
  |  |  862|  1.64k|#undef DEFINE_OPCODE_3
  |  |  863|  1.64k|#undef DEFINE_OPCODE_4
  |  |  864|  1.64k|#undef DEFINE_OPCODE_5
  |  |  865|  1.64k|#undef DEFINE_OPCODE_6
  |  |  866|  1.64k|#undef DEFINE_OPCODE
  |  |  867|  1.64k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.64k|#undef DEFINE_RET_TARGET
  |  |  869|  1.64k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.64k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.64k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.64k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.64k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.64k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.64k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.64k|#undef OPERAND_STRING_ID
  ------------------
 1072|  1.64k|      &&case__last};
 1073|       |
 1074|  1.64k|#define CASE(name) case_##name:
 1075|       |// For indirect threading, there is no way to specify a default, leave it as
 1076|       |// an empty label.
 1077|  1.64k|#define DEFAULT_CASE
 1078|  1.64k|#define DISPATCH                                \
 1079|  1.64k|  BEFORE_OP_CODE;                               \
 1080|  1.64k|  if (SingleStep) {                             \
 1081|  1.64k|    state.codeBlock = curCodeBlock;             \
 1082|  1.64k|    state.offset = CUROFFSET;                   \
 1083|  1.64k|    return HermesValue::encodeUndefinedValue(); \
 1084|  1.64k|  }                                             \
 1085|  1.64k|  goto *opcodeDispatch[(unsigned)ip->opCode]
 1086|       |
 1087|       |#else // HERMESVM_INDIRECT_THREADING
 1088|       |
 1089|       |#define CASE(name) case OpCode::name:
 1090|       |#define DEFAULT_CASE default:
 1091|       |#define DISPATCH                                \
 1092|       |  if (SingleStep) {                             \
 1093|       |    state.codeBlock = curCodeBlock;             \
 1094|       |    state.offset = CUROFFSET;                   \
 1095|       |    return HermesValue::encodeUndefinedValue(); \
 1096|       |  }                                             \
 1097|       |  continue
 1098|       |
 1099|       |#endif // HERMESVM_INDIRECT_THREADING
 1100|       |
 1101|  1.64k|#define RUN_DEBUGGER_ASYNC_BREAK(flags)                                      \
 1102|  1.64k|  do {                                                                       \
 1103|  1.64k|    CAPTURE_IP_ASSIGN(                                                       \
 1104|  1.64k|        auto dRes,                                                           \
 1105|  1.64k|        runDebuggerUpdatingState(                                            \
 1106|  1.64k|            (uint8_t)(flags) &                                               \
 1107|  1.64k|                    (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit \
 1108|  1.64k|                ? Debugger::RunReason::AsyncBreakExplicit                    \
 1109|  1.64k|                : Debugger::RunReason::AsyncBreakImplicit,                   \
 1110|  1.64k|            runtime,                                                         \
 1111|  1.64k|            curCodeBlock,                                                    \
 1112|  1.64k|            ip,                                                              \
 1113|  1.64k|            frameRegs));                                                     \
 1114|  1.64k|    if (dRes == ExecutionStatus::EXCEPTION)                                  \
 1115|  1.64k|      goto exception;                                                        \
 1116|  1.64k|  } while (0)
 1117|       |
 1118|  1.64k|  for (;;) {
 1119|  1.64k|    BEFORE_OP_CODE;
  ------------------
  |  | 1051|  1.64k|  {                                                                          \
  |  | 1052|  1.64k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  | 1053|  1.64k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  ------------------
  |  |  |  |   17|  1.64k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1054|  1.64k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  | 1055|  1.64k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  ------------------
  |  |  |  |   17|  1.64k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1056|  1.64k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  ------------------
  |  |  |  |   17|  1.64k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1057|  1.64k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  | 1058|  1.64k|        "unaccounted handles were created");                                 \
  |  | 1059|  1.64k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  ------------------
  |  |  |  |   17|  1.64k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  ------------------
  |  | 1060|  1.64k|    RECORD_OPCODE_START_TIME;                                                \
  |  | 1061|  1.64k|    INC_OPCODE_COUNT;                                                        \
  |  | 1062|  1.64k|    if (EnableCrashTrace) {                                                  \
  |  |  ------------------
  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  ------------------
  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  | 1065|      0|    }                                                                        \
  |  | 1066|  1.64k|  }
  ------------------
 1120|       |
 1121|  1.64k|#ifdef HERMESVM_INDIRECT_THREADING
 1122|  1.64k|    goto *opcodeDispatch[(unsigned)ip->opCode];
 1123|       |#else
 1124|       |    switch (ip->opCode)
 1125|       |#endif
 1126|  1.64k|    {
 1127|  1.64k|      const Inst *nextIP;
 1128|  1.64k|      uint32_t idVal;
 1129|  1.64k|      bool tryProp;
 1130|  1.64k|      uint32_t callArgCount;
 1131|       |      // This is HermesValue::getRaw(), since HermesValue cannot be assigned
 1132|       |      // to. It is meant to be used only for very short durations, in the
 1133|       |      // dispatch of call instructions, when there is definitely no possibility
 1134|       |      // of a GC.
 1135|  1.64k|      HermesValue::RawType callNewTarget;
 1136|       |
 1137|       |/// Handle an opcode \p name with an out-of-line implementation in a function
 1138|       |///   ExecutionStatus caseName(
 1139|       |///       Runtime &,
 1140|       |///       PinnedHermesValue *frameRegs,
 1141|       |///       Inst *ip)
 1142|  1.64k|#define CASE_OUTOFLINE(name)                                         \
 1143|  1.64k|  CASE(name) {                                                       \
 1144|  1.64k|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
 1145|  1.64k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
 1146|  1.64k|      goto exception;                                                \
 1147|  1.64k|    }                                                                \
 1148|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
 1149|  1.64k|    ip = NEXTINST(name);                                             \
 1150|  1.64k|    DISPATCH;                                                        \
 1151|  1.64k|  }
 1152|       |
 1153|       |/// Implement a binary arithmetic instruction with a fast path where both
 1154|       |/// operands are numbers.
 1155|       |/// \param name the name of the instruction. The fast path case will have a
 1156|       |///     "n" appended to the name.
 1157|  1.64k|#define BINOP(name)                                                      \
 1158|  1.64k|  CASE(name) {                                                           \
 1159|  1.64k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1160|       |      /* Fast-path. */                                                   \
 1161|  1.64k|      CASE(name##N) {                                                    \
 1162|  1.64k|        O1REG(name) = HermesValue::encodeDoubleValue(                    \
 1163|  1.64k|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
 1164|  1.64k|        ip = NEXTINST(name);                                             \
 1165|  1.64k|        DISPATCH;                                                        \
 1166|  1.64k|      }                                                                  \
 1167|  1.64k|    }                                                                    \
 1168|  1.64k|    CAPTURE_IP(                                                          \
 1169|  1.64k|        res = doOperSlowPath<do##name>(                                  \
 1170|  1.64k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1171|  1.64k|    if (res == ExecutionStatus::EXCEPTION)                               \
 1172|  1.64k|      goto exception;                                                    \
 1173|  1.64k|    O1REG(name) = *res;                                                  \
 1174|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1175|  1.64k|    ip = NEXTINST(name);                                                 \
 1176|  1.64k|    DISPATCH;                                                            \
 1177|  1.64k|  }
 1178|       |
 1179|  1.64k|#define INCDECOP(name)                                                        \
 1180|  1.64k|  CASE(name) {                                                                \
 1181|  1.64k|    if (LLVM_LIKELY(O2REG(name).isNumber())) {                                \
 1182|  1.64k|      O1REG(name) =                                                           \
 1183|  1.64k|          HermesValue::encodeDoubleValue(do##name(O2REG(name).getNumber()));  \
 1184|  1.64k|      ip = NEXTINST(name);                                                    \
 1185|  1.64k|      DISPATCH;                                                               \
 1186|  1.64k|    }                                                                         \
 1187|  1.64k|    CAPTURE_IP(                                                               \
 1188|  1.64k|        res =                                                                 \
 1189|  1.64k|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
 1190|  1.64k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                   \
 1191|  1.64k|      goto exception;                                                         \
 1192|  1.64k|    }                                                                         \
 1193|  1.64k|    O1REG(name) = *res;                                                       \
 1194|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
 1195|  1.64k|    ip = NEXTINST(name);                                                      \
 1196|  1.64k|    DISPATCH;                                                                 \
 1197|  1.64k|  }
 1198|       |
 1199|       |/// Implement a shift instruction with a fast path where both
 1200|       |/// operands are numbers.
 1201|       |/// \param name the name of the instruction.
 1202|  1.64k|#define SHIFTOP(name)                                                          \
 1203|  1.64k|  CASE(name) {                                                                 \
 1204|  1.64k|    if (LLVM_LIKELY(                                                           \
 1205|  1.64k|            O2REG(name).isNumber() &&                                          \
 1206|  1.64k|            O3REG(name).isNumber())) { /* Fast-path. */                        \
 1207|  1.64k|      auto lnum = hermes::truncateToInt32(O2REG(name).getNumber());            \
 1208|  1.64k|      uint32_t rnum = hermes::truncateToInt32(O3REG(name).getNumber()) & 0x1f; \
 1209|  1.64k|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(lnum, rnum));      \
 1210|  1.64k|      ip = NEXTINST(name);                                                     \
 1211|  1.64k|      DISPATCH;                                                                \
 1212|  1.64k|    }                                                                          \
 1213|  1.64k|    CAPTURE_IP(                                                                \
 1214|  1.64k|        res = doShiftOperSlowPath<do##name>(                                   \
 1215|  1.64k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
 1216|  1.64k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                    \
 1217|  1.64k|      goto exception;                                                          \
 1218|  1.64k|    }                                                                          \
 1219|  1.64k|    O1REG(name) = *res;                                                        \
 1220|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
 1221|  1.64k|    ip = NEXTINST(name);                                                       \
 1222|  1.64k|    DISPATCH;                                                                  \
 1223|  1.64k|  }
 1224|       |
 1225|       |/// Implement a binary bitwise instruction with a fast path where both
 1226|       |/// operands are numbers.
 1227|       |/// \param name the name of the instruction.
 1228|  1.64k|#define BITWISEBINOP(name)                                               \
 1229|  1.64k|  CASE(name) {                                                           \
 1230|  1.64k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1231|       |      /* Fast-path. */                                                   \
 1232|  1.64k|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(             \
 1233|  1.64k|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
 1234|  1.64k|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
 1235|  1.64k|      ip = NEXTINST(name);                                               \
 1236|  1.64k|      DISPATCH;                                                          \
 1237|  1.64k|    }                                                                    \
 1238|  1.64k|    CAPTURE_IP(                                                          \
 1239|  1.64k|        res = doBitOperSlowPath<do##name>(                               \
 1240|  1.64k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1241|  1.64k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
 1242|  1.64k|      goto exception;                                                    \
 1243|  1.64k|    }                                                                    \
 1244|  1.64k|    O1REG(name) = *res;                                                  \
 1245|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1246|  1.64k|    ip = NEXTINST(name);                                                 \
 1247|  1.64k|    DISPATCH;                                                            \
 1248|  1.64k|  }
 1249|       |
 1250|       |/// Implement a comparison instruction.
 1251|       |/// \param name the name of the instruction.
 1252|       |/// \param oper the C++ operator to use to actually perform the fast arithmetic
 1253|       |///     comparison.
 1254|       |/// \param operFuncName  function to call for the slow-path comparison.
 1255|  1.64k|#define CONDOP(name, oper, operFuncName)                                 \
 1256|  1.64k|  CASE(name) {                                                           \
 1257|  1.64k|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
 1258|       |      /* Fast-path. */                                                   \
 1259|  1.64k|      O1REG(name) = HermesValue::encodeBoolValue(                        \
 1260|  1.64k|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
 1261|  1.64k|      ip = NEXTINST(name);                                               \
 1262|  1.64k|      DISPATCH;                                                          \
 1263|  1.64k|    }                                                                    \
 1264|  1.64k|    CAPTURE_IP(                                                          \
 1265|  1.64k|        boolRes = operFuncName(                                          \
 1266|  1.64k|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
 1267|  1.64k|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
 1268|  1.64k|      goto exception;                                                    \
 1269|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
 1270|  1.64k|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
 1271|  1.64k|    ip = NEXTINST(name);                                                 \
 1272|  1.64k|    DISPATCH;                                                            \
 1273|  1.64k|  }
 1274|       |
 1275|       |/// Implement a comparison conditional jump with a fast path where both
 1276|       |/// operands are numbers.
 1277|       |/// \param name the name of the instruction. The fast path case will have a
 1278|       |///     "N" appended to the name.
 1279|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1280|       |/// \param oper the C++ operator to use to actually perform the fast arithmetic
 1281|       |///     comparison.
 1282|       |/// \param operFuncName  function to call for the slow-path comparison.
 1283|       |/// \param trueDest  ip value if the conditional evaluates to true
 1284|       |/// \param falseDest  ip value if the conditional evaluates to false
 1285|  1.64k|#define JCOND_IMPL(name, suffix, oper, operFuncName, trueDest, falseDest) \
 1286|  1.64k|  CASE(name##suffix) {                                                    \
 1287|  1.64k|    if (LLVM_LIKELY(                                                      \
 1288|  1.64k|            O2REG(name##suffix).isNumber() &&                             \
 1289|  1.64k|            O3REG(name##suffix).isNumber())) {                            \
 1290|       |      /* Fast-path. */                                                    \
 1291|  1.64k|      CASE(name##N##suffix) {                                             \
 1292|  1.64k|        if (O2REG(name##N##suffix)                                        \
 1293|  1.64k|                .getNumber() oper O3REG(name##N##suffix)                  \
 1294|  1.64k|                .getNumber()) {                                           \
 1295|  1.64k|          ip = trueDest;                                                  \
 1296|  1.64k|          DISPATCH;                                                       \
 1297|  1.64k|        }                                                                 \
 1298|  1.64k|        ip = falseDest;                                                   \
 1299|  1.64k|        DISPATCH;                                                         \
 1300|  1.64k|      }                                                                   \
 1301|  1.64k|    }                                                                     \
 1302|  1.64k|    CAPTURE_IP(                                                           \
 1303|  1.64k|        boolRes = operFuncName(                                           \
 1304|  1.64k|            runtime,                                                      \
 1305|  1.64k|            Handle<>(&O2REG(name##suffix)),                               \
 1306|  1.64k|            Handle<>(&O3REG(name##suffix))));                             \
 1307|  1.64k|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
 1308|  1.64k|      goto exception;                                                     \
 1309|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
 1310|  1.64k|    if (boolRes.getValue()) {                                             \
 1311|  1.64k|      ip = trueDest;                                                      \
 1312|  1.64k|      DISPATCH;                                                           \
 1313|  1.64k|    }                                                                     \
 1314|  1.64k|    ip = falseDest;                                                       \
 1315|  1.64k|    DISPATCH;                                                             \
 1316|  1.64k|  }
 1317|       |
 1318|       |/// Implement a strict equality conditional jump
 1319|       |/// \param name the name of the instruction.
 1320|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1321|       |/// \param trueDest  ip value if the conditional evaluates to true
 1322|       |/// \param falseDest  ip value if the conditional evaluates to false
 1323|  1.64k|#define JCOND_STRICT_EQ_IMPL(name, suffix, trueDest, falseDest)         \
 1324|  1.64k|  CASE(name##suffix) {                                                  \
 1325|  1.64k|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
 1326|  1.64k|      ip = trueDest;                                                    \
 1327|  1.64k|      DISPATCH;                                                         \
 1328|  1.64k|    }                                                                   \
 1329|  1.64k|    ip = falseDest;                                                     \
 1330|  1.64k|    DISPATCH;                                                           \
 1331|  1.64k|  }
 1332|       |
 1333|       |/// Implement an equality conditional jump
 1334|       |/// \param name the name of the instruction.
 1335|       |/// \param suffix  Optional suffix to be added to the end (e.g. Long)
 1336|       |/// \param trueDest  ip value if the conditional evaluates to true
 1337|       |/// \param falseDest  ip value if the conditional evaluates to false
 1338|  1.64k|#define JCOND_EQ_IMPL(name, suffix, trueDest, falseDest) \
 1339|  1.64k|  CASE(name##suffix) {                                   \
 1340|  1.64k|    CAPTURE_IP_ASSIGN(                                   \
 1341|  1.64k|        auto eqRes,                                      \
 1342|  1.64k|        abstractEqualityTest_RJS(                        \
 1343|  1.64k|            runtime,                                     \
 1344|  1.64k|            Handle<>(&O2REG(name##suffix)),              \
 1345|  1.64k|            Handle<>(&O3REG(name##suffix))));            \
 1346|  1.64k|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
 1347|  1.64k|      goto exception;                                    \
 1348|  1.64k|    }                                                    \
 1349|  1.64k|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
 1350|  1.64k|    if (*eqRes) {                                        \
 1351|  1.64k|      ip = trueDest;                                     \
 1352|  1.64k|      DISPATCH;                                          \
 1353|  1.64k|    }                                                    \
 1354|  1.64k|    ip = falseDest;                                      \
 1355|  1.64k|    DISPATCH;                                            \
 1356|  1.64k|  }
 1357|       |
 1358|       |/// Implement the long and short forms of a conditional jump, and its negation.
 1359|  1.64k|#define JCOND(name, oper, operFuncName) \
 1360|  1.64k|  JCOND_IMPL(                           \
 1361|  1.64k|      J##name,                          \
 1362|  1.64k|      ,                                 \
 1363|  1.64k|      oper,                             \
 1364|  1.64k|      operFuncName,                     \
 1365|  1.64k|      IPADD(ip->iJ##name.op1),          \
 1366|  1.64k|      NEXTINST(J##name));               \
 1367|  1.64k|  JCOND_IMPL(                           \
 1368|  1.64k|      J##name,                          \
 1369|  1.64k|      Long,                             \
 1370|  1.64k|      oper,                             \
 1371|  1.64k|      operFuncName,                     \
 1372|  1.64k|      IPADD(ip->iJ##name##Long.op1),    \
 1373|  1.64k|      NEXTINST(J##name##Long));         \
 1374|  1.64k|  JCOND_IMPL(                           \
 1375|  1.64k|      JNot##name,                       \
 1376|  1.64k|      ,                                 \
 1377|  1.64k|      oper,                             \
 1378|  1.64k|      operFuncName,                     \
 1379|  1.64k|      NEXTINST(JNot##name),             \
 1380|  1.64k|      IPADD(ip->iJNot##name.op1));      \
 1381|  1.64k|  JCOND_IMPL(                           \
 1382|  1.64k|      JNot##name,                       \
 1383|  1.64k|      Long,                             \
 1384|  1.64k|      oper,                             \
 1385|  1.64k|      operFuncName,                     \
 1386|  1.64k|      NEXTINST(JNot##name##Long),       \
 1387|  1.64k|      IPADD(ip->iJNot##name##Long.op1));
 1388|       |
 1389|       |/// Load a constant.
 1390|       |/// \param value is the value to store in the output register.
 1391|  1.64k|#define LOAD_CONST(name, value) \
 1392|  1.64k|  CASE(name) {                  \
 1393|  1.64k|    O1REG(name) = value;        \
 1394|  1.64k|    ip = NEXTINST(name);        \
 1395|  1.64k|    DISPATCH;                   \
 1396|  1.64k|  }
 1397|       |
 1398|  1.64k|#define LOAD_CONST_CAPTURE_IP(name, value) \
 1399|  1.64k|  CASE(name) {                             \
 1400|  1.64k|    CAPTURE_IP(O1REG(name) = value);       \
 1401|  1.64k|    ip = NEXTINST(name);                   \
 1402|  1.64k|    DISPATCH;                              \
 1403|  1.64k|  }
 1404|       |
 1405|  2.22k|      CASE(Mov) {
  ------------------
  |  | 1074|  2.22k|#define CASE(name) case_##name:
  ------------------
 1406|  2.22k|        O1REG(Mov) = O2REG(Mov);
  ------------------
  |  |   31|  2.22k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  4.45k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(Mov) = O2REG(Mov);
  ------------------
  |  |   32|  2.22k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  2.22k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1407|  2.22k|        ip = NEXTINST(Mov);
  ------------------
  |  |   59|  2.22k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1408|  2.22k|        DISPATCH;
  ------------------
  |  | 1079|  2.22k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  2.22k|  {                                                                          \
  |  |  |  | 1052|  2.22k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  2.22k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.22k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  2.22k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  2.22k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.22k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  2.22k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.22k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  2.22k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  2.22k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  2.22k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  2.22k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  2.22k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  2.22k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  2.22k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  2.22k|  }
  |  |  ------------------
  |  | 1080|  2.22k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  2.22k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1409|  2.22k|      }
 1410|       |
 1411|   137k|      CASE(MovLong) {
  ------------------
  |  | 1074|   137k|#define CASE(name) case_##name:
  ------------------
 1412|   137k|        O1REG(MovLong) = O2REG(MovLong);
  ------------------
  |  |   31|   137k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|   274k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(MovLong) = O2REG(MovLong);
  ------------------
  |  |   32|   137k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|   137k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1413|   137k|        ip = NEXTINST(MovLong);
  ------------------
  |  |   59|   137k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1414|   137k|        DISPATCH;
  ------------------
  |  | 1079|   137k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|   137k|  {                                                                          \
  |  |  |  | 1052|   137k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|   137k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   137k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|   137k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|   137k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   137k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|   137k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   137k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|   137k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|   137k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|   137k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   137k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|   137k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|   137k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|   137k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|   137k|  }
  |  |  ------------------
  |  | 1080|   137k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|   137k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1415|   137k|      }
 1416|       |
 1417|  1.78k|      CASE(LoadParam) {
  ------------------
  |  | 1074|  1.78k|#define CASE(name) case_##name:
  ------------------
 1418|  1.78k|        if (LLVM_LIKELY(ip->iLoadParam.op2 <= FRAME.getArgCount())) {
  ------------------
  |  |  188|  1.78k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.78k, False: 0]
  |  |  ------------------
  ------------------
 1419|       |          // index 0 must load 'this'. Index 1 the first argument, etc.
 1420|  1.78k|          O1REG(LoadParam) = FRAME.getArgRef((int32_t)ip->iLoadParam.op2 - 1);
  ------------------
  |  |   31|  1.78k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  3.56k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(LoadParam) = FRAME.getArgRef((int32_t)ip->iLoadParam.op2 - 1);
  ------------------
  |  |   39|  1.78k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1421|  1.78k|          ip = NEXTINST(LoadParam);
  ------------------
  |  |   59|  1.78k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1422|  1.78k|          DISPATCH;
  ------------------
  |  | 1079|  1.78k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.78k|  {                                                                          \
  |  |  |  | 1052|  1.78k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.78k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.78k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.78k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.78k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.78k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.78k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.78k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.78k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.78k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.78k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.78k|  }
  |  |  ------------------
  |  | 1080|  1.78k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.78k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1423|  1.78k|        }
 1424|  1.78k|        O1REG(LoadParam) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|  1.78k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  3.56k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1425|  1.78k|        ip = NEXTINST(LoadParam);
  ------------------
  |  |   59|  1.78k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1426|  1.78k|        DISPATCH;
  ------------------
  |  | 1079|  1.78k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.78k|  {                                                                          \
  |  |  |  | 1052|  1.78k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.78k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.78k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.78k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.78k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.78k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.78k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.78k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.78k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.78k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.78k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.78k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.78k|  }
  |  |  ------------------
  |  | 1080|  1.78k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.78k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1427|  1.78k|      }
 1428|       |
 1429|      0|      CASE(LoadParamLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1430|      0|        if (LLVM_LIKELY(ip->iLoadParamLong.op2 <= FRAME.getArgCount())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1431|       |          // index 0 must load 'this'. Index 1 the first argument, etc.
 1432|      0|          O1REG(LoadParamLong) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1433|      0|              FRAME.getArgRef((int32_t)ip->iLoadParamLong.op2 - 1);
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1434|      0|          ip = NEXTINST(LoadParamLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1435|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1436|      0|        }
 1437|      0|        O1REG(LoadParamLong) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1438|      0|        ip = NEXTINST(LoadParamLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1439|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1440|      0|      }
 1441|       |
 1442|      0|      CASE(CoerceThisNS) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1443|      0|        if (LLVM_LIKELY(O2REG(CoerceThisNS).isObject())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1444|      0|          O1REG(CoerceThisNS) = O2REG(CoerceThisNS);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(CoerceThisNS) = O2REG(CoerceThisNS);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1445|      0|        } else if (
 1446|      0|            O2REG(CoerceThisNS).isNull() || O2REG(CoerceThisNS).isUndefined()) {
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                          O2REG(CoerceThisNS).isNull() || O2REG(CoerceThisNS).isUndefined()) {
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (1446:13): [True: 0, False: 0]
  |  Branch (1446:45): [True: 0, False: 0]
  ------------------
 1447|      0|          O1REG(CoerceThisNS) = runtime.global_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1448|      0|        } else {
 1449|      0|          tmpHandle = O2REG(CoerceThisNS);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1450|      0|          nextIP = NEXTINST(CoerceThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1451|      0|          goto coerceThisSlowPath;
 1452|      0|        }
 1453|      0|        ip = NEXTINST(CoerceThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1454|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1455|      0|      }
 1456|      5|      CASE(LoadThisNS) {
  ------------------
  |  | 1074|      5|#define CASE(name) case_##name:
  ------------------
 1457|      5|        if (LLVM_LIKELY(FRAME.getThisArgRef().isObject())) {
  ------------------
  |  |  188|      5|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5, False: 0]
  |  |  ------------------
  ------------------
 1458|      5|          O1REG(LoadThisNS) = FRAME.getThisArgRef();
  ------------------
  |  |   31|      5|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     10|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(LoadThisNS) = FRAME.getThisArgRef();
  ------------------
  |  |   39|      5|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1459|      5|        } else if (
 1460|      0|            FRAME.getThisArgRef().isNull() ||
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (1460:13): [True: 0, False: 0]
  |  Branch (1460:13): [True: 0, False: 0]
  ------------------
 1461|      0|            FRAME.getThisArgRef().isUndefined()) {
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (1461:13): [True: 0, False: 0]
  ------------------
 1462|      0|          O1REG(LoadThisNS) = runtime.global_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1463|      0|        } else {
 1464|      0|          tmpHandle = FRAME.getThisArgRef();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1465|      0|          nextIP = NEXTINST(LoadThisNS);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1466|      0|          goto coerceThisSlowPath;
 1467|      0|        }
 1468|      5|        ip = NEXTINST(LoadThisNS);
  ------------------
  |  |   59|      5|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1469|      5|        DISPATCH;
  ------------------
  |  | 1079|      5|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      5|  {                                                                          \
  |  |  |  | 1052|      5|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      5|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      5|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      5|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      5|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      5|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      5|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      5|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      5|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      5|  }
  |  |  ------------------
  |  | 1080|      5|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      5|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1470|      5|      }
 1471|      0|    coerceThisSlowPath : {
 1472|      0|      CAPTURE_IP(res = toObject(runtime, tmpHandle));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 1473|      0|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1474|      0|        goto exception;
 1475|      0|      }
 1476|      0|      O1REG(CoerceThisNS) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1477|      0|      tmpHandle.clear();
 1478|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1479|      0|      ip = nextIP;
 1480|      0|      DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1481|      0|    }
 1482|       |
 1483|      0|      CASE(ConstructLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1484|      0|        callArgCount = (uint32_t)ip->iConstructLong.op3;
 1485|      0|        nextIP = NEXTINST(ConstructLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1486|      0|        callNewTarget = O2REG(ConstructLong).getRaw();
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1487|      0|        goto doCall;
 1488|      0|      }
 1489|      5|      CASE(CallLong) {
  ------------------
  |  | 1074|      5|#define CASE(name) case_##name:
  ------------------
 1490|      5|        callArgCount = (uint32_t)ip->iCallLong.op3;
 1491|      5|        nextIP = NEXTINST(CallLong);
  ------------------
  |  |   59|      5|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1492|      5|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1493|      5|        goto doCall;
 1494|      0|      }
 1495|       |
 1496|       |      // Note in Call1 through Call4, the first argument is 'this' which has
 1497|       |      // argument index -1.
 1498|       |      // Also note that we are writing to callNewTarget last, to avoid the
 1499|       |      // possibility of it being aliased by the arg writes.
 1500|    594|      CASE(Call1) {
  ------------------
  |  | 1074|    594|#define CASE(name) case_##name:
  ------------------
 1501|    594|        callArgCount = 1;
 1502|    594|        nextIP = NEXTINST(Call1);
  ------------------
  |  |   59|    594|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1503|    594|        StackFramePtr fr{runtime.stackPointer_};
 1504|    594|        fr.getArgRefUnsafe(-1) = O3REG(Call1);
  ------------------
  |  |   33|    594|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    594|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1505|    594|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1506|    594|        goto doCall;
 1507|      0|      }
 1508|       |
 1509|    792|      CASE(Call2) {
  ------------------
  |  | 1074|    792|#define CASE(name) case_##name:
  ------------------
 1510|    792|        callArgCount = 2;
 1511|    792|        nextIP = NEXTINST(Call2);
  ------------------
  |  |   59|    792|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1512|    792|        StackFramePtr fr{runtime.stackPointer_};
 1513|    792|        fr.getArgRefUnsafe(-1) = O3REG(Call2);
  ------------------
  |  |   33|    792|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    792|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1514|    792|        fr.getArgRefUnsafe(0) = O4REG(Call2);
  ------------------
  |  |   34|    792|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|    792|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1515|    792|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1516|    792|        goto doCall;
 1517|      0|      }
 1518|       |
 1519|      0|      CASE(Call3) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1520|      0|        callArgCount = 3;
 1521|      0|        nextIP = NEXTINST(Call3);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1522|      0|        StackFramePtr fr{runtime.stackPointer_};
 1523|      0|        fr.getArgRefUnsafe(-1) = O3REG(Call3);
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1524|      0|        fr.getArgRefUnsafe(0) = O4REG(Call3);
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1525|      0|        fr.getArgRefUnsafe(1) = O5REG(Call3);
  ------------------
  |  |   35|      0|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1526|      0|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1527|      0|        goto doCall;
 1528|      0|      }
 1529|       |
 1530|      0|      CASE(Call4) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1531|      0|        callArgCount = 4;
 1532|      0|        nextIP = NEXTINST(Call4);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1533|      0|        StackFramePtr fr{runtime.stackPointer_};
 1534|      0|        fr.getArgRefUnsafe(-1) = O3REG(Call4);
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1535|      0|        fr.getArgRefUnsafe(0) = O4REG(Call4);
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1536|      0|        fr.getArgRefUnsafe(1) = O5REG(Call4);
  ------------------
  |  |   35|      0|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1537|      0|        fr.getArgRefUnsafe(2) = O6REG(Call4);
  ------------------
  |  |   36|      0|#define O6REG(name) REG(ip->i##name.op6)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1538|      0|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1539|      0|        goto doCall;
 1540|      0|      }
 1541|       |
 1542|    594|      CASE(Construct) {
  ------------------
  |  | 1074|    594|#define CASE(name) case_##name:
  ------------------
 1543|    594|        callArgCount = (uint32_t)ip->iConstruct.op3;
 1544|    594|        nextIP = NEXTINST(Construct);
  ------------------
  |  |   59|    594|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1545|    594|        callNewTarget = O2REG(Construct).getRaw();
  ------------------
  |  |   32|    594|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    594|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1546|    594|        goto doCall;
 1547|      0|      }
 1548|    286|      CASE(Call) {
  ------------------
  |  | 1074|    286|#define CASE(name) case_##name:
  ------------------
 1549|    286|        callArgCount = (uint32_t)ip->iCall.op3;
 1550|    286|        nextIP = NEXTINST(Call);
  ------------------
  |  |   59|    286|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1551|    286|        callNewTarget = HermesValue::encodeUndefinedValue().getRaw();
 1552|    286|        goto doCall;
 1553|      0|      }
 1554|       |
 1555|  2.27k|    doCall : {
 1556|  2.27k|#ifdef HERMES_ENABLE_DEBUGGER
 1557|       |      // Check for an async debugger request.
 1558|  2.27k|      if (uint8_t asyncFlags =
  ------------------
  |  Branch (1558:19): [True: 0, False: 2.27k]
  ------------------
 1559|  2.27k|              runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1560|      0|        RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  do {                                                                       \
  |  | 1103|      0|    CAPTURE_IP_ASSIGN(                                                       \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (931:11): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1104|      0|        auto dRes,                                                           \
  |  | 1105|      0|        runDebuggerUpdatingState(                                            \
  |  | 1106|      0|            (uint8_t)(flags) &                                               \
  |  | 1107|      0|                    (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit \
  |  | 1108|      0|                ? Debugger::RunReason::AsyncBreakExplicit                    \
  |  | 1109|      0|                : Debugger::RunReason::AsyncBreakImplicit,                   \
  |  | 1110|      0|            runtime,                                                         \
  |  | 1111|      0|            curCodeBlock,                                                    \
  |  | 1112|      0|            ip,                                                              \
  |  | 1113|      0|            frameRegs));                                                     \
  |  | 1114|      0|    if (dRes == ExecutionStatus::EXCEPTION)                                  \
  |  |  ------------------
  |  |  |  Branch (1114:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1115|      0|      goto exception;                                                        \
  |  | 1116|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1116:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1561|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1562|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1563|      0|      }
 1564|  2.27k|#endif
 1565|       |
 1566|       |      // Subtract 1 from callArgCount as 'this' is considered an argument in the
 1567|       |      // instruction, but not in the frame.
 1568|  2.27k|      auto newFrame = StackFramePtr::initFrame(
 1569|  2.27k|          runtime.stackPointer_,
 1570|  2.27k|          FRAME,
  ------------------
  |  |   39|  2.27k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1571|  2.27k|          ip,
 1572|  2.27k|          curCodeBlock,
 1573|  2.27k|          callArgCount - 1,
 1574|  2.27k|          O2REG(Call),
  ------------------
  |  |   32|  2.27k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  2.27k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1575|  2.27k|          HermesValue::fromRaw(callNewTarget));
 1576|  2.27k|      (void)newFrame;
 1577|       |
 1578|  2.27k|      SLOW_DEBUG(dumpCallArguments(dbgs(), runtime, newFrame));
  ------------------
  |  |   18|  2.27k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|  2.27k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|  2.27k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 2.27k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|  2.27k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1579|       |
 1580|  2.27k|      if (auto *func = dyn_vmcast<JSFunction>(O2REG(Call))) {
  ------------------
  |  Branch (1580:17): [True: 1.48k, False: 786]
  ------------------
 1581|  1.48k|        assert(!SingleStep && "can't single-step a call");
 1582|       |
 1583|      0|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1584|      0|        runtime.pushCallStack(curCodeBlock, ip);
 1585|  1.48k|#endif
 1586|       |
 1587|  1.48k|        CodeBlock *calleeBlock = func->getCodeBlock(runtime);
 1588|  1.48k|        CAPTURE_IP_ASSIGN(auto res, calleeBlock->lazyCompile(runtime));
  ------------------
  |  |  930|  1.48k|  runtime.setCurrentIP(ip);           \
  |  |  931|  1.48k|  decl = (expr);                      \
  |  |  932|  1.48k|  ip = runtime.getCurrentIP();        \
  |  |  933|  1.48k|  runtime.invalidateCurrentIP();
  ------------------
 1589|  1.48k|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.48k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.48k]
  |  |  ------------------
  ------------------
 1590|      0|          goto exception;
 1591|      0|        }
 1592|  1.48k|        curCodeBlock = calleeBlock;
 1593|  1.48k|        CAPTURE_IP_SET();
  ------------------
  |  |  948|  1.48k|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  ------------------
 1594|  1.48k|        goto tailCall;
 1595|  1.48k|      }
 1596|    786|      CAPTURE_IP(
  ------------------
  |  |  923|    786|  runtime.setCurrentIP(ip);    \
  |  |  924|    786|  (void)(expr);                \
  |  |  925|    786|  ip = runtime.getCurrentIP(); \
  |  |  926|    786|  runtime.invalidateCurrentIP();
  ------------------
 1597|    786|          resPH = Interpreter::handleCallSlowPath(runtime, &O2REG(Call)));
 1598|    786|      if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    786|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 4, False: 782]
  |  |  ------------------
  ------------------
 1599|      4|        goto exception;
 1600|      4|      }
 1601|    782|      O1REG(Call) = std::move(resPH->get());
  ------------------
  |  |   31|    782|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.56k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1602|    782|      SLOW_DEBUG(
  ------------------
  |  |   18|    782|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|    782|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|    782|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 782]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|    782|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1603|    782|          dbgs() << "native return value r" << (unsigned)ip->iCall.op1 << "="
 1604|    782|                 << DumpHermesValue(O1REG(Call)) << "\n");
 1605|    782|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1606|    782|      ip = nextIP;
 1607|    782|      DISPATCH;
  ------------------
  |  | 1079|    782|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    782|  {                                                                          \
  |  |  |  | 1052|    782|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    782|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    782|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    782|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    782|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    782|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    782|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    782|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    782|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    782|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    782|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    782|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    782|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    782|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    782|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    782|  }
  |  |  ------------------
  |  | 1080|    782|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    782|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1608|    782|    }
 1609|       |
 1610|      0|      CASE(CallDirect)
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1611|      0|      CASE(CallDirectLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1612|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1613|       |        // Check for an async debugger request.
 1614|      0|        if (uint8_t asyncFlags =
  ------------------
  |  Branch (1614:21): [True: 0, False: 0]
  ------------------
 1615|      0|                runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1616|      0|          RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  do {                                                                       \
  |  | 1103|      0|    CAPTURE_IP_ASSIGN(                                                       \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (931:11): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1104|      0|        auto dRes,                                                           \
  |  | 1105|      0|        runDebuggerUpdatingState(                                            \
  |  | 1106|      0|            (uint8_t)(flags) &                                               \
  |  | 1107|      0|                    (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit \
  |  | 1108|      0|                ? Debugger::RunReason::AsyncBreakExplicit                    \
  |  | 1109|      0|                : Debugger::RunReason::AsyncBreakImplicit,                   \
  |  | 1110|      0|            runtime,                                                         \
  |  | 1111|      0|            curCodeBlock,                                                    \
  |  | 1112|      0|            ip,                                                              \
  |  | 1113|      0|            frameRegs));                                                     \
  |  | 1114|      0|    if (dRes == ExecutionStatus::EXCEPTION)                                  \
  |  |  ------------------
  |  |  |  Branch (1114:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1115|      0|      goto exception;                                                        \
  |  | 1116|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1116:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1617|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 1618|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1619|      0|        }
 1620|      0|#endif
 1621|       |
 1622|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (931:11): [True: 0, False: 0]
  |  |  ------------------
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1623|      0|            CodeBlock * calleeBlock,
 1624|      0|            ip->opCode == OpCode::CallDirect
 1625|      0|                ? curCodeBlock->getRuntimeModule()->getCodeBlockMayAllocate(
 1626|      0|                      ip->iCallDirect.op3)
 1627|      0|                : curCodeBlock->getRuntimeModule()->getCodeBlockMayAllocate(
 1628|      0|                      ip->iCallDirectLongIndex.op3));
 1629|       |
 1630|      0|        auto newFrame = StackFramePtr::initFrame(
 1631|      0|            runtime.stackPointer_,
 1632|      0|            FRAME,
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1633|      0|            ip,
 1634|      0|            curCodeBlock,
 1635|      0|            (uint32_t)ip->iCallDirect.op2 - 1,
 1636|      0|            HermesValue::encodeNativePointer(calleeBlock),
 1637|      0|            HermesValue::encodeUndefinedValue());
 1638|      0|        (void)newFrame;
 1639|       |
 1640|      0|        LLVM_DEBUG(dumpCallArguments(dbgs(), runtime, newFrame));
  ------------------
  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1641|       |
 1642|      0|        assert(!SingleStep && "can't single-step a call");
 1643|       |
 1644|      0|        CAPTURE_IP_ASSIGN(auto res, calleeBlock->lazyCompile(runtime));
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1645|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1646|      0|          goto exception;
 1647|      0|        }
 1648|      0|        curCodeBlock = calleeBlock;
 1649|      0|        CAPTURE_IP_SET();
  ------------------
  |  |  948|      0|#define CAPTURE_IP_SET() runtime.setCurrentIP(ip)
  ------------------
 1650|      0|        goto tailCall;
 1651|      0|      }
 1652|       |
 1653|      0|      CASE(GetBuiltinClosure) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1654|      0|        uint8_t methodIndex = ip->iCallBuiltin.op2;
 1655|      0|        Callable *closure = runtime.getBuiltinCallable(methodIndex);
 1656|      0|        O1REG(GetBuiltinClosure) = HermesValue::encodeObjectValue(closure);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1657|      0|        ip = NEXTINST(GetBuiltinClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1658|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1659|      0|      }
 1660|       |
 1661|    278|      CASE(CallBuiltin) {
  ------------------
  |  | 1074|    278|#define CASE(name) case_##name:
  ------------------
 1662|    278|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    278|  runtime.setCurrentIP(ip);           \
  |  |  931|    278|  decl = (expr);                      \
  |  |  932|    278|  ip = runtime.getCurrentIP();        \
  |  |  933|    278|  runtime.invalidateCurrentIP();
  ------------------
 1663|    278|            auto cres,
 1664|    278|            implCallBuiltin(
 1665|    278|                runtime, frameRegs, curCodeBlock, ip->iCallBuiltin.op3));
 1666|    278|        if (LLVM_UNLIKELY(cres == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|    278|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 278]
  |  |  ------------------
  ------------------
 1667|      0|          goto exception;
 1668|    278|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1669|    278|        ip = NEXTINST(CallBuiltin);
  ------------------
  |  |   59|    278|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1670|    278|        DISPATCH;
  ------------------
  |  | 1079|    278|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    278|  {                                                                          \
  |  |  |  | 1052|    278|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    278|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    278|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    278|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    278|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    278|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    278|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    278|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    278|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    278|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    278|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    278|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    278|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    278|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    278|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    278|  }
  |  |  ------------------
  |  | 1080|    278|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    278|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1671|    278|      }
 1672|      5|      CASE(CallBuiltinLong) {
  ------------------
  |  | 1074|      5|#define CASE(name) case_##name:
  ------------------
 1673|      5|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      5|  runtime.setCurrentIP(ip);           \
  |  |  931|      5|  decl = (expr);                      \
  |  |  932|      5|  ip = runtime.getCurrentIP();        \
  |  |  933|      5|  runtime.invalidateCurrentIP();
  ------------------
 1674|      5|            auto cres,
 1675|      5|            implCallBuiltin(
 1676|      5|                runtime, frameRegs, curCodeBlock, ip->iCallBuiltinLong.op3));
 1677|      5|        if (LLVM_UNLIKELY(cres == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 1678|      0|          goto exception;
 1679|      5|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1680|      5|        ip = NEXTINST(CallBuiltinLong);
  ------------------
  |  |   59|      5|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1681|      5|        DISPATCH;
  ------------------
  |  | 1079|      5|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      5|  {                                                                          \
  |  |  |  | 1052|      5|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      5|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      5|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      5|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      5|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      5|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      5|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      5|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      5|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      5|  }
  |  |  ------------------
  |  | 1080|      5|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      5|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1682|      5|      }
 1683|       |
 1684|      0|      CASE(CompleteGenerator) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1685|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1686|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1687|      0|        innerFn->setState(GeneratorInnerFunction::State::Completed);
 1688|      0|        ip = NEXTINST(CompleteGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1689|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1690|      0|      }
 1691|       |
 1692|      0|      CASE(SaveGenerator) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1693|      0|        DONT_CAPTURE_IP(
  ------------------
  |  |  942|      0|  do {                             \
  |  |  943|      0|    NoAllocScope noAlloc(runtime); \
  |  |  944|      0|    (void)expr;                    \
  |  |  945|      0|  } while (false)
  |  |  ------------------
  |  |  |  Branch (945:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1694|      0|            saveGenerator(runtime, frameRegs, IPADD(ip->iSaveGenerator.op1)));
 1695|      0|        ip = NEXTINST(SaveGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1696|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1697|      0|      }
 1698|      0|      CASE(SaveGeneratorLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1699|      0|        DONT_CAPTURE_IP(saveGenerator(
  ------------------
  |  |  942|      0|  do {                             \
  |  |  943|      0|    NoAllocScope noAlloc(runtime); \
  |  |  944|      0|    (void)expr;                    \
  |  |  945|      0|  } while (false)
  |  |  ------------------
  |  |  |  Branch (945:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1700|      0|            runtime, frameRegs, IPADD(ip->iSaveGeneratorLong.op1)));
 1701|      0|        ip = NEXTINST(SaveGeneratorLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1702|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1703|      0|      }
 1704|       |
 1705|      0|      CASE(StartGenerator) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1706|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1707|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1708|      0|        if (innerFn->getState() ==
  ------------------
  |  Branch (1708:13): [True: 0, False: 0]
  ------------------
 1709|      0|            GeneratorInnerFunction::State::SuspendedStart) {
 1710|      0|          nextIP = NEXTINST(StartGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1711|      0|        } else {
 1712|      0|          nextIP = innerFn->getNextIP(runtime);
 1713|      0|          innerFn->restoreStack(runtime);
 1714|      0|        }
 1715|      0|        innerFn->setState(GeneratorInnerFunction::State::Executing);
 1716|      0|        ip = nextIP;
 1717|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1718|      0|      }
 1719|       |
 1720|      0|      CASE(ResumeGenerator) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1721|      0|        auto *innerFn = vmcast<GeneratorInnerFunction>(
 1722|      0|            runtime.getCurrentFrame().getCalleeClosureUnsafe());
 1723|      0|        O1REG(ResumeGenerator) = innerFn->getResult().unboxToHV(runtime);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1724|      0|        O2REG(ResumeGenerator) = HermesValue::encodeBoolValue(
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1725|      0|            innerFn->getAction() == GeneratorInnerFunction::Action::Return);
 1726|      0|        innerFn->clearResult(runtime);
 1727|      0|        if (innerFn->getAction() == GeneratorInnerFunction::Action::Throw) {
  ------------------
  |  Branch (1727:13): [True: 0, False: 0]
  ------------------
 1728|      0|          runtime.setThrownValue(O1REG(ResumeGenerator));
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1729|      0|          goto exception;
 1730|      0|        }
 1731|      0|        ip = NEXTINST(ResumeGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1732|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1733|      0|      }
 1734|       |
 1735|  1.61k|      CASE(Ret) {
  ------------------
  |  | 1074|  1.61k|#define CASE(name) case_##name:
  ------------------
 1736|  1.61k|#ifdef HERMES_ENABLE_DEBUGGER
 1737|       |        // Check for an async debugger request.
 1738|  1.61k|        if (uint8_t asyncFlags =
  ------------------
  |  Branch (1738:21): [True: 0, False: 1.61k]
  ------------------
 1739|  1.61k|                runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1740|      0|          RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  do {                                                                       \
  |  | 1103|      0|    CAPTURE_IP_ASSIGN(                                                       \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (931:11): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1104|      0|        auto dRes,                                                           \
  |  | 1105|      0|        runDebuggerUpdatingState(                                            \
  |  | 1106|      0|            (uint8_t)(flags) &                                               \
  |  | 1107|      0|                    (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit \
  |  | 1108|      0|                ? Debugger::RunReason::AsyncBreakExplicit                    \
  |  | 1109|      0|                : Debugger::RunReason::AsyncBreakImplicit,                   \
  |  | 1110|      0|            runtime,                                                         \
  |  | 1111|      0|            curCodeBlock,                                                    \
  |  | 1112|      0|            ip,                                                              \
  |  | 1113|      0|            frameRegs));                                                     \
  |  | 1114|      0|    if (dRes == ExecutionStatus::EXCEPTION)                                  \
  |  |  ------------------
  |  |  |  Branch (1114:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1115|      0|      goto exception;                                                        \
  |  | 1116|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1116:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1741|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 1742|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1743|      0|        }
 1744|  1.61k|#endif
 1745|       |
 1746|  1.61k|        PROFILER_EXIT_FUNCTION(curCodeBlock);
 1747|       |
 1748|  1.61k|#ifdef HERMES_MEMORY_INSTRUMENTATION
 1749|  1.61k|        runtime.popCallStack();
 1750|  1.61k|#endif
 1751|       |
 1752|       |        // Store the return value.
 1753|  1.61k|        res = O1REG(Ret);
  ------------------
  |  |   31|  1.61k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.61k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1754|       |
 1755|  1.61k|        ip = FRAME.getSavedIP();
  ------------------
  |  |   39|  1.61k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1756|  1.61k|        curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|  1.61k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1757|       |
 1758|  1.61k|        frameRegs =
 1759|  1.61k|            &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|  1.61k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 1760|       |
 1761|  1.61k|        SLOW_DEBUG(
  ------------------
  |  |   18|  1.61k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|  1.61k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|  1.61k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 1.61k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|  1.61k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1762|  1.61k|            dbgs() << "function exit: restored stackLevel="
 1763|  1.61k|                   << runtime.getStackLevel() << "\n");
 1764|       |
 1765|       |        // Are we returning to native code?
 1766|  1.61k|        if (!curCodeBlock) {
  ------------------
  |  Branch (1766:13): [True: 131, False: 1.48k]
  ------------------
 1767|    131|          SLOW_DEBUG(dbgs() << "function exit: returning to native code\n");
  ------------------
  |  |   18|    131|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|    131|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|    131|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 131]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|    131|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1768|    131|          return res;
 1769|    131|        }
 1770|       |
 1771|  1.48k|        INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|  1.48k|  do {                                                           \
  |  |  117|  1.48k|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|  1.48k|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|  1.48k|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 1.38k, False: 99]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|  1.48k|    if (EnableCrashTrace) {                                      \
  |  |  ------------------
  |  |  |  Branch (119:9): [Folded - Ignored]
  |  |  ------------------
  |  |  120|      0|      auto *bc = (codeBlock)->getRuntimeModule()->getBytecode(); \
  |  |  121|      0|      bytecodeFileStart = bc->getRawBuffer().data();             \
  |  |  122|      0|      auto hash = bc->getSourceHash();                           \
  |  |  123|      0|      runtime.crashTrace_.recordModule(                          \
  |  |  124|      0|          bc->getSegmentID(),                                    \
  |  |  125|      0|          (codeBlock)->getRuntimeModule()->getSourceURL(),       \
  |  |  126|      0|          llvh::StringRef((const char *)&hash, sizeof(hash)));   \
  |  |  127|      0|    }                                                            \
  |  |  128|  1.48k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1772|  1.48k|        O1REG(Call) = res.getValue();
  ------------------
  |  |   31|  1.48k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.97k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1773|  1.48k|        ip = nextInstCall(ip);
 1774|  1.48k|        DISPATCH;
  ------------------
  |  | 1079|  1.48k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.48k|  {                                                                          \
  |  |  |  | 1052|  1.48k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.48k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.48k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.48k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.48k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.48k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.48k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.48k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.48k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.48k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.48k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.48k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.48k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.48k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.48k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.48k|  }
  |  |  ------------------
  |  | 1080|  1.48k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.48k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1775|  1.48k|      }
 1776|       |
 1777|      0|      CASE(Catch) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1778|      0|        assert(!runtime.thrownValue_.isEmpty() && "Invalid thrown value");
 1779|      0|        assert(
 1780|      0|            !isUncatchableError(runtime.thrownValue_) &&
 1781|      0|            "Uncatchable thrown value was caught");
 1782|      0|        O1REG(Catch) = runtime.thrownValue_;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1783|      0|        runtime.clearThrownValue();
 1784|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1785|       |        // Signal to the debugger that we're done unwinding an exception,
 1786|       |        // and we can resume normal debugging flow.
 1787|      0|        runtime.debugger_.finishedUnwindingException();
 1788|      0|#endif
 1789|      0|        ip = NEXTINST(Catch);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1790|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1791|      0|      }
 1792|       |
 1793|      0|      CASE(Throw) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1794|      0|        runtime.thrownValue_ = O1REG(Throw);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1795|      0|        SLOW_DEBUG(
  ------------------
  |  |   18|      0|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1796|      0|            dbgs() << "Exception thrown: "
 1797|      0|                   << DumpHermesValue(runtime.thrownValue_) << "\n");
 1798|      0|        goto exception;
 1799|      0|      }
 1800|       |
 1801|      0|      CASE(ThrowIfEmpty) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1802|      0|        if (LLVM_UNLIKELY(O2REG(ThrowIfEmpty).isEmpty())) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1803|      0|          SLOW_DEBUG(dbgs() << "Throwing ReferenceError for empty variable");
  ------------------
  |  |   18|      0|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1804|      0|          CAPTURE_IP(runtime.raiseReferenceError(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 1805|      0|              "accessing an uninitialized variable"));
 1806|      0|          goto exception;
 1807|      0|        }
 1808|      0|        O1REG(ThrowIfEmpty) = O2REG(ThrowIfEmpty);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(ThrowIfEmpty) = O2REG(ThrowIfEmpty);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 1809|      0|        ip = NEXTINST(ThrowIfEmpty);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1810|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1811|      0|      }
 1812|       |
 1813|      0|      CASE(Debugger) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1814|      0|        SLOW_DEBUG(dbgs() << "debugger statement executed\n");
  ------------------
  |  |   18|      0|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|      0|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|      0|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|      0|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1815|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1816|      0|        {
 1817|      0|          if (!runtime.debugger_.isDebugging()) {
  ------------------
  |  Branch (1817:15): [True: 0, False: 0]
  ------------------
 1818|       |            // Only run the debugger if we're not already debugging.
 1819|       |            // Don't want to call it again and mess with its state.
 1820|      0|            CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1821|      0|                auto res,
 1822|      0|                runDebuggerUpdatingState(
 1823|      0|                    Debugger::RunReason::Opcode,
 1824|      0|                    runtime,
 1825|      0|                    curCodeBlock,
 1826|      0|                    ip,
 1827|      0|                    frameRegs));
 1828|      0|            if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1828:17): [True: 0, False: 0]
  ------------------
 1829|       |              // If one of the internal steps threw,
 1830|       |              // then handle that here by jumping to where we're supposed to go.
 1831|       |              // If we're in mid-step, the breakpoint at the catch point
 1832|       |              // will have been set by the debugger.
 1833|       |              // We don't want to execute this instruction because it's already
 1834|       |              // thrown.
 1835|      0|              goto exception;
 1836|      0|            }
 1837|      0|          }
 1838|      0|          auto breakpointOpt = runtime.debugger_.getBreakpointLocation(ip);
 1839|      0|          if (breakpointOpt.hasValue()) {
  ------------------
  |  Branch (1839:15): [True: 0, False: 0]
  ------------------
 1840|       |            // We're on a breakpoint but we're supposed to continue.
 1841|      0|            curCodeBlock->uninstallBreakpointAtOffset(
 1842|      0|                CUROFFSET, breakpointOpt->opCode);
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 1843|      0|            if (ip->opCode == OpCode::Debugger) {
  ------------------
  |  Branch (1843:17): [True: 0, False: 0]
  ------------------
 1844|       |              // Breakpointed a debugger instruction, so move past it
 1845|       |              // since we've already called the debugger on this instruction.
 1846|      0|              ip = NEXTINST(Debugger);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1847|      0|            } else {
 1848|      0|              InterpreterState newState{curCodeBlock, (uint32_t)CUROFFSET};
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 1849|      0|              CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1850|      0|                  ExecutionStatus status, runtime.stepFunction(newState));
 1851|      0|              curCodeBlock->installBreakpointAtOffset(CUROFFSET);
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 1852|      0|              if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1852:19): [True: 0, False: 0]
  ------------------
 1853|      0|                goto exception;
 1854|      0|              }
 1855|      0|              curCodeBlock = newState.codeBlock;
 1856|      0|              ip = newState.codeBlock->getOffsetPtr(newState.offset);
 1857|      0|              INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|      0|  do {                                                           \
  |  |  117|      0|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|      0|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|      0|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      0|    if (EnableCrashTrace) {                                      \
  |  |  ------------------
  |  |  |  Branch (119:9): [Folded - Ignored]
  |  |  ------------------
  |  |  120|      0|      auto *bc = (codeBlock)->getRuntimeModule()->getBytecode(); \
  |  |  121|      0|      bytecodeFileStart = bc->getRawBuffer().data();             \
  |  |  122|      0|      auto hash = bc->getSourceHash();                           \
  |  |  123|      0|      runtime.crashTrace_.recordModule(                          \
  |  |  124|      0|          bc->getSegmentID(),                                    \
  |  |  125|      0|          (codeBlock)->getRuntimeModule()->getSourceURL(),       \
  |  |  126|      0|          llvh::StringRef((const char *)&hash, sizeof(hash)));   \
  |  |  127|      0|    }                                                            \
  |  |  128|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1858|       |              // Single-stepping should handle call stack management for us.
 1859|      0|              frameRegs = &runtime.getCurrentFrame().getFirstLocalRef();
 1860|      0|            }
 1861|      0|          } else if (ip->opCode == OpCode::Debugger) {
  ------------------
  |  Branch (1861:22): [True: 0, False: 0]
  ------------------
 1862|       |            // No breakpoint here and we've already run the debugger,
 1863|       |            // just continue on.
 1864|       |            // If the current instruction is no longer a debugger instruction,
 1865|       |            // we're just going to keep executing from the current IP.
 1866|      0|            ip = NEXTINST(Debugger);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1867|      0|          }
 1868|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 1869|      0|        }
 1870|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1871|       |#else
 1872|       |        ip = NEXTINST(Debugger);
 1873|       |        DISPATCH;
 1874|       |#endif
 1875|      0|      }
 1876|       |
 1877|     33|      CASE(AsyncBreakCheck) {
  ------------------
  |  | 1074|     33|#define CASE(name) case_##name:
  ------------------
 1878|     33|        if (LLVM_UNLIKELY(runtime.hasAsyncBreak())) {
  ------------------
  |  |  189|     33|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 33]
  |  |  ------------------
  ------------------
 1879|      0|#ifdef HERMES_ENABLE_DEBUGGER
 1880|      0|          if (uint8_t asyncFlags =
  ------------------
  |  Branch (1880:23): [True: 0, False: 0]
  ------------------
 1881|      0|                  runtime.testAndClearDebuggerAsyncBreakRequest()) {
 1882|      0|            RUN_DEBUGGER_ASYNC_BREAK(asyncFlags);
  ------------------
  |  | 1102|      0|  do {                                                                       \
  |  | 1103|      0|    CAPTURE_IP_ASSIGN(                                                       \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (931:11): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1104|      0|        auto dRes,                                                           \
  |  | 1105|      0|        runDebuggerUpdatingState(                                            \
  |  | 1106|      0|            (uint8_t)(flags) &                                               \
  |  | 1107|      0|                    (uint8_t)Runtime::AsyncBreakReasonBits::DebuggerExplicit \
  |  | 1108|      0|                ? Debugger::RunReason::AsyncBreakExplicit                    \
  |  | 1109|      0|                : Debugger::RunReason::AsyncBreakImplicit,                   \
  |  | 1110|      0|            runtime,                                                         \
  |  | 1111|      0|            curCodeBlock,                                                    \
  |  | 1112|      0|            ip,                                                              \
  |  | 1113|      0|            frameRegs));                                                     \
  |  | 1114|      0|    if (dRes == ExecutionStatus::EXCEPTION)                                  \
  |  |  ------------------
  |  |  |  Branch (1114:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1115|      0|      goto exception;                                                        \
  |  | 1116|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (1116:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1883|      0|          }
 1884|      0|#endif
 1885|      0|          if (runtime.testAndClearTimeoutAsyncBreakRequest()) {
  ------------------
  |  Branch (1885:15): [True: 0, False: 0]
  ------------------
 1886|      0|            CAPTURE_IP_ASSIGN(auto nRes, runtime.notifyTimeout());
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1887|      0|            if (nRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1887:17): [True: 0, False: 0]
  ------------------
 1888|      0|              goto exception;
 1889|      0|            }
 1890|      0|          }
 1891|      0|        }
 1892|     33|        gcScope.flushToSmallCount(KEEP_HANDLES);
 1893|       |
 1894|     33|        ip = NEXTINST(AsyncBreakCheck);
  ------------------
  |  |   59|     33|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1895|     33|        DISPATCH;
  ------------------
  |  | 1079|     33|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|     33|  {                                                                          \
  |  |  |  | 1052|     33|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|     33|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     33|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|     33|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|     33|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     33|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|     33|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     33|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|     33|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|     33|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|     33|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     33|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|     33|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|     33|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|     33|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|     33|  }
  |  |  ------------------
  |  | 1080|     33|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|     33|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1896|     33|      }
 1897|       |
 1898|      0|      CASE(ProfilePoint) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1899|       |#ifdef HERMESVM_PROFILER_BB
 1900|       |        auto pointIndex = ip->iProfilePoint.op1;
 1901|       |        SLOW_DEBUG(llvh::dbgs() << "ProfilePoint: " << pointIndex << "\n");
 1902|       |        CAPTURE_IP(runtime.getBasicBlockExecutionInfo().executeBlock(
 1903|       |            curCodeBlock, pointIndex));
 1904|       |#endif
 1905|      0|        ip = NEXTINST(ProfilePoint);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1906|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1907|      0|      }
 1908|       |
 1909|       |      // Use a macro here to avoid clang-format issues with a literal default:
 1910|       |      // label.
 1911|      0|      DEFAULT_CASE
 1912|      0|      CASE(Unreachable) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1913|      0|        hermes_fatal("Unreachable instruction encountered");
 1914|       |        // The fatal call doesn't return, no need to set the IP differently and
 1915|       |        // dispatch.
 1916|      0|      }
 1917|       |
 1918|  4.34k|      CASE(CreateClosure) {
  ------------------
  |  | 1074|  4.34k|#define CASE(name) case_##name:
  ------------------
 1919|  4.34k|        idVal = ip->iCreateClosure.op3;
 1920|  4.34k|        nextIP = NEXTINST(CreateClosure);
  ------------------
  |  |   59|  4.34k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1921|  4.34k|        goto createClosure;
 1922|      0|      }
 1923|      0|      CASE(CreateClosureLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1924|      0|        idVal = ip->iCreateClosureLongIndex.op3;
 1925|      0|        nextIP = NEXTINST(CreateClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1926|      0|        goto createClosure;
 1927|      0|      }
 1928|  4.34k|    createClosure : {
 1929|  4.34k|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 1930|  4.34k|      CAPTURE_IP(
  ------------------
  |  |  923|  4.34k|  runtime.setCurrentIP(ip);    \
  |  |  924|  4.34k|  (void)(expr);                \
  |  |  925|  4.34k|  ip = runtime.getCurrentIP(); \
  |  |  926|  4.34k|  runtime.invalidateCurrentIP();
  ------------------
 1931|  4.34k|          O1REG(CreateClosure) =
 1932|  4.34k|              JSFunction::create(
 1933|  4.34k|                  runtime,
 1934|  4.34k|                  runtimeModule->getDomain(runtime),
 1935|  4.34k|                  Handle<JSObject>::vmcast(&runtime.functionPrototype),
 1936|  4.34k|                  Handle<Environment>::vmcast(&O2REG(CreateClosure)),
 1937|  4.34k|                  runtimeModule->getCodeBlockMayAllocate(idVal))
 1938|  4.34k|                  .getHermesValue());
 1939|  4.34k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1940|  4.34k|      ip = nextIP;
 1941|  4.34k|      DISPATCH;
  ------------------
  |  | 1079|  4.34k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  4.34k|  {                                                                          \
  |  |  |  | 1052|  4.34k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  4.34k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.34k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  4.34k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  4.34k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.34k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  4.34k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.34k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  4.34k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  4.34k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  4.34k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.34k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  4.34k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  4.34k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  4.34k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  4.34k|  }
  |  |  ------------------
  |  | 1080|  4.34k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  4.34k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1942|  4.34k|    }
 1943|       |
 1944|      0|      CASE(CreateAsyncClosure) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1945|      0|        idVal = ip->iCreateAsyncClosure.op3;
 1946|      0|        nextIP = NEXTINST(CreateAsyncClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1947|      0|        goto createAsyncClosure;
 1948|  4.34k|      }
 1949|      0|      CASE(CreateAsyncClosureLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1950|      0|        idVal = ip->iCreateAsyncClosureLongIndex.op3;
 1951|      0|        nextIP = NEXTINST(CreateAsyncClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1952|      0|        goto createAsyncClosure;
 1953|  4.34k|      }
 1954|      0|    createAsyncClosure : {
 1955|      0|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 1956|      0|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1957|      0|          O1REG(CreateAsyncClosure),
 1958|      0|          JSAsyncFunction::create(
 1959|      0|              runtime,
 1960|      0|              runtimeModule->getDomain(runtime),
 1961|      0|              Handle<JSObject>::vmcast(&runtime.asyncFunctionPrototype),
 1962|      0|              Handle<Environment>::vmcast(&O2REG(CreateAsyncClosure)),
 1963|      0|              runtimeModule->getCodeBlockMayAllocate(idVal))
 1964|      0|              .getHermesValue());
 1965|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1966|      0|      ip = nextIP;
 1967|      0|      DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1968|      0|    }
 1969|       |
 1970|      0|      CASE(CreateGeneratorClosure) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1971|      0|        idVal = ip->iCreateGeneratorClosure.op3;
 1972|      0|        nextIP = NEXTINST(CreateGeneratorClosure);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1973|      0|        goto createGeneratorClosure;
 1974|      0|      }
 1975|      0|      CASE(CreateGeneratorClosureLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1976|      0|        idVal = ip->iCreateGeneratorClosureLongIndex.op3;
 1977|      0|        nextIP = NEXTINST(CreateGeneratorClosureLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 1978|      0|        goto createGeneratorClosure;
 1979|      0|      }
 1980|      0|    createGeneratorClosure : {
 1981|      0|      auto *runtimeModule = curCodeBlock->getRuntimeModule();
 1982|      0|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1983|      0|          O1REG(CreateGeneratorClosure),
 1984|      0|          JSGeneratorFunction::create(
 1985|      0|              runtime,
 1986|      0|              runtimeModule->getDomain(runtime),
 1987|      0|              Handle<JSObject>::vmcast(&runtime.generatorFunctionPrototype),
 1988|      0|              Handle<Environment>::vmcast(&O2REG(CreateGeneratorClosure)),
 1989|      0|              runtimeModule->getCodeBlockMayAllocate(idVal))
 1990|      0|              .getHermesValue());
 1991|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 1992|      0|      ip = nextIP;
 1993|      0|      DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 1994|      0|    }
 1995|       |
 1996|      0|      CASE(CreateGenerator) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 1997|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 1998|      0|            auto res,
 1999|      0|            createGenerator_RJS(
 2000|      0|                runtime,
 2001|      0|                curCodeBlock->getRuntimeModule(),
 2002|      0|                ip->iCreateGenerator.op3,
 2003|      0|                Handle<Environment>::vmcast(&O2REG(CreateGenerator)),
 2004|      0|                FRAME.getNativeArgs()));
 2005|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2006|      0|          goto exception;
 2007|      0|        }
 2008|      0|        O1REG(CreateGenerator) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2009|      0|        res->invalidate();
 2010|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2011|      0|        ip = NEXTINST(CreateGenerator);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2012|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2013|      0|      }
 2014|      0|      CASE(CreateGeneratorLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2015|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2016|      0|            auto res,
 2017|      0|            createGenerator_RJS(
 2018|      0|                runtime,
 2019|      0|                curCodeBlock->getRuntimeModule(),
 2020|      0|                ip->iCreateGeneratorLongIndex.op3,
 2021|      0|                Handle<Environment>::vmcast(&O2REG(CreateGeneratorLongIndex)),
 2022|      0|                FRAME.getNativeArgs()));
 2023|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2024|      0|          goto exception;
 2025|      0|        }
 2026|      0|        O1REG(CreateGeneratorLongIndex) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2027|      0|        res->invalidate();
 2028|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2029|      0|        ip = NEXTINST(CreateGeneratorLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2030|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2031|      0|      }
 2032|       |
 2033|  1.28k|      CASE(GetEnvironment) {
  ------------------
  |  | 1074|  1.28k|#define CASE(name) case_##name:
  ------------------
 2034|       |        // The currently executing function must exist, so get the environment.
 2035|  1.28k|        Environment *curEnv =
 2036|  1.28k|            FRAME.getCalleeClosureUnsafe()->getEnvironment(runtime);
  ------------------
  |  |   39|  1.28k|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2037|  1.28k|        for (unsigned level = ip->iGetEnvironment.op2; level; --level) {
  ------------------
  |  Branch (2037:56): [True: 0, False: 1.28k]
  ------------------
 2038|      0|          assert(curEnv && "invalid environment relative level");
 2039|      0|          curEnv = curEnv->getParentEnvironment(runtime);
 2040|      0|        }
 2041|  1.28k|        O1REG(GetEnvironment) = HermesValue::encodeObjectValue(curEnv);
  ------------------
  |  |   31|  1.28k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.57k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2042|  1.28k|        ip = NEXTINST(GetEnvironment);
  ------------------
  |  |   59|  1.28k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2043|  1.28k|        DISPATCH;
  ------------------
  |  | 1079|  1.28k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.28k|  {                                                                          \
  |  |  |  | 1052|  1.28k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.28k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.28k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.28k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.28k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.28k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.28k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.28k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.28k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.28k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.28k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.28k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.28k|  }
  |  |  ------------------
  |  | 1080|  1.28k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.28k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2044|  1.28k|      }
 2045|       |
 2046|    452|      CASE(CreateEnvironment) {
  ------------------
  |  | 1074|    452|#define CASE(name) case_##name:
  ------------------
 2047|    452|        tmpHandle = HermesValue::encodeObjectValueUnsafe(
 2048|    452|            FRAME.getCalleeClosureUnsafe()->getEnvironment(runtime));
  ------------------
  |  |   39|    452|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2049|       |
 2050|    452|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    452|  runtime.setCurrentIP(ip);           \
  |  |  931|    452|  decl = (expr);                      \
  |  |  932|    452|  ip = runtime.getCurrentIP();        \
  |  |  933|    452|  runtime.invalidateCurrentIP();
  ------------------
 2051|    452|            HermesValue envHV,
 2052|    452|            Environment::create(
 2053|    452|                runtime,
 2054|    452|                Handle<Environment>::vmcast_or_null(tmpHandle),
 2055|    452|                curCodeBlock->getEnvironmentSize()));
 2056|       |
 2057|    452|        O1REG(CreateEnvironment) = envHV;
  ------------------
  |  |   31|    452|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    904|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2058|    452|#ifdef HERMES_ENABLE_DEBUGGER
 2059|    452|        FRAME.getDebugEnvironmentRef() = envHV;
  ------------------
  |  |   39|    904|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2060|    452|#endif
 2061|    452|        tmpHandle = HermesValue::encodeUndefinedValue();
 2062|    452|        ip = NEXTINST(CreateEnvironment);
  ------------------
  |  |   59|    452|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2063|    452|        DISPATCH;
  ------------------
  |  | 1079|    452|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    452|  {                                                                          \
  |  |  |  | 1052|    452|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    452|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    452|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    452|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    452|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    452|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    452|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    452|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    452|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    452|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    452|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    452|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    452|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    452|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    452|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    452|  }
  |  |  ------------------
  |  | 1080|    452|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    452|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2064|    452|      }
 2065|       |
 2066|  3.47k|      CASE(StoreToEnvironment) {
  ------------------
  |  | 1074|  3.47k|#define CASE(name) case_##name:
  ------------------
 2067|  3.47k|        vmcast<Environment>(O1REG(StoreToEnvironment))
  ------------------
  |  |   31|  3.47k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  3.47k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2068|  3.47k|            ->slot(ip->iStoreToEnvironment.op2)
 2069|  3.47k|            .set(O3REG(StoreToEnvironment), runtime.getHeap());
  ------------------
  |  |   33|  3.47k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|  3.47k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2070|  3.47k|        ip = NEXTINST(StoreToEnvironment);
  ------------------
  |  |   59|  3.47k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2071|  3.47k|        DISPATCH;
  ------------------
  |  | 1079|  3.47k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  3.47k|  {                                                                          \
  |  |  |  | 1052|  3.47k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  3.47k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.47k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  3.47k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  3.47k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.47k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  3.47k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.47k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  3.47k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  3.47k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  3.47k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.47k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  3.47k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  3.47k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  3.47k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  3.47k|  }
  |  |  ------------------
  |  | 1080|  3.47k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  3.47k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2072|  3.47k|      }
 2073|      0|      CASE(StoreToEnvironmentL) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2074|      0|        vmcast<Environment>(O1REG(StoreToEnvironmentL))
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2075|      0|            ->slot(ip->iStoreToEnvironmentL.op2)
 2076|      0|            .set(O3REG(StoreToEnvironmentL), runtime.getHeap());
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2077|      0|        ip = NEXTINST(StoreToEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2078|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2079|      0|      }
 2080|       |
 2081|    198|      CASE(StoreNPToEnvironment) {
  ------------------
  |  | 1074|    198|#define CASE(name) case_##name:
  ------------------
 2082|    198|        vmcast<Environment>(O1REG(StoreNPToEnvironment))
  ------------------
  |  |   31|    198|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    198|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2083|    198|            ->slot(ip->iStoreNPToEnvironment.op2)
 2084|    198|            .setNonPtr(O3REG(StoreNPToEnvironment), runtime.getHeap());
  ------------------
  |  |   33|    198|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    198|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2085|    198|        ip = NEXTINST(StoreNPToEnvironment);
  ------------------
  |  |   59|    198|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2086|    198|        DISPATCH;
  ------------------
  |  | 1079|    198|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    198|  {                                                                          \
  |  |  |  | 1052|    198|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    198|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    198|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    198|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    198|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    198|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    198|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    198|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    198|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    198|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    198|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    198|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    198|  }
  |  |  ------------------
  |  | 1080|    198|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    198|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2087|    198|      }
 2088|      0|      CASE(StoreNPToEnvironmentL) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2089|      0|        vmcast<Environment>(O1REG(StoreNPToEnvironmentL))
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2090|      0|            ->slot(ip->iStoreNPToEnvironmentL.op2)
 2091|      0|            .setNonPtr(O3REG(StoreNPToEnvironmentL), runtime.getHeap());
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2092|      0|        ip = NEXTINST(StoreNPToEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2093|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2094|      0|      }
 2095|       |
 2096|  1.38k|      CASE(LoadFromEnvironment) {
  ------------------
  |  | 1074|  1.38k|#define CASE(name) case_##name:
  ------------------
 2097|  1.38k|        O1REG(LoadFromEnvironment) =
  ------------------
  |  |   31|  1.38k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.77k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2098|  1.38k|            vmcast<Environment>(O2REG(LoadFromEnvironment))
  ------------------
  |  |   32|  1.38k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  1.38k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2099|  1.38k|                ->slot(ip->iLoadFromEnvironment.op3);
 2100|  1.38k|        ip = NEXTINST(LoadFromEnvironment);
  ------------------
  |  |   59|  1.38k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2101|  1.38k|        DISPATCH;
  ------------------
  |  | 1079|  1.38k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.38k|  {                                                                          \
  |  |  |  | 1052|  1.38k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.38k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.38k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.38k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.38k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.38k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.38k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.38k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.38k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.38k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.38k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.38k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.38k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.38k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.38k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.38k|  }
  |  |  ------------------
  |  | 1080|  1.38k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.38k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2102|  1.38k|      }
 2103|       |
 2104|      0|      CASE(LoadFromEnvironmentL) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2105|      0|        O1REG(LoadFromEnvironmentL) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2106|      0|            vmcast<Environment>(O2REG(LoadFromEnvironmentL))
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2107|      0|                ->slot(ip->iLoadFromEnvironmentL.op3);
 2108|      0|        ip = NEXTINST(LoadFromEnvironmentL);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2109|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2110|      0|      }
 2111|       |
 2112|    326|      CASE(GetGlobalObject) {
  ------------------
  |  | 1074|    326|#define CASE(name) case_##name:
  ------------------
 2113|    326|        O1REG(GetGlobalObject) = runtime.global_;
  ------------------
  |  |   31|    326|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    652|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2114|    326|        ip = NEXTINST(GetGlobalObject);
  ------------------
  |  |   59|    326|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2115|    326|        DISPATCH;
  ------------------
  |  | 1079|    326|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    326|  {                                                                          \
  |  |  |  | 1052|    326|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    326|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    326|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    326|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    326|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    326|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    326|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    326|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    326|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    326|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    326|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    326|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    326|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    326|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    326|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    326|  }
  |  |  ------------------
  |  | 1080|    326|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    326|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2116|    326|      }
 2117|       |
 2118|      5|      CASE(GetNewTarget) {
  ------------------
  |  | 1074|      5|#define CASE(name) case_##name:
  ------------------
 2119|      5|        O1REG(GetNewTarget) = FRAME.getNewTargetRef();
  ------------------
  |  |   31|      5|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     10|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(GetNewTarget) = FRAME.getNewTargetRef();
  ------------------
  |  |   39|      5|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2120|      5|        ip = NEXTINST(GetNewTarget);
  ------------------
  |  |   59|      5|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2121|      5|        DISPATCH;
  ------------------
  |  | 1079|      5|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      5|  {                                                                          \
  |  |  |  | 1052|      5|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      5|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      5|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      5|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      5|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      5|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      5|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      5|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      5|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      5|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      5|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      5|  }
  |  |  ------------------
  |  | 1080|      5|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      5|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2122|      5|      }
 2123|       |
 2124|      2|      CASE(DeclareGlobalVar) {
  ------------------
  |  | 1074|      2|#define CASE(name) case_##name:
  ------------------
 2125|      2|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      2|  runtime.setCurrentIP(ip);           \
  |  |  931|      2|  decl = (expr);                      \
  |  |  932|      2|  ip = runtime.getCurrentIP();        \
  |  |  933|      2|  runtime.invalidateCurrentIP();
  ------------------
 2126|      2|            auto res, declareGlobalVarImpl(runtime, curCodeBlock, ip));
 2127|      2|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 2128|      0|          goto exception;
 2129|      0|        }
 2130|      2|        ip = NEXTINST(DeclareGlobalVar);
  ------------------
  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2131|      2|        DISPATCH;
  ------------------
  |  | 1079|      2|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      2|  {                                                                          \
  |  |  |  | 1052|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      2|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      2|  }
  |  |  ------------------
  |  | 1080|      2|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2132|      2|      }
 2133|       |
 2134|      0|      CASE(TryGetByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2135|      0|        tryProp = true;
 2136|      0|        idVal = ip->iTryGetByIdLong.op4;
 2137|      0|        nextIP = NEXTINST(TryGetByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2138|      0|        goto getById;
 2139|      2|      }
 2140|      0|      CASE(GetByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2141|      0|        tryProp = false;
 2142|      0|        idVal = ip->iGetByIdLong.op4;
 2143|      0|        nextIP = NEXTINST(GetByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2144|      0|        goto getById;
 2145|      2|      }
 2146|  2.29k|      CASE(GetByIdShort) {
  ------------------
  |  | 1074|  2.29k|#define CASE(name) case_##name:
  ------------------
 2147|  2.29k|        tryProp = false;
 2148|  2.29k|        idVal = ip->iGetByIdShort.op4;
 2149|  2.29k|        nextIP = NEXTINST(GetByIdShort);
  ------------------
  |  |   59|  2.29k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2150|  2.29k|        goto getById;
 2151|      2|      }
 2152|  1.18k|      CASE(TryGetById) {
  ------------------
  |  | 1074|  1.18k|#define CASE(name) case_##name:
  ------------------
 2153|  1.18k|        tryProp = true;
 2154|  1.18k|        idVal = ip->iTryGetById.op4;
 2155|  1.18k|        nextIP = NEXTINST(TryGetById);
  ------------------
  |  |   59|  1.18k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2156|  1.18k|        goto getById;
 2157|      2|      }
 2158|      0|      CASE(GetById) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2159|      0|        tryProp = false;
 2160|      0|        idVal = ip->iGetById.op4;
 2161|      0|        nextIP = NEXTINST(GetById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2162|      0|      }
 2163|  3.47k|    getById : {
 2164|  3.47k|      ++NumGetById;
 2165|       |      // NOTE: it is safe to use OnREG(GetById) here because all instructions
 2166|       |      // have the same layout: opcode, registers, non-register operands, i.e.
 2167|       |      // they only differ in the width of the last "identifier" field.
 2168|  3.47k|      if (LLVM_LIKELY(O2REG(GetById).isObject())) {
  ------------------
  |  |  188|  3.47k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.46k, False: 14]
  |  |  ------------------
  ------------------
 2169|  3.46k|        auto *obj = vmcast<JSObject>(O2REG(GetById));
  ------------------
  |  |   32|  3.46k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  3.46k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2170|  3.46k|        auto cacheIdx = ip->iGetById.op3;
 2171|  3.46k|        auto *cacheEntry = curCodeBlock->getReadCacheEntry(cacheIdx);
 2172|       |
 2173|       |#ifdef HERMESVM_PROFILER_BB
 2174|       |        {
 2175|       |          HERMES_SLOW_ASSERT(
 2176|       |              gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2177|       |              "unaccounted handles were created");
 2178|       |          auto objHandle = runtime.makeHandle(obj);
 2179|       |          auto cacheHCPtr = vmcast_or_null<HiddenClass>(static_cast<GCCell *>(
 2180|       |              cacheEntry->clazz.get(runtime, runtime.getHeap())));
 2181|       |          CAPTURE_IP(runtime.recordHiddenClass(
 2182|       |              curCodeBlock, ip, ID(idVal), obj->getClass(runtime), cacheHCPtr));
 2183|       |          // obj may be moved by GC due to recordHiddenClass
 2184|       |          obj = objHandle.get();
 2185|       |        }
 2186|       |        gcScope.flushToSmallCount(KEEP_HANDLES);
 2187|       |#endif
 2188|  3.46k|        CompressedPointer clazzPtr{obj->getClassGCPtr()};
 2189|  3.46k|#ifndef NDEBUG
 2190|  3.46k|        if (vmcast<HiddenClass>(clazzPtr.getNonNull(runtime))->isDictionary())
  ------------------
  |  Branch (2190:13): [True: 0, False: 3.46k]
  ------------------
 2191|      0|          ++NumGetByIdDict;
 2192|       |#else
 2193|       |        (void)NumGetByIdDict;
 2194|       |#endif
 2195|       |
 2196|       |        // If we have a cache hit, reuse the cached offset and immediately
 2197|       |        // return the property.
 2198|  3.46k|        if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|  3.46k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.35k, False: 2.11k]
  |  |  ------------------
  ------------------
 2199|  1.35k|          ++NumGetByIdCacheHits;
 2200|  1.35k|          CAPTURE_IP(
  ------------------
  |  |  923|  1.35k|  runtime.setCurrentIP(ip);    \
  |  |  924|  1.35k|  (void)(expr);                \
  |  |  925|  1.35k|  ip = runtime.getCurrentIP(); \
  |  |  926|  1.35k|  runtime.invalidateCurrentIP();
  ------------------
 2201|  1.35k|              O1REG(GetById) =
 2202|  1.35k|                  JSObject::getNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
 2203|  1.35k|                      obj, runtime, cacheEntry->slot)
 2204|  1.35k|                      .unboxToHV(runtime));
 2205|  1.35k|          ip = nextIP;
 2206|  1.35k|          DISPATCH;
  ------------------
  |  | 1079|  1.35k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.35k|  {                                                                          \
  |  |  |  | 1052|  1.35k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.35k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.35k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.35k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.35k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.35k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.35k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.35k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.35k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.35k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.35k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.35k|  }
  |  |  ------------------
  |  | 1080|  1.35k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.35k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2207|  1.35k|        }
 2208|  3.46k|        auto id = ID(idVal);
  ------------------
  |  |   49|  3.46k|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
 2209|  3.46k|        NamedPropertyDescriptor desc;
 2210|  3.46k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  3.46k|  runtime.setCurrentIP(ip);           \
  |  |  931|  3.46k|  decl = (expr);                      \
  |  |  932|  3.46k|  ip = runtime.getCurrentIP();        \
  |  |  933|  3.46k|  runtime.invalidateCurrentIP();
  ------------------
 2211|  3.46k|            OptValue<bool> fastPathResult,
 2212|  3.46k|            JSObject::tryGetOwnNamedDescriptorFast(obj, runtime, id, desc));
 2213|  3.46k|        if (LLVM_LIKELY(
  ------------------
  |  |  188|  6.92k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.89k, False: 1.56k]
  |  |  |  Branch (188:51): [True: 1.91k, False: 1.54k]
  |  |  |  Branch (188:51): [True: 1.89k, False: 20]
  |  |  ------------------
  ------------------
 2214|  3.46k|                fastPathResult.hasValue() && fastPathResult.getValue()) &&
 2215|  3.46k|            !desc.flags.accessor) {
  ------------------
  |  Branch (2215:13): [True: 1.89k, False: 0]
  ------------------
 2216|  1.89k|          ++NumGetByIdFastPaths;
 2217|       |
 2218|       |          // cacheIdx == 0 indicates no caching so don't update the cache in
 2219|       |          // those cases.
 2220|  1.89k|          HiddenClass *clazz =
 2221|  1.89k|              vmcast<HiddenClass>(clazzPtr.getNonNull(runtime));
 2222|  1.89k|          if (LLVM_LIKELY(!clazz->isDictionaryNoCache()) &&
  ------------------
  |  |  188|  3.78k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.89k, False: 0]
  |  |  ------------------
  ------------------
 2223|  1.89k|              LLVM_LIKELY(cacheIdx != hbc::PROPERTY_CACHING_DISABLED)) {
  ------------------
  |  |  188|  1.89k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.89k, False: 0]
  |  |  ------------------
  ------------------
 2224|  1.89k|#ifdef HERMES_SLOW_DEBUG
 2225|  1.89k|            if (cacheEntry->clazz && cacheEntry->clazz != clazzPtr)
  ------------------
  |  Branch (2225:17): [True: 396, False: 1.49k]
  |  Branch (2225:38): [True: 396, False: 0]
  ------------------
 2226|    396|              ++NumGetByIdCacheEvicts;
 2227|       |#else
 2228|       |            (void)NumGetByIdCacheEvicts;
 2229|       |#endif
 2230|       |            // Cache the class, id and property slot.
 2231|  1.89k|            cacheEntry->clazz = clazzPtr;
 2232|  1.89k|            cacheEntry->slot = desc.slot;
 2233|  1.89k|          }
 2234|       |
 2235|  1.89k|          assert(
 2236|  1.89k|              !obj->isProxyObject() &&
 2237|  1.89k|              "tryGetOwnNamedDescriptorFast returned true on Proxy");
 2238|  1.89k|          CAPTURE_IP(
  ------------------
  |  |  923|  1.89k|  runtime.setCurrentIP(ip);    \
  |  |  924|  1.89k|  (void)(expr);                \
  |  |  925|  1.89k|  ip = runtime.getCurrentIP(); \
  |  |  926|  1.89k|  runtime.invalidateCurrentIP();
  ------------------
 2239|  1.89k|              O1REG(GetById) =
 2240|  1.89k|                  JSObject::getNamedSlotValueUnsafe(obj, runtime, desc)
 2241|  1.89k|                      .unboxToHV(runtime));
 2242|  1.89k|          ip = nextIP;
 2243|  1.89k|          DISPATCH;
  ------------------
  |  | 1079|  1.89k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.89k|  {                                                                          \
  |  |  |  | 1052|  1.89k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.89k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.89k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.89k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.89k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.89k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.89k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.89k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.89k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.89k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.89k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.89k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.89k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.89k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.89k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.89k|  }
  |  |  ------------------
  |  | 1080|  1.89k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.89k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2244|  1.89k|        }
 2245|       |
 2246|       |        // The cache may also be populated via the prototype of the object.
 2247|       |        // This value is only reliable if the fast path was a definite
 2248|       |        // not-found.
 2249|  3.46k|        if (fastPathResult.hasValue() && !fastPathResult.getValue() &&
  ------------------
  |  Branch (2249:13): [True: 20, False: 3.44k]
  |  Branch (2249:42): [True: 20, False: 0]
  ------------------
 2250|  3.46k|            LLVM_LIKELY(!obj->isProxyObject())) {
  ------------------
  |  |  188|     20|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 20, False: 0]
  |  |  ------------------
  ------------------
 2251|     20|          CAPTURE_IP_ASSIGN(JSObject * parent, obj->getParent(runtime));
  ------------------
  |  |  930|     20|  runtime.setCurrentIP(ip);           \
  |  |  931|     20|  decl = (expr);                      \
  |  |  932|     20|  ip = runtime.getCurrentIP();        \
  |  |  933|     20|  runtime.invalidateCurrentIP();
  ------------------
 2252|       |          // TODO: This isLazy check is because a lazy object is reported as
 2253|       |          // having no properties and therefore cannot contain the property.
 2254|       |          // This check does not belong here, it should be merged into
 2255|       |          // tryGetOwnNamedDescriptorFast().
 2256|     20|          if (parent && cacheEntry->clazz == parent->getClassGCPtr() &&
  ------------------
  |  Branch (2256:15): [True: 20, False: 0]
  |  Branch (2256:25): [True: 0, False: 20]
  ------------------
 2257|     20|              LLVM_LIKELY(!obj->isLazy())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2258|      0|            ++NumGetByIdProtoHits;
 2259|       |            // We've already checked that this isn't a Proxy.
 2260|      0|            CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2261|      0|                O1REG(GetById) = JSObject::getNamedSlotValueUnsafe(
 2262|      0|                                     parent, runtime, cacheEntry->slot)
 2263|      0|                                     .unboxToHV(runtime));
 2264|      0|            ip = nextIP;
 2265|      0|            DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2266|      0|          }
 2267|     20|        }
 2268|       |
 2269|  3.46k|#ifdef HERMES_SLOW_DEBUG
 2270|       |        // Call to getNamedDescriptorUnsafe is safe because `id` is kept alive
 2271|       |        // by the IdentifierTable.
 2272|  3.46k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  3.46k|  runtime.setCurrentIP(ip);           \
  |  |  931|  3.46k|  decl = (expr);                      \
  |  |  932|  3.46k|  ip = runtime.getCurrentIP();        \
  |  |  933|  3.46k|  runtime.invalidateCurrentIP();
  ------------------
 2273|  3.46k|            JSObject * propObj,
 2274|  3.46k|            JSObject::getNamedDescriptorUnsafe(
 2275|  3.46k|                Handle<JSObject>::vmcast(&O2REG(GetById)), runtime, id, desc));
 2276|  3.46k|        if (propObj) {
  ------------------
  |  Branch (2276:13): [True: 198, False: 3.26k]
  ------------------
 2277|    198|          if (desc.flags.accessor)
  ------------------
  |  Branch (2277:15): [True: 0, False: 198]
  ------------------
 2278|      0|            ++NumGetByIdAccessor;
 2279|    198|          else if (propObj != vmcast<JSObject>(O2REG(GetById)))
  ------------------
  |  |   32|    198|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    198|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2279:20): [True: 99, False: 99]
  ------------------
 2280|     99|            ++NumGetByIdProto;
 2281|  3.26k|        } else {
 2282|  3.26k|          ++NumGetByIdNotFound;
 2283|  3.26k|        }
 2284|       |#else
 2285|       |        (void)NumGetByIdAccessor;
 2286|       |        (void)NumGetByIdProto;
 2287|       |        (void)NumGetByIdNotFound;
 2288|       |#endif
 2289|  3.46k|#ifdef HERMES_SLOW_DEBUG
 2290|  3.46k|        auto *savedClass = cacheIdx != hbc::PROPERTY_CACHING_DISABLED
  ------------------
  |  Branch (2290:28): [True: 218, False: 3.24k]
  ------------------
 2291|  3.46k|            ? cacheEntry->clazz.get(runtime, runtime.getHeap())
 2292|  3.46k|            : nullptr;
 2293|  3.46k|#endif
 2294|  3.46k|        ++NumGetByIdSlow;
 2295|  3.46k|        CAPTURE_IP(
  ------------------
  |  |  923|  3.46k|  runtime.setCurrentIP(ip);    \
  |  |  924|  13.8k|  (void)(expr);                \
  |  |  ------------------
  |  |  |  Branch (924:10): [True: 198, False: 3.26k]
  |  |  |  Branch (924:10): [True: 218, False: 3.24k]
  |  |  ------------------
  |  |  925|  3.46k|  ip = runtime.getCurrentIP(); \
  |  |  926|  3.46k|  runtime.invalidateCurrentIP();
  ------------------
 2296|  3.46k|            resPH = JSObject::getNamed_RJS(
 2297|  3.46k|                Handle<JSObject>::vmcast(&O2REG(GetById)),
 2298|  3.46k|                runtime,
 2299|  3.46k|                id,
 2300|  3.46k|                !tryProp ? defaultPropOpFlags
 2301|  3.46k|                         : defaultPropOpFlags.plusMustExist(),
 2302|  3.46k|                cacheIdx != hbc::PROPERTY_CACHING_DISABLED ? cacheEntry
 2303|  3.46k|                                                           : nullptr));
 2304|  3.46k|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  3.46k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 20, False: 3.44k]
  |  |  ------------------
  ------------------
 2305|     20|          goto exception;
 2306|     20|        }
 2307|  3.44k|#ifdef HERMES_SLOW_DEBUG
 2308|  3.44k|        if (cacheIdx != hbc::PROPERTY_CACHING_DISABLED && savedClass &&
  ------------------
  |  Branch (2308:13): [True: 198, False: 3.24k]
  |  Branch (2308:59): [True: 0, False: 198]
  ------------------
 2309|  3.44k|            cacheEntry->clazz.get(runtime, runtime.getHeap()) != savedClass) {
  ------------------
  |  Branch (2309:13): [True: 0, False: 0]
  ------------------
 2310|      0|          ++NumGetByIdCacheEvicts;
 2311|      0|        }
 2312|  3.44k|#endif
 2313|  3.44k|      } else {
 2314|     14|        ++NumGetByIdTransient;
 2315|     14|        assert(!tryProp && "TryGetById can only be used on the global object");
 2316|       |        /* Slow path. */
 2317|     14|        CAPTURE_IP(
  ------------------
  |  |  923|     14|  runtime.setCurrentIP(ip);    \
  |  |  924|     14|  (void)(expr);                \
  |  |  925|     14|  ip = runtime.getCurrentIP(); \
  |  |  926|     14|  runtime.invalidateCurrentIP();
  ------------------
 2318|     14|            resPH = Interpreter::getByIdTransient_RJS(
 2319|     14|                runtime, Handle<>(&O2REG(GetById)), ID(idVal)));
 2320|     14|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     14|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 14]
  |  |  ------------------
  ------------------
 2321|      0|          goto exception;
 2322|      0|        }
 2323|     14|      }
 2324|  3.45k|      O1REG(GetById) = resPH->get();
  ------------------
  |  |   31|  3.45k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  6.91k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2325|  3.45k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2326|  3.45k|      ip = nextIP;
 2327|  3.45k|      DISPATCH;
  ------------------
  |  | 1079|  3.45k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  3.45k|  {                                                                          \
  |  |  |  | 1052|  3.45k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  3.45k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.45k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  3.45k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  3.45k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.45k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  3.45k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.45k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  3.45k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  3.45k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  3.45k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.45k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  3.45k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  3.45k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  3.45k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  3.45k|  }
  |  |  ------------------
  |  | 1080|  3.45k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  3.45k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2328|  3.45k|    }
 2329|       |
 2330|      0|      CASE(TryPutByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2331|      0|        tryProp = true;
 2332|      0|        idVal = ip->iTryPutByIdLong.op4;
 2333|      0|        nextIP = NEXTINST(TryPutByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2334|      0|        goto putById;
 2335|  3.45k|      }
 2336|      0|      CASE(PutByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2337|      0|        tryProp = false;
 2338|      0|        idVal = ip->iPutByIdLong.op4;
 2339|      0|        nextIP = NEXTINST(PutByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2340|      0|        goto putById;
 2341|  3.45k|      }
 2342|      0|      CASE(TryPutById) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2343|      0|        tryProp = true;
 2344|      0|        idVal = ip->iTryPutById.op4;
 2345|      0|        nextIP = NEXTINST(TryPutById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2346|      0|        goto putById;
 2347|  3.45k|      }
 2348|  5.71k|      CASE(PutById) {
  ------------------
  |  | 1074|  5.71k|#define CASE(name) case_##name:
  ------------------
 2349|  5.71k|        tryProp = false;
 2350|  5.71k|        idVal = ip->iPutById.op4;
 2351|  5.71k|        nextIP = NEXTINST(PutById);
  ------------------
  |  |   59|  5.71k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2352|  5.71k|      }
 2353|  5.71k|    putById : {
 2354|  5.71k|      ++NumPutById;
 2355|  5.71k|      if (LLVM_LIKELY(O1REG(PutById).isObject())) {
  ------------------
  |  |  188|  5.71k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 5.71k, False: 0]
  |  |  ------------------
  ------------------
 2356|  5.71k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  5.71k|  runtime.setCurrentIP(ip);           \
  |  |  931|  5.71k|  decl = (expr);                      \
  |  |  932|  5.71k|  ip = runtime.getCurrentIP();        \
  |  |  933|  5.71k|  runtime.invalidateCurrentIP();
  ------------------
 2357|  5.71k|            SmallHermesValue shv,
 2358|  5.71k|            SmallHermesValue::encodeHermesValue(O2REG(PutById), runtime));
 2359|  5.71k|        auto *obj = vmcast<JSObject>(O1REG(PutById));
  ------------------
  |  |   31|  5.71k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  5.71k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2360|  5.71k|        auto cacheIdx = ip->iPutById.op3;
 2361|  5.71k|        auto *cacheEntry = curCodeBlock->getWriteCacheEntry(cacheIdx);
 2362|       |
 2363|       |#ifdef HERMESVM_PROFILER_BB
 2364|       |        {
 2365|       |          HERMES_SLOW_ASSERT(
 2366|       |              gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2367|       |              "unaccounted handles were created");
 2368|       |          auto shvHandle = runtime.makeHandle(shv.toHV(runtime));
 2369|       |          auto objHandle = runtime.makeHandle(obj);
 2370|       |          auto cacheHCPtr = vmcast_or_null<HiddenClass>(static_cast<GCCell *>(
 2371|       |              cacheEntry->clazz.get(runtime, runtime.getHeap())));
 2372|       |          CAPTURE_IP(runtime.recordHiddenClass(
 2373|       |              curCodeBlock, ip, ID(idVal), obj->getClass(runtime), cacheHCPtr));
 2374|       |          // shv/obj may be invalidated by recordHiddenClass
 2375|       |          if (shv.isPointer())
 2376|       |            shv.unsafeUpdatePointer(
 2377|       |                static_cast<GCCell *>(shvHandle->getPointer()), runtime);
 2378|       |          obj = objHandle.get();
 2379|       |        }
 2380|       |        gcScope.flushToSmallCount(KEEP_HANDLES);
 2381|       |#endif
 2382|  5.71k|        CompressedPointer clazzPtr{obj->getClassGCPtr()};
 2383|       |        // If we have a cache hit, reuse the cached offset and immediately
 2384|       |        // return the property.
 2385|  5.71k|        if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|  5.71k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.75k, False: 3.96k]
  |  |  ------------------
  ------------------
 2386|  1.75k|          ++NumPutByIdCacheHits;
 2387|  1.75k|          CAPTURE_IP(
  ------------------
  |  |  923|  1.75k|  runtime.setCurrentIP(ip);    \
  |  |  924|  1.75k|  (void)(expr);                \
  |  |  925|  1.75k|  ip = runtime.getCurrentIP(); \
  |  |  926|  1.75k|  runtime.invalidateCurrentIP();
  ------------------
 2388|  1.75k|              JSObject::setNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
 2389|  1.75k|                  obj, runtime, cacheEntry->slot, shv));
 2390|  1.75k|          ip = nextIP;
 2391|  1.75k|          DISPATCH;
  ------------------
  |  | 1079|  1.75k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.75k|  {                                                                          \
  |  |  |  | 1052|  1.75k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.75k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.75k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.75k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.75k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.75k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.75k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.75k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.75k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.75k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.75k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.75k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.75k|  }
  |  |  ------------------
  |  | 1080|  1.75k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.75k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2392|  1.75k|        }
 2393|  5.71k|        auto id = ID(idVal);
  ------------------
  |  |   49|  5.71k|  (curCodeBlock->getRuntimeModule()->getSymbolIDMustExist(stringID))
  ------------------
 2394|  5.71k|        NamedPropertyDescriptor desc;
 2395|  5.71k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  5.71k|  runtime.setCurrentIP(ip);           \
  |  |  931|  5.71k|  decl = (expr);                      \
  |  |  932|  5.71k|  ip = runtime.getCurrentIP();        \
  |  |  933|  5.71k|  runtime.invalidateCurrentIP();
  ------------------
 2396|  5.71k|            OptValue<bool> hasOwnProp,
 2397|  5.71k|            JSObject::tryGetOwnNamedDescriptorFast(obj, runtime, id, desc));
 2398|  5.71k|        if (LLVM_LIKELY(hasOwnProp.hasValue() && hasOwnProp.getValue()) &&
  ------------------
  |  |  188|  11.4k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 200, False: 5.51k]
  |  |  |  Branch (188:51): [True: 2.27k, False: 3.43k]
  |  |  |  Branch (188:51): [True: 200, False: 2.07k]
  |  |  ------------------
  ------------------
 2399|  5.71k|            !desc.flags.accessor && desc.flags.writable &&
  ------------------
  |  Branch (2399:13): [True: 200, False: 0]
  |  Branch (2399:37): [True: 200, False: 0]
  ------------------
 2400|  5.71k|            !desc.flags.internalSetter) {
  ------------------
  |  Branch (2400:13): [True: 200, False: 0]
  ------------------
 2401|    200|          ++NumPutByIdFastPaths;
 2402|       |
 2403|       |          // cacheIdx == 0 indicates no caching so don't update the cache in
 2404|       |          // those cases.
 2405|    200|          HiddenClass *clazz =
 2406|    200|              vmcast<HiddenClass>(clazzPtr.getNonNull(runtime));
 2407|    200|          if (LLVM_LIKELY(!clazz->isDictionary()) &&
  ------------------
  |  |  188|    400|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 200, False: 0]
  |  |  ------------------
  ------------------
 2408|    200|              LLVM_LIKELY(cacheIdx != hbc::PROPERTY_CACHING_DISABLED)) {
  ------------------
  |  |  188|    200|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 200, False: 0]
  |  |  ------------------
  ------------------
 2409|    200|#ifdef HERMES_SLOW_DEBUG
 2410|    200|            if (cacheEntry->clazz && cacheEntry->clazz != clazzPtr)
  ------------------
  |  Branch (2410:17): [True: 0, False: 200]
  |  Branch (2410:38): [True: 0, False: 0]
  ------------------
 2411|      0|              ++NumPutByIdCacheEvicts;
 2412|       |#else
 2413|       |            (void)NumPutByIdCacheEvicts;
 2414|       |#endif
 2415|       |            // Cache the class and property slot.
 2416|    200|            cacheEntry->clazz = clazzPtr;
 2417|    200|            cacheEntry->slot = desc.slot;
 2418|    200|          }
 2419|       |
 2420|       |          // This must be valid because an own property was already found.
 2421|    200|          CAPTURE_IP(
  ------------------
  |  |  923|    200|  runtime.setCurrentIP(ip);    \
  |  |  924|    200|  (void)(expr);                \
  |  |  925|    200|  ip = runtime.getCurrentIP(); \
  |  |  926|    200|  runtime.invalidateCurrentIP();
  ------------------
 2422|    200|              JSObject::setNamedSlotValueUnsafe(obj, runtime, desc.slot, shv));
 2423|    200|          ip = nextIP;
 2424|    200|          DISPATCH;
  ------------------
  |  | 1079|    200|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    200|  {                                                                          \
  |  |  |  | 1052|    200|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    200|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    200|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    200|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    200|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    200|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    200|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    200|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    200|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    200|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    200|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    200|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    200|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    200|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    200|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    200|  }
  |  |  ------------------
  |  | 1080|    200|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    200|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2425|    200|        }
 2426|       |
 2427|  5.71k|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  5.71k|  runtime.setCurrentIP(ip);           \
  |  |  931|  11.4k|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (931:11): [True: 3.76k, False: 1.95k]
  |  |  ------------------
  |  |  932|  5.71k|  ip = runtime.getCurrentIP();        \
  |  |  933|  5.71k|  runtime.invalidateCurrentIP();
  ------------------
 2428|  5.71k|            auto putRes,
 2429|  5.71k|            JSObject::putNamed_RJS(
 2430|  5.71k|                Handle<JSObject>::vmcast(&O1REG(PutById)),
 2431|  5.71k|                runtime,
 2432|  5.71k|                id,
 2433|  5.71k|                Handle<>(&O2REG(PutById)),
 2434|  5.71k|                !tryProp ? defaultPropOpFlags
 2435|  5.71k|                         : defaultPropOpFlags.plusMustExist()));
 2436|  5.71k|        if (LLVM_UNLIKELY(putRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  5.71k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5.71k]
  |  |  ------------------
  ------------------
 2437|      0|          goto exception;
 2438|      0|        }
 2439|  5.71k|      } else {
 2440|      0|        ++NumPutByIdTransient;
 2441|      0|        assert(!tryProp && "TryPutById can only be used on the global object");
 2442|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2443|      0|            auto retStatus,
 2444|      0|            Interpreter::putByIdTransient_RJS(
 2445|      0|                runtime,
 2446|      0|                Handle<>(&O1REG(PutById)),
 2447|      0|                ID(idVal),
 2448|      0|                Handle<>(&O2REG(PutById)),
 2449|      0|                strictMode));
 2450|      0|        if (retStatus == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2450:13): [True: 0, False: 0]
  ------------------
 2451|      0|          goto exception;
 2452|      0|        }
 2453|      0|      }
 2454|  5.71k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2455|  5.71k|      ip = nextIP;
 2456|  5.71k|      DISPATCH;
  ------------------
  |  | 1079|  5.71k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  5.71k|  {                                                                          \
  |  |  |  | 1052|  5.71k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  5.71k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.71k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  5.71k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  5.71k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.71k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  5.71k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.71k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  5.71k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  5.71k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  5.71k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  5.71k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  5.71k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  5.71k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  5.71k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  5.71k|  }
  |  |  ------------------
  |  | 1080|  5.71k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  5.71k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2457|  5.71k|    }
 2458|       |
 2459|      0|      CASE(GetByVal) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2460|      0|        if (LLVM_LIKELY(O2REG(GetByVal).isObject())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2461|      0|          CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2462|      0|              resPH = JSObject::getComputed_RJS(
 2463|      0|                  Handle<JSObject>::vmcast(&O2REG(GetByVal)),
 2464|      0|                  runtime,
 2465|      0|                  Handle<>(&O3REG(GetByVal))));
 2466|      0|          if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2467|      0|            goto exception;
 2468|      0|          }
 2469|      0|        } else {
 2470|       |          // This is the "slow path".
 2471|      0|          CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2472|      0|              resPH = Interpreter::getByValTransient_RJS(
 2473|      0|                  runtime,
 2474|      0|                  Handle<>(&O2REG(GetByVal)),
 2475|      0|                  Handle<>(&O3REG(GetByVal))));
 2476|      0|          if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2477|      0|            goto exception;
 2478|      0|          }
 2479|      0|        }
 2480|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2481|      0|        O1REG(GetByVal) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2482|      0|        ip = NEXTINST(GetByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2483|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2484|      0|      }
 2485|       |
 2486|      0|      CASE(PutByVal) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2487|      0|        if (LLVM_LIKELY(O1REG(PutByVal).isObject())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2488|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2489|      0|              auto putRes,
 2490|      0|              JSObject::putComputed_RJS(
 2491|      0|                  Handle<JSObject>::vmcast(&O1REG(PutByVal)),
 2492|      0|                  runtime,
 2493|      0|                  Handle<>(&O2REG(PutByVal)),
 2494|      0|                  Handle<>(&O3REG(PutByVal)),
 2495|      0|                  defaultPropOpFlags));
 2496|      0|          if (LLVM_UNLIKELY(putRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2497|      0|            goto exception;
 2498|      0|          }
 2499|      0|        } else {
 2500|       |          // This is the "slow path".
 2501|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2502|      0|              auto retStatus,
 2503|      0|              Interpreter::putByValTransient_RJS(
 2504|      0|                  runtime,
 2505|      0|                  Handle<>(&O1REG(PutByVal)),
 2506|      0|                  Handle<>(&O2REG(PutByVal)),
 2507|      0|                  Handle<>(&O3REG(PutByVal)),
 2508|      0|                  strictMode));
 2509|      0|          if (LLVM_UNLIKELY(retStatus == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2510|      0|            goto exception;
 2511|      0|          }
 2512|      0|        }
 2513|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2514|      0|        ip = NEXTINST(PutByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2515|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2516|      0|      }
 2517|       |
 2518|   215k|      CASE(PutOwnByIndexL) {
  ------------------
  |  | 1074|   215k|#define CASE(name) case_##name:
  ------------------
 2519|   215k|        nextIP = NEXTINST(PutOwnByIndexL);
  ------------------
  |  |   59|   215k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2520|   215k|        idVal = ip->iPutOwnByIndexL.op3;
 2521|   215k|        goto putOwnByIndex;
 2522|      0|      }
 2523|  3.77k|      CASE(PutOwnByIndex) {
  ------------------
  |  | 1074|  3.77k|#define CASE(name) case_##name:
  ------------------
 2524|  3.77k|        nextIP = NEXTINST(PutOwnByIndex);
  ------------------
  |  |   59|  3.77k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2525|  3.77k|        idVal = ip->iPutOwnByIndex.op3;
 2526|  3.77k|      }
 2527|   219k|    putOwnByIndex : {
 2528|   219k|      tmpHandle = HermesValue::encodeDoubleValue(idVal);
 2529|   219k|      CAPTURE_IP(JSObject::defineOwnComputedPrimitive(
  ------------------
  |  |  923|   219k|  runtime.setCurrentIP(ip);    \
  |  |  924|   219k|  (void)(expr);                \
  |  |  925|   219k|  ip = runtime.getCurrentIP(); \
  |  |  926|   219k|  runtime.invalidateCurrentIP();
  ------------------
 2530|   219k|          Handle<JSObject>::vmcast(&O1REG(PutOwnByIndex)),
 2531|   219k|          runtime,
 2532|   219k|          tmpHandle,
 2533|   219k|          DefinePropertyFlags::getDefaultNewPropertyFlags(),
 2534|   219k|          Handle<>(&O2REG(PutOwnByIndex))));
 2535|   219k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 2536|   219k|      tmpHandle.clear();
 2537|   219k|      ip = nextIP;
 2538|   219k|      DISPATCH;
  ------------------
  |  | 1079|   219k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|   219k|  {                                                                          \
  |  |  |  | 1052|   219k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|   219k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   219k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|   219k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|   219k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   219k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|   219k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   219k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|   219k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|   219k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|   219k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|   219k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|   219k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|   219k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|   219k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|   219k|  }
  |  |  ------------------
  |  | 1080|   219k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|   219k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2539|   219k|    }
 2540|       |
 2541|   219k|      CASE_OUTOFLINE(GetPNameList);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 2542|       |
 2543|      0|      CASE(GetNextPName) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2544|      0|        {
 2545|      0|          assert(
 2546|      0|              vmisa<BigStorage>(O2REG(GetNextPName)) &&
 2547|      0|              "GetNextPName's second op must be BigStorage");
 2548|      0|          auto obj = Handle<JSObject>::vmcast(&O3REG(GetNextPName));
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2549|      0|          auto arr = Handle<BigStorage>::vmcast(&O2REG(GetNextPName));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2550|      0|          uint32_t idx = O4REG(GetNextPName).getNumber();
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2551|      0|          uint32_t size = O5REG(GetNextPName).getNumber();
  ------------------
  |  |   35|      0|#define O5REG(name) REG(ip->i##name.op5)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2552|      0|          MutableHandle<JSObject> propObj{runtime};
 2553|      0|          MutableHandle<SymbolID> tmpPropNameStorage{runtime};
 2554|       |          // Loop until we find a property which is present.
 2555|      0|          while (idx < size) {
  ------------------
  |  Branch (2555:18): [True: 0, False: 0]
  ------------------
 2556|      0|            tmpHandle = arr->at(runtime, idx);
 2557|      0|            ComputedPropertyDescriptor desc;
 2558|      0|            CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2559|      0|                ExecutionStatus status,
 2560|      0|                JSObject::getComputedPrimitiveDescriptor(
 2561|      0|                    obj,
 2562|      0|                    runtime,
 2563|      0|                    tmpHandle,
 2564|      0|                    propObj,
 2565|      0|                    tmpPropNameStorage,
 2566|      0|                    desc));
 2567|      0|            if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2568|      0|              goto exception;
 2569|      0|            }
 2570|      0|            if (LLVM_LIKELY(propObj))
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2571|      0|              break;
 2572|      0|            ++idx;
 2573|      0|          }
 2574|      0|          if (idx < size) {
  ------------------
  |  Branch (2574:15): [True: 0, False: 0]
  ------------------
 2575|       |            // We must return the property as a string
 2576|      0|            if (tmpHandle->isNumber()) {
  ------------------
  |  Branch (2576:17): [True: 0, False: 0]
  ------------------
 2577|      0|              CAPTURE_IP_ASSIGN(auto status, toString_RJS(runtime, tmpHandle));
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2578|      0|              assert(
 2579|      0|                  status == ExecutionStatus::RETURNED &&
 2580|      0|                  "toString on number cannot fail");
 2581|      0|              tmpHandle = status->getHermesValue();
 2582|      0|            }
 2583|      0|            O1REG(GetNextPName) = tmpHandle.get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2584|      0|            O4REG(GetNextPName) = HermesValue::encodeNumberValue(idx + 1);
  ------------------
  |  |   34|      0|#define O4REG(name) REG(ip->i##name.op4)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2585|      0|          } else {
 2586|      0|            O1REG(GetNextPName) = HermesValue::encodeUndefinedValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2587|      0|          }
 2588|      0|        }
 2589|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2590|      0|        tmpHandle.clear();
 2591|      0|        ip = NEXTINST(GetNextPName);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2592|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2593|      0|      }
 2594|       |
 2595|      2|      CASE(ToNumber) {
  ------------------
  |  | 1074|      2|#define CASE(name) case_##name:
  ------------------
 2596|      2|        if (LLVM_LIKELY(O2REG(ToNumber).isNumber())) {
  ------------------
  |  |  188|      2|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 2]
  |  |  ------------------
  ------------------
 2597|      0|          O1REG(ToNumber) = O2REG(ToNumber);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(ToNumber) = O2REG(ToNumber);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2598|      0|          ip = NEXTINST(ToNumber);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2599|      2|        } else {
 2600|      2|          CAPTURE_IP(res = toNumber_RJS(runtime, Handle<>(&O2REG(ToNumber))));
  ------------------
  |  |  923|      2|  runtime.setCurrentIP(ip);    \
  |  |  924|      2|  (void)(expr);                \
  |  |  925|      2|  ip = runtime.getCurrentIP(); \
  |  |  926|      2|  runtime.invalidateCurrentIP();
  ------------------
 2601|      2|          if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2601:15): [True: 0, False: 2]
  ------------------
 2602|      0|            goto exception;
 2603|      2|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2604|      2|          O1REG(ToNumber) = res.getValue();
  ------------------
  |  |   31|      2|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      4|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2605|      2|          ip = NEXTINST(ToNumber);
  ------------------
  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2606|      2|        }
 2607|      4|        DISPATCH;
  ------------------
  |  | 1079|      2|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      2|  {                                                                          \
  |  |  |  | 1052|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      2|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      2|  }
  |  |  ------------------
  |  | 1080|      2|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2608|      4|      }
 2609|       |
 2610|      0|      CASE(ToNumeric) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2611|      0|        if (LLVM_LIKELY(O2REG(ToNumeric).isNumber())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2612|      0|          O1REG(ToNumeric) = O2REG(ToNumeric);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(ToNumeric) = O2REG(ToNumeric);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2613|      0|          ip = NEXTINST(ToNumeric);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2614|      0|        } else {
 2615|      0|          CAPTURE_IP(res = toNumeric_RJS(runtime, Handle<>(&O2REG(ToNumeric))));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2616|      0|          if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2616:15): [True: 0, False: 0]
  ------------------
 2617|      0|            goto exception;
 2618|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2619|      0|          O1REG(ToNumeric) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2620|      0|          ip = NEXTINST(ToNumeric);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2621|      0|        }
 2622|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2623|      0|      }
 2624|       |
 2625|      0|      CASE(ToInt32) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2626|      0|        CAPTURE_IP(res = toInt32_RJS(runtime, Handle<>(&O2REG(ToInt32))));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2627|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2628|      0|          goto exception;
 2629|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2630|      0|        O1REG(ToInt32) = res.getValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2631|      0|        ip = NEXTINST(ToInt32);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2632|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2633|      0|      }
 2634|       |
 2635|      0|      CASE(AddEmptyString) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2636|      0|        if (LLVM_LIKELY(O2REG(AddEmptyString).isString())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2637|      0|          O1REG(AddEmptyString) = O2REG(AddEmptyString);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                        O1REG(AddEmptyString) = O2REG(AddEmptyString);
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2638|      0|          ip = NEXTINST(AddEmptyString);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2639|      0|        } else {
 2640|      0|          CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2641|      0|              res = toPrimitive_RJS(
 2642|      0|                  runtime,
 2643|      0|                  Handle<>(&O2REG(AddEmptyString)),
 2644|      0|                  PreferredType::NONE));
 2645|      0|          if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2646|      0|            goto exception;
 2647|      0|          tmpHandle = res.getValue();
 2648|      0|          CAPTURE_IP_ASSIGN(auto strRes, toString_RJS(runtime, tmpHandle));
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2649|      0|          if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2650|      0|            goto exception;
 2651|      0|          tmpHandle.clear();
 2652|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 2653|      0|          O1REG(AddEmptyString) = strRes->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2654|      0|          ip = NEXTINST(AddEmptyString);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2655|      0|        }
 2656|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2657|      0|      }
 2658|       |
 2659|      0|      CASE(Jmp) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2660|      0|        ip = IPADD(ip->iJmp.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2661|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2662|      0|      }
 2663|      0|      CASE(JmpLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2664|      0|        ip = IPADD(ip->iJmpLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2665|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2666|      0|      }
 2667|    105|      CASE(JmpTrue) {
  ------------------
  |  | 1074|    105|#define CASE(name) case_##name:
  ------------------
 2668|    105|        if (toBoolean(O2REG(JmpTrue)))
  ------------------
  |  |   32|    105|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|    105|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2668:13): [True: 99, False: 6]
  ------------------
 2669|     99|          ip = IPADD(ip->iJmpTrue.op1);
  ------------------
  |  |   52|     99|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2670|      6|        else
 2671|      6|          ip = NEXTINST(JmpTrue);
  ------------------
  |  |   59|      6|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2672|    105|        DISPATCH;
  ------------------
  |  | 1079|    105|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    105|  {                                                                          \
  |  |  |  | 1052|    105|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    105|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    105|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    105|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    105|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    105|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    105|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    105|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    105|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    105|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    105|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    105|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    105|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    105|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    105|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    105|  }
  |  |  ------------------
  |  | 1080|    105|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    105|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2673|    105|      }
 2674|      3|      CASE(JmpTrueLong) {
  ------------------
  |  | 1074|      3|#define CASE(name) case_##name:
  ------------------
 2675|      3|        if (toBoolean(O2REG(JmpTrueLong)))
  ------------------
  |  |   32|      3|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      3|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2675:13): [True: 0, False: 3]
  ------------------
 2676|      0|          ip = IPADD(ip->iJmpTrueLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2677|      3|        else
 2678|      3|          ip = NEXTINST(JmpTrueLong);
  ------------------
  |  |   59|      3|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2679|      3|        DISPATCH;
  ------------------
  |  | 1079|      3|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      3|  {                                                                          \
  |  |  |  | 1052|      3|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      3|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      3|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      3|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      3|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      3|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      3|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      3|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      3|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      3|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      3|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      3|  }
  |  |  ------------------
  |  | 1080|      3|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      3|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2680|      3|      }
 2681|     99|      CASE(JmpFalse) {
  ------------------
  |  | 1074|     99|#define CASE(name) case_##name:
  ------------------
 2682|     99|        if (!toBoolean(O2REG(JmpFalse)))
  ------------------
  |  |   32|     99|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|     99|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2682:13): [True: 0, False: 99]
  ------------------
 2683|      0|          ip = IPADD(ip->iJmpFalse.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2684|     99|        else
 2685|     99|          ip = NEXTINST(JmpFalse);
  ------------------
  |  |   59|     99|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2686|     99|        DISPATCH;
  ------------------
  |  | 1079|     99|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|     99|  {                                                                          \
  |  |  |  | 1052|     99|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|     99|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|     99|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|     99|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|     99|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|     99|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|     99|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|     99|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     99|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|     99|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|     99|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|     99|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|     99|  }
  |  |  ------------------
  |  | 1080|     99|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|     99|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2687|     99|      }
 2688|      0|      CASE(JmpFalseLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2689|      0|        if (!toBoolean(O2REG(JmpFalseLong)))
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2689:13): [True: 0, False: 0]
  ------------------
 2690|      0|          ip = IPADD(ip->iJmpFalseLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2691|      0|        else
 2692|      0|          ip = NEXTINST(JmpFalseLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2693|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2694|      0|      }
 2695|      0|      CASE(JmpUndefined) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2696|      0|        if (O2REG(JmpUndefined).isUndefined())
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2696:13): [True: 0, False: 0]
  ------------------
 2697|      0|          ip = IPADD(ip->iJmpUndefined.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2698|      0|        else
 2699|      0|          ip = NEXTINST(JmpUndefined);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2700|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2701|      0|      }
 2702|      0|      CASE(JmpUndefinedLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2703|      0|        if (O2REG(JmpUndefinedLong).isUndefined())
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2703:13): [True: 0, False: 0]
  ------------------
 2704|      0|          ip = IPADD(ip->iJmpUndefinedLong.op1);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 2705|      0|        else
 2706|      0|          ip = NEXTINST(JmpUndefinedLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2707|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2708|      0|      }
 2709|      0|      INCDECOP(Inc)
  ------------------
  |  | 1180|      0|  CASE(name) {                                                                \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1181|      0|    if (LLVM_LIKELY(O2REG(name).isNumber())) {                                \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1182|      0|      O1REG(name) =                                                           \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1183|      0|          HermesValue::encodeDoubleValue(do##name(O2REG(name).getNumber()));  \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1184|      0|      ip = NEXTINST(name);                                                    \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1185|      0|      DISPATCH;                                                               \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1186|      0|    }                                                                         \
  |  | 1187|      0|    CAPTURE_IP(                                                               \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1188|      0|        res =                                                                 \
  |  | 1189|      0|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
  |  | 1190|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                   \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1191|      0|      goto exception;                                                         \
  |  | 1192|      0|    }                                                                         \
  |  | 1193|      0|    O1REG(name) = *res;                                                       \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1194|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
  |  | 1195|      0|    ip = NEXTINST(name);                                                      \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1196|      0|    DISPATCH;                                                                 \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1197|      0|  }
  ------------------
 2710|      0|      INCDECOP(Dec)
  ------------------
  |  | 1180|      0|  CASE(name) {                                                                \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1181|      0|    if (LLVM_LIKELY(O2REG(name).isNumber())) {                                \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1182|      0|      O1REG(name) =                                                           \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1183|      0|          HermesValue::encodeDoubleValue(do##name(O2REG(name).getNumber()));  \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1184|      0|      ip = NEXTINST(name);                                                    \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1185|      0|      DISPATCH;                                                               \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1186|      0|    }                                                                         \
  |  | 1187|      0|    CAPTURE_IP(                                                               \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1188|      0|        res =                                                                 \
  |  | 1189|      0|            doIncDecOperSlowPath<do##name>(runtime, Handle<>(&O2REG(name)))); \
  |  | 1190|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                   \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1191|      0|      goto exception;                                                         \
  |  | 1192|      0|    }                                                                         \
  |  | 1193|      0|    O1REG(name) = *res;                                                       \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1194|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                  \
  |  | 1195|      0|    ip = NEXTINST(name);                                                      \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1196|      0|    DISPATCH;                                                                 \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1197|      0|  }
  ------------------
 2711|  1.01k|      CASE(Add) {
  ------------------
  |  | 1074|  1.01k|#define CASE(name) case_##name:
  ------------------
 2712|  1.01k|        if (LLVM_LIKELY(
  ------------------
  |  |  188|  1.01k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 1.01k]
  |  |  |  Branch (188:51): [True: 3, False: 1.01k]
  |  |  |  Branch (188:51): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2713|  1.01k|                O2REG(Add).isNumber() &&
 2714|  1.01k|                O3REG(Add).isNumber())) { /* Fast-path. */
 2715|      0|          CASE(AddN) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2716|      0|            O1REG(Add) = HermesValue::encodeDoubleValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2717|      0|                O2REG(Add).getNumber() + O3REG(Add).getNumber());
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                              O2REG(Add).getNumber() + O3REG(Add).getNumber());
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2718|      0|            ip = NEXTINST(Add);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2719|      0|            DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2720|      0|          }
 2721|      0|        }
 2722|  1.01k|        CAPTURE_IP(
  ------------------
  |  |  923|  1.01k|  runtime.setCurrentIP(ip);    \
  |  |  924|  1.01k|  (void)(expr);                \
  |  |  925|  1.01k|  ip = runtime.getCurrentIP(); \
  |  |  926|  1.01k|  runtime.invalidateCurrentIP();
  ------------------
 2723|  1.01k|            res = addOp_RJS(
 2724|  1.01k|                runtime, Handle<>(&O2REG(Add)), Handle<>(&O3REG(Add))));
 2725|  1.01k|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2725:13): [True: 0, False: 1.01k]
  ------------------
 2726|      0|          goto exception;
 2727|      0|        }
 2728|  1.01k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2729|  1.01k|        O1REG(Add) = res.getValue();
  ------------------
  |  |   31|  1.01k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  2.03k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2730|  1.01k|        ip = NEXTINST(Add);
  ------------------
  |  |   59|  1.01k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2731|  1.01k|        DISPATCH;
  ------------------
  |  | 1079|  1.01k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.01k|  {                                                                          \
  |  |  |  | 1052|  1.01k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.01k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.01k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.01k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.01k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.01k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.01k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.01k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.01k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.01k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.01k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.01k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.01k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.01k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.01k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.01k|  }
  |  |  ------------------
  |  | 1080|  1.01k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.01k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2732|  1.01k|      }
 2733|       |
 2734|      3|      CASE(BitNot) {
  ------------------
  |  | 1074|      3|#define CASE(name) case_##name:
  ------------------
 2735|      3|        if (LLVM_LIKELY(O2REG(BitNot).isNumber())) { /* Fast-path. */
  ------------------
  |  |  188|      3|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2736|      0|          O1REG(BitNot) = HermesValue::encodeDoubleValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2737|      0|              ~hermes::truncateToInt32(O2REG(BitNot).getNumber()));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2738|      0|          ip = NEXTINST(BitNot);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2739|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2740|      0|        }
 2741|      3|        CAPTURE_IP(res = doBitNotSlowPath(runtime, Handle<>(&O2REG(BitNot))));
  ------------------
  |  |  923|      3|  runtime.setCurrentIP(ip);    \
  |  |  924|      3|  (void)(expr);                \
  |  |  925|      3|  ip = runtime.getCurrentIP(); \
  |  |  926|      3|  runtime.invalidateCurrentIP();
  ------------------
 2742|      3|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2742:13): [True: 0, False: 3]
  ------------------
 2743|      0|          goto exception;
 2744|      0|        }
 2745|      3|        O1REG(BitNot) = *res;
  ------------------
  |  |   31|      3|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      6|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2746|      3|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2747|      3|        ip = NEXTINST(BitNot);
  ------------------
  |  |   59|      3|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2748|      3|        DISPATCH;
  ------------------
  |  | 1079|      3|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      3|  {                                                                          \
  |  |  |  | 1052|      3|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      3|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      3|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      3|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      3|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      3|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      3|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      3|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      3|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      3|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      3|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      3|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      3|  }
  |  |  ------------------
  |  | 1080|      3|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      3|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2749|      3|      }
 2750|       |
 2751|      0|      CASE(GetArgumentsLength) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2752|       |        // If the arguments object hasn't been created yet.
 2753|      0|        if (O2REG(GetArgumentsLength).isUndefined()) {
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2753:13): [True: 0, False: 0]
  ------------------
 2754|      0|          O1REG(GetArgumentsLength) =
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2755|      0|              HermesValue::encodeNumberValue(FRAME.getArgCount());
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2756|      0|          ip = NEXTINST(GetArgumentsLength);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2757|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2758|      0|        }
 2759|       |        // The arguments object has been created, so this is a regular property
 2760|       |        // get.
 2761|      0|        assert(
 2762|      0|            O2REG(GetArgumentsLength).isObject() &&
 2763|      0|            "arguments lazy register is not an object");
 2764|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2765|      0|            resPH = JSObject::getNamed_RJS(
 2766|      0|                Handle<JSObject>::vmcast(&O2REG(GetArgumentsLength)),
 2767|      0|                runtime,
 2768|      0|                Predefined::getSymbolID(Predefined::length)));
 2769|      0|        if (resPH == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2769:13): [True: 0, False: 0]
  ------------------
 2770|      0|          goto exception;
 2771|      0|        }
 2772|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2773|      0|        O1REG(GetArgumentsLength) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2774|      0|        ip = NEXTINST(GetArgumentsLength);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2775|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2776|      0|      }
 2777|       |
 2778|      0|      CASE(GetArgumentsPropByVal) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2779|       |        // If the arguments object hasn't been created yet and we have a
 2780|       |        // valid integer index, we use the fast path.
 2781|      0|        if (O3REG(GetArgumentsPropByVal).isUndefined()) {
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2781:13): [True: 0, False: 0]
  ------------------
 2782|       |          // If this is an integer index.
 2783|      0|          if (auto index = toArrayIndexFastPath(O2REG(GetArgumentsPropByVal))) {
  ------------------
  |  Branch (2783:20): [True: 0, False: 0]
  ------------------
 2784|       |            // Is this an existing argument?
 2785|      0|            if (*index < FRAME.getArgCount()) {
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
  |  Branch (2785:17): [True: 0, False: 0]
  ------------------
 2786|      0|              O1REG(GetArgumentsPropByVal) = FRAME.getArgRef(*index);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                            O1REG(GetArgumentsPropByVal) = FRAME.getArgRef(*index);
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 2787|      0|              ip = NEXTINST(GetArgumentsPropByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2788|      0|              DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2789|      0|            }
 2790|      0|          }
 2791|      0|        }
 2792|       |        // Slow path.
 2793|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2794|      0|            auto res,
 2795|      0|            getArgumentsPropByValSlowPath_RJS(
 2796|      0|                runtime,
 2797|      0|                &O3REG(GetArgumentsPropByVal),
 2798|      0|                &O2REG(GetArgumentsPropByVal),
 2799|      0|                FRAME.getCalleeClosureHandleUnsafe(),
 2800|      0|                strictMode));
 2801|      0|        if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2801:13): [True: 0, False: 0]
  ------------------
 2802|      0|          goto exception;
 2803|      0|        }
 2804|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2805|      0|        O1REG(GetArgumentsPropByVal) = res->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2806|      0|        ip = NEXTINST(GetArgumentsPropByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2807|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2808|      0|      }
 2809|       |
 2810|      0|      CASE(ReifyArguments) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2811|       |        // If the arguments object was already created, do nothing.
 2812|      0|        if (!O1REG(ReifyArguments).isUndefined()) {
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2812:13): [True: 0, False: 0]
  ------------------
 2813|      0|          assert(
 2814|      0|              O1REG(ReifyArguments).isObject() &&
 2815|      0|              "arguments lazy register is not an object");
 2816|      0|          ip = NEXTINST(ReifyArguments);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2817|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2818|      0|        }
 2819|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2820|      0|            resArgs = reifyArgumentsSlowPath(
 2821|      0|                runtime, FRAME.getCalleeClosureHandleUnsafe(), strictMode));
 2822|      0|        if (LLVM_UNLIKELY(resArgs == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2823|      0|          goto exception;
 2824|      0|        }
 2825|      0|        O1REG(ReifyArguments) = resArgs->getHermesValue();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2826|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2827|      0|        ip = NEXTINST(ReifyArguments);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2828|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2829|      0|      }
 2830|       |
 2831|  4.55k|      CASE(NewObject) {
  ------------------
  |  | 1074|  4.55k|#define CASE(name) case_##name:
  ------------------
 2832|       |        // Create a new object using the built-in constructor. Note that the
 2833|       |        // built-in constructor is empty, so we don't actually need to call
 2834|       |        // it.
 2835|  4.55k|        CAPTURE_IP(
  ------------------
  |  |  923|  4.55k|  runtime.setCurrentIP(ip);    \
  |  |  924|  4.55k|  (void)(expr);                \
  |  |  925|  4.55k|  ip = runtime.getCurrentIP(); \
  |  |  926|  4.55k|  runtime.invalidateCurrentIP();
  ------------------
 2836|  4.55k|            O1REG(NewObject) = JSObject::create(runtime).getHermesValue());
 2837|  4.55k|        assert(
 2838|  4.55k|            gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2839|  4.55k|            "Should not create handles.");
 2840|  4.55k|        ip = NEXTINST(NewObject);
  ------------------
  |  |   59|  4.55k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2841|  4.55k|        DISPATCH;
  ------------------
  |  | 1079|  4.55k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  4.55k|  {                                                                          \
  |  |  |  | 1052|  4.55k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  4.55k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.55k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  4.55k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  4.55k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.55k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  4.55k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.55k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  4.55k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  4.55k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  4.55k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.55k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  4.55k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  4.55k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  4.55k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  4.55k|  }
  |  |  ------------------
  |  | 1080|  4.55k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  4.55k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2842|  4.55k|      }
 2843|      0|      CASE(NewObjectWithParent) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2844|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  ------------------
  |  |  |  Branch (924:10): [True: 0, False: 0]
  |  |  |  Branch (924:10): [True: 0, False: 0]
  |  |  ------------------
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2845|      0|            O1REG(NewObjectWithParent) =
 2846|      0|                JSObject::create(
 2847|      0|                    runtime,
 2848|      0|                    O2REG(NewObjectWithParent).isObject()
 2849|      0|                        ? Handle<JSObject>::vmcast(&O2REG(NewObjectWithParent))
 2850|      0|                        : O2REG(NewObjectWithParent).isNull()
 2851|      0|                        ? Runtime::makeNullHandle<JSObject>()
 2852|      0|                        : Handle<JSObject>::vmcast(&runtime.objectPrototype))
 2853|      0|                    .getHermesValue());
 2854|      0|        assert(
 2855|      0|            gcScope.getHandleCountDbg() == KEEP_HANDLES &&
 2856|      0|            "Should not create handles.");
 2857|      0|        ip = NEXTINST(NewObjectWithParent);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2858|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2859|      0|      }
 2860|       |
 2861|    877|      CASE(NewObjectWithBuffer) {
  ------------------
  |  | 1074|    877|#define CASE(name) case_##name:
  ------------------
 2862|    877|        CAPTURE_IP(
  ------------------
  |  |  923|    877|  runtime.setCurrentIP(ip);    \
  |  |  924|    877|  (void)(expr);                \
  |  |  925|    877|  ip = runtime.getCurrentIP(); \
  |  |  926|    877|  runtime.invalidateCurrentIP();
  ------------------
 2863|    877|            resPH = Interpreter::createObjectFromBuffer(
 2864|    877|                runtime,
 2865|    877|                curCodeBlock,
 2866|    877|                ip->iNewObjectWithBuffer.op3,
 2867|    877|                ip->iNewObjectWithBuffer.op4,
 2868|    877|                ip->iNewObjectWithBuffer.op5));
 2869|    877|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    877|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 877]
  |  |  ------------------
  ------------------
 2870|      0|          goto exception;
 2871|      0|        }
 2872|    877|        O1REG(NewObjectWithBuffer) = resPH->get();
  ------------------
  |  |   31|    877|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.75k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2873|    877|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2874|    877|        ip = NEXTINST(NewObjectWithBuffer);
  ------------------
  |  |   59|    877|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2875|    877|        DISPATCH;
  ------------------
  |  | 1079|    877|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    877|  {                                                                          \
  |  |  |  | 1052|    877|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    877|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    877|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    877|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    877|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    877|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    877|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    877|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    877|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    877|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    877|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    877|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    877|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    877|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    877|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    877|  }
  |  |  ------------------
  |  | 1080|    877|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    877|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2876|    877|      }
 2877|       |
 2878|      0|      CASE(NewObjectWithBufferLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2879|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2880|      0|            resPH = Interpreter::createObjectFromBuffer(
 2881|      0|                runtime,
 2882|      0|                curCodeBlock,
 2883|      0|                ip->iNewObjectWithBufferLong.op3,
 2884|      0|                ip->iNewObjectWithBufferLong.op4,
 2885|      0|                ip->iNewObjectWithBufferLong.op5));
 2886|      0|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2887|      0|          goto exception;
 2888|      0|        }
 2889|      0|        O1REG(NewObjectWithBufferLong) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2890|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2891|      0|        ip = NEXTINST(NewObjectWithBufferLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2892|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2893|      0|      }
 2894|       |
 2895|  12.3k|      CASE(NewArray) {
  ------------------
  |  | 1074|  12.3k|#define CASE(name) case_##name:
  ------------------
 2896|       |        // Create a new array using the built-in constructor. Note that the
 2897|       |        // built-in constructor is empty, so we don't actually need to call
 2898|       |        // it.
 2899|  12.3k|        {
 2900|  12.3k|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  12.3k|  runtime.setCurrentIP(ip);           \
  |  |  931|  12.3k|  decl = (expr);                      \
  |  |  932|  12.3k|  ip = runtime.getCurrentIP();        \
  |  |  933|  12.3k|  runtime.invalidateCurrentIP();
  ------------------
 2901|  12.3k|              auto createRes,
 2902|  12.3k|              JSArray::create(runtime, ip->iNewArray.op2, ip->iNewArray.op2));
 2903|  12.3k|          if (createRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2903:15): [True: 0, False: 12.3k]
  ------------------
 2904|      0|            goto exception;
 2905|      0|          }
 2906|  12.3k|          O1REG(NewArray) = createRes->getHermesValue();
  ------------------
  |  |   31|  12.3k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  24.7k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2907|  12.3k|        }
 2908|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2909|  12.3k|        ip = NEXTINST(NewArray);
  ------------------
  |  |   59|  12.3k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2910|  12.3k|        DISPATCH;
  ------------------
  |  | 1079|  12.3k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  12.3k|  {                                                                          \
  |  |  |  | 1052|  12.3k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  12.3k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  12.3k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  12.3k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  12.3k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  12.3k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  12.3k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  12.3k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  12.3k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  12.3k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  12.3k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  12.3k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  12.3k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  12.3k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  12.3k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  12.3k|  }
  |  |  ------------------
  |  | 1080|  12.3k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  12.3k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2911|  12.3k|      }
 2912|       |
 2913|  10.9k|      CASE(NewArrayWithBuffer) {
  ------------------
  |  | 1074|  10.9k|#define CASE(name) case_##name:
  ------------------
 2914|  10.9k|        CAPTURE_IP(
  ------------------
  |  |  923|  10.9k|  runtime.setCurrentIP(ip);    \
  |  |  924|  10.9k|  (void)(expr);                \
  |  |  925|  10.9k|  ip = runtime.getCurrentIP(); \
  |  |  926|  10.9k|  runtime.invalidateCurrentIP();
  ------------------
 2915|  10.9k|            resPH = Interpreter::createArrayFromBuffer(
 2916|  10.9k|                runtime,
 2917|  10.9k|                curCodeBlock,
 2918|  10.9k|                ip->iNewArrayWithBuffer.op2,
 2919|  10.9k|                ip->iNewArrayWithBuffer.op3,
 2920|  10.9k|                ip->iNewArrayWithBuffer.op4));
 2921|  10.9k|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  10.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.9k]
  |  |  ------------------
  ------------------
 2922|      0|          goto exception;
 2923|      0|        }
 2924|  10.9k|        O1REG(NewArrayWithBuffer) = resPH->get();
  ------------------
  |  |   31|  10.9k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  21.8k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2925|  10.9k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2926|  10.9k|        tmpHandle.clear();
 2927|  10.9k|        ip = NEXTINST(NewArrayWithBuffer);
  ------------------
  |  |   59|  10.9k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2928|  10.9k|        DISPATCH;
  ------------------
  |  | 1079|  10.9k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  10.9k|  {                                                                          \
  |  |  |  | 1052|  10.9k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  10.9k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  10.9k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  10.9k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  10.9k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  10.9k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  10.9k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  10.9k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  10.9k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  10.9k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  10.9k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  10.9k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  10.9k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  10.9k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  10.9k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  10.9k|  }
  |  |  ------------------
  |  | 1080|  10.9k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  10.9k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2929|  10.9k|      }
 2930|       |
 2931|      0|      CASE(NewArrayWithBufferLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2932|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2933|      0|            resPH = Interpreter::createArrayFromBuffer(
 2934|      0|                runtime,
 2935|      0|                curCodeBlock,
 2936|      0|                ip->iNewArrayWithBufferLong.op2,
 2937|      0|                ip->iNewArrayWithBufferLong.op3,
 2938|      0|                ip->iNewArrayWithBufferLong.op4));
 2939|      0|        if (LLVM_UNLIKELY(resPH == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2940|      0|          goto exception;
 2941|      0|        }
 2942|      0|        O1REG(NewArrayWithBufferLong) = resPH->get();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2943|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2944|      0|        tmpHandle.clear();
 2945|      0|        ip = NEXTINST(NewArrayWithBufferLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2946|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2947|      0|      }
 2948|       |
 2949|    594|      CASE(CreateThis) {
  ------------------
  |  | 1074|    594|#define CASE(name) case_##name:
  ------------------
 2950|       |        // Registers: output, prototype, closure.
 2951|    594|        if (LLVM_UNLIKELY(!vmisa<Callable>(O3REG(CreateThis)))) {
  ------------------
  |  |  189|    594|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 594]
  |  |  ------------------
  ------------------
 2952|      0|          CAPTURE_IP(runtime.raiseTypeError("constructor is not callable"));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 2953|      0|          goto exception;
 2954|      0|        }
 2955|    594|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    594|  runtime.setCurrentIP(ip);           \
  |  |  931|  1.18k|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (931:11): [True: 594, False: 0]
  |  |  ------------------
  |  |  932|    594|  ip = runtime.getCurrentIP();        \
  |  |  933|    594|  runtime.invalidateCurrentIP();
  ------------------
 2956|    594|            auto res,
 2957|    594|            Callable::newObject(
 2958|    594|                Handle<Callable>::vmcast(&O3REG(CreateThis)),
 2959|    594|                runtime,
 2960|    594|                Handle<JSObject>::vmcast(
 2961|    594|                    O2REG(CreateThis).isObject() ? &O2REG(CreateThis)
 2962|    594|                                                 : &runtime.objectPrototype)));
 2963|    594|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    594|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 594]
  |  |  ------------------
  ------------------
 2964|      0|          goto exception;
 2965|      0|        }
 2966|    594|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2967|    594|        O1REG(CreateThis) = res->getHermesValue();
  ------------------
  |  |   31|    594|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.18k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2968|    594|        ip = NEXTINST(CreateThis);
  ------------------
  |  |   59|    594|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2969|    594|        DISPATCH;
  ------------------
  |  | 1079|    594|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    594|  {                                                                          \
  |  |  |  | 1052|    594|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    594|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    594|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    594|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    594|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    594|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    594|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    594|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    594|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    594|  }
  |  |  ------------------
  |  | 1080|    594|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    594|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2970|    594|      }
 2971|       |
 2972|    594|      CASE(SelectObject) {
  ------------------
  |  | 1074|    594|#define CASE(name) case_##name:
  ------------------
 2973|       |        // Registers: output, thisObject, constructorReturnValue.
 2974|    594|        O1REG(SelectObject) = O3REG(SelectObject).isObject()
  ------------------
  |  |   31|    594|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  1.18k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(SelectObject) = O3REG(SelectObject).isObject()
  ------------------
  |  |   33|    594|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|    594|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
  |  Branch (2974:31): [True: 0, False: 594]
  ------------------
 2975|    594|            ? O3REG(SelectObject)
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2976|    594|            : O2REG(SelectObject);
  ------------------
  |  |   32|    594|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  1.18k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2977|    594|        ip = NEXTINST(SelectObject);
  ------------------
  |  |   59|    594|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2978|    594|        DISPATCH;
  ------------------
  |  | 1079|    594|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    594|  {                                                                          \
  |  |  |  | 1052|    594|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    594|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    594|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    594|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    594|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    594|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    594|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    594|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    594|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    594|  }
  |  |  ------------------
  |  | 1080|    594|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    594|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2979|    594|      }
 2980|       |
 2981|      0|      CASE(Eq)
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2982|      0|      CASE(Neq) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2983|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 2984|      0|            auto eqRes,
 2985|      0|            abstractEqualityTest_RJS(
 2986|      0|                runtime, Handle<>(&O2REG(Eq)), Handle<>(&O3REG(Eq))));
 2987|      0|        if (eqRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (2987:13): [True: 0, False: 0]
  ------------------
 2988|      0|          goto exception;
 2989|      0|        }
 2990|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 2991|      0|        O1REG(Eq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2992|      0|            ip->opCode == OpCode::Eq ? *eqRes : !*eqRes);
  ------------------
  |  Branch (2992:13): [True: 0, False: 0]
  ------------------
 2993|      0|        ip = NEXTINST(Eq);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 2994|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 2995|      0|      }
 2996|      0|      CASE(StrictEq) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 2997|      0|        O1REG(StrictEq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2998|      0|            strictEqualityTest(O2REG(StrictEq), O3REG(StrictEq)));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                          strictEqualityTest(O2REG(StrictEq), O3REG(StrictEq)));
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 2999|      0|        ip = NEXTINST(StrictEq);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3000|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3001|      0|      }
 3002|      0|      CASE(StrictNeq) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3003|      0|        O1REG(StrictNeq) = HermesValue::encodeBoolValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3004|      0|            !strictEqualityTest(O2REG(StrictNeq), O3REG(StrictNeq)));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                          !strictEqualityTest(O2REG(StrictNeq), O3REG(StrictNeq)));
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3005|      0|        ip = NEXTINST(StrictNeq);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3006|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3007|      0|      }
 3008|      6|      CASE(Not) {
  ------------------
  |  | 1074|      6|#define CASE(name) case_##name:
  ------------------
 3009|      6|        O1REG(Not) = HermesValue::encodeBoolValue(!toBoolean(O2REG(Not)));
  ------------------
  |  |   31|      6|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|     12|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                      O1REG(Not) = HermesValue::encodeBoolValue(!toBoolean(O2REG(Not)));
  ------------------
  |  |   32|      6|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      6|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3010|      6|        ip = NEXTINST(Not);
  ------------------
  |  |   59|      6|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3011|      6|        DISPATCH;
  ------------------
  |  | 1079|      6|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      6|  {                                                                          \
  |  |  |  | 1052|      6|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      6|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      6|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      6|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      6|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      6|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      6|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      6|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      6|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      6|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      6|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      6|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      6|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      6|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      6|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      6|  }
  |  |  ------------------
  |  | 1080|      6|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      6|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3012|      6|      }
 3013|  3.98k|      CASE(Negate) {
  ------------------
  |  | 1074|  3.98k|#define CASE(name) case_##name:
  ------------------
 3014|  3.98k|        if (LLVM_LIKELY(O2REG(Negate).isNumber())) {
  ------------------
  |  |  188|  3.98k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 3.98k, False: 0]
  |  |  ------------------
  ------------------
 3015|  3.98k|          O1REG(Negate) =
  ------------------
  |  |   31|  3.98k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  7.96k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3016|  3.98k|              HermesValue::encodeDoubleValue(-O2REG(Negate).getNumber());
  ------------------
  |  |   32|  3.98k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|  3.98k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3017|  3.98k|          ip = NEXTINST(Negate);
  ------------------
  |  |   59|  3.98k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3018|  3.98k|          DISPATCH;
  ------------------
  |  | 1079|  3.98k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  3.98k|  {                                                                          \
  |  |  |  | 1052|  3.98k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  3.98k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  3.98k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  3.98k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  3.98k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  3.98k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  3.98k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  3.98k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  3.98k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  3.98k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  3.98k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  3.98k|  }
  |  |  ------------------
  |  | 1080|  3.98k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  3.98k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3019|  3.98k|        }
 3020|  3.98k|        CAPTURE_IP(res = doNegateSlowPath(runtime, Handle<>(&O2REG(Negate))));
  ------------------
  |  |  923|  3.98k|  runtime.setCurrentIP(ip);    \
  |  |  924|  3.98k|  (void)(expr);                \
  |  |  925|  3.98k|  ip = runtime.getCurrentIP(); \
  |  |  926|  3.98k|  runtime.invalidateCurrentIP();
  ------------------
 3021|  3.98k|        if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (3021:13): [True: 0, False: 3.98k]
  ------------------
 3022|      0|          goto exception;
 3023|  3.98k|        O1REG(Negate) = *res;
  ------------------
  |  |   31|  3.98k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|  7.96k|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3024|  3.98k|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3025|  3.98k|        ip = NEXTINST(Negate);
  ------------------
  |  |   59|  3.98k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3026|  3.98k|        DISPATCH;
  ------------------
  |  | 1079|  3.98k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  3.98k|  {                                                                          \
  |  |  |  | 1052|  3.98k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  3.98k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  3.98k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  3.98k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  3.98k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  3.98k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  3.98k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  3.98k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  3.98k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  3.98k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  3.98k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  3.98k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  3.98k|  }
  |  |  ------------------
  |  | 1080|  3.98k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  3.98k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3027|  3.98k|      }
 3028|  1.18k|      CASE(TypeOf) {
  ------------------
  |  | 1074|  1.18k|#define CASE(name) case_##name:
  ------------------
 3029|  1.18k|        CAPTURE_IP(O1REG(TypeOf) = typeOf(runtime, Handle<>(&O2REG(TypeOf))));
  ------------------
  |  |  923|  1.18k|  runtime.setCurrentIP(ip);    \
  |  |  924|  1.18k|  (void)(expr);                \
  |  |  925|  1.18k|  ip = runtime.getCurrentIP(); \
  |  |  926|  1.18k|  runtime.invalidateCurrentIP();
  ------------------
 3030|  1.18k|        ip = NEXTINST(TypeOf);
  ------------------
  |  |   59|  1.18k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3031|  1.18k|        DISPATCH;
  ------------------
  |  | 1079|  1.18k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  1.18k|  {                                                                          \
  |  |  |  | 1052|  1.18k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  1.18k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  1.18k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  1.18k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  1.18k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  1.18k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  1.18k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  1.18k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  1.18k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  1.18k|  }
  |  |  ------------------
  |  | 1080|  1.18k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  1.18k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3032|  1.18k|      }
 3033|      0|      CASE(Mod) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3034|      0|        if (LLVM_LIKELY(O2REG(Mod).isNumber() && O3REG(Mod).isNumber())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3035|       |          /* Fast-path. */
 3036|      0|          O1REG(Mod) = HermesValue::encodeDoubleValue(
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3037|      0|              doMod(O2REG(Mod).getNumber(), O3REG(Mod).getNumber()));
  ------------------
  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
                            doMod(O2REG(Mod).getNumber(), O3REG(Mod).getNumber()));
  ------------------
  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3038|      0|          ip = NEXTINST(Mod);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3039|      0|          DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3040|      0|        }
 3041|      0|        CAPTURE_IP(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3042|      0|            res = doOperSlowPath<doMod>(
 3043|      0|                runtime, Handle<>(&O2REG(Mod)), Handle<>(&O3REG(Mod))));
 3044|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3045|      0|          goto exception;
 3046|      0|        }
 3047|      0|        O1REG(Mod) = *res;
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3048|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3049|      0|        ip = NEXTINST(Mod);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3050|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3051|      0|      }
 3052|      0|      CASE(InstanceOf) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3053|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3054|      0|            auto result,
 3055|      0|            instanceOfOperator_RJS(
 3056|      0|                runtime,
 3057|      0|                Handle<>(&O2REG(InstanceOf)),
 3058|      0|                Handle<>(&O3REG(InstanceOf))));
 3059|      0|        if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3060|      0|          goto exception;
 3061|      0|        }
 3062|      0|        O1REG(InstanceOf) = HermesValue::encodeBoolValue(*result);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3063|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3064|      0|        ip = NEXTINST(InstanceOf);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3065|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3066|      0|      }
 3067|      0|      CASE(IsIn) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3068|      0|        {
 3069|      0|          if (LLVM_UNLIKELY(!O3REG(IsIn).isObject())) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3070|      0|            CAPTURE_IP(runtime.raiseTypeError(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3071|      0|                "right operand of 'in' is not an object"));
 3072|      0|            goto exception;
 3073|      0|          }
 3074|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3075|      0|              auto cr,
 3076|      0|              JSObject::hasComputed(
 3077|      0|                  Handle<JSObject>::vmcast(&O3REG(IsIn)),
 3078|      0|                  runtime,
 3079|      0|                  Handle<>(&O2REG(IsIn))));
 3080|      0|          if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (3080:15): [True: 0, False: 0]
  ------------------
 3081|      0|            goto exception;
 3082|      0|          }
 3083|      0|          O1REG(IsIn) = HermesValue::encodeBoolValue(*cr);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3084|      0|        }
 3085|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3086|      0|        ip = NEXTINST(IsIn);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3087|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3088|      0|      }
 3089|       |
 3090|  4.35k|      CASE(PutNewOwnByIdShort) {
  ------------------
  |  | 1074|  4.35k|#define CASE(name) case_##name:
  ------------------
 3091|  4.35k|        nextIP = NEXTINST(PutNewOwnByIdShort);
  ------------------
  |  |   59|  4.35k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3092|  4.35k|        idVal = ip->iPutNewOwnByIdShort.op3;
 3093|  4.35k|        goto putOwnById;
 3094|      0|      }
 3095|      0|      CASE(PutNewOwnNEByIdLong)
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3096|      0|      CASE(PutNewOwnByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3097|      0|        nextIP = NEXTINST(PutNewOwnByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3098|      0|        idVal = ip->iPutNewOwnByIdLong.op3;
 3099|      0|        goto putOwnById;
 3100|      0|      }
 3101|      0|      CASE(PutNewOwnNEById)
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3102|      0|      CASE(PutNewOwnById) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3103|      0|        nextIP = NEXTINST(PutNewOwnById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3104|      0|        idVal = ip->iPutNewOwnById.op3;
 3105|      0|      }
 3106|  4.35k|    putOwnById : {
 3107|  4.35k|      assert(
 3108|  4.35k|          O1REG(PutNewOwnById).isObject() &&
 3109|  4.35k|          "Object argument of PutNewOwnById must be an object");
 3110|  4.35k|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|  4.35k|  runtime.setCurrentIP(ip);           \
  |  |  931|  8.71k|  decl = (expr);                      \
  |  |  ------------------
  |  |  |  Branch (931:11): [True: 4.35k, False: 0]
  |  |  ------------------
  |  |  932|  4.35k|  ip = runtime.getCurrentIP();        \
  |  |  933|  4.35k|  runtime.invalidateCurrentIP();
  ------------------
 3111|  4.35k|          auto res,
 3112|  4.35k|          JSObject::defineNewOwnProperty(
 3113|  4.35k|              Handle<JSObject>::vmcast(&O1REG(PutNewOwnById)),
 3114|  4.35k|              runtime,
 3115|  4.35k|              ID(idVal),
 3116|  4.35k|              ip->opCode <= OpCode::PutNewOwnByIdLong
 3117|  4.35k|                  ? PropertyFlags::defaultNewNamedPropertyFlags()
 3118|  4.35k|                  : PropertyFlags::nonEnumerablePropertyFlags(),
 3119|  4.35k|              Handle<>(&O2REG(PutNewOwnById))));
 3120|  4.35k|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  4.35k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4.35k]
  |  |  ------------------
  ------------------
 3121|      0|        goto exception;
 3122|      0|      }
 3123|  4.35k|      gcScope.flushToSmallCount(KEEP_HANDLES);
 3124|  4.35k|      ip = nextIP;
 3125|  4.35k|      DISPATCH;
  ------------------
  |  | 1079|  4.35k|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|  4.35k|  {                                                                          \
  |  |  |  | 1052|  4.35k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|  4.35k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|  4.35k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|  4.35k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|  4.35k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|  4.35k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|  4.35k|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|  4.35k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|  4.35k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|  4.35k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|  4.35k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|  4.35k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|  4.35k|  }
  |  |  ------------------
  |  | 1080|  4.35k|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|  4.35k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3126|  4.35k|    }
 3127|       |
 3128|      0|      CASE(DelByIdLong) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3129|      0|        idVal = ip->iDelByIdLong.op3;
 3130|      0|        nextIP = NEXTINST(DelByIdLong);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3131|      0|        goto DelById;
 3132|  4.35k|      }
 3133|       |
 3134|      0|      CASE(DelById) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3135|      0|        idVal = ip->iDelById.op3;
 3136|      0|        nextIP = NEXTINST(DelById);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3137|      0|      }
 3138|      0|    DelById : {
 3139|      0|      if (LLVM_LIKELY(O2REG(DelById).isObject())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3140|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3141|      0|            auto status,
 3142|      0|            JSObject::deleteNamed(
 3143|      0|                Handle<JSObject>::vmcast(&O2REG(DelById)),
 3144|      0|                runtime,
 3145|      0|                ID(idVal),
 3146|      0|                defaultPropOpFlags));
 3147|      0|        if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3148|      0|          goto exception;
 3149|      0|        }
 3150|      0|        O1REG(DelById) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3151|      0|      } else {
 3152|       |        // This is the "slow path".
 3153|      0|        CAPTURE_IP(res = toObject(runtime, Handle<>(&O2REG(DelById))));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3154|      0|        if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3155|       |          // If an exception is thrown, likely we are trying to convert
 3156|       |          // undefined/null to an object. Passing over the name of the property
 3157|       |          // so that we could emit more meaningful error messages.
 3158|      0|          CAPTURE_IP(amendPropAccessErrorMsgWithPropName(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3159|      0|              runtime, Handle<>(&O2REG(DelById)), "delete", ID(idVal)));
 3160|      0|          goto exception;
 3161|      0|        }
 3162|      0|        tmpHandle = res.getValue();
 3163|      0|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3164|      0|            auto status,
 3165|      0|            JSObject::deleteNamed(
 3166|      0|                Handle<JSObject>::vmcast(tmpHandle),
 3167|      0|                runtime,
 3168|      0|                ID(idVal),
 3169|      0|                defaultPropOpFlags));
 3170|      0|        if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3171|      0|          goto exception;
 3172|      0|        }
 3173|      0|        O1REG(DelById) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3174|      0|        tmpHandle.clear();
 3175|      0|      }
 3176|      0|      gcScope.flushToSmallCount(KEEP_HANDLES);
 3177|      0|      ip = nextIP;
 3178|      0|      DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3179|      0|    }
 3180|       |
 3181|      0|      CASE(DelByVal) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3182|      0|        if (LLVM_LIKELY(O2REG(DelByVal).isObject())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3183|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3184|      0|              auto status,
 3185|      0|              JSObject::deleteComputed(
 3186|      0|                  Handle<JSObject>::vmcast(&O2REG(DelByVal)),
 3187|      0|                  runtime,
 3188|      0|                  Handle<>(&O3REG(DelByVal)),
 3189|      0|                  defaultPropOpFlags));
 3190|      0|          if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3191|      0|            goto exception;
 3192|      0|          }
 3193|      0|          O1REG(DelByVal) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3194|      0|        } else {
 3195|       |          // This is the "slow path".
 3196|      0|          CAPTURE_IP(res = toObject(runtime, Handle<>(&O2REG(DelByVal))));
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3197|      0|          if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3198|      0|            goto exception;
 3199|      0|          }
 3200|      0|          tmpHandle = res.getValue();
 3201|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3202|      0|              auto status,
 3203|      0|              JSObject::deleteComputed(
 3204|      0|                  Handle<JSObject>::vmcast(tmpHandle),
 3205|      0|                  runtime,
 3206|      0|                  Handle<>(&O3REG(DelByVal)),
 3207|      0|                  defaultPropOpFlags));
 3208|      0|          if (LLVM_UNLIKELY(status == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3209|      0|            goto exception;
 3210|      0|          }
 3211|      0|          O1REG(DelByVal) = HermesValue::encodeBoolValue(status.getValue());
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3212|      0|        }
 3213|      0|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3214|      0|        tmpHandle.clear();
 3215|      0|        ip = NEXTINST(DelByVal);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3216|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3217|      0|      }
 3218|    242|      CASE(CreateRegExp) {
  ------------------
  |  | 1074|    242|#define CASE(name) case_##name:
  ------------------
 3219|    242|        {
 3220|       |          // Create the RegExp object.
 3221|    242|          CAPTURE_IP(
  ------------------
  |  |  923|    242|  runtime.setCurrentIP(ip);    \
  |  |  924|    242|  (void)(expr);                \
  |  |  925|    242|  ip = runtime.getCurrentIP(); \
  |  |  926|    242|  runtime.invalidateCurrentIP();
  ------------------
 3222|    242|              O1REG(CreateRegExp) = JSRegExp::create(runtime).getHermesValue());
 3223|    242|          auto re = Handle<JSRegExp>::vmcast(&O1REG(CreateRegExp));
  ------------------
  |  |   31|    242|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|    242|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3224|       |          // Initialize the regexp.
 3225|    242|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    242|  runtime.setCurrentIP(ip);           \
  |  |  931|    242|  decl = (expr);                      \
  |  |  932|    242|  ip = runtime.getCurrentIP();        \
  |  |  933|    242|  runtime.invalidateCurrentIP();
  ------------------
 3226|    242|              auto pattern,
 3227|    242|              runtime.makeHandle(curCodeBlock->getRuntimeModule()
 3228|    242|                                     ->getStringPrimFromStringIDMayAllocate(
 3229|    242|                                         ip->iCreateRegExp.op2)));
 3230|    242|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    242|  runtime.setCurrentIP(ip);           \
  |  |  931|    242|  decl = (expr);                      \
  |  |  932|    242|  ip = runtime.getCurrentIP();        \
  |  |  933|    242|  runtime.invalidateCurrentIP();
  ------------------
 3231|    242|              auto flags,
 3232|    242|              runtime.makeHandle(curCodeBlock->getRuntimeModule()
 3233|    242|                                     ->getStringPrimFromStringIDMayAllocate(
 3234|    242|                                         ip->iCreateRegExp.op3)));
 3235|    242|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|    242|  runtime.setCurrentIP(ip);           \
  |  |  931|    242|  decl = (expr);                      \
  |  |  932|    242|  ip = runtime.getCurrentIP();        \
  |  |  933|    242|  runtime.invalidateCurrentIP();
  ------------------
 3236|    242|              auto bytecode,
 3237|    242|              curCodeBlock->getRuntimeModule()->getRegExpBytecodeFromRegExpID(
 3238|    242|                  ip->iCreateRegExp.op4));
 3239|    242|          CAPTURE_IP(
  ------------------
  |  |  923|    242|  runtime.setCurrentIP(ip);    \
  |  |  924|    242|  (void)(expr);                \
  |  |  925|    242|  ip = runtime.getCurrentIP(); \
  |  |  926|    242|  runtime.invalidateCurrentIP();
  ------------------
 3240|    242|              JSRegExp::initialize(re, runtime, pattern, flags, bytecode));
 3241|    242|        }
 3242|    242|        gcScope.flushToSmallCount(KEEP_HANDLES);
 3243|    242|        ip = NEXTINST(CreateRegExp);
  ------------------
  |  |   59|    242|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3244|    242|        DISPATCH;
  ------------------
  |  | 1079|    242|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|    242|  {                                                                          \
  |  |  |  | 1052|    242|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|    242|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    242|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|    242|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|    242|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    242|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|    242|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    242|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|    242|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|    242|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|    242|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|    242|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|    242|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|    242|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|    242|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|    242|  }
  |  |  ------------------
  |  | 1080|    242|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|    242|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3245|    242|      }
 3246|       |
 3247|      0|      CASE(SwitchImm) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3248|      0|        if (LLVM_LIKELY(O1REG(SwitchImm).isNumber())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3249|      0|          double numVal = O1REG(SwitchImm).getNumber();
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3250|      0|          uint32_t uintVal = (uint32_t)numVal;
 3251|      0|          if (LLVM_LIKELY(numVal == uintVal) && // Only integers.
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3252|      0|              LLVM_LIKELY(uintVal >= ip->iSwitchImm.op4) && // Bounds checking.
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3253|      0|              LLVM_LIKELY(uintVal <= ip->iSwitchImm.op5)) // Bounds checking.
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3254|      0|          {
 3255|       |            // Calculate the offset into the bytecode where the jump table for
 3256|       |            // this SwitchImm starts.
 3257|      0|            const uint8_t *tablestart = (const uint8_t *)llvh::alignAddr(
 3258|      0|                (const uint8_t *)ip + ip->iSwitchImm.op2, sizeof(uint32_t));
 3259|       |
 3260|       |            // Read the offset from the table.
 3261|       |            // Must be signed to account for backwards branching.
 3262|      0|            const int32_t *loc =
 3263|      0|                (const int32_t *)tablestart + uintVal - ip->iSwitchImm.op4;
 3264|       |
 3265|      0|            ip = IPADD(*loc);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3266|      0|            DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3267|      0|          }
 3268|      0|        }
 3269|       |        // Wrong type or out of range, jump to default.
 3270|      0|        ip = IPADD(ip->iSwitchImm.op3);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3271|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3272|      0|      }
 3273|  1.68k|      LOAD_CONST(
  ------------------
  |  | 1392|    842|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    842|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    842|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    842|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.68k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    842|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    842|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    842|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    842|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    842|  {                                                                          \
  |  |  |  |  |  | 1052|    842|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    842|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    842|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    842|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    842|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    842|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    842|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    842|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    842|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    842|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    842|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    842|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    842|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    842|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    842|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    842|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    842|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    842|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    842|  }
  ------------------
 3274|  1.68k|          LoadConstUInt8,
 3275|  1.68k|          HermesValue::encodeDoubleValue(ip->iLoadConstUInt8.op2));
 3276|  1.68k|      LOAD_CONST(
  ------------------
  |  | 1392|    131|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    131|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    131|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    131|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    262|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    131|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    131|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    131|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    131|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    131|  {                                                                          \
  |  |  |  |  |  | 1052|    131|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    131|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    131|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    131|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    131|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    131|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    131|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    131|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    131|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    131|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    131|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    131|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    131|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    131|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    131|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    131|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    131|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    131|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    131|  }
  ------------------
 3277|    262|          LoadConstInt, HermesValue::encodeDoubleValue(ip->iLoadConstInt.op2));
 3278|    262|      LOAD_CONST(
  ------------------
  |  | 1392|     80|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|     80|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|     80|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|     80|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    160|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|     80|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|     80|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|     80|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|     80|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|     80|  {                                                                          \
  |  |  |  |  |  | 1052|     80|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|     80|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     80|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|     80|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|     80|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     80|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|     80|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     80|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|     80|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|     80|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|     80|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|     80|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|     80|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|     80|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|     80|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|     80|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|     80|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|     80|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|     80|  }
  ------------------
 3279|    160|          LoadConstDouble,
 3280|    160|          HermesValue::encodeDoubleValue(ip->iLoadConstDouble.op2));
 3281|  2.99k|      LOAD_CONST_CAPTURE_IP(
  ------------------
  |  | 1399|  1.49k|  CASE(name) {                             \
  |  |  ------------------
  |  |  |  | 1074|  1.49k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1400|  1.49k|    CAPTURE_IP(O1REG(name) = value);       \
  |  |  ------------------
  |  |  |  |  923|  1.49k|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|  1.49k|  (void)(expr);                \
  |  |  |  |  925|  1.49k|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|  1.49k|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1401|  1.49k|    ip = NEXTINST(name);                   \
  |  |  ------------------
  |  |  |  |   59|  1.49k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1402|  1.49k|    DISPATCH;                              \
  |  |  ------------------
  |  |  |  | 1079|  1.49k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|  1.49k|  {                                                                          \
  |  |  |  |  |  | 1052|  1.49k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|  1.49k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.49k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|  1.49k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|  1.49k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.49k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|  1.49k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.49k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|  1.49k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|  1.49k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|  1.49k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.49k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|  1.49k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|  1.49k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|  1.49k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|  1.49k|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|  1.49k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|  1.49k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1403|  1.49k|  }
  ------------------
 3282|  2.99k|          LoadConstString,
 3283|  2.99k|          HermesValue::encodeStringValue(
 3284|  2.99k|              curCodeBlock->getRuntimeModule()
 3285|  2.99k|                  ->getStringPrimFromStringIDMayAllocate(
 3286|  2.99k|                      ip->iLoadConstString.op2)));
 3287|  2.99k|      LOAD_CONST_CAPTURE_IP(
  ------------------
  |  | 1399|      0|  CASE(name) {                             \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1400|      0|    CAPTURE_IP(O1REG(name) = value);       \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1401|      0|    ip = NEXTINST(name);                   \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1402|      0|    DISPATCH;                              \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1403|      0|  }
  ------------------
 3288|      0|          LoadConstStringLongIndex,
 3289|      0|          HermesValue::encodeStringValue(
 3290|      0|              curCodeBlock->getRuntimeModule()
 3291|      0|                  ->getStringPrimFromStringIDMayAllocate(
 3292|      0|                      ip->iLoadConstStringLongIndex.op2)));
 3293|      0|      LOAD_CONST(LoadConstEmpty, HermesValue::encodeEmptyValue());
  ------------------
  |  | 1392|      0|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|      0|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|      0|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|      0|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|      0|  }
  ------------------
 3294|  2.88k|      LOAD_CONST(LoadConstUndefined, HermesValue::encodeUndefinedValue());
  ------------------
  |  | 1392|  1.44k|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|  1.44k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|  1.44k|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|  1.44k|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  2.88k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|  1.44k|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|  1.44k|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|  1.44k|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|  1.44k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|  1.44k|  {                                                                          \
  |  |  |  |  |  | 1052|  1.44k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|  1.44k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.44k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|  1.44k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|  1.44k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.44k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|  1.44k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.44k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|  1.44k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|  1.44k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|  1.44k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.44k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|  1.44k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|  1.44k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|  1.44k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|  1.44k|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|  1.44k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|  1.44k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|  1.44k|  }
  ------------------
 3295|  2.88k|      LOAD_CONST(LoadConstNull, HermesValue::encodeNullValue());
  ------------------
  |  | 1392|    792|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    792|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    792|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    792|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.58k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    792|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    792|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    792|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    792|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    792|  {                                                                          \
  |  |  |  |  |  | 1052|    792|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    792|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    792|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    792|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    792|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    792|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    792|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    792|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    792|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    792|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    792|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    792|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    792|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    792|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    792|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    792|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    792|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    792|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    792|  }
  ------------------
 3296|  1.58k|      LOAD_CONST(LoadConstTrue, HermesValue::encodeBoolValue(true));
  ------------------
  |  | 1392|    111|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    111|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    111|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    111|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    222|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    111|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    111|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    111|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    111|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    111|  {                                                                          \
  |  |  |  |  |  | 1052|    111|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    111|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    111|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    111|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    111|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    111|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    111|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    111|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    111|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    111|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    111|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    111|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    111|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    111|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    111|  }
  ------------------
 3297|    222|      LOAD_CONST(LoadConstFalse, HermesValue::encodeBoolValue(false));
  ------------------
  |  | 1392|    111|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    111|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    111|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    111|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    222|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    111|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    111|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    111|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    111|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    111|  {                                                                          \
  |  |  |  |  |  | 1052|    111|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    111|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    111|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    111|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    111|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    111|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    111|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    111|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    111|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    111|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    111|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    111|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    111|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    111|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    111|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    111|  }
  ------------------
 3298|  1.45k|      LOAD_CONST(LoadConstZero, HermesValue::encodeDoubleValue(0));
  ------------------
  |  | 1392|    725|  CASE(name) {                  \
  |  |  ------------------
  |  |  |  | 1074|    725|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1393|    725|    O1REG(name) = value;        \
  |  |  ------------------
  |  |  |  |   31|    725|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.45k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1394|    725|    ip = NEXTINST(name);        \
  |  |  ------------------
  |  |  |  |   59|    725|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1395|    725|    DISPATCH;                   \
  |  |  ------------------
  |  |  |  | 1079|    725|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    725|  {                                                                          \
  |  |  |  |  |  | 1052|    725|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    725|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    725|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    725|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    725|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    725|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    725|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    725|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    725|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    725|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    725|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    725|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    725|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    725|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    725|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    725|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    725|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    725|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1396|    725|  }
  ------------------
 3299|  1.45k|      CASE(LoadConstBigInt) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3300|      0|        idVal = ip->iLoadConstBigInt.op2;
 3301|      0|        nextIP = NEXTINST(LoadConstBigInt);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3302|      0|        goto doLoadConstBigInt;
 3303|  1.45k|      }
 3304|      0|      CASE(LoadConstBigIntLongIndex) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3305|      0|        idVal = ip->iLoadConstBigIntLongIndex.op2;
 3306|      0|        nextIP = NEXTINST(LoadConstBigIntLongIndex);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3307|      0|        goto doLoadConstBigInt;
 3308|  1.45k|      }
 3309|      0|    doLoadConstBigInt : {
 3310|      0|      CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3311|      0|          auto res,
 3312|      0|          BigIntPrimitive::fromBytes(
 3313|      0|              runtime,
 3314|      0|              curCodeBlock->getRuntimeModule()->getBigIntBytesFromBigIntId(
 3315|      0|                  idVal)));
 3316|      0|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3317|      0|        goto exception;
 3318|      0|      }
 3319|       |      // It is safe to access O1REG(LoadConstBigInt) or
 3320|       |      // O1REG(LoadConstBigIntLongIndex) here as both instructions' O1 operands
 3321|       |      // are the same size and live in the same offset w.r.t. the start of the
 3322|       |      // instruction.
 3323|      0|      O1REG(LoadConstBigInt) = std::move(*res);
  ------------------
  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  ------------------
  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  ------------------
  ------------------
 3324|      0|      ip = nextIP;
 3325|      0|      DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3326|      0|    }
 3327|      0|      BINOP(Sub);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1160|      0|      /* Fast-path. */                                                   \
  |  | 1161|      0|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1162|      0|        O1REG(name) = HermesValue::encodeDoubleValue(                    \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1163|      0|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                           do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1164|      0|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|      }                                                                  \
  |  | 1167|      0|    }                                                                    \
  |  | 1168|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1169|      0|        res = doOperSlowPath<do##name>(                                  \
  |  | 1170|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1171|      0|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1171:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1172|      0|      goto exception;                                                    \
  |  | 1173|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1174|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1175|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1176|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1177|      0|  }
  ------------------
 3328|      0|      BINOP(Mul);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1160|      0|      /* Fast-path. */                                                   \
  |  | 1161|      0|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1162|      0|        O1REG(name) = HermesValue::encodeDoubleValue(                    \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1163|      0|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                           do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1164|      0|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|      }                                                                  \
  |  | 1167|      0|    }                                                                    \
  |  | 1168|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1169|      0|        res = doOperSlowPath<do##name>(                                  \
  |  | 1170|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1171|      0|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1171:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1172|      0|      goto exception;                                                    \
  |  | 1173|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1174|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1175|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1176|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1177|      0|  }
  ------------------
 3329|      0|      BINOP(Div);
  ------------------
  |  | 1158|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1159|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1160|      0|      /* Fast-path. */                                                   \
  |  | 1161|      0|      CASE(name##N) {                                                    \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1162|      0|        O1REG(name) = HermesValue::encodeDoubleValue(                    \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1163|      0|            do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                           do##name(O2REG(name).getNumber(), O3REG(name).getNumber())); \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1164|      0|        ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1165|      0|        DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1166|      0|      }                                                                  \
  |  | 1167|      0|    }                                                                    \
  |  | 1168|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1169|      0|        res = doOperSlowPath<do##name>(                                  \
  |  | 1170|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1171|      0|    if (res == ExecutionStatus::EXCEPTION)                               \
  |  |  ------------------
  |  |  |  Branch (1171:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1172|      0|      goto exception;                                                    \
  |  | 1173|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1174|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1175|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1176|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1177|      0|  }
  ------------------
 3330|       |      // Can't do BINOP(Mod) as there's no ModN opcode.
 3331|      8|      BITWISEBINOP(BitAnd);
  ------------------
  |  | 1229|      2|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      2|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1230|      2|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 2, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 2, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 2, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1231|      2|      /* Fast-path. */                                                   \
  |  | 1232|      2|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(             \
  |  |  ------------------
  |  |  |  |   31|      2|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      4|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1233|      2|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      2|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      2|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      2|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      2|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1235|      2|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1236|      2|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      2|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      2|  {                                                                          \
  |  |  |  |  |  | 1052|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      2|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      2|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      2|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1237|      2|    }                                                                    \
  |  | 1238|      2|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      2|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      2|  (void)(expr);                \
  |  |  |  |  925|      2|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      2|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1239|      2|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1240|      2|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1241|      2|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
  |  |  ------------------
  |  |  |  |  189|      2|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 2]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1242|      0|      goto exception;                                                    \
  |  | 1243|      0|    }                                                                    \
  |  | 1244|      2|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      2|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      4|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1245|      2|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1246|      2|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      2|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1247|      2|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      2|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      2|  {                                                                          \
  |  |  |  |  |  | 1052|      2|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      2|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      2|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      2|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      2|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      2|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      2|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      2|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      2|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      2|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      2|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      2|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      2|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      2|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1248|      2|  }
  ------------------
 3332|    888|      BITWISEBINOP(BitOr);
  ------------------
  |  | 1229|    222|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|    222|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1230|    222|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|    432|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 222]
  |  |  |  |  |  Branch (188:51): [True: 210, False: 12]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 210]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1231|      0|      /* Fast-path. */                                                   \
  |  | 1232|      0|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(             \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1233|      0|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      0|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1235|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1236|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1237|      0|    }                                                                    \
  |  | 1238|    222|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|    222|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|    222|  (void)(expr);                \
  |  |  |  |  925|    222|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|    222|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1239|    222|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1240|    222|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1241|    222|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
  |  |  ------------------
  |  |  |  |  189|    222|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 222]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1242|      0|      goto exception;                                                    \
  |  | 1243|      0|    }                                                                    \
  |  | 1244|    222|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|    222|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    444|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1245|    222|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1246|    222|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|    222|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1247|    222|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|    222|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    222|  {                                                                          \
  |  |  |  |  |  | 1052|    222|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    222|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    222|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    222|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    222|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    222|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    222|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    222|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    222|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    222|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    222|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    222|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    222|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    222|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    222|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    222|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    222|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    222|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1248|    222|  }
  ------------------
 3333|    888|      BITWISEBINOP(BitXor);
  ------------------
  |  | 1229|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1230|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1231|      0|      /* Fast-path. */                                                   \
  |  | 1232|      0|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(             \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1233|      0|          hermes::truncateToInt32(O2REG(name).getNumber()),              \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1234|      0|          hermes::truncateToInt32(O3REG(name).getNumber())));            \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1235|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1236|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1237|      0|    }                                                                    \
  |  | 1238|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1239|      0|        res = doBitOperSlowPath<do##name>(                               \
  |  | 1240|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1241|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {              \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1242|      0|      goto exception;                                                    \
  |  | 1243|      0|    }                                                                    \
  |  | 1244|      0|    O1REG(name) = *res;                                                  \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1245|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1246|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1247|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1248|      0|  }
  ------------------
 3334|      0|      SHIFTOP(LShift);
  ------------------
  |  | 1203|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1204|      0|    if (LLVM_LIKELY(                                                           \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1205|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1206|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1207|      0|      auto lnum = hermes::truncateToInt32(O2REG(name).getNumber());            \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1208|      0|      uint32_t rnum = hermes::truncateToInt32(O3REG(name).getNumber()) & 0x1f; \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1209|      0|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(lnum, rnum));      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1210|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1211|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1212|      0|    }                                                                          \
  |  | 1213|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1214|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1215|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1216|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                    \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1217|      0|      goto exception;                                                          \
  |  | 1218|      0|    }                                                                          \
  |  | 1219|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1220|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1221|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1222|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1223|      0|  }
  ------------------
 3335|      0|      SHIFTOP(RShift);
  ------------------
  |  | 1203|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1204|      0|    if (LLVM_LIKELY(                                                           \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1205|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1206|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1207|      0|      auto lnum = hermes::truncateToInt32(O2REG(name).getNumber());            \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1208|      0|      uint32_t rnum = hermes::truncateToInt32(O3REG(name).getNumber()) & 0x1f; \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1209|      0|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(lnum, rnum));      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1210|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1211|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1212|      0|    }                                                                          \
  |  | 1213|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1214|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1215|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1216|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                    \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1217|      0|      goto exception;                                                          \
  |  | 1218|      0|    }                                                                          \
  |  | 1219|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1220|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1221|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1222|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1223|      0|  }
  ------------------
 3336|      0|      SHIFTOP(URshift);
  ------------------
  |  | 1203|      0|  CASE(name) {                                                                 \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1204|      0|    if (LLVM_LIKELY(                                                           \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1205|      0|            O2REG(name).isNumber() &&                                          \
  |  | 1206|      0|            O3REG(name).isNumber())) { /* Fast-path. */                        \
  |  | 1207|      0|      auto lnum = hermes::truncateToInt32(O2REG(name).getNumber());            \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1208|      0|      uint32_t rnum = hermes::truncateToInt32(O3REG(name).getNumber()) & 0x1f; \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1209|      0|      O1REG(name) = HermesValue::encodeDoubleValue(do##name(lnum, rnum));      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1210|      0|      ip = NEXTINST(name);                                                     \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1211|      0|      DISPATCH;                                                                \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1212|      0|    }                                                                          \
  |  | 1213|      0|    CAPTURE_IP(                                                                \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1214|      0|        res = doShiftOperSlowPath<do##name>(                                   \
  |  | 1215|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));         \
  |  | 1216|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {                    \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1217|      0|      goto exception;                                                          \
  |  | 1218|      0|    }                                                                          \
  |  | 1219|      0|    O1REG(name) = *res;                                                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1220|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                                   \
  |  | 1221|      0|    ip = NEXTINST(name);                                                       \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1222|      0|    DISPATCH;                                                                  \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1223|      0|  }
  ------------------
 3337|      0|      CONDOP(Less, <, lessOp_RJS);
  ------------------
  |  | 1256|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1257|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1258|      0|      /* Fast-path. */                                                   \
  |  | 1259|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      0|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                         O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1261|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1262|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1263|      0|    }                                                                    \
  |  | 1264|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1265|      0|        boolRes = operFuncName(                                          \
  |  | 1266|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1267|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1267:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1268|      0|      goto exception;                                                    \
  |  | 1269|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1270|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1271|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1272|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1273|      0|  }
  ------------------
 3338|      0|      CONDOP(LessEq, <=, lessEqualOp_RJS);
  ------------------
  |  | 1256|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1257|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1258|      0|      /* Fast-path. */                                                   \
  |  | 1259|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      0|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                         O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1261|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1262|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1263|      0|    }                                                                    \
  |  | 1264|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1265|      0|        boolRes = operFuncName(                                          \
  |  | 1266|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1267|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1267:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1268|      0|      goto exception;                                                    \
  |  | 1269|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1270|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1271|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1272|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1273|      0|  }
  ------------------
 3339|     28|      CONDOP(Greater, >, greaterOp_RJS);
  ------------------
  |  | 1256|      7|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      7|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1257|      7|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|     14|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 7, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 7, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 7, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1258|      7|      /* Fast-path. */                                                   \
  |  | 1259|      7|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      7|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|     14|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      7|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   32|      7|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      7|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                         O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   33|      7|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      7|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1261|      7|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      7|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1262|      7|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      7|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      7|  {                                                                          \
  |  |  |  |  |  | 1052|      7|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      7|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      7|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      7|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      7|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      7|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      7|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      7|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      7|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      7|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      7|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      7|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1263|      7|    }                                                                    \
  |  | 1264|      7|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      7|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      7|  (void)(expr);                \
  |  |  |  |  925|      7|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      7|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1265|      7|        boolRes = operFuncName(                                          \
  |  | 1266|      7|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1267|      7|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1267:9): [True: 0, False: 7]
  |  |  ------------------
  |  | 1268|      7|      goto exception;                                                    \
  |  | 1269|      7|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1270|      7|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      7|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|     14|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1271|      7|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      7|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1272|      7|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      7|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      7|  {                                                                          \
  |  |  |  |  |  | 1052|      7|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      7|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      7|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      7|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      7|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      7|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      7|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      7|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      7|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      7|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      7|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      7|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      7|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      7|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1273|      7|  }
  ------------------
 3340|     28|      CONDOP(GreaterEq, >=, greaterEqualOp_RJS);
  ------------------
  |  | 1256|      0|  CASE(name) {                                                           \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1257|      0|    if (LLVM_LIKELY(O2REG(name).isNumber() && O3REG(name).isNumber())) { \
  |  |  ------------------
  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1258|      0|      /* Fast-path. */                                                   \
  |  | 1259|      0|      O1REG(name) = HermesValue::encodeBoolValue(                        \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1260|      0|          O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                         O2REG(name).getNumber() oper O3REG(name).getNumber());         \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1261|      0|      ip = NEXTINST(name);                                               \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1262|      0|      DISPATCH;                                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1263|      0|    }                                                                    \
  |  | 1264|      0|    CAPTURE_IP(                                                          \
  |  |  ------------------
  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1265|      0|        boolRes = operFuncName(                                          \
  |  | 1266|      0|            runtime, Handle<>(&O2REG(name)), Handle<>(&O3REG(name))));   \
  |  | 1267|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                           \
  |  |  ------------------
  |  |  |  Branch (1267:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1268|      0|      goto exception;                                                    \
  |  | 1269|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                             \
  |  | 1270|      0|    O1REG(name) = HermesValue::encodeBoolValue(boolRes.getValue());      \
  |  |  ------------------
  |  |  |  |   31|      0|#define O1REG(name) REG(ip->i##name.op1)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1271|      0|    ip = NEXTINST(name);                                                 \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1272|      0|    DISPATCH;                                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1273|      0|  }
  ------------------
 3341|      0|      JCOND(Less, <, lessOp_RJS);
  ------------------
  |  | 1360|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1361|      0|      J##name,                          \
  |  | 1362|      0|      ,                                 \
  |  | 1363|      0|      oper,                             \
  |  | 1364|      0|      operFuncName,                     \
  |  | 1365|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1366|      0|      NEXTINST(J##name));               \
  |  | 1367|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1368|      0|      J##name,                          \
  |  | 1369|      0|      Long,                             \
  |  | 1370|      0|      oper,                             \
  |  | 1371|      0|      operFuncName,                     \
  |  | 1372|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1373|      0|      NEXTINST(J##name##Long));         \
  |  | 1374|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1375|      0|      JNot##name,                       \
  |  | 1376|      0|      ,                                 \
  |  | 1377|      0|      oper,                             \
  |  | 1378|      0|      operFuncName,                     \
  |  | 1379|      0|      NEXTINST(JNot##name),             \
  |  | 1380|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1381|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1382|      0|      JNot##name,                       \
  |  | 1383|      0|      Long,                             \
  |  | 1384|      0|      oper,                             \
  |  | 1385|      0|      operFuncName,                     \
  |  | 1386|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1387|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3342|      0|      JCOND(LessEqual, <=, lessEqualOp_RJS);
  ------------------
  |  | 1360|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1361|      0|      J##name,                          \
  |  | 1362|      0|      ,                                 \
  |  | 1363|      0|      oper,                             \
  |  | 1364|      0|      operFuncName,                     \
  |  | 1365|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1366|      0|      NEXTINST(J##name));               \
  |  | 1367|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1368|      0|      J##name,                          \
  |  | 1369|      0|      Long,                             \
  |  | 1370|      0|      oper,                             \
  |  | 1371|      0|      operFuncName,                     \
  |  | 1372|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1373|      0|      NEXTINST(J##name##Long));         \
  |  | 1374|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1375|      0|      JNot##name,                       \
  |  | 1376|      0|      ,                                 \
  |  | 1377|      0|      oper,                             \
  |  | 1378|      0|      operFuncName,                     \
  |  | 1379|      0|      NEXTINST(JNot##name),             \
  |  | 1380|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1381|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1382|      0|      JNot##name,                       \
  |  | 1383|      0|      Long,                             \
  |  | 1384|      0|      oper,                             \
  |  | 1385|      0|      operFuncName,                     \
  |  | 1386|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1387|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3343|      0|      JCOND(Greater, >, greaterOp_RJS);
  ------------------
  |  | 1360|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1361|      0|      J##name,                          \
  |  | 1362|      0|      ,                                 \
  |  | 1363|      0|      oper,                             \
  |  | 1364|      0|      operFuncName,                     \
  |  | 1365|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1366|      0|      NEXTINST(J##name));               \
  |  | 1367|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1368|      0|      J##name,                          \
  |  | 1369|      0|      Long,                             \
  |  | 1370|      0|      oper,                             \
  |  | 1371|      0|      operFuncName,                     \
  |  | 1372|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1373|      0|      NEXTINST(J##name##Long));         \
  |  | 1374|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1375|      0|      JNot##name,                       \
  |  | 1376|      0|      ,                                 \
  |  | 1377|      0|      oper,                             \
  |  | 1378|      0|      operFuncName,                     \
  |  | 1379|      0|      NEXTINST(JNot##name),             \
  |  | 1380|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1381|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1382|      0|      JNot##name,                       \
  |  | 1383|      0|      Long,                             \
  |  | 1384|      0|      oper,                             \
  |  | 1385|      0|      operFuncName,                     \
  |  | 1386|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1387|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3344|      0|      JCOND(GreaterEqual, >=, greaterEqualOp_RJS);
  ------------------
  |  | 1360|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1361|      0|      J##name,                          \
  |  | 1362|      0|      ,                                 \
  |  | 1363|      0|      oper,                             \
  |  | 1364|      0|      operFuncName,                     \
  |  | 1365|      0|      IPADD(ip->iJ##name.op1),          \
  |  | 1366|      0|      NEXTINST(J##name));               \
  |  | 1367|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1368|      0|      J##name,                          \
  |  | 1369|      0|      Long,                             \
  |  | 1370|      0|      oper,                             \
  |  | 1371|      0|      operFuncName,                     \
  |  | 1372|      0|      IPADD(ip->iJ##name##Long.op1),    \
  |  | 1373|      0|      NEXTINST(J##name##Long));         \
  |  | 1374|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1375|      0|      JNot##name,                       \
  |  | 1376|      0|      ,                                 \
  |  | 1377|      0|      oper,                             \
  |  | 1378|      0|      operFuncName,                     \
  |  | 1379|      0|      NEXTINST(JNot##name),             \
  |  | 1380|      0|      IPADD(ip->iJNot##name.op1));      \
  |  | 1381|      0|  JCOND_IMPL(                           \
  |  |  ------------------
  |  |  |  | 1286|      0|  CASE(name##suffix) {                                                    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1287|      0|    if (LLVM_LIKELY(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1288|      0|            O2REG(name##suffix).isNumber() &&                             \
  |  |  |  | 1289|      0|            O3REG(name##suffix).isNumber())) {                            \
  |  |  |  | 1290|      0|      /* Fast-path. */                                                    \
  |  |  |  | 1291|      0|      CASE(name##N##suffix) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  |  |  ------------------
  |  |  |  | 1292|      0|        if (O2REG(name##N##suffix)                                        \
  |  |  |  |  ------------------
  |  |  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1292:13): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1293|      0|                .getNumber() oper O3REG(name##N##suffix)                  \
  |  |  |  |  ------------------
  |  |  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  | 1294|      0|                .getNumber()) {                                           \
  |  |  |  | 1295|      0|          ip = trueDest;                                                  \
  |  |  |  | 1296|      0|          DISPATCH;                                                       \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1297|      0|        }                                                                 \
  |  |  |  | 1298|      0|        ip = falseDest;                                                   \
  |  |  |  | 1299|      0|        DISPATCH;                                                         \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1300|      0|      }                                                                   \
  |  |  |  | 1301|      0|    }                                                                     \
  |  |  |  | 1302|      0|    CAPTURE_IP(                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  |  |  |  |  924|      0|  (void)(expr);                \
  |  |  |  |  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  |  |  |  |  926|      0|  runtime.invalidateCurrentIP();
  |  |  |  |  ------------------
  |  |  |  | 1303|      0|        boolRes = operFuncName(                                           \
  |  |  |  | 1304|      0|            runtime,                                                      \
  |  |  |  | 1305|      0|            Handle<>(&O2REG(name##suffix)),                               \
  |  |  |  | 1306|      0|            Handle<>(&O3REG(name##suffix))));                             \
  |  |  |  | 1307|      0|    if (boolRes == ExecutionStatus::EXCEPTION)                            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1307:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1308|      0|      goto exception;                                                     \
  |  |  |  | 1309|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                              \
  |  |  |  | 1310|      0|    if (boolRes.getValue()) {                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1310:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  | 1311|      0|      ip = trueDest;                                                      \
  |  |  |  | 1312|      0|      DISPATCH;                                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1313|      0|    }                                                                     \
  |  |  |  | 1314|      0|    ip = falseDest;                                                       \
  |  |  |  | 1315|      0|    DISPATCH;                                                             \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  |  |  | 1084|      0|  }                                             \
  |  |  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  |  |  ------------------
  |  |  |  | 1316|      0|  }
  |  |  ------------------
  |  | 1382|      0|      JNot##name,                       \
  |  | 1383|      0|      Long,                             \
  |  | 1384|      0|      oper,                             \
  |  | 1385|      0|      operFuncName,                     \
  |  | 1386|      0|      NEXTINST(JNot##name##Long),       \
  |  | 1387|      0|      IPADD(ip->iJNot##name##Long.op1));
  ------------------
 3345|       |
 3346|  1.78k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1324|    594|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1074|    594|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1325|    594|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|    594|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    594|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|    594|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|    594|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1325:9): [True: 594, False: 0]
  |  |  ------------------
  |  | 1326|    594|      ip = trueDest;                                                    \
  |  | 1327|    594|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1079|    594|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    594|  {                                                                          \
  |  |  |  |  |  | 1052|    594|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    594|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    594|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    594|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    594|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    594|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    594|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    594|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    594|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    594|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    594|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    594|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1328|    594|    }                                                                   \
  |  | 1329|    594|    ip = falseDest;                                                     \
  |  | 1330|    594|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1079|    594|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    594|  {                                                                          \
  |  |  |  |  |  | 1052|    594|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    594|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    594|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    594|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    594|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    594|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    594|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    594|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    594|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    594|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    594|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    594|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1331|    594|  }
  ------------------
 3347|  1.78k|          JStrictEqual, , IPADD(ip->iJStrictEqual.op1), NEXTINST(JStrictEqual));
 3348|  1.78k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1324|      0|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1325|      0|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1326|      0|      ip = trueDest;                                                    \
  |  | 1327|      0|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1328|      0|    }                                                                   \
  |  | 1329|      0|    ip = falseDest;                                                     \
  |  | 1330|      0|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1331|      0|  }
  ------------------
 3349|      0|          JStrictEqual,
 3350|      0|          Long,
 3351|      0|          IPADD(ip->iJStrictEqualLong.op1),
 3352|      0|          NEXTINST(JStrictEqualLong));
 3353|  3.56k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1324|  1.18k|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1074|  1.18k|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1325|  1.18k|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|  1.18k|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.18k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|  1.18k|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|  1.18k|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1325:9): [True: 1.18k, False: 0]
  |  |  ------------------
  |  | 1326|  1.18k|      ip = trueDest;                                                    \
  |  | 1327|  1.18k|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1079|  1.18k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|  1.18k|  {                                                                          \
  |  |  |  |  |  | 1052|  1.18k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|  1.18k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|  1.18k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|  1.18k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|  1.18k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|  1.18k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|  1.18k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|  1.18k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|  1.18k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|  1.18k|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|  1.18k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|  1.18k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1328|  1.18k|    }                                                                   \
  |  | 1329|  1.18k|    ip = falseDest;                                                     \
  |  | 1330|  1.18k|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1079|  1.18k|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|  1.18k|  {                                                                          \
  |  |  |  |  |  | 1052|  1.18k|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|  1.18k|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|  1.18k|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|  1.18k|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|  1.18k|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|  1.18k|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|  1.18k|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|  1.18k|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|  1.18k|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|  1.18k|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|  1.18k|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|  1.18k|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|  1.18k|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|  1.18k|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1331|  1.18k|  }
  ------------------
 3354|  3.56k|          JStrictNotEqual,
 3355|  3.56k|          ,
 3356|  3.56k|          NEXTINST(JStrictNotEqual),
 3357|  3.56k|          IPADD(ip->iJStrictNotEqual.op1));
 3358|  3.56k|      JCOND_STRICT_EQ_IMPL(
  ------------------
  |  | 1324|      0|  CASE(name##suffix) {                                                  \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1325|      0|    if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   32|      0|#define O2REG(name) REG(ip->i##name.op2)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |                   if (strictEqualityTest(O2REG(name##suffix), O3REG(name##suffix))) { \
  |  |  ------------------
  |  |  |  |   33|      0|#define O3REG(name) REG(ip->i##name.op3)
  |  |  |  |  ------------------
  |  |  |  |  |  |   16|      0|#define REG(index) frameRegs[index]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  |  Branch (1325:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1326|      0|      ip = trueDest;                                                    \
  |  | 1327|      0|      DISPATCH;                                                         \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1328|      0|    }                                                                   \
  |  | 1329|      0|    ip = falseDest;                                                     \
  |  | 1330|      0|    DISPATCH;                                                           \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1331|      0|  }
  ------------------
 3359|      0|          JStrictNotEqual,
 3360|      0|          Long,
 3361|      0|          NEXTINST(JStrictNotEqualLong),
 3362|      0|          IPADD(ip->iJStrictNotEqualLong.op1));
 3363|       |
 3364|  2.37k|      JCOND_EQ_IMPL(JEqual, , IPADD(ip->iJEqual.op1), NEXTINST(JEqual));
  ------------------
  |  | 1339|    594|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1074|    594|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1340|    594|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  930|    594|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|    594|  decl = (expr);                      \
  |  |  |  |  932|    594|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|    594|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1341|    594|        auto eqRes,                                      \
  |  | 1342|    594|        abstractEqualityTest_RJS(                        \
  |  | 1343|    594|            runtime,                                     \
  |  | 1344|    594|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1345|    594|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1346|    594|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1346:9): [True: 0, False: 594]
  |  |  ------------------
  |  | 1347|      0|      goto exception;                                    \
  |  | 1348|      0|    }                                                    \
  |  | 1349|    594|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1350|    594|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1350:9): [True: 0, False: 594]
  |  |  ------------------
  |  | 1351|      0|      ip = trueDest;                                     \
  |  | 1352|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1353|      0|    }                                                    \
  |  | 1354|    594|    ip = falseDest;                                      \
  |  | 1355|    594|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1079|    594|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|    594|  {                                                                          \
  |  |  |  |  |  | 1052|    594|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|    594|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|    594|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|    594|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|    594|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|    594|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|    594|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|    594|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|    594|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|    594|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|    594|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|    594|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|    594|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|    594|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1356|    594|  }
  ------------------
 3365|  2.37k|      JCOND_EQ_IMPL(
  ------------------
  |  | 1339|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1340|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1341|      0|        auto eqRes,                                      \
  |  | 1342|      0|        abstractEqualityTest_RJS(                        \
  |  | 1343|      0|            runtime,                                     \
  |  | 1344|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1345|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1346|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1346:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1347|      0|      goto exception;                                    \
  |  | 1348|      0|    }                                                    \
  |  | 1349|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1350|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1350:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1351|      0|      ip = trueDest;                                     \
  |  | 1352|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1353|      0|    }                                                    \
  |  | 1354|      0|    ip = falseDest;                                      \
  |  | 1355|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1356|      0|  }
  ------------------
 3366|      0|          JEqual, Long, IPADD(ip->iJEqualLong.op1), NEXTINST(JEqualLong));
 3367|      0|      JCOND_EQ_IMPL(
  ------------------
  |  | 1339|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1340|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1341|      0|        auto eqRes,                                      \
  |  | 1342|      0|        abstractEqualityTest_RJS(                        \
  |  | 1343|      0|            runtime,                                     \
  |  | 1344|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1345|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1346|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1346:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1347|      0|      goto exception;                                    \
  |  | 1348|      0|    }                                                    \
  |  | 1349|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1350|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1350:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1351|      0|      ip = trueDest;                                     \
  |  | 1352|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1353|      0|    }                                                    \
  |  | 1354|      0|    ip = falseDest;                                      \
  |  | 1355|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1356|      0|  }
  ------------------
 3368|      0|          JNotEqual, , NEXTINST(JNotEqual), IPADD(ip->iJNotEqual.op1));
 3369|      0|      JCOND_EQ_IMPL(
  ------------------
  |  | 1339|      0|  CASE(name##suffix) {                                   \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1340|      0|    CAPTURE_IP_ASSIGN(                                   \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1341|      0|        auto eqRes,                                      \
  |  | 1342|      0|        abstractEqualityTest_RJS(                        \
  |  | 1343|      0|            runtime,                                     \
  |  | 1344|      0|            Handle<>(&O2REG(name##suffix)),              \
  |  | 1345|      0|            Handle<>(&O3REG(name##suffix))));            \
  |  | 1346|      0|    if (eqRes == ExecutionStatus::EXCEPTION) {           \
  |  |  ------------------
  |  |  |  Branch (1346:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1347|      0|      goto exception;                                    \
  |  | 1348|      0|    }                                                    \
  |  | 1349|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);             \
  |  | 1350|      0|    if (*eqRes) {                                        \
  |  |  ------------------
  |  |  |  Branch (1350:9): [True: 0, False: 0]
  |  |  ------------------
  |  | 1351|      0|      ip = trueDest;                                     \
  |  | 1352|      0|      DISPATCH;                                          \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1353|      0|    }                                                    \
  |  | 1354|      0|    ip = falseDest;                                      \
  |  | 1355|      0|    DISPATCH;                                            \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1356|      0|  }
  ------------------
 3370|      0|          JNotEqual,
 3371|      0|          Long,
 3372|      0|          NEXTINST(JNotEqualLong),
 3373|      0|          IPADD(ip->iJNotEqualLong.op1));
 3374|       |
 3375|      0|      CASE_OUTOFLINE(PutOwnByVal);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 3376|      0|      CASE_OUTOFLINE(PutOwnGetterSetterByVal);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 3377|      0|      CASE_OUTOFLINE(DirectEval);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 3378|       |
 3379|      0|      CASE_OUTOFLINE(IteratorBegin);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 3380|      0|      CASE_OUTOFLINE(IteratorNext);
  ------------------
  |  | 1143|      0|  CASE(name) {                                                       \
  |  |  ------------------
  |  |  |  | 1074|      0|#define CASE(name) case_##name:
  |  |  ------------------
  |  | 1144|      0|    CAPTURE_IP_ASSIGN(auto res, case##name(runtime, frameRegs, ip)); \
  |  |  ------------------
  |  |  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  |  |  931|      0|  decl = (expr);                      \
  |  |  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  |  |  933|      0|  runtime.invalidateCurrentIP();
  |  |  ------------------
  |  | 1145|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {          \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1146|      0|      goto exception;                                                \
  |  | 1147|      0|    }                                                                \
  |  | 1148|      0|    gcScope.flushToSmallCount(KEEP_HANDLES);                         \
  |  | 1149|      0|    ip = NEXTINST(name);                                             \
  |  |  ------------------
  |  |  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  |  |  ------------------
  |  | 1150|      0|    DISPATCH;                                                        \
  |  |  ------------------
  |  |  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  |  |  | 1066|      0|  }
  |  |  |  |  ------------------
  |  |  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  |  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  |  |  ------------------
  |  |  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  |  |  ------------------
  |  |  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  |  |  | 1084|      0|  }                                             \
  |  |  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  |  |  ------------------
  |  | 1151|      0|  }
  ------------------
 3381|      0|      CASE(IteratorClose) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3382|      0|        if (LLVM_UNLIKELY(O1REG(IteratorClose).isObject())) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3383|       |          // The iterator must be closed if it's still an object.
 3384|       |          // That means it was never an index and is not done iterating (a state
 3385|       |          // which is indicated by `undefined`).
 3386|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3387|      0|              auto res,
 3388|      0|              iteratorClose(
 3389|      0|                  runtime,
 3390|      0|                  Handle<JSObject>::vmcast(&O1REG(IteratorClose)),
 3391|      0|                  Runtime::getEmptyValue()));
 3392|      0|          if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 3393|      0|            if (ip->iIteratorClose.op2 &&
  ------------------
  |  Branch (3393:17): [True: 0, False: 0]
  ------------------
 3394|      0|                !isUncatchableError(runtime.thrownValue_)) {
  ------------------
  |  Branch (3394:17): [True: 0, False: 0]
  ------------------
 3395|       |              // Ignore inner exception.
 3396|      0|              runtime.clearThrownValue();
 3397|      0|            } else {
 3398|      0|              goto exception;
 3399|      0|            }
 3400|      0|          }
 3401|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 3402|      0|        }
 3403|      0|        ip = NEXTINST(IteratorClose);
  ------------------
  |  |   59|      0|#define NEXTINST(name) ((const Inst *)(&ip->i##name + 1))
  ------------------
 3404|      0|        DISPATCH;
  ------------------
  |  | 1079|      0|  BEFORE_OP_CODE;                               \
  |  |  ------------------
  |  |  |  | 1051|      0|  {                                                                          \
  |  |  |  | 1052|      0|    UPDATE_OPCODE_TIME_SPENT;                                                \
  |  |  |  | 1053|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1054|      0|        curCodeBlock->contains(ip) && "curCodeBlock must contain ip");       \
  |  |  |  | 1055|      0|    HERMES_SLOW_ASSERT((printDebugInfo(curCodeBlock, frameRegs, ip), true)); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1056|      0|    HERMES_SLOW_ASSERT(                                                      \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1057|      0|        gcScope.getHandleCountDbg() == KEEP_HANDLES &&                       \
  |  |  |  | 1058|      0|        "unaccounted handles were created");                                 \
  |  |  |  | 1059|      0|    HERMES_SLOW_ASSERT(tmpHandle->isUndefined() && "tmpHandle not cleared"); \
  |  |  |  |  ------------------
  |  |  |  |  |  |   17|      0|#define HERMES_SLOW_ASSERT(x) assert(x)
  |  |  |  |  ------------------
  |  |  |  | 1060|      0|    RECORD_OPCODE_START_TIME;                                                \
  |  |  |  | 1061|      0|    INC_OPCODE_COUNT;                                                        \
  |  |  |  | 1062|      0|    if (EnableCrashTrace) {                                                  \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1062:9): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  |  | 1063|      0|      runtime.crashTrace_.recordInst(                                        \
  |  |  |  | 1064|      0|          (uint32_t)((const uint8_t *)ip - bytecodeFileStart), ip->opCode);  \
  |  |  |  | 1065|      0|    }                                                                        \
  |  |  |  | 1066|      0|  }
  |  |  ------------------
  |  | 1080|      0|  if (SingleStep) {                             \
  |  |  ------------------
  |  |  |  Branch (1080:7): [Folded - Ignored]
  |  |  ------------------
  |  | 1081|      0|    state.codeBlock = curCodeBlock;             \
  |  | 1082|      0|    state.offset = CUROFFSET;                   \
  |  |  ------------------
  |  |  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  |  |  ------------------
  |  | 1083|      0|    return HermesValue::encodeUndefinedValue(); \
  |  | 1084|      0|  }                                             \
  |  | 1085|      0|  goto *opcodeDispatch[(unsigned)ip->opCode]
  ------------------
 3405|      0|      }
 3406|       |
 3407|       |#ifdef HERMES_RUN_WASM
 3408|       |      // Asm.js/Wasm Intrinsics
 3409|       |      CASE(Add32) {
 3410|       |        O1REG(Add32) = HermesValue::encodeDoubleValue((
 3411|       |            int32_t)(int64_t)(O2REG(Add32).getNumber() + O3REG(Add32).getNumber()));
 3412|       |        ip = NEXTINST(Add32);
 3413|       |        DISPATCH;
 3414|       |      }
 3415|       |      CASE(Sub32) {
 3416|       |        O1REG(Sub32) = HermesValue::encodeDoubleValue((
 3417|       |            int32_t)(int64_t)(O2REG(Sub32).getNumber() - O3REG(Sub32).getNumber()));
 3418|       |        ip = NEXTINST(Sub32);
 3419|       |        DISPATCH;
 3420|       |      }
 3421|       |      CASE(Mul32) {
 3422|       |        // Signedness matters for multiplication, but low 32 bits are the same
 3423|       |        // regardless of signedness.
 3424|       |        const uint32_t arg0 = (uint32_t)(int32_t)(O2REG(Mul32).getNumber());
 3425|       |        const uint32_t arg1 = (uint32_t)(int32_t)(O3REG(Mul32).getNumber());
 3426|       |        O1REG(Mul32) = HermesValue::encodeDoubleValue((int32_t)(arg0 * arg1));
 3427|       |        ip = NEXTINST(Mul32);
 3428|       |        DISPATCH;
 3429|       |      }
 3430|       |      CASE(Divi32) {
 3431|       |        const int32_t arg0 = (int32_t)(O2REG(Divi32).getNumber());
 3432|       |        const int32_t arg1 = (int32_t)(O3REG(Divi32).getNumber());
 3433|       |        O1REG(Divi32) = HermesValue::encodeDoubleValue(arg0 / arg1);
 3434|       |        ip = NEXTINST(Divi32);
 3435|       |        DISPATCH;
 3436|       |      }
 3437|       |      CASE(Divu32) {
 3438|       |        const uint32_t arg0 = (uint32_t)(int32_t)(O2REG(Divu32).getNumber());
 3439|       |        const uint32_t arg1 = (uint32_t)(int32_t)(O3REG(Divu32).getNumber());
 3440|       |        O1REG(Divu32) = HermesValue::encodeDoubleValue((int32_t)(arg0 / arg1));
 3441|       |        ip = NEXTINST(Divu32);
 3442|       |        DISPATCH;
 3443|       |      }
 3444|       |
 3445|       |      CASE(Loadi8) {
 3446|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi8));
 3447|       |        int8_t *basePtr = reinterpret_cast<int8_t *>(mem->begin(runtime));
 3448|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi8).getNumber());
 3449|       |        O1REG(Loadi8) = HermesValue::encodeNumberValue(basePtr[addr]);
 3450|       |        ip = NEXTINST(Loadi8);
 3451|       |        DISPATCH;
 3452|       |      }
 3453|       |      CASE(Loadu8) {
 3454|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu8));
 3455|       |        uint8_t *basePtr = reinterpret_cast<uint8_t *>(mem->begin(runtime));
 3456|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu8).getNumber());
 3457|       |        O1REG(Loadu8) = HermesValue::encodeNumberValue(basePtr[addr]);
 3458|       |        ip = NEXTINST(Loadu8);
 3459|       |        DISPATCH;
 3460|       |      }
 3461|       |      CASE(Loadi16) {
 3462|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi16));
 3463|       |        int16_t *basePtr = reinterpret_cast<int16_t *>(mem->begin(runtime));
 3464|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi16).getNumber());
 3465|       |        O1REG(Loadi16) = HermesValue::encodeNumberValue(basePtr[addr >> 1]);
 3466|       |        ip = NEXTINST(Loadi16);
 3467|       |        DISPATCH;
 3468|       |      }
 3469|       |      CASE(Loadu16) {
 3470|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu16));
 3471|       |        uint16_t *basePtr = reinterpret_cast<uint16_t *>(mem->begin(runtime));
 3472|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu16).getNumber());
 3473|       |        O1REG(Loadu16) = HermesValue::encodeNumberValue(basePtr[addr >> 1]);
 3474|       |        ip = NEXTINST(Loadu16);
 3475|       |        DISPATCH;
 3476|       |      }
 3477|       |      CASE(Loadi32) {
 3478|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadi32));
 3479|       |        int32_t *basePtr = reinterpret_cast<int32_t *>(mem->begin(runtime));
 3480|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadi32).getNumber());
 3481|       |        O1REG(Loadi32) = HermesValue::encodeNumberValue(basePtr[addr >> 2]);
 3482|       |        ip = NEXTINST(Loadi32);
 3483|       |        DISPATCH;
 3484|       |      }
 3485|       |      CASE(Loadu32) {
 3486|       |        auto *mem = vmcast<JSTypedArrayBase>(O2REG(Loadu32));
 3487|       |        uint32_t *basePtr = reinterpret_cast<uint32_t *>(mem->begin(runtime));
 3488|       |        const uint32_t addr = (uint32_t)(int32_t)(O3REG(Loadu32).getNumber());
 3489|       |        O1REG(Loadu32) =
 3490|       |            HermesValue::encodeNumberValue((int32_t)(basePtr[addr >> 2]));
 3491|       |        ip = NEXTINST(Loadu32);
 3492|       |        DISPATCH;
 3493|       |      }
 3494|       |
 3495|       |      CASE(Store8) {
 3496|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store8));
 3497|       |        int8_t *basePtr = reinterpret_cast<int8_t *>(mem->begin(runtime));
 3498|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store8).getNumber());
 3499|       |        basePtr[addr] = (int8_t)(int32_t)(O3REG(Store8).getNumber());
 3500|       |        ip = NEXTINST(Store8);
 3501|       |        DISPATCH;
 3502|       |      }
 3503|       |      CASE(Store16) {
 3504|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store16));
 3505|       |        int16_t *basePtr = reinterpret_cast<int16_t *>(mem->begin(runtime));
 3506|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store16).getNumber());
 3507|       |        basePtr[addr >> 1] = (int16_t)(int32_t)(O3REG(Store16).getNumber());
 3508|       |        ip = NEXTINST(Store16);
 3509|       |        DISPATCH;
 3510|       |      }
 3511|       |      CASE(Store32) {
 3512|       |        auto *mem = vmcast<JSTypedArrayBase>(O1REG(Store32));
 3513|       |        int32_t *basePtr = reinterpret_cast<int32_t *>(mem->begin(runtime));
 3514|       |        const uint32_t addr = (uint32_t)(int32_t)(O2REG(Store32).getNumber());
 3515|       |        basePtr[addr >> 2] = (int32_t)(O3REG(Store32).getNumber());
 3516|       |        // A nop for now.
 3517|       |        ip = NEXTINST(Store32);
 3518|       |        DISPATCH;
 3519|       |      }
 3520|       |#endif
 3521|       |
 3522|      0|      CASE(_last) {
  ------------------
  |  | 1074|      0|#define CASE(name) case_##name:
  ------------------
 3523|      0|        hermes_fatal("Invalid opcode _last");
 3524|      0|      }
 3525|      0|    }
 3526|       |
 3527|      0|    hermes_fatal(
 3528|      0|        "All opcodes should dispatch to the next and not fallthrough "
 3529|      0|        "to here");
 3530|       |
 3531|       |  // We arrive here if we couldn't allocate the registers for the current frame.
 3532|      0|  stackOverflow:
 3533|      0|    CAPTURE_IP(runtime.raiseStackOverflow(
  ------------------
  |  |  923|      0|  runtime.setCurrentIP(ip);    \
  |  |  924|      0|  (void)(expr);                \
  |  |  925|      0|  ip = runtime.getCurrentIP(); \
  |  |  926|      0|  runtime.invalidateCurrentIP();
  ------------------
 3534|      0|        Runtime::StackOverflowKind::JSRegisterStack));
 3535|       |
 3536|       |  // We arrive here when we raised an exception in a callee, but we don't want
 3537|       |  // the callee to be able to handle it.
 3538|      0|  handleExceptionInParent:
 3539|       |    // Restore the caller code block and IP.
 3540|      0|    curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3541|      0|    ip = FRAME.getSavedIP();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3542|       |
 3543|       |    // Pop to the previous frame where technically the error happened.
 3544|      0|    frameRegs = &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|      0|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3545|       |
 3546|       |    // If we are coming from native code, return.
 3547|      0|    if (!curCodeBlock)
  ------------------
  |  Branch (3547:9): [True: 0, False: 0]
  ------------------
 3548|      0|      return ExecutionStatus::EXCEPTION;
 3549|       |
 3550|       |  // Handle the exception.
 3551|     24|  exception:
 3552|     24|    UPDATE_OPCODE_TIME_SPENT;
 3553|     24|    assert(
 3554|     24|        !runtime.thrownValue_.isEmpty() &&
 3555|     24|        "thrownValue unavailable at exception");
 3556|       |
 3557|      0|    bool catchable = true;
 3558|       |    // If this is an Error object that was thrown internally, it didn't have
 3559|       |    // access to the current codeblock and IP, so collect the stack trace here.
 3560|     24|    if (auto *jsError = dyn_vmcast<JSError>(runtime.thrownValue_)) {
  ------------------
  |  Branch (3560:15): [True: 24, False: 0]
  ------------------
 3561|     24|      catchable = jsError->catchable();
 3562|     24|      if (!jsError->getStackTrace()) {
  ------------------
  |  Branch (3562:11): [True: 24, False: 0]
  ------------------
 3563|       |        // Temporarily clear the thrown value for following operations.
 3564|     24|        CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|     24|  runtime.setCurrentIP(ip);           \
  |  |  931|     24|  decl = (expr);                      \
  |  |  932|     24|  ip = runtime.getCurrentIP();        \
  |  |  933|     24|  runtime.invalidateCurrentIP();
  ------------------
 3565|     24|            auto errorHandle,
 3566|     24|            runtime.makeHandle(vmcast<JSError>(runtime.thrownValue_)));
 3567|     24|        runtime.clearThrownValue();
 3568|       |
 3569|     24|        CAPTURE_IP(JSError::recordStackTrace(
  ------------------
  |  |  923|     24|  runtime.setCurrentIP(ip);    \
  |  |  924|     24|  (void)(expr);                \
  |  |  925|     24|  ip = runtime.getCurrentIP(); \
  |  |  926|     24|  runtime.invalidateCurrentIP();
  ------------------
 3570|     24|            errorHandle, runtime, false, curCodeBlock, ip));
 3571|       |
 3572|       |        // Restore the thrown value.
 3573|     24|        runtime.setThrownValue(errorHandle.getHermesValue());
 3574|     24|      }
 3575|     24|    }
 3576|       |
 3577|     24|    gcScope.flushToSmallCount(KEEP_HANDLES);
 3578|     24|    tmpHandle.clear();
 3579|       |
 3580|     24|#ifdef HERMES_ENABLE_DEBUGGER
 3581|     24|    if (SingleStep) {
  ------------------
  |  Branch (3581:9): [Folded - Ignored]
  ------------------
 3582|       |      // If we're single stepping, don't bother with any more checks,
 3583|       |      // and simply signal that we should continue execution with an exception.
 3584|      0|      state.codeBlock = curCodeBlock;
 3585|      0|      state.offset = CUROFFSET;
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3586|      0|      return ExecutionStatus::EXCEPTION;
 3587|      0|    }
 3588|       |
 3589|     24|    using PauseOnThrowMode = facebook::hermes::debugger::PauseOnThrowMode;
 3590|     24|    auto mode = runtime.debugger_.getPauseOnThrowMode();
 3591|     24|    if (mode != PauseOnThrowMode::None) {
  ------------------
  |  Branch (3591:9): [True: 0, False: 24]
  ------------------
 3592|      0|      if (!runtime.debugger_.isDebugging()) {
  ------------------
  |  Branch (3592:11): [True: 0, False: 0]
  ------------------
 3593|       |        // Determine whether the PauseOnThrowMode requires us to stop here.
 3594|      0|        bool caught =
 3595|      0|            runtime.debugger_
 3596|      0|                .findCatchTarget(InterpreterState(curCodeBlock, CUROFFSET))
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3597|      0|                .hasValue();
 3598|      0|        bool shouldStop = mode == PauseOnThrowMode::All ||
  ------------------
  |  Branch (3598:27): [True: 0, False: 0]
  ------------------
 3599|      0|            (mode == PauseOnThrowMode::Uncaught && !caught);
  ------------------
  |  Branch (3599:14): [True: 0, False: 0]
  |  Branch (3599:52): [True: 0, False: 0]
  ------------------
 3600|      0|        if (shouldStop) {
  ------------------
  |  Branch (3600:13): [True: 0, False: 0]
  ------------------
 3601|       |          // When runDebugger is invoked after an exception,
 3602|       |          // stepping should never happen internally.
 3603|       |          // Any step is a step to an exception handler, which we do
 3604|       |          // directly here in the interpreter.
 3605|       |          // Thus, the result state should be the same as the input state.
 3606|      0|          InterpreterState tmpState{curCodeBlock, (uint32_t)CUROFFSET};
  ------------------
  |  |   55|      0|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
 3607|      0|          CAPTURE_IP_ASSIGN(
  ------------------
  |  |  930|      0|  runtime.setCurrentIP(ip);           \
  |  |  931|      0|  decl = (expr);                      \
  |  |  932|      0|  ip = runtime.getCurrentIP();        \
  |  |  933|      0|  runtime.invalidateCurrentIP();
  ------------------
 3608|      0|              ExecutionStatus resultStatus,
 3609|      0|              runtime.debugger_.runDebugger(
 3610|      0|                  Debugger::RunReason::Exception, tmpState));
 3611|      0|          (void)resultStatus;
 3612|      0|          assert(
 3613|      0|              tmpState == InterpreterState(curCodeBlock, CUROFFSET) &&
 3614|      0|              "not allowed to step internally in a pauseOnThrow");
 3615|      0|          gcScope.flushToSmallCount(KEEP_HANDLES);
 3616|      0|        }
 3617|      0|      }
 3618|      0|    }
 3619|      0|#endif
 3620|       |
 3621|      0|    int32_t handlerOffset = 0;
 3622|       |
 3623|       |    // If the exception is not catchable, skip found catch blocks.
 3624|     24|    while (((handlerOffset = curCodeBlock->findCatchTargetOffset(CUROFFSET)) ==
  ------------------
  |  |   55|     24|#define CUROFFSET ((const uint8_t *)ip - (const uint8_t *)curCodeBlock->begin())
  ------------------
  |  Branch (3624:12): [True: 24, False: 0]
  ------------------
 3625|     24|            -1) ||
 3626|     24|           !catchable) {
  ------------------
  |  Branch (3626:12): [True: 0, False: 0]
  ------------------
 3627|     24|      PROFILER_EXIT_FUNCTION(curCodeBlock);
 3628|       |
 3629|     24|#ifdef HERMES_MEMORY_INSTRUMENTATION
 3630|     24|      runtime.popCallStack();
 3631|     24|#endif
 3632|       |
 3633|       |      // Restore the code block and IP.
 3634|     24|      curCodeBlock = FRAME.getSavedCodeBlock();
  ------------------
  |  |   39|     24|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3635|     24|      ip = FRAME.getSavedIP();
  ------------------
  |  |   39|     24|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3636|       |
 3637|       |      // Pop a stack frame.
 3638|     24|      frameRegs =
 3639|     24|          &runtime.restoreStackAndPreviousFrame(FRAME).getFirstLocalRef();
  ------------------
  |  |   39|     24|#define FRAME StackFramePtr(frameRegs - StackFrameLayout::FirstLocal)
  ------------------
 3640|       |
 3641|     24|      SLOW_DEBUG(
  ------------------
  |  |   18|     24|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|     24|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|     24|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 24]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|     24|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3642|     24|          dbgs() << "function exit with exception: restored stackLevel="
 3643|     24|                 << runtime.getStackLevel() << "\n");
 3644|       |
 3645|       |      // Are we returning to native code?
 3646|     24|      if (!curCodeBlock) {
  ------------------
  |  Branch (3646:11): [True: 24, False: 0]
  ------------------
 3647|     24|        SLOW_DEBUG(
  ------------------
  |  |   18|     24|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|     24|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|     24|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 24]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|     24|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 3648|     24|            dbgs()
 3649|     24|            << "function exit with exception: returning to native code\n");
 3650|     24|        return ExecutionStatus::EXCEPTION;
 3651|     24|      }
 3652|       |
 3653|      0|      assert(
 3654|      0|          isCallType(ip->opCode) &&
 3655|      0|          "return address is not Call-type instruction");
 3656|      0|    }
 3657|       |
 3658|      0|    INIT_STATE_FOR_CODEBLOCK(curCodeBlock);
  ------------------
  |  |  116|      0|  do {                                                           \
  |  |  117|      0|    strictMode = (codeBlock)->isStrictMode();                    \
  |  |  118|      0|    defaultPropOpFlags = DEFAULT_PROP_OP_FLAGS(strictMode);      \
  |  |  ------------------
  |  |  |  |   44|      0|  (strictMode ? PropOpFlags().plusThrowOnError() : PropOpFlags())
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (44:4): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  119|      0|    if (EnableCrashTrace) {                                      \
  |  |  ------------------
  |  |  |  Branch (119:9): [Folded - Ignored]
  |  |  ------------------
  |  |  120|      0|      auto *bc = (codeBlock)->getRuntimeModule()->getBytecode(); \
  |  |  121|      0|      bytecodeFileStart = bc->getRawBuffer().data();             \
  |  |  122|      0|      auto hash = bc->getSourceHash();                           \
  |  |  123|      0|      runtime.crashTrace_.recordModule(                          \
  |  |  124|      0|          bc->getSegmentID(),                                    \
  |  |  125|      0|          (codeBlock)->getRuntimeModule()->getSourceURL(),       \
  |  |  126|      0|          llvh::StringRef((const char *)&hash, sizeof(hash)));   \
  |  |  127|      0|    }                                                            \
  |  |  128|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (128:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 3659|       |
 3660|      0|    ip = IPADD(handlerOffset - CUROFFSET);
  ------------------
  |  |   52|      0|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
 3661|      0|  }
 3662|  1.64k|}
_ZZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateEEN7IPSaverC2ES9_:
  864|    155|        : ip_(runtime.getCurrentIP()), runtime_(runtime) {}
Interpreter.cpp:_ZN6hermes2vmL14printDebugInfoEPNS0_9CodeBlockEPNS0_17PinnedHermesValueEPKNS_4inst4InstE:
  688|   435k|    const Inst *ip) {
  689|       |  // Check if LLVm debugging is enabled for us.
  690|   435k|  bool debug = false;
  691|   435k|  SLOW_DEBUG(debug = true);
  ------------------
  |  |   18|   435k|#define SLOW_DEBUG(x) LLVM_DEBUG(x)
  |  |  ------------------
  |  |  |  |  123|   435k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  |  |  ------------------
  |  |  |  |  |  |   66|   435k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (66:12): [True: 0, False: 435k]
  |  |  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   67|   435k|  } while (false)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  692|   435k|  if (!debug)
  ------------------
  |  Branch (692:7): [True: 435k, False: 0]
  ------------------
  693|   435k|    return;
  694|       |
  695|      0|  DecodedInstruction decoded = decodeInstruction(ip);
  696|       |
  697|      0|  dbgs() << llvh::format_decimal((const uint8_t *)ip - curCodeBlock->begin(), 4)
  698|      0|         << " OpCode::" << getOpCodeString(decoded.meta.opCode);
  699|       |
  700|      0|  for (unsigned i = 0; i < decoded.meta.numOperands; ++i) {
  ------------------
  |  Branch (700:24): [True: 0, False: 0]
  ------------------
  701|      0|    auto operandType = decoded.meta.operandType[i];
  702|      0|    auto value = decoded.operandValue[i];
  703|       |
  704|      0|    dbgs() << (i == 0 ? " " : ", ");
  ------------------
  |  Branch (704:16): [True: 0, False: 0]
  ------------------
  705|      0|    dumpOperand(dbgs(), operandType, value);
  706|       |
  707|      0|    if (operandType == OperandType::Reg8 || operandType == OperandType::Reg32) {
  ------------------
  |  Branch (707:9): [True: 0, False: 0]
  |  Branch (707:45): [True: 0, False: 0]
  ------------------
  708|       |      // Print the register value, if source.
  709|      0|      if (i != 0 || decoded.meta.numOperands == 1)
  ------------------
  |  Branch (709:11): [True: 0, False: 0]
  |  Branch (709:21): [True: 0, False: 0]
  ------------------
  710|      0|        dbgs() << "="
  711|      0|               << DumpHermesValue(REG(static_cast<uint32_t>(value.integer)));
  ------------------
  |  |   16|      0|#define REG(index) frameRegs[index]
  ------------------
  712|      0|    }
  713|      0|  }
  714|       |
  715|      0|  dbgs() << "\n";
  716|      0|}
Interpreter.cpp:_ZN6hermes2vmL12nextInstCallEPKNS_4inst4InstE:
  737|  1.48k|static inline const Inst *nextInstCall(const Inst *ip) {
  738|  1.48k|  HERMES_SLOW_ASSERT(isCallType(ip->opCode) && "ip is not of call type");
  ------------------
  |  |   17|  1.48k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  739|       |
  740|       |  // To avoid needing a large lookup table or switchcase, the following packs
  741|       |  // information about the size of each call opcode into a uint32_t. Each call
  742|       |  // type is represented with two bits, representing how much larger it is than
  743|       |  // the smallest call instruction.
  744|       |  // If we used 64 bits, we could fit the actual size of each call, without
  745|       |  // needing the offset, and this may be necessary if new call instructions are
  746|       |  // added in the future. For now however, due to limitations on loading large
  747|       |  // immediates in ARM, it is significantly more efficient to use a uint32_t
  748|       |  // than a uint64_t.
  749|      0|  constexpr auto firstCall = std::min({
  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  751|  1.48k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.48k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.48k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.48k|#endif
  |  |   12|  1.48k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.48k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.48k|#endif
  |  |   15|  1.48k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.48k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.48k|#endif
  |  |   18|  1.48k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.48k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.48k|#endif
  |  |   21|  1.48k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.48k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.48k|#endif
  |  |   24|  1.48k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.48k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.48k|#endif
  |  |   27|  1.48k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.48k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.48k|#endif
  |  |   30|  1.48k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.48k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.48k|#endif
  |  |   33|  1.48k|#ifndef DEFINE_OPCODE
  |  |   34|  1.48k|#define DEFINE_OPCODE(...)
  |  |   35|  1.48k|#endif
  |  |   36|  1.48k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.48k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.48k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.48k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.48k|#endif
  |  |   45|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.48k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.48k|#endif
  |  |   48|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.48k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.48k|#endif
  |  |   51|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.48k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.48k|#endif
  |  |   54|  1.48k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.48k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.48k|#endif
  |  |   57|  1.48k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.48k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.48k|#endif
  |  |   60|  1.48k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.48k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.48k|#endif
  |  |   63|  1.48k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.48k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.48k|#endif
  |  |   66|       |
  |  |   67|  1.48k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.48k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.48k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.48k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.48k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.48k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.48k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.48k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.48k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.48k|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.48k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  1.48k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.48k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.48k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.48k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  1.48k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.48k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.48k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.48k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.48k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.48k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.48k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.48k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.48k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.48k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.48k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.48k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.48k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.48k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.48k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.48k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.48k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.48k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.48k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.48k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.48k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.48k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.48k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.48k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.48k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.48k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.48k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.48k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.48k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.48k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.48k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.48k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.48k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.48k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.48k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.48k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.48k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  1.48k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.48k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.48k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.48k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.48k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|  1.48k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.48k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|  1.48k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|  1.48k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|  1.48k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.48k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.48k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.48k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|  1.48k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|  1.48k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.48k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.48k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|  1.48k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|  1.48k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.48k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.48k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|  1.48k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|  1.48k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.48k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|  1.48k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.48k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|  1.48k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.48k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.48k|    PutNewOwnByIdShort,
  |  |  315|  1.48k|    PutNewOwnById,
  |  |  316|  1.48k|    PutNewOwnByIdLong,
  |  |  317|  1.48k|    PutNewOwnNEById,
  |  |  318|  1.48k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.48k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|  1.48k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.48k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.48k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|  1.48k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|  1.48k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.48k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.48k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.48k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.48k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.48k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.48k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.48k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.48k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|  1.48k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.48k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|  1.48k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.48k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|  1.48k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.48k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|  1.48k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.48k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.48k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|  1.48k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|  1.48k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.48k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|  1.48k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.48k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|  1.48k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.48k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|  1.48k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.48k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|  1.48k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  750|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.48k|    Call,
  |  |  465|  1.48k|    Construct,
  |  |  466|  1.48k|    Call1,
  |  |  467|  1.48k|    CallDirect,
  |  |  468|  1.48k|    Call2,
  |  |  469|  1.48k|    Call3,
  |  |  470|  1.48k|    Call4,
  |  |  471|  1.48k|    CallLong,
  |  |  472|  1.48k|    ConstructLong,
  |  |  473|  1.48k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.48k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.48k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.48k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.48k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.48k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.48k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.48k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.48k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.48k|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.48k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.48k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.48k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|  1.48k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|  1.48k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.48k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.48k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.48k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.48k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.48k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.48k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|  1.48k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.48k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.48k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|  1.48k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|  1.48k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.48k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.48k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|  1.48k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|  1.48k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.48k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.48k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|  1.48k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|  1.48k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|  1.48k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|  1.48k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|  1.48k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.48k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.48k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.48k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.48k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.48k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.48k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.48k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.48k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.48k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.48k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|  1.48k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.48k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.48k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.48k|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.48k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.48k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.48k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|  1.48k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|  1.48k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.48k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.48k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.48k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.48k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.48k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.48k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.48k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.48k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.48k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.48k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.48k|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.48k|DEFINE_JUMP_2(JmpTrue)
  |  |  769|  1.48k|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.48k|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.48k|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.48k|DEFINE_JUMP_3(JLess)
  |  |  785|  1.48k|DEFINE_JUMP_3(JNotLess)
  |  |  786|  1.48k|DEFINE_JUMP_3(JLessN)
  |  |  787|  1.48k|DEFINE_JUMP_3(JNotLessN)
  |  |  788|  1.48k|DEFINE_JUMP_3(JLessEqual)
  |  |  789|  1.48k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|  1.48k|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|  1.48k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|  1.48k|DEFINE_JUMP_3(JGreater)
  |  |  793|  1.48k|DEFINE_JUMP_3(JNotGreater)
  |  |  794|  1.48k|DEFINE_JUMP_3(JGreaterN)
  |  |  795|  1.48k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|  1.48k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|  1.48k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|  1.48k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|  1.48k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|  1.48k|DEFINE_JUMP_3(JEqual)
  |  |  801|  1.48k|DEFINE_JUMP_3(JNotEqual)
  |  |  802|  1.48k|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|  1.48k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.48k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.48k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.48k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.48k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.48k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.48k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.48k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.48k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.48k|#undef DEFINE_JUMP_1
  |  |  854|  1.48k|#undef DEFINE_JUMP_2
  |  |  855|  1.48k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.48k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.48k|#undef DEFINE_OPCODE_0
  |  |  860|  1.48k|#undef DEFINE_OPCODE_1
  |  |  861|  1.48k|#undef DEFINE_OPCODE_2
  |  |  862|  1.48k|#undef DEFINE_OPCODE_3
  |  |  863|  1.48k|#undef DEFINE_OPCODE_4
  |  |  864|  1.48k|#undef DEFINE_OPCODE_5
  |  |  865|  1.48k|#undef DEFINE_OPCODE_6
  |  |  866|  1.48k|#undef DEFINE_OPCODE
  |  |  867|  1.48k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.48k|#undef DEFINE_RET_TARGET
  |  |  869|  1.48k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.48k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.48k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.48k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.48k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.48k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.48k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.48k|#undef OPERAND_STRING_ID
  ------------------
  752|  1.48k|  });
  753|  1.48k|  constexpr auto lastCall = std::max({
  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  755|  1.48k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.48k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.48k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.48k|#endif
  |  |   12|  1.48k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.48k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.48k|#endif
  |  |   15|  1.48k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.48k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.48k|#endif
  |  |   18|  1.48k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.48k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.48k|#endif
  |  |   21|  1.48k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.48k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.48k|#endif
  |  |   24|  1.48k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.48k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.48k|#endif
  |  |   27|  1.48k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.48k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.48k|#endif
  |  |   30|  1.48k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.48k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.48k|#endif
  |  |   33|  1.48k|#ifndef DEFINE_OPCODE
  |  |   34|  1.48k|#define DEFINE_OPCODE(...)
  |  |   35|  1.48k|#endif
  |  |   36|  1.48k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.48k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.48k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.48k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.48k|#endif
  |  |   45|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.48k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.48k|#endif
  |  |   48|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.48k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.48k|#endif
  |  |   51|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.48k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.48k|#endif
  |  |   54|  1.48k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.48k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.48k|#endif
  |  |   57|  1.48k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.48k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.48k|#endif
  |  |   60|  1.48k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.48k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.48k|#endif
  |  |   63|  1.48k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.48k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.48k|#endif
  |  |   66|       |
  |  |   67|  1.48k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.48k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.48k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.48k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.48k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.48k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.48k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.48k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.48k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.48k|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.48k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  1.48k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.48k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.48k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.48k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  1.48k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.48k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.48k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.48k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.48k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.48k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.48k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.48k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.48k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.48k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.48k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.48k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.48k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.48k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.48k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.48k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.48k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.48k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.48k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.48k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.48k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.48k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.48k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.48k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.48k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.48k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.48k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.48k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.48k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.48k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.48k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.48k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.48k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.48k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.48k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.48k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.48k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  1.48k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.48k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.48k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.48k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.48k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|  1.48k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.48k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|  1.48k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|  1.48k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|  1.48k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.48k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.48k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.48k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|  1.48k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|  1.48k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.48k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.48k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|  1.48k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|  1.48k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.48k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.48k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|  1.48k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|  1.48k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.48k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|  1.48k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.48k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|  1.48k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.48k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.48k|    PutNewOwnByIdShort,
  |  |  315|  1.48k|    PutNewOwnById,
  |  |  316|  1.48k|    PutNewOwnByIdLong,
  |  |  317|  1.48k|    PutNewOwnNEById,
  |  |  318|  1.48k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.48k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|  1.48k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.48k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.48k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|  1.48k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|  1.48k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.48k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.48k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.48k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.48k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.48k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.48k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.48k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.48k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|  1.48k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.48k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|  1.48k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.48k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|  1.48k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.48k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|  1.48k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.48k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.48k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|  1.48k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|  1.48k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.48k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|  1.48k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.48k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|  1.48k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.48k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|  1.48k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.48k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|  1.48k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  754|  1.48k|#define DEFINE_RET_TARGET(name) static_cast<uint8_t>(OpCode::name),
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.48k|    Call,
  |  |  465|  1.48k|    Construct,
  |  |  466|  1.48k|    Call1,
  |  |  467|  1.48k|    CallDirect,
  |  |  468|  1.48k|    Call2,
  |  |  469|  1.48k|    Call3,
  |  |  470|  1.48k|    Call4,
  |  |  471|  1.48k|    CallLong,
  |  |  472|  1.48k|    ConstructLong,
  |  |  473|  1.48k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.48k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.48k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.48k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.48k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.48k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.48k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.48k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.48k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.48k|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.48k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.48k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.48k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|  1.48k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|  1.48k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.48k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.48k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.48k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.48k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.48k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.48k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|  1.48k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.48k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.48k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|  1.48k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|  1.48k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.48k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.48k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|  1.48k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|  1.48k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.48k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.48k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|  1.48k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|  1.48k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|  1.48k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|  1.48k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|  1.48k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.48k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.48k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.48k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.48k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.48k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.48k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.48k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.48k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.48k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.48k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|  1.48k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.48k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.48k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.48k|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.48k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.48k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.48k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|  1.48k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|  1.48k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.48k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.48k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.48k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.48k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.48k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.48k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.48k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.48k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.48k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.48k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.48k|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.48k|DEFINE_JUMP_2(JmpTrue)
  |  |  769|  1.48k|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.48k|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.48k|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.48k|DEFINE_JUMP_3(JLess)
  |  |  785|  1.48k|DEFINE_JUMP_3(JNotLess)
  |  |  786|  1.48k|DEFINE_JUMP_3(JLessN)
  |  |  787|  1.48k|DEFINE_JUMP_3(JNotLessN)
  |  |  788|  1.48k|DEFINE_JUMP_3(JLessEqual)
  |  |  789|  1.48k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|  1.48k|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|  1.48k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|  1.48k|DEFINE_JUMP_3(JGreater)
  |  |  793|  1.48k|DEFINE_JUMP_3(JNotGreater)
  |  |  794|  1.48k|DEFINE_JUMP_3(JGreaterN)
  |  |  795|  1.48k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|  1.48k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|  1.48k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|  1.48k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|  1.48k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|  1.48k|DEFINE_JUMP_3(JEqual)
  |  |  801|  1.48k|DEFINE_JUMP_3(JNotEqual)
  |  |  802|  1.48k|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|  1.48k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.48k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.48k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.48k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.48k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.48k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.48k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.48k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.48k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.48k|#undef DEFINE_JUMP_1
  |  |  854|  1.48k|#undef DEFINE_JUMP_2
  |  |  855|  1.48k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.48k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.48k|#undef DEFINE_OPCODE_0
  |  |  860|  1.48k|#undef DEFINE_OPCODE_1
  |  |  861|  1.48k|#undef DEFINE_OPCODE_2
  |  |  862|  1.48k|#undef DEFINE_OPCODE_3
  |  |  863|  1.48k|#undef DEFINE_OPCODE_4
  |  |  864|  1.48k|#undef DEFINE_OPCODE_5
  |  |  865|  1.48k|#undef DEFINE_OPCODE_6
  |  |  866|  1.48k|#undef DEFINE_OPCODE
  |  |  867|  1.48k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.48k|#undef DEFINE_RET_TARGET
  |  |  869|  1.48k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.48k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.48k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.48k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.48k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.48k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.48k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.48k|#undef OPERAND_STRING_ID
  ------------------
  756|  1.48k|  });
  757|  1.48k|  constexpr auto minSize = std::min({
  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  759|  1.48k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.48k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.48k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.48k|#endif
  |  |   12|  1.48k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.48k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.48k|#endif
  |  |   15|  1.48k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.48k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.48k|#endif
  |  |   18|  1.48k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.48k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.48k|#endif
  |  |   21|  1.48k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.48k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.48k|#endif
  |  |   24|  1.48k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.48k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.48k|#endif
  |  |   27|  1.48k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.48k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.48k|#endif
  |  |   30|  1.48k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.48k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.48k|#endif
  |  |   33|  1.48k|#ifndef DEFINE_OPCODE
  |  |   34|  1.48k|#define DEFINE_OPCODE(...)
  |  |   35|  1.48k|#endif
  |  |   36|  1.48k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.48k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.48k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.48k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.48k|#endif
  |  |   45|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.48k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.48k|#endif
  |  |   48|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.48k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.48k|#endif
  |  |   51|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.48k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.48k|#endif
  |  |   54|  1.48k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.48k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.48k|#endif
  |  |   57|  1.48k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.48k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.48k|#endif
  |  |   60|  1.48k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.48k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.48k|#endif
  |  |   63|  1.48k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.48k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.48k|#endif
  |  |   66|       |
  |  |   67|  1.48k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.48k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.48k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.48k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.48k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.48k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.48k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.48k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.48k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.48k|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.48k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  1.48k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.48k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.48k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.48k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  1.48k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.48k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.48k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.48k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.48k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.48k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.48k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.48k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.48k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.48k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.48k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.48k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.48k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.48k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.48k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.48k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.48k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.48k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.48k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.48k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.48k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.48k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.48k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.48k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.48k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.48k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.48k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.48k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.48k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.48k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.48k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.48k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.48k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.48k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.48k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.48k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.48k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  1.48k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.48k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.48k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.48k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.48k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|  1.48k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.48k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|  1.48k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|  1.48k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|  1.48k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.48k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.48k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.48k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|  1.48k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|  1.48k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.48k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.48k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|  1.48k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|  1.48k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.48k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.48k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|  1.48k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|  1.48k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.48k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|  1.48k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.48k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|  1.48k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.48k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.48k|    PutNewOwnByIdShort,
  |  |  315|  1.48k|    PutNewOwnById,
  |  |  316|  1.48k|    PutNewOwnByIdLong,
  |  |  317|  1.48k|    PutNewOwnNEById,
  |  |  318|  1.48k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.48k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|  1.48k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.48k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.48k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|  1.48k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|  1.48k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.48k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.48k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.48k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.48k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.48k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.48k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.48k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.48k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|  1.48k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.48k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|  1.48k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.48k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|  1.48k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.48k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|  1.48k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.48k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.48k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|  1.48k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|  1.48k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.48k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|  1.48k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.48k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|  1.48k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.48k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|  1.48k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.48k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|  1.48k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  758|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.48k|    Call,
  |  |  465|  1.48k|    Construct,
  |  |  466|  1.48k|    Call1,
  |  |  467|  1.48k|    CallDirect,
  |  |  468|  1.48k|    Call2,
  |  |  469|  1.48k|    Call3,
  |  |  470|  1.48k|    Call4,
  |  |  471|  1.48k|    CallLong,
  |  |  472|  1.48k|    ConstructLong,
  |  |  473|  1.48k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.48k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.48k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.48k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.48k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.48k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.48k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.48k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.48k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.48k|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.48k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.48k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.48k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|  1.48k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|  1.48k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.48k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.48k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.48k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.48k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.48k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.48k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|  1.48k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.48k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.48k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|  1.48k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|  1.48k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.48k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.48k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|  1.48k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|  1.48k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.48k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.48k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|  1.48k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|  1.48k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|  1.48k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|  1.48k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|  1.48k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.48k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.48k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.48k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.48k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.48k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.48k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.48k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.48k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.48k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.48k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|  1.48k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.48k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.48k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.48k|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.48k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.48k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.48k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|  1.48k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|  1.48k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.48k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.48k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.48k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.48k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.48k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.48k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.48k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.48k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.48k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.48k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.48k|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.48k|DEFINE_JUMP_2(JmpTrue)
  |  |  769|  1.48k|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.48k|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.48k|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.48k|DEFINE_JUMP_3(JLess)
  |  |  785|  1.48k|DEFINE_JUMP_3(JNotLess)
  |  |  786|  1.48k|DEFINE_JUMP_3(JLessN)
  |  |  787|  1.48k|DEFINE_JUMP_3(JNotLessN)
  |  |  788|  1.48k|DEFINE_JUMP_3(JLessEqual)
  |  |  789|  1.48k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|  1.48k|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|  1.48k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|  1.48k|DEFINE_JUMP_3(JGreater)
  |  |  793|  1.48k|DEFINE_JUMP_3(JNotGreater)
  |  |  794|  1.48k|DEFINE_JUMP_3(JGreaterN)
  |  |  795|  1.48k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|  1.48k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|  1.48k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|  1.48k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|  1.48k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|  1.48k|DEFINE_JUMP_3(JEqual)
  |  |  801|  1.48k|DEFINE_JUMP_3(JNotEqual)
  |  |  802|  1.48k|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|  1.48k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.48k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.48k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.48k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.48k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.48k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.48k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.48k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.48k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.48k|#undef DEFINE_JUMP_1
  |  |  854|  1.48k|#undef DEFINE_JUMP_2
  |  |  855|  1.48k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.48k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.48k|#undef DEFINE_OPCODE_0
  |  |  860|  1.48k|#undef DEFINE_OPCODE_1
  |  |  861|  1.48k|#undef DEFINE_OPCODE_2
  |  |  862|  1.48k|#undef DEFINE_OPCODE_3
  |  |  863|  1.48k|#undef DEFINE_OPCODE_4
  |  |  864|  1.48k|#undef DEFINE_OPCODE_5
  |  |  865|  1.48k|#undef DEFINE_OPCODE_6
  |  |  866|  1.48k|#undef DEFINE_OPCODE
  |  |  867|  1.48k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.48k|#undef DEFINE_RET_TARGET
  |  |  869|  1.48k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.48k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.48k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.48k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.48k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.48k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.48k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.48k|#undef OPERAND_STRING_ID
  ------------------
  760|  1.48k|  });
  761|  1.48k|  constexpr auto maxSize = std::max({
  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  763|  1.48k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.48k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.48k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.48k|#endif
  |  |   12|  1.48k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.48k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.48k|#endif
  |  |   15|  1.48k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.48k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.48k|#endif
  |  |   18|  1.48k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.48k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.48k|#endif
  |  |   21|  1.48k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.48k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.48k|#endif
  |  |   24|  1.48k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.48k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.48k|#endif
  |  |   27|  1.48k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.48k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.48k|#endif
  |  |   30|  1.48k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.48k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.48k|#endif
  |  |   33|  1.48k|#ifndef DEFINE_OPCODE
  |  |   34|  1.48k|#define DEFINE_OPCODE(...)
  |  |   35|  1.48k|#endif
  |  |   36|  1.48k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.48k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.48k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.48k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.48k|#endif
  |  |   45|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.48k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.48k|#endif
  |  |   48|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.48k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.48k|#endif
  |  |   51|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.48k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.48k|#endif
  |  |   54|  1.48k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.48k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.48k|#endif
  |  |   57|  1.48k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.48k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.48k|#endif
  |  |   60|  1.48k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.48k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.48k|#endif
  |  |   63|  1.48k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.48k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.48k|#endif
  |  |   66|       |
  |  |   67|  1.48k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.48k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.48k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.48k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.48k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.48k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.48k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.48k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.48k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.48k|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.48k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  1.48k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.48k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.48k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.48k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  1.48k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.48k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.48k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.48k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.48k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.48k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.48k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.48k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.48k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.48k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.48k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.48k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.48k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.48k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.48k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.48k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.48k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.48k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.48k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.48k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.48k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.48k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.48k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.48k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.48k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.48k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.48k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.48k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.48k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.48k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.48k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.48k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.48k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.48k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.48k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.48k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.48k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  1.48k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.48k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.48k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.48k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.48k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|  1.48k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.48k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|  1.48k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|  1.48k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|  1.48k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.48k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.48k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.48k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|  1.48k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|  1.48k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.48k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.48k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|  1.48k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|  1.48k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.48k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.48k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|  1.48k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|  1.48k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.48k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|  1.48k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.48k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|  1.48k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.48k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.48k|    PutNewOwnByIdShort,
  |  |  315|  1.48k|    PutNewOwnById,
  |  |  316|  1.48k|    PutNewOwnByIdLong,
  |  |  317|  1.48k|    PutNewOwnNEById,
  |  |  318|  1.48k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.48k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|  1.48k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.48k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.48k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|  1.48k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|  1.48k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.48k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.48k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.48k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.48k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.48k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.48k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.48k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.48k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|  1.48k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.48k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|  1.48k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.48k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|  1.48k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.48k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|  1.48k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.48k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.48k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|  1.48k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|  1.48k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.48k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|  1.48k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.48k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|  1.48k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.48k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|  1.48k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.48k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|  1.48k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  762|  1.48k|#define DEFINE_RET_TARGET(name) sizeof(inst::name##Inst),
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.48k|    Call,
  |  |  465|  1.48k|    Construct,
  |  |  466|  1.48k|    Call1,
  |  |  467|  1.48k|    CallDirect,
  |  |  468|  1.48k|    Call2,
  |  |  469|  1.48k|    Call3,
  |  |  470|  1.48k|    Call4,
  |  |  471|  1.48k|    CallLong,
  |  |  472|  1.48k|    ConstructLong,
  |  |  473|  1.48k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.48k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.48k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.48k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.48k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.48k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.48k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.48k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.48k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.48k|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.48k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.48k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.48k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|  1.48k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|  1.48k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.48k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.48k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.48k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.48k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.48k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.48k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|  1.48k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.48k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.48k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|  1.48k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|  1.48k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.48k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.48k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|  1.48k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|  1.48k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.48k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.48k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|  1.48k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|  1.48k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|  1.48k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|  1.48k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|  1.48k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.48k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.48k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.48k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.48k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.48k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.48k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.48k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.48k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.48k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.48k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|  1.48k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.48k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.48k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.48k|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.48k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.48k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.48k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|  1.48k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|  1.48k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.48k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.48k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.48k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.48k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.48k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.48k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.48k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.48k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.48k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.48k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.48k|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.48k|DEFINE_JUMP_2(JmpTrue)
  |  |  769|  1.48k|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.48k|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.48k|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.48k|DEFINE_JUMP_3(JLess)
  |  |  785|  1.48k|DEFINE_JUMP_3(JNotLess)
  |  |  786|  1.48k|DEFINE_JUMP_3(JLessN)
  |  |  787|  1.48k|DEFINE_JUMP_3(JNotLessN)
  |  |  788|  1.48k|DEFINE_JUMP_3(JLessEqual)
  |  |  789|  1.48k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|  1.48k|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|  1.48k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|  1.48k|DEFINE_JUMP_3(JGreater)
  |  |  793|  1.48k|DEFINE_JUMP_3(JNotGreater)
  |  |  794|  1.48k|DEFINE_JUMP_3(JGreaterN)
  |  |  795|  1.48k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|  1.48k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|  1.48k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|  1.48k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|  1.48k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|  1.48k|DEFINE_JUMP_3(JEqual)
  |  |  801|  1.48k|DEFINE_JUMP_3(JNotEqual)
  |  |  802|  1.48k|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|  1.48k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.48k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.48k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.48k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.48k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.48k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.48k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.48k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.48k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.48k|#undef DEFINE_JUMP_1
  |  |  854|  1.48k|#undef DEFINE_JUMP_2
  |  |  855|  1.48k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.48k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.48k|#undef DEFINE_OPCODE_0
  |  |  860|  1.48k|#undef DEFINE_OPCODE_1
  |  |  861|  1.48k|#undef DEFINE_OPCODE_2
  |  |  862|  1.48k|#undef DEFINE_OPCODE_3
  |  |  863|  1.48k|#undef DEFINE_OPCODE_4
  |  |  864|  1.48k|#undef DEFINE_OPCODE_5
  |  |  865|  1.48k|#undef DEFINE_OPCODE_6
  |  |  866|  1.48k|#undef DEFINE_OPCODE
  |  |  867|  1.48k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.48k|#undef DEFINE_RET_TARGET
  |  |  869|  1.48k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.48k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.48k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.48k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.48k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.48k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.48k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.48k|#undef OPERAND_STRING_ID
  ------------------
  764|  1.48k|  });
  765|       |
  766|  1.48k|  constexpr uint32_t W = 2;
  767|  1.48k|  constexpr uint32_t mask = (1 << W) - 1;
  768|       |
  769|  1.48k|  static_assert(llvh::isUInt<W>(maxSize - minSize), "Size range too large.");
  770|  1.48k|  static_assert((lastCall - firstCall + 1) * W <= 32, "Too many call opcodes.");
  771|       |
  772|  1.48k|  constexpr uint32_t callSizes = 0
  773|  1.48k|#define DEFINE_RET_TARGET(name)             \
  774|  1.48k|  |                                         \
  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  777|  1.48k|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|  1.48k|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|  1.48k|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|  1.48k|#endif
  |  |   12|  1.48k|#ifndef DEFINE_OPCODE_0
  |  |   13|  1.48k|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|  1.48k|#endif
  |  |   15|  1.48k|#ifndef DEFINE_OPCODE_1
  |  |   16|  1.48k|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|  1.48k|#endif
  |  |   18|  1.48k|#ifndef DEFINE_OPCODE_2
  |  |   19|  1.48k|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|  1.48k|#endif
  |  |   21|  1.48k|#ifndef DEFINE_OPCODE_3
  |  |   22|  1.48k|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|  1.48k|#endif
  |  |   24|  1.48k|#ifndef DEFINE_OPCODE_4
  |  |   25|  1.48k|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|  1.48k|#endif
  |  |   27|  1.48k|#ifndef DEFINE_OPCODE_5
  |  |   28|  1.48k|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|  1.48k|#endif
  |  |   30|  1.48k|#ifndef DEFINE_OPCODE_6
  |  |   31|  1.48k|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|  1.48k|#endif
  |  |   33|  1.48k|#ifndef DEFINE_OPCODE
  |  |   34|  1.48k|#define DEFINE_OPCODE(...)
  |  |   35|  1.48k|#endif
  |  |   36|  1.48k|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|  1.48k|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|  1.48k|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|  1.48k|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|  1.48k|#endif
  |  |   45|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|  1.48k|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|  1.48k|#endif
  |  |   48|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|  1.48k|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|  1.48k|#endif
  |  |   51|  1.48k|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|  1.48k|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|  1.48k|#endif
  |  |   54|  1.48k|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|  1.48k|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|  1.48k|#endif
  |  |   57|  1.48k|#ifndef OPERAND_BIGINT_ID
  |  |   58|  1.48k|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|  1.48k|#endif
  |  |   60|  1.48k|#ifndef OPERAND_FUNCTION_ID
  |  |   61|  1.48k|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|  1.48k|#endif
  |  |   63|  1.48k|#ifndef OPERAND_STRING_ID
  |  |   64|  1.48k|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|  1.48k|#endif
  |  |   66|       |
  |  |   67|  1.48k|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|  1.48k|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|  1.48k|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|  1.48k|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|  1.48k|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|  1.48k|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|  1.48k|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|  1.48k|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|  1.48k|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|  1.48k|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|  1.48k|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|  1.48k|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|  1.48k|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|  1.48k|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|  1.48k|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|  1.48k|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|  1.48k|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|  1.48k|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|  1.48k|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|  1.48k|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|  1.48k|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|  1.48k|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|  1.48k|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|  1.48k|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|  1.48k|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|  1.48k|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|  1.48k|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|  1.48k|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|  1.48k|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|  1.48k|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|  1.48k|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|  1.48k|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|  1.48k|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|  1.48k|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|  1.48k|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|  1.48k|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|  1.48k|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|  1.48k|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|  1.48k|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|  1.48k|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|  1.48k|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|  1.48k|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|  1.48k|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|  1.48k|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|  1.48k|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|  1.48k|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|  1.48k|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|  1.48k|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|  1.48k|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|  1.48k|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|  1.48k|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|  1.48k|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|  1.48k|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|  1.48k|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|  1.48k|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|  1.48k|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|  1.48k|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|  1.48k|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|  1.48k|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|  1.48k|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|  1.48k|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|  1.48k|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|  1.48k|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|  1.48k|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|  1.48k|OPERAND_STRING_ID(GetById, 4)
  |  |  261|  1.48k|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|  1.48k|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|  1.48k|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|  1.48k|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|  1.48k|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|  1.48k|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|  1.48k|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|  1.48k|OPERAND_STRING_ID(PutById, 4)
  |  |  276|  1.48k|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|  1.48k|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|  1.48k|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|  1.48k|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|  1.48k|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|  1.48k|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|  1.48k|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|  1.48k|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|  1.48k|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|  1.48k|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|  1.48k|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|  1.48k|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  314|  1.48k|    PutNewOwnByIdShort,
  |  |  315|  1.48k|    PutNewOwnById,
  |  |  316|  1.48k|    PutNewOwnByIdLong,
  |  |  317|  1.48k|    PutNewOwnNEById,
  |  |  318|  1.48k|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|  1.48k|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|  1.48k|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|  1.48k|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|  1.48k|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|  1.48k|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|  1.48k|OPERAND_STRING_ID(DelById, 3)
  |  |  341|  1.48k|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|  1.48k|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|  1.48k|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|  1.48k|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|  1.48k|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|  1.48k|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|  1.48k|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|  1.48k|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|  1.48k|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|  1.48k|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|  1.48k|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|  1.48k|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|  1.48k|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|  1.48k|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|  1.48k|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|  1.48k|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|  1.48k|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|  1.48k|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|  1.48k|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|  1.48k|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|  1.48k|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|  1.48k|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|  1.48k|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|  1.48k|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|  1.48k|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|  1.48k|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|  1.48k|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|  1.48k|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  774|  1.48k|  |                                         \
  |  |  |  |  775|  1.48k|      ((sizeof(inst::name##Inst) - minSize) \
  |  |  |  |  776|  1.48k|       << (((uint8_t)OpCode::name - firstCall) * W))
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|  1.48k|ASSERT_MONOTONE_INCREASING(
  |  |  464|  1.48k|    Call,
  |  |  465|  1.48k|    Construct,
  |  |  466|  1.48k|    Call1,
  |  |  467|  1.48k|    CallDirect,
  |  |  468|  1.48k|    Call2,
  |  |  469|  1.48k|    Call3,
  |  |  470|  1.48k|    Call4,
  |  |  471|  1.48k|    CallLong,
  |  |  472|  1.48k|    ConstructLong,
  |  |  473|  1.48k|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|  1.48k|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|  1.48k|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|  1.48k|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|  1.48k|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|  1.48k|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|  1.48k|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|  1.48k|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|  1.48k|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|  1.48k|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|  1.48k|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|  1.48k|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|  1.48k|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|  1.48k|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|  1.48k|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|  1.48k|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|  1.48k|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|  1.48k|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|  1.48k|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|  1.48k|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|  1.48k|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|  1.48k|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|  1.48k|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|  1.48k|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|  1.48k|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|  1.48k|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|  1.48k|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|  1.48k|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|  1.48k|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|  1.48k|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|  1.48k|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|  1.48k|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|  1.48k|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|  1.48k|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|  1.48k|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|  1.48k|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|  1.48k|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|  1.48k|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|  1.48k|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|  1.48k|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|  1.48k|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|  1.48k|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|  1.48k|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|  1.48k|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|  1.48k|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|  1.48k|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|  1.48k|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|  1.48k|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|  1.48k|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|  1.48k|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|  1.48k|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|  1.48k|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|  1.48k|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|  1.48k|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|  1.48k|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|  1.48k|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|  1.48k|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|  1.48k|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|  1.48k|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|  1.48k|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|  1.48k|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|  1.48k|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|  1.48k|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|  1.48k|#define DEFINE_JUMP_1(name)           \
  |  |  751|  1.48k|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|  1.48k|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|  1.48k|#define DEFINE_JUMP_2(name)                 \
  |  |  756|  1.48k|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|  1.48k|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|  1.48k|#define DEFINE_JUMP_3(name)                       \
  |  |  761|  1.48k|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|  1.48k|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|  1.48k|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|  1.48k|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|  1.48k|DEFINE_JUMP_2(JmpTrue)
  |  |  769|  1.48k|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|  1.48k|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|  1.48k|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|  1.48k|DEFINE_JUMP_3(JLess)
  |  |  785|  1.48k|DEFINE_JUMP_3(JNotLess)
  |  |  786|  1.48k|DEFINE_JUMP_3(JLessN)
  |  |  787|  1.48k|DEFINE_JUMP_3(JNotLessN)
  |  |  788|  1.48k|DEFINE_JUMP_3(JLessEqual)
  |  |  789|  1.48k|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|  1.48k|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|  1.48k|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|  1.48k|DEFINE_JUMP_3(JGreater)
  |  |  793|  1.48k|DEFINE_JUMP_3(JNotGreater)
  |  |  794|  1.48k|DEFINE_JUMP_3(JGreaterN)
  |  |  795|  1.48k|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|  1.48k|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|  1.48k|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|  1.48k|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|  1.48k|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|  1.48k|DEFINE_JUMP_3(JEqual)
  |  |  801|  1.48k|DEFINE_JUMP_3(JNotEqual)
  |  |  802|  1.48k|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|  1.48k|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|  1.48k|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|  1.48k|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|  1.48k|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|  1.48k|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|  1.48k|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|  1.48k|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|  1.48k|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|  1.48k|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|  1.48k|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|  1.48k|#undef DEFINE_JUMP_1
  |  |  854|  1.48k|#undef DEFINE_JUMP_2
  |  |  855|  1.48k|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|  1.48k|#undef DEFINE_OPERAND_TYPE
  |  |  859|  1.48k|#undef DEFINE_OPCODE_0
  |  |  860|  1.48k|#undef DEFINE_OPCODE_1
  |  |  861|  1.48k|#undef DEFINE_OPCODE_2
  |  |  862|  1.48k|#undef DEFINE_OPCODE_3
  |  |  863|  1.48k|#undef DEFINE_OPCODE_4
  |  |  864|  1.48k|#undef DEFINE_OPCODE_5
  |  |  865|  1.48k|#undef DEFINE_OPCODE_6
  |  |  866|  1.48k|#undef DEFINE_OPCODE
  |  |  867|  1.48k|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|  1.48k|#undef DEFINE_RET_TARGET
  |  |  869|  1.48k|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|  1.48k|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|  1.48k|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|  1.48k|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|  1.48k|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|  1.48k|#undef OPERAND_BIGINT_ID
  |  |  875|  1.48k|#undef OPERAND_FUNCTION_ID
  |  |  876|  1.48k|#undef OPERAND_STRING_ID
  ------------------
  778|  1.48k|      ;
  779|  1.48k|#undef DEFINE_RET_TARGET
  780|       |
  781|  1.48k|  const uint8_t offset = static_cast<uint8_t>(ip->opCode) - firstCall;
  782|  1.48k|  return IPADD(((callSizes >> (offset * W)) & mask) + minSize);
  ------------------
  |  |   52|  1.48k|#define IPADD(val) ((const Inst *)((const uint8_t *)ip + (val)))
  ------------------
  783|  1.48k|}
Interpreter.cpp:_ZN6hermes2vmL10isCallTypeENS_4inst6OpCodeE:
  721|  1.48k|static bool isCallType(OpCode opcode) {
  722|  1.48k|  switch (opcode) {
  723|      0|#define DEFINE_RET_TARGET(name) \
  724|      0|  case OpCode::name:            \
  725|      0|    return true;
  726|      0|#include "hermes/BCGen/HBC/BytecodeList.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// Define default versions of all macros used.
  |  |    9|      0|#ifndef DEFINE_OPERAND_TYPE
  |  |   10|      0|#define DEFINE_OPERAND_TYPE(...)
  |  |   11|      0|#endif
  |  |   12|      0|#ifndef DEFINE_OPCODE_0
  |  |   13|      0|#define DEFINE_OPCODE_0(name) DEFINE_OPCODE(name)
  |  |   14|      0|#endif
  |  |   15|      0|#ifndef DEFINE_OPCODE_1
  |  |   16|      0|#define DEFINE_OPCODE_1(name, ...) DEFINE_OPCODE(name)
  |  |   17|      0|#endif
  |  |   18|      0|#ifndef DEFINE_OPCODE_2
  |  |   19|      0|#define DEFINE_OPCODE_2(name, ...) DEFINE_OPCODE(name)
  |  |   20|      0|#endif
  |  |   21|      0|#ifndef DEFINE_OPCODE_3
  |  |   22|      0|#define DEFINE_OPCODE_3(name, ...) DEFINE_OPCODE(name)
  |  |   23|      0|#endif
  |  |   24|      0|#ifndef DEFINE_OPCODE_4
  |  |   25|      0|#define DEFINE_OPCODE_4(name, ...) DEFINE_OPCODE(name)
  |  |   26|      0|#endif
  |  |   27|      0|#ifndef DEFINE_OPCODE_5
  |  |   28|      0|#define DEFINE_OPCODE_5(name, ...) DEFINE_OPCODE(name)
  |  |   29|      0|#endif
  |  |   30|      0|#ifndef DEFINE_OPCODE_6
  |  |   31|      0|#define DEFINE_OPCODE_6(name, ...) DEFINE_OPCODE(name)
  |  |   32|      0|#endif
  |  |   33|      0|#ifndef DEFINE_OPCODE
  |  |   34|      0|#define DEFINE_OPCODE(...)
  |  |   35|      0|#endif
  |  |   36|      0|#ifndef DEFINE_JUMP_LONG_VARIANT
  |  |   37|      0|#define DEFINE_JUMP_LONG_VARIANT(...)
  |  |   38|      0|#endif
  |  |   39|       |#ifndef DEFINE_RET_TARGET
  |  |   40|       |#define DEFINE_RET_TARGET(...)
  |  |   41|       |#endif
  |  |   42|      0|#ifndef ASSERT_EQUAL_LAYOUT1
  |  |   43|      0|#define ASSERT_EQUAL_LAYOUT1(a, b)
  |  |   44|      0|#endif
  |  |   45|      0|#ifndef ASSERT_EQUAL_LAYOUT2
  |  |   46|      0|#define ASSERT_EQUAL_LAYOUT2(a, b)
  |  |   47|      0|#endif
  |  |   48|      0|#ifndef ASSERT_EQUAL_LAYOUT3
  |  |   49|      0|#define ASSERT_EQUAL_LAYOUT3(a, b)
  |  |   50|      0|#endif
  |  |   51|      0|#ifndef ASSERT_EQUAL_LAYOUT4
  |  |   52|      0|#define ASSERT_EQUAL_LAYOUT4(a, b)
  |  |   53|      0|#endif
  |  |   54|      0|#ifndef ASSERT_MONOTONE_INCREASING
  |  |   55|      0|#define ASSERT_MONOTONE_INCREASING(first, ...)
  |  |   56|      0|#endif
  |  |   57|      0|#ifndef OPERAND_BIGINT_ID
  |  |   58|      0|#define OPERAND_BIGINT_ID(name, operandNumber)
  |  |   59|      0|#endif
  |  |   60|      0|#ifndef OPERAND_FUNCTION_ID
  |  |   61|      0|#define OPERAND_FUNCTION_ID(name, operandNumber)
  |  |   62|      0|#endif
  |  |   63|      0|#ifndef OPERAND_STRING_ID
  |  |   64|      0|#define OPERAND_STRING_ID(name, operandNumber)
  |  |   65|      0|#endif
  |  |   66|       |
  |  |   67|      0|DEFINE_OPERAND_TYPE(Reg8, uint8_t)
  |  |   68|      0|DEFINE_OPERAND_TYPE(Reg32, uint32_t)
  |  |   69|      0|DEFINE_OPERAND_TYPE(UInt8, uint8_t)
  |  |   70|      0|DEFINE_OPERAND_TYPE(UInt16, uint16_t)
  |  |   71|      0|DEFINE_OPERAND_TYPE(UInt32, uint32_t)
  |  |   72|      0|DEFINE_OPERAND_TYPE(Addr8, int8_t)
  |  |   73|      0|DEFINE_OPERAND_TYPE(Addr32, int32_t)
  |  |   74|      0|DEFINE_OPERAND_TYPE(Imm32, int32_t)
  |  |   75|      0|DEFINE_OPERAND_TYPE(Double, double)
  |  |   76|       |
  |  |   77|       |/// Unreachable opcode for stubs and similar. This is first so that it has the
  |  |   78|       |/// value zero.
  |  |   79|      0|DEFINE_OPCODE_0(Unreachable)
  |  |   80|       |
  |  |   81|       |/// Create an object from a static map of values, as for var={'a': 3}.
  |  |   82|       |/// Any non-constant elements can be set afterwards with PutOwnByInd.
  |  |   83|       |/// Arg1 is the destination.
  |  |   84|       |/// Arg2 is a preallocation size hint.
  |  |   85|       |/// Arg3 is the number of static elements.
  |  |   86|       |/// Arg4 is the index in the object key buffer table.
  |  |   87|       |/// Arg5 is the index in the object val buffer table.
  |  |   88|      0|DEFINE_OPCODE_5(NewObjectWithBuffer, Reg8, UInt16, UInt16, UInt16, UInt16)
  |  |   89|      0|DEFINE_OPCODE_5(NewObjectWithBufferLong, Reg8, UInt16, UInt16, UInt32, UInt32)
  |  |   90|       |
  |  |   91|       |/// Create a new, empty Object using the built-in constructor (regardless of
  |  |   92|       |/// whether it was overridden).
  |  |   93|       |/// Arg1 = {}
  |  |   94|      0|DEFINE_OPCODE_1(NewObject, Reg8)
  |  |   95|       |
  |  |   96|       |/// Create a new empty Object with the specified parent. If the parent is
  |  |   97|       |/// null, no parent is used. If the parent is not an object, the builtin
  |  |   98|       |/// Object.prototype is used. Otherwise the parent itself is used.
  |  |   99|       |/// Arg1 = the created object
  |  |  100|       |/// Arg2 = the parent.
  |  |  101|      0|DEFINE_OPCODE_2(NewObjectWithParent, Reg8, Reg8)
  |  |  102|       |
  |  |  103|       |/// Create an array from a static list of values, as for var=[1,2,3].
  |  |  104|       |/// Any non-constant elements can be set afterwards with PutOwnByIndex.
  |  |  105|       |/// Arg1 is the destination.
  |  |  106|       |/// Arg2 is a preallocation size hint.
  |  |  107|       |/// Arg3 is the number of static elements.
  |  |  108|       |/// Arg4 is the index in the array buffer table.
  |  |  109|      0|DEFINE_OPCODE_4(NewArrayWithBuffer, Reg8, UInt16, UInt16, UInt16)
  |  |  110|      0|DEFINE_OPCODE_4(NewArrayWithBufferLong, Reg8, UInt16, UInt16, UInt32)
  |  |  111|       |
  |  |  112|       |/// Create a new array of a given size.
  |  |  113|       |/// Arg1 = new Array(Arg2)
  |  |  114|      0|DEFINE_OPCODE_2(NewArray, Reg8, UInt16)
  |  |  115|       |
  |  |  116|       |/// Arg1 = Arg2 (Register copy)
  |  |  117|      0|DEFINE_OPCODE_2(Mov, Reg8, Reg8)
  |  |  118|       |
  |  |  119|       |/// Arg1 = Arg2 (Register copy, long index)
  |  |  120|      0|DEFINE_OPCODE_2(MovLong, Reg32, Reg32)
  |  |  121|       |
  |  |  122|       |/// Arg1 = -Arg2 (Unary minus)
  |  |  123|      0|DEFINE_OPCODE_2(Negate, Reg8, Reg8)
  |  |  124|       |
  |  |  125|       |/// Arg1 = !Arg2 (Boolean not)
  |  |  126|      0|DEFINE_OPCODE_2(Not, Reg8, Reg8)
  |  |  127|       |
  |  |  128|       |/// Arg1 = ~Arg2 (Bitwise not)
  |  |  129|      0|DEFINE_OPCODE_2(BitNot, Reg8, Reg8)
  |  |  130|       |
  |  |  131|       |/// Arg1 = typeof Arg2 (JS typeof)
  |  |  132|      0|DEFINE_OPCODE_2(TypeOf, Reg8, Reg8)
  |  |  133|       |
  |  |  134|       |/// Arg1 = Arg2 == Arg3 (JS equality)
  |  |  135|      0|DEFINE_OPCODE_3(Eq, Reg8, Reg8, Reg8)
  |  |  136|       |
  |  |  137|       |/// Arg1 = Arg2 === Arg3 (JS strict equality)
  |  |  138|      0|DEFINE_OPCODE_3(StrictEq, Reg8, Reg8, Reg8)
  |  |  139|       |
  |  |  140|       |/// Arg1 = Arg2 != Arg3 (JS inequality)
  |  |  141|      0|DEFINE_OPCODE_3(Neq, Reg8, Reg8, Reg8)
  |  |  142|       |
  |  |  143|       |/// Arg1 = Arg2 !== Arg3 (JS strict inequality)
  |  |  144|      0|DEFINE_OPCODE_3(StrictNeq, Reg8, Reg8, Reg8)
  |  |  145|       |
  |  |  146|       |/// Arg1 = Arg2 < Arg3 (JS less-than)
  |  |  147|      0|DEFINE_OPCODE_3(Less, Reg8, Reg8, Reg8)
  |  |  148|       |
  |  |  149|       |/// Arg1 = Arg2 <= Arg3 (JS less-than-or-equals)
  |  |  150|      0|DEFINE_OPCODE_3(LessEq, Reg8, Reg8, Reg8)
  |  |  151|       |
  |  |  152|       |/// Arg1 = Arg2 > Arg3 (JS greater-than)
  |  |  153|      0|DEFINE_OPCODE_3(Greater, Reg8, Reg8, Reg8)
  |  |  154|       |
  |  |  155|       |/// Arg1 = Arg2 >= Arg3 (JS greater-than-or-equals)
  |  |  156|      0|DEFINE_OPCODE_3(GreaterEq, Reg8, Reg8, Reg8)
  |  |  157|       |
  |  |  158|       |/// Arg1 = Arg2 + Arg3 (JS addition/concatenation)
  |  |  159|      0|DEFINE_OPCODE_3(Add, Reg8, Reg8, Reg8)
  |  |  160|       |
  |  |  161|       |/// Arg1 = Arg2 + Arg3 (Numeric addition, skips number check)
  |  |  162|      0|DEFINE_OPCODE_3(AddN, Reg8, Reg8, Reg8)
  |  |  163|       |
  |  |  164|       |/// Arg1 = Arg2 * Arg3 (JS multiplication)
  |  |  165|      0|DEFINE_OPCODE_3(Mul, Reg8, Reg8, Reg8)
  |  |  166|       |
  |  |  167|       |/// Arg1 = Arg2 * Arg3 (Numeric multiplication, skips number check)
  |  |  168|      0|DEFINE_OPCODE_3(MulN, Reg8, Reg8, Reg8)
  |  |  169|       |
  |  |  170|       |/// Arg1 = Arg2 / Arg3 (JS division)
  |  |  171|      0|DEFINE_OPCODE_3(Div, Reg8, Reg8, Reg8)
  |  |  172|       |
  |  |  173|       |/// Arg1 = Arg2 / Arg3 (Numeric division, skips number check)
  |  |  174|      0|DEFINE_OPCODE_3(DivN, Reg8, Reg8, Reg8)
  |  |  175|       |
  |  |  176|       |/// Arg1 = Arg2 % Arg3 (JS remainder)
  |  |  177|      0|DEFINE_OPCODE_3(Mod, Reg8, Reg8, Reg8)
  |  |  178|       |
  |  |  179|       |/// Arg1 = Arg2 - Arg3 (JS subtraction)
  |  |  180|      0|DEFINE_OPCODE_3(Sub, Reg8, Reg8, Reg8)
  |  |  181|       |
  |  |  182|       |/// Arg1 = Arg2 - Arg3 (Numeric subtraction, skips number check)
  |  |  183|      0|DEFINE_OPCODE_3(SubN, Reg8, Reg8, Reg8)
  |  |  184|       |
  |  |  185|       |/// Arg1 = Arg2 << Arg3 (JS bitshift left)
  |  |  186|      0|DEFINE_OPCODE_3(LShift, Reg8, Reg8, Reg8)
  |  |  187|       |
  |  |  188|       |/// Arg1 = Arg2 >> Arg3 (JS signed bitshift right)
  |  |  189|      0|DEFINE_OPCODE_3(RShift, Reg8, Reg8, Reg8)
  |  |  190|       |
  |  |  191|       |/// Arg1 = Arg2 >>> Arg3 (JS unsigned bitshift right)
  |  |  192|      0|DEFINE_OPCODE_3(URshift, Reg8, Reg8, Reg8)
  |  |  193|       |
  |  |  194|       |/// Arg1 = Arg2 & Arg3 (JS bitwise AND)
  |  |  195|      0|DEFINE_OPCODE_3(BitAnd, Reg8, Reg8, Reg8)
  |  |  196|       |
  |  |  197|       |/// Arg1 = Arg2 ^ Arg3 (JS bitwise XOR)
  |  |  198|      0|DEFINE_OPCODE_3(BitXor, Reg8, Reg8, Reg8)
  |  |  199|       |
  |  |  200|       |/// Arg1 = Arg2 | Arg3 (JS bitwise OR)
  |  |  201|      0|DEFINE_OPCODE_3(BitOr, Reg8, Reg8, Reg8)
  |  |  202|       |
  |  |  203|       |/// Arg1 = Arg2 + 1 (JS increment, skips number check)
  |  |  204|      0|DEFINE_OPCODE_2(Inc, Reg8, Reg8)
  |  |  205|       |
  |  |  206|       |/// Arg1 = Arg2 - 1 (JS decrement, skips number check)
  |  |  207|      0|DEFINE_OPCODE_2(Dec, Reg8, Reg8)
  |  |  208|       |
  |  |  209|       |/// Check whether Arg2 contains Arg3 in its prototype chain.
  |  |  210|       |/// Note that this is not the same as JS instanceof.
  |  |  211|       |/// Pseudocode: Arg1 = prototypechain(Arg2).contains(Arg3)
  |  |  212|      0|DEFINE_OPCODE_3(InstanceOf, Reg8, Reg8, Reg8)
  |  |  213|       |
  |  |  214|       |/// Arg1 = Arg2 in Arg3 (JS relational 'in')
  |  |  215|      0|DEFINE_OPCODE_3(IsIn, Reg8, Reg8, Reg8)
  |  |  216|       |
  |  |  217|       |/// Get an environment (scope) from N levels up the stack.
  |  |  218|       |/// 0 is the current environment, 1 is the caller's environment, etc.
  |  |  219|      0|DEFINE_OPCODE_2(GetEnvironment, Reg8, UInt8)
  |  |  220|       |
  |  |  221|       |/// Store a value in an environment.
  |  |  222|       |/// StoreNPToEnvironment[L] store a non-pointer value in an environment
  |  |  223|       |/// Arg1 is the environment (as fetched by GetEnvironment).
  |  |  224|       |/// Arg2 is the environment index slot number.
  |  |  225|       |/// Arg3 is the value.
  |  |  226|      0|DEFINE_OPCODE_3(StoreToEnvironment, Reg8, UInt8, Reg8)
  |  |  227|      0|DEFINE_OPCODE_3(StoreToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  228|      0|DEFINE_OPCODE_3(StoreNPToEnvironment, Reg8, UInt8, Reg8)
  |  |  229|      0|DEFINE_OPCODE_3(StoreNPToEnvironmentL, Reg8, UInt16, Reg8)
  |  |  230|       |
  |  |  231|       |/// Load a value from an environment.
  |  |  232|       |/// Arg1 is the destination.
  |  |  233|       |/// Arg2 is the environment (as fetched by GetEnvironment).
  |  |  234|       |/// Arg3 is the environment index slot number.
  |  |  235|      0|DEFINE_OPCODE_3(LoadFromEnvironment, Reg8, Reg8, UInt8)
  |  |  236|      0|DEFINE_OPCODE_3(LoadFromEnvironmentL, Reg8, Reg8, UInt16)
  |  |  237|       |
  |  |  238|       |/// Get the global object (the object in which global variables are stored).
  |  |  239|      0|DEFINE_OPCODE_1(GetGlobalObject, Reg8)
  |  |  240|       |
  |  |  241|       |/// Obtain the value of NewTarget from the frame.
  |  |  242|       |/// Arg1 = NewTarget
  |  |  243|      0|DEFINE_OPCODE_1(GetNewTarget, Reg8)
  |  |  244|       |
  |  |  245|       |/// Create a new environment, to store values captured by closures.
  |  |  246|      0|DEFINE_OPCODE_1(CreateEnvironment, Reg8)
  |  |  247|       |
  |  |  248|       |/// Declare a global variable by string table index.
  |  |  249|       |/// The variable will be set to undefined.
  |  |  250|      0|DEFINE_OPCODE_1(DeclareGlobalVar, UInt32)
  |  |  251|      0|OPERAND_STRING_ID(DeclareGlobalVar, 1)
  |  |  252|       |
  |  |  253|       |/// Get an object property by string table index.
  |  |  254|       |/// Arg1 = Arg2[stringtable[Arg4]]
  |  |  255|       |/// Arg3 is a cache index used to speed up the above operation.
  |  |  256|      0|DEFINE_OPCODE_4(GetByIdShort, Reg8, Reg8, UInt8, UInt8)
  |  |  257|      0|DEFINE_OPCODE_4(GetById, Reg8, Reg8, UInt8, UInt16)
  |  |  258|      0|DEFINE_OPCODE_4(GetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  259|      0|OPERAND_STRING_ID(GetByIdShort, 4)
  |  |  260|      0|OPERAND_STRING_ID(GetById, 4)
  |  |  261|      0|OPERAND_STRING_ID(GetByIdLong, 4)
  |  |  262|       |
  |  |  263|       |/// Get an object property by string table index, or throw if not found.
  |  |  264|       |/// This is similar to GetById, but intended for use with global variables
  |  |  265|       |/// where Arg2 = GetGlobalObject.
  |  |  266|      0|DEFINE_OPCODE_4(TryGetById, Reg8, Reg8, UInt8, UInt16)
  |  |  267|      0|DEFINE_OPCODE_4(TryGetByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  268|      0|OPERAND_STRING_ID(TryGetById, 4)
  |  |  269|      0|OPERAND_STRING_ID(TryGetByIdLong, 4)
  |  |  270|       |
  |  |  271|       |/// Set an object property by string index.
  |  |  272|       |/// Arg1[stringtable[Arg4]] = Arg2.
  |  |  273|      0|DEFINE_OPCODE_4(PutById, Reg8, Reg8, UInt8, UInt16)
  |  |  274|      0|DEFINE_OPCODE_4(PutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  275|      0|OPERAND_STRING_ID(PutById, 4)
  |  |  276|      0|OPERAND_STRING_ID(PutByIdLong, 4)
  |  |  277|       |
  |  |  278|       |/// Set an object property by string index, or throw if undeclared.
  |  |  279|       |/// This is similar to PutById, but intended for use with global variables
  |  |  280|       |/// where Arg1 = GetGlobalObject.
  |  |  281|      0|DEFINE_OPCODE_4(TryPutById, Reg8, Reg8, UInt8, UInt16)
  |  |  282|      0|DEFINE_OPCODE_4(TryPutByIdLong, Reg8, Reg8, UInt8, UInt32)
  |  |  283|      0|OPERAND_STRING_ID(TryPutById, 4)
  |  |  284|      0|OPERAND_STRING_ID(TryPutByIdLong, 4)
  |  |  285|       |
  |  |  286|       |/// Create a new own property on an object. This is similar to PutById, but
  |  |  287|       |/// the destination must be an object, it only deals with own properties,
  |  |  288|       |/// ignoring the prototype chain, and the property must not already be defined.
  |  |  289|       |/// Similarly to PutById, the property name cannot be a valid array index.
  |  |  290|       |/// Arg1 is the destination object, which is known to be an object.
  |  |  291|       |/// Arg2 is the value to write.
  |  |  292|       |/// Arg3 is the string table ID of the property name.
  |  |  293|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  294|      0|DEFINE_OPCODE_3(PutNewOwnByIdShort, Reg8, Reg8, UInt8)
  |  |  295|      0|DEFINE_OPCODE_3(PutNewOwnById, Reg8, Reg8, UInt16)
  |  |  296|      0|DEFINE_OPCODE_3(PutNewOwnByIdLong, Reg8, Reg8, UInt32)
  |  |  297|      0|OPERAND_STRING_ID(PutNewOwnByIdShort, 3)
  |  |  298|      0|OPERAND_STRING_ID(PutNewOwnById, 3)
  |  |  299|      0|OPERAND_STRING_ID(PutNewOwnByIdLong, 3)
  |  |  300|       |
  |  |  301|       |/// Create a new non-enumerable own property on an object. This is the same as
  |  |  302|       |/// PutNewOwnById, but creates the property with different enumerability.
  |  |  303|       |/// Arg1 is the destination object.
  |  |  304|       |/// Arg2 is the value to write.
  |  |  305|       |/// Arg3 is the string table ID of the property name.
  |  |  306|       |/// Arg1[stringtable[Arg3]] = Arg2
  |  |  307|      0|DEFINE_OPCODE_3(PutNewOwnNEById, Reg8, Reg8, UInt16)
  |  |  308|      0|DEFINE_OPCODE_3(PutNewOwnNEByIdLong, Reg8, Reg8, UInt32)
  |  |  309|      0|OPERAND_STRING_ID(PutNewOwnNEById, 3)
  |  |  310|      0|OPERAND_STRING_ID(PutNewOwnNEByIdLong, 3)
  |  |  311|       |
  |  |  312|       |// The "NE" versions must be ordered after the "normal" versions.
  |  |  313|      0|ASSERT_MONOTONE_INCREASING(
  |  |  314|      0|    PutNewOwnByIdShort,
  |  |  315|      0|    PutNewOwnById,
  |  |  316|      0|    PutNewOwnByIdLong,
  |  |  317|      0|    PutNewOwnNEById,
  |  |  318|      0|    PutNewOwnNEByIdLong)
  |  |  319|       |
  |  |  320|       |/// Assign a value to a constant integer own property which will be created as
  |  |  321|       |/// enumerable. This is used (potentially in conjunction with
  |  |  322|       |/// NewArrayWithBuffer) for arr=[foo,bar] initializations.
  |  |  323|       |/// Arg1[Arg3] = Arg2;
  |  |  324|      0|DEFINE_OPCODE_3(PutOwnByIndex, Reg8, Reg8, UInt8)
  |  |  325|      0|DEFINE_OPCODE_3(PutOwnByIndexL, Reg8, Reg8, UInt32)
  |  |  326|       |
  |  |  327|       |/// Set an own property identified by value.
  |  |  328|       |/// Arg1 is the destination object.
  |  |  329|       |/// Arg2 is the value to write.
  |  |  330|       |/// Arg3 is the property name.
  |  |  331|       |/// Arg4 : bool -> enumerable. If true, the property is created as enumerable,
  |  |  332|       |///        non-enumerable otherwise.
  |  |  333|       |/// Arg1[Arg3] = Arg2;
  |  |  334|      0|DEFINE_OPCODE_4(PutOwnByVal, Reg8, Reg8, Reg8, UInt8)
  |  |  335|       |
  |  |  336|       |/// Delete a property by string table index.
  |  |  337|       |/// Arg1 = delete Arg2[stringtable[Arg3]]
  |  |  338|      0|DEFINE_OPCODE_3(DelById, Reg8, Reg8, UInt16)
  |  |  339|      0|DEFINE_OPCODE_3(DelByIdLong, Reg8, Reg8, UInt32)
  |  |  340|      0|OPERAND_STRING_ID(DelById, 3)
  |  |  341|      0|OPERAND_STRING_ID(DelByIdLong, 3)
  |  |  342|       |
  |  |  343|       |/// Get a property by value. Constants string values should instead use GetById.
  |  |  344|       |/// Arg1 = Arg2[Arg3]
  |  |  345|      0|DEFINE_OPCODE_3(GetByVal, Reg8, Reg8, Reg8)
  |  |  346|       |
  |  |  347|       |/// Set a property by value. Constant string values should instead use GetById
  |  |  348|       |/// (unless they are array indices according to ES5.1 section 15.4, in which
  |  |  349|       |/// case this is still the right opcode).
  |  |  350|       |/// Arg1[Arg2] = Arg3
  |  |  351|      0|DEFINE_OPCODE_3(PutByVal, Reg8, Reg8, Reg8)
  |  |  352|       |
  |  |  353|       |/// Delete a property by value (when the value is not known at compile time).
  |  |  354|       |/// Arg1 = delete Arg2[Arg3]
  |  |  355|      0|DEFINE_OPCODE_3(DelByVal, Reg8, Reg8, Reg8)
  |  |  356|       |
  |  |  357|       |/// Add a getter and a setter for a property by value.
  |  |  358|       |/// Object.defineProperty(Arg1, Arg2, { get: Arg3, set: Arg4 }).
  |  |  359|       |/// Arg1 is the target object which will have a property defined.
  |  |  360|       |/// Arg2 is the property name
  |  |  361|       |/// Arg3 is the getter closure or undefined
  |  |  362|       |/// Arg4 is the setter closure or undefined
  |  |  363|       |/// Arg5 : boolean - if true, the property will be enumerable.
  |  |  364|      0|DEFINE_OPCODE_5(PutOwnGetterSetterByVal, Reg8, Reg8, Reg8, Reg8, UInt8)
  |  |  365|       |
  |  |  366|       |/// Get the list of properties from an object to implement for..in loop.
  |  |  367|       |/// Returns Arg1, which is the register that holds array of properties.
  |  |  368|       |/// Returns Undefined if the object is null/undefined.
  |  |  369|       |/// Arg2 is the register that holds the object.
  |  |  370|       |/// Arg3 is the register that holds the iterating index.
  |  |  371|       |/// Arg4 is the register that holds the size of the property list.
  |  |  372|      0|DEFINE_OPCODE_4(GetPNameList, Reg8, Reg8, Reg8, Reg8)
  |  |  373|       |
  |  |  374|       |/// Get the next property in the for..in iterator.
  |  |  375|       |/// Returns Arg1, which is the next property. Undefined if unavailable.
  |  |  376|       |/// Arg2 is the register that holds array of properties.
  |  |  377|       |/// Arg3 is the register that holds the object.
  |  |  378|       |/// Arg4 is the register that holds the iterating index.
  |  |  379|       |/// Arg5 is the register that holds the size of the property list.
  |  |  380|      0|DEFINE_OPCODE_5(GetNextPName, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  381|       |
  |  |  382|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  383|       |/// NOTE: the ordering of Call, CallN, Construct, CallLong, ConstructLong is
  |  |  384|       |/// important. The "long" versions are defined after the "short" versions.
  |  |  385|       |/// It is important for efficiency that all Calls have contiguous opcodes, with
  |  |  386|       |/// wider instructions appearing after narrower ones.
  |  |  387|       |
  |  |  388|       |/// Call a function.
  |  |  389|       |/// Arg1 is the destination of the return value.
  |  |  390|       |/// Arg2 is the closure to invoke.
  |  |  391|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  392|       |///      from the end of the current frame.
  |  |  393|      0|DEFINE_OPCODE_3(Call, Reg8, Reg8, UInt8)
  |  |  394|      0|DEFINE_RET_TARGET(Call)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  395|       |
  |  |  396|       |/// Call a constructor, with semantics identical to Call.
  |  |  397|       |/// Arg1 is the destination of the return value.
  |  |  398|       |/// Arg2 is the closure to invoke.
  |  |  399|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  400|       |///      from the end of the current frame. The first argument 'this'
  |  |  401|       |///      is assumed to be created with CreateThis.
  |  |  402|      0|DEFINE_OPCODE_3(Construct, Reg8, Reg8, UInt8)
  |  |  403|    594|DEFINE_RET_TARGET(Construct)
  |  |  ------------------
  |  |  |  |  724|    594|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 594, False: 891]
  |  |  |  |  ------------------
  |  |  |  |  725|    594|    return true;
  |  |  ------------------
  |  |  404|       |
  |  |  405|       |/// Call a function with one arg.
  |  |  406|       |/// Arg1 is the destination of the return value.
  |  |  407|       |/// Arg2 is the closure to invoke.
  |  |  408|       |/// Arg3 is the first argument.
  |  |  409|      0|DEFINE_OPCODE_3(Call1, Reg8, Reg8, Reg8)
  |  |  410|    297|DEFINE_RET_TARGET(Call1)
  |  |  ------------------
  |  |  |  |  724|    297|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 297, False: 1.18k]
  |  |  |  |  ------------------
  |  |  |  |  725|    297|    return true;
  |  |  ------------------
  |  |  411|       |
  |  |  412|       |/// Call a function directly without a closure.
  |  |  413|       |/// Arg1 is the destination of the return value.
  |  |  414|       |/// Arg2 is the number of arguments, assumed to be found in reverse order
  |  |  415|       |///      from the end of the current frame. The first argument 'this'
  |  |  416|       |///      is assumed to be created with CreateThis.
  |  |  417|       |/// Arg3 is index in the function table.
  |  |  418|       |/// Note that we expect the variable-sized argument to be last.
  |  |  419|      0|DEFINE_OPCODE_3(CallDirect, Reg8, UInt8, UInt16)
  |  |  420|      0|OPERAND_FUNCTION_ID(CallDirect, 3)
  |  |  421|      0|DEFINE_RET_TARGET(CallDirect)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  422|       |
  |  |  423|       |/// Call a function with two args.
  |  |  424|       |/// Arg1 is the destination of the return value.
  |  |  425|       |/// Arg2 is the closure to invoke.
  |  |  426|       |/// Arg3 is the first argument.
  |  |  427|       |/// Arg4 is the second argument.
  |  |  428|      0|DEFINE_OPCODE_4(Call2, Reg8, Reg8, Reg8, Reg8)
  |  |  429|    594|DEFINE_RET_TARGET(Call2)
  |  |  ------------------
  |  |  |  |  724|    594|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 594, False: 891]
  |  |  |  |  ------------------
  |  |  |  |  725|    594|    return true;
  |  |  ------------------
  |  |  430|       |
  |  |  431|       |/// Call a function with three args.
  |  |  432|       |/// Arg1 is the destination of the return value.
  |  |  433|       |/// Arg2 is the closure to invoke.
  |  |  434|       |/// Arg3 is the first argument.
  |  |  435|       |/// Arg4 is the second argument.
  |  |  436|       |/// Arg5 is the third argument.
  |  |  437|      0|DEFINE_OPCODE_5(Call3, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  438|      0|DEFINE_RET_TARGET(Call3)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  439|       |
  |  |  440|       |/// Call a function with four args.
  |  |  441|       |/// Arg1 is the destination of the return value.
  |  |  442|       |/// Arg2 is the closure to invoke.
  |  |  443|       |/// Arg3 is the first argument.
  |  |  444|       |/// Arg4 is the second argument.
  |  |  445|       |/// Arg5 is the third argument.
  |  |  446|       |/// Arg6 is the fourth argument.
  |  |  447|      0|DEFINE_OPCODE_6(Call4, Reg8, Reg8, Reg8, Reg8, Reg8, Reg8)
  |  |  448|      0|DEFINE_RET_TARGET(Call4)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  449|       |
  |  |  450|       |/// Identical to Call, but allowing more arguments.
  |  |  451|      0|DEFINE_OPCODE_3(CallLong, Reg8, Reg8, UInt32)
  |  |  452|      0|DEFINE_RET_TARGET(CallLong)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  453|       |
  |  |  454|       |/// Identical to Construct, but allowing more arguments.
  |  |  455|      0|DEFINE_OPCODE_3(ConstructLong, Reg8, Reg8, UInt32)
  |  |  456|      0|DEFINE_RET_TARGET(ConstructLong)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  457|       |
  |  |  458|       |/// Identical to CallDirect, but the function index is 32-bit.
  |  |  459|      0|DEFINE_OPCODE_3(CallDirectLongIndex, Reg8, UInt8, UInt32)
  |  |  460|      0|DEFINE_RET_TARGET(CallDirectLongIndex)
  |  |  ------------------
  |  |  |  |  724|      0|  case OpCode::name:            \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (724:3): [True: 0, False: 1.48k]
  |  |  |  |  ------------------
  |  |  |  |  725|      0|    return true;
  |  |  ------------------
  |  |  461|       |
  |  |  462|       |// Enforce the order.
  |  |  463|      0|ASSERT_MONOTONE_INCREASING(
  |  |  464|      0|    Call,
  |  |  465|      0|    Construct,
  |  |  466|      0|    Call1,
  |  |  467|      0|    CallDirect,
  |  |  468|      0|    Call2,
  |  |  469|      0|    Call3,
  |  |  470|      0|    Call4,
  |  |  471|      0|    CallLong,
  |  |  472|      0|    ConstructLong,
  |  |  473|      0|    CallDirectLongIndex)
  |  |  474|       |
  |  |  475|       |/// Call a builtin function.
  |  |  476|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  477|       |/// and therefore never JS.
  |  |  478|       |/// Arg1 is the destination of the return value.
  |  |  479|       |/// Arg2 is the builtin number.
  |  |  480|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  481|       |///      from the end of the current frame.
  |  |  482|       |/// thisArg is set to "undefined".
  |  |  483|      0|DEFINE_OPCODE_3(CallBuiltin, Reg8, UInt8, UInt8)
  |  |  484|       |
  |  |  485|       |/// Call a builtin function.
  |  |  486|       |/// Note this is NOT marked as a Ret target, because the callee is native
  |  |  487|       |/// and therefore never JS.
  |  |  488|       |/// Arg1 is the destination of the return value.
  |  |  489|       |/// Arg2 is the builtin number.
  |  |  490|       |/// Arg3 is the number of arguments, assumed to be found in reverse order
  |  |  491|       |///      from the end of the current frame.
  |  |  492|       |/// thisArg is set to "undefined".
  |  |  493|      0|DEFINE_OPCODE_3(CallBuiltinLong, Reg8, UInt8, UInt32)
  |  |  494|       |
  |  |  495|       |/// Get a closure from a builtin function.
  |  |  496|       |/// Arg1 is the destination of the return value.
  |  |  497|       |/// Arg2 is the builtin number.
  |  |  498|      0|DEFINE_OPCODE_2(GetBuiltinClosure, Reg8, UInt8)
  |  |  499|       |
  |  |  500|       |///
  |  |  501|       |///!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  |  |  502|       |
  |  |  503|       |/// Return a value from the current function.
  |  |  504|       |/// return Arg1;
  |  |  505|      0|DEFINE_OPCODE_1(Ret, Reg8)
  |  |  506|       |
  |  |  507|       |/// Catch an exception (the first instruction in an exception handler).
  |  |  508|       |/// } catch(Arg1) {
  |  |  509|      0|DEFINE_OPCODE_1(Catch, Reg8)
  |  |  510|       |
  |  |  511|       |/// ES6 18.2.1.1 PerformEval(Arg2, evalRealm, strictCaller=true, direct=true)
  |  |  512|       |/// Arg1 is the destination of the return value.
  |  |  513|       |/// Arg2 is the value to eval.
  |  |  514|      0|DEFINE_OPCODE_2(DirectEval, Reg8, Reg8)
  |  |  515|       |
  |  |  516|       |/// Throw an exception.
  |  |  517|       |/// throw Arg1;
  |  |  518|      0|DEFINE_OPCODE_1(Throw, Reg8)
  |  |  519|       |
  |  |  520|       |/// If Arg2 is Empty, throw ReferenceError, otherwise move it into Arg1.
  |  |  521|       |/// Arg1 is the destination of the return value
  |  |  522|       |/// Arg2 is the value to check
  |  |  523|      0|DEFINE_OPCODE_2(ThrowIfEmpty, Reg8, Reg8)
  |  |  524|       |
  |  |  525|       |/// Implementation dependent debugger action.
  |  |  526|      0|DEFINE_OPCODE_0(Debugger)
  |  |  527|       |
  |  |  528|       |/// Fast check for an async interrupt request.
  |  |  529|      0|DEFINE_OPCODE_0(AsyncBreakCheck)
  |  |  530|       |
  |  |  531|       |/// Define a profile point.
  |  |  532|       |/// Arg1 is the function local profile point index. The first one will have the
  |  |  533|       |/// largest index. If there are more than 2^16 profile points in the function,
  |  |  534|       |/// all the overflowed profile points have index zero.
  |  |  535|      0|DEFINE_OPCODE_1(ProfilePoint, UInt16)
  |  |  536|       |
  |  |  537|       |/// Create a closure.
  |  |  538|       |/// Arg1 is the register in which to store the closure.
  |  |  539|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  540|       |/// Arg3 is index in the function table.
  |  |  541|      0|DEFINE_OPCODE_3(CreateClosure, Reg8, Reg8, UInt16)
  |  |  542|      0|DEFINE_OPCODE_3(CreateClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  543|      0|OPERAND_FUNCTION_ID(CreateClosure, 3)
  |  |  544|      0|OPERAND_FUNCTION_ID(CreateClosureLongIndex, 3)
  |  |  545|       |
  |  |  546|       |/// Create a closure for a GeneratorFunction.
  |  |  547|       |/// Arg1 is the register in which to store the closure.
  |  |  548|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  549|       |/// Arg3 is index in the function table.
  |  |  550|      0|DEFINE_OPCODE_3(CreateGeneratorClosure, Reg8, Reg8, UInt16)
  |  |  551|      0|DEFINE_OPCODE_3(CreateGeneratorClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  552|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosure, 3)
  |  |  553|      0|OPERAND_FUNCTION_ID(CreateGeneratorClosureLongIndex, 3)
  |  |  554|       |
  |  |  555|       |/// Create a closure for an AsyncFunction.
  |  |  556|       |/// Arg1 is the register in which to store the closure.
  |  |  557|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  558|       |/// Arg3 is index in the function table.
  |  |  559|      0|DEFINE_OPCODE_3(CreateAsyncClosure, Reg8, Reg8, UInt16)
  |  |  560|      0|DEFINE_OPCODE_3(CreateAsyncClosureLongIndex, Reg8, Reg8, UInt32)
  |  |  561|      0|OPERAND_FUNCTION_ID(CreateAsyncClosure, 3)
  |  |  562|      0|OPERAND_FUNCTION_ID(CreateAsyncClosureLongIndex, 3)
  |  |  563|       |
  |  |  564|       |/// Allocate an empty, uninitialized object (immediately before a constructor).
  |  |  565|       |/// Arg1 is the destination register.
  |  |  566|       |/// Arg2 is the prototype to assign it.
  |  |  567|       |/// Arg3 is the constructor closure that will be used*.
  |  |  568|       |/// * To allow internal constructors to have special objects allocated.
  |  |  569|      0|DEFINE_OPCODE_3(CreateThis, Reg8, Reg8, Reg8)
  |  |  570|       |
  |  |  571|       |/// Choose the result of a constructor: 'this' or a returned object.
  |  |  572|       |/// Arg1 is the result.
  |  |  573|       |/// Arg2 is the 'this' object used for the constructor.
  |  |  574|       |/// Arg3 is the constructor's return value.
  |  |  575|       |/// Arg1 = Arg3 instanceof Object ? Arg3 : Arg2
  |  |  576|      0|DEFINE_OPCODE_3(SelectObject, Reg8, Reg8, Reg8)
  |  |  577|       |
  |  |  578|       |/// Load a function parameter by index. Starts at 0 with 'this'.
  |  |  579|       |/// Arg1 = Arg2 == 0 ? this : arguments[Arg2 - 1];
  |  |  580|      0|DEFINE_OPCODE_2(LoadParam, Reg8, UInt8)
  |  |  581|       |
  |  |  582|       |/// Like LoadParam, but allows accessing arguments >= 255.
  |  |  583|      0|DEFINE_OPCODE_2(LoadParamLong, Reg8, UInt32)
  |  |  584|       |
  |  |  585|       |/// Load a constant integer value.
  |  |  586|      0|DEFINE_OPCODE_2(LoadConstUInt8, Reg8, UInt8)
  |  |  587|      0|DEFINE_OPCODE_2(LoadConstInt, Reg8, Imm32)
  |  |  588|       |
  |  |  589|       |/// Load a constant double value.
  |  |  590|      0|DEFINE_OPCODE_2(LoadConstDouble, Reg8, Double)
  |  |  591|       |
  |  |  592|       |/// Load a constant BigInt value by bigint table index.
  |  |  593|      0|DEFINE_OPCODE_2(LoadConstBigInt, Reg8, UInt16)
  |  |  594|      0|DEFINE_OPCODE_2(LoadConstBigIntLongIndex, Reg8, UInt32)
  |  |  595|      0|OPERAND_BIGINT_ID(LoadConstBigInt, 2)
  |  |  596|      0|OPERAND_BIGINT_ID(LoadConstBigIntLongIndex, 2)
  |  |  597|       |
  |  |  598|       |/// Load a constant string value by string table index.
  |  |  599|      0|DEFINE_OPCODE_2(LoadConstString, Reg8, UInt16)
  |  |  600|      0|DEFINE_OPCODE_2(LoadConstStringLongIndex, Reg8, UInt32)
  |  |  601|      0|OPERAND_STRING_ID(LoadConstString, 2)
  |  |  602|      0|OPERAND_STRING_ID(LoadConstStringLongIndex, 2)
  |  |  603|       |
  |  |  604|       |/// Load common constants.
  |  |  605|      0|DEFINE_OPCODE_1(LoadConstEmpty, Reg8)
  |  |  606|      0|DEFINE_OPCODE_1(LoadConstUndefined, Reg8)
  |  |  607|      0|DEFINE_OPCODE_1(LoadConstNull, Reg8)
  |  |  608|      0|DEFINE_OPCODE_1(LoadConstTrue, Reg8)
  |  |  609|      0|DEFINE_OPCODE_1(LoadConstFalse, Reg8)
  |  |  610|      0|DEFINE_OPCODE_1(LoadConstZero, Reg8)
  |  |  611|       |
  |  |  612|       |/// Coerce a value assumed to contain 'this' to an object using non-strict
  |  |  613|       |/// mode rules. Primitives are boxed, \c null or \c undefed produce the global
  |  |  614|       |/// object.
  |  |  615|       |/// Arg1 = coerce_to_object(Arg2)
  |  |  616|      0|DEFINE_OPCODE_2(CoerceThisNS, Reg8, Reg8)
  |  |  617|       |
  |  |  618|       |/// Obtain the raw \c this value and coerce it to an object. Equivalent to:
  |  |  619|       |/// \code
  |  |  620|       |///     LoadParam    Arg1, #0
  |  |  621|       |///     CoerceThisNS Arg1, Arg1
  |  |  622|       |/// \endcode
  |  |  623|      0|DEFINE_OPCODE_1(LoadThisNS, Reg8)
  |  |  624|       |
  |  |  625|       |/// Convert a value to a number.
  |  |  626|       |/// Arg1 = Arg2 - 0
  |  |  627|      0|DEFINE_OPCODE_2(ToNumber, Reg8, Reg8)
  |  |  628|       |/// Convert a value to a numberic.
  |  |  629|       |/// Arg1 = ToNumeric(Arg2)
  |  |  630|      0|DEFINE_OPCODE_2(ToNumeric, Reg8, Reg8)
  |  |  631|       |/// Convert a value to a 32-bit signed integer.
  |  |  632|       |/// Arg1 = Arg2 | 0
  |  |  633|      0|DEFINE_OPCODE_2(ToInt32, Reg8, Reg8)
  |  |  634|       |
  |  |  635|       |/// Convert a value to a string as if evaluating the expression:
  |  |  636|       |///     Arg1 = "" + Arg2
  |  |  637|       |/// In practice this means
  |  |  638|       |///     Arg1 = ToString(ToPrimitive(Arg2, PreferredType::NONE))
  |  |  639|       |/// with ToPrimitive (ES5.1 9.1) and ToString (ES5.1 9.8).
  |  |  640|      0|DEFINE_OPCODE_2(AddEmptyString, Reg8, Reg8)
  |  |  641|       |
  |  |  642|       |// `arguments` opcodes all work with a lazy register that contains either
  |  |  643|       |// undefined or a reified array. On the first ReifyArguments, the register
  |  |  644|       |// will be populated and the rest of the instruction will access it directly.
  |  |  645|       |// This is an optimization to allow arguments[i] to just load an argument
  |  |  646|       |// instead of doing a full array allocation and property lookup.
  |  |  647|       |
  |  |  648|       |/// Get a property of the 'arguments' array by value.
  |  |  649|       |/// Arg1 is the result.
  |  |  650|       |/// Arg2 is the index.
  |  |  651|       |/// Arg3 is the lazy loaded register.
  |  |  652|       |/// Arg1 = arguments[Arg2]
  |  |  653|      0|DEFINE_OPCODE_3(GetArgumentsPropByVal, Reg8, Reg8, Reg8)
  |  |  654|       |
  |  |  655|       |/// Get the length of the 'arguments' array.
  |  |  656|       |/// Arg1 is the result.
  |  |  657|       |/// Arg2 is the lazy loaded register.
  |  |  658|       |/// Arg1 = arguments.length
  |  |  659|      0|DEFINE_OPCODE_2(GetArgumentsLength, Reg8, Reg8)
  |  |  660|       |
  |  |  661|       |/// Create an actual 'arguments' array, if get-by-index and length isn't enough.
  |  |  662|       |/// Arg1 is the lazy loaded register, which afterwards will contain a proper
  |  |  663|       |///      object that can be used by non-*Arguments* opcodes like Return.
  |  |  664|      0|DEFINE_OPCODE_1(ReifyArguments, Reg8)
  |  |  665|       |
  |  |  666|       |/// Create a regular expression.
  |  |  667|       |/// Arg1 is the result.
  |  |  668|       |/// Arg2 is the string index of the pattern.
  |  |  669|       |/// Arg3 is the string index of the flags.
  |  |  670|       |/// Arg4 is the regexp bytecode index in the regexp table.
  |  |  671|      0|DEFINE_OPCODE_4(CreateRegExp, Reg8, UInt32, UInt32, UInt32)
  |  |  672|      0|OPERAND_STRING_ID(CreateRegExp, 2)
  |  |  673|      0|OPERAND_STRING_ID(CreateRegExp, 3)
  |  |  674|       |
  |  |  675|       |/// Jump table switch - using a table of offset, jump to the offset of the given
  |  |  676|       |/// input or to the default block if out of range (or not right type)
  |  |  677|       |/// Arg 1 is the value to be branched upon
  |  |  678|       |/// Arg 2 is the relative offset of the jump table to be used by this
  |  |  679|       |/// instruction. Jump tables are appended to the bytecode. Arg 3 is the relative
  |  |  680|       |/// offset for the "default" jump. Arg 4 is the unsigned min value, if arg 1 is
  |  |  681|       |/// less than this value jmp to
  |  |  682|       |///   default block
  |  |  683|       |/// Arg 5 is the unsigned max value, if arg 1 is greater than this value jmp to
  |  |  684|       |///   default block.
  |  |  685|       |///
  |  |  686|       |/// Given the above, the jump table entry for a given value (that is in range)
  |  |  687|       |/// is located at offset ip + arg2 + arg1 - arg4. We subtract arg4 to avoid
  |  |  688|       |/// wasting space when compiling denses switches that do not start at zero. Note
  |  |  689|       |/// that Arg2 is *unaligned* it is dynamically aligned at runtime.
  |  |  690|      0|DEFINE_OPCODE_5(SwitchImm, Reg8, UInt32, Addr32, UInt32, UInt32)
  |  |  691|       |
  |  |  692|       |/// Start the generator by jumping to the next instruction to begin.
  |  |  693|       |/// Restore the stack frame if this generator has previously been suspended.
  |  |  694|      0|DEFINE_OPCODE_0(StartGenerator)
  |  |  695|       |
  |  |  696|       |/// Resume generator by performing one of the following user-requested actions:
  |  |  697|       |/// - next(val): Set Arg1 to val, Arg2 to false, run next instruction
  |  |  698|       |/// - return(val): Set Arg1 to val, Arg2 to true, run next instruction
  |  |  699|       |/// - throw(val): Throw val as an error
  |  |  700|       |/// Arg1 is the result provided by the user.
  |  |  701|       |/// Arg2 is a boolean which is true if the user requested a return().
  |  |  702|      0|DEFINE_OPCODE_2(ResumeGenerator, Reg8, Reg8)
  |  |  703|       |
  |  |  704|       |/// Set the generator status to complete, but do not return.
  |  |  705|      0|DEFINE_OPCODE_0(CompleteGenerator)
  |  |  706|       |
  |  |  707|       |/// Create a generator.
  |  |  708|       |/// Arg1 is the register in which to store the generator.
  |  |  709|       |/// Arg2 is the current environment as loaded by GetEnvironment 0.
  |  |  710|       |/// Arg3 is index in the function table.
  |  |  711|      0|DEFINE_OPCODE_3(CreateGenerator, Reg8, Reg8, UInt16)
  |  |  712|      0|DEFINE_OPCODE_3(CreateGeneratorLongIndex, Reg8, Reg8, UInt32)
  |  |  713|      0|OPERAND_FUNCTION_ID(CreateGenerator, 3)
  |  |  714|      0|OPERAND_FUNCTION_ID(CreateGeneratorLongIndex, 3)
  |  |  715|       |
  |  |  716|       |/// Arg1 [out] is the result iterator or index.
  |  |  717|       |/// Arg2 [in/out] is the source. Output for either the source or next method.
  |  |  718|       |/// If source is an array with an unmodified [Symbol.iterator], the result is
  |  |  719|       |/// 0. Else the result is source[Symbol.iterator] and the output is the .next()
  |  |  720|       |/// method on the iterator.
  |  |  721|       |/// See IR.md for IteratorBeginInst.
  |  |  722|      0|DEFINE_OPCODE_2(IteratorBegin, Reg8, Reg8)
  |  |  723|       |
  |  |  724|       |/// Arg1 [out] is the result, or undefined if done.
  |  |  725|       |/// Arg2 [in/out] is the iterator or index.
  |  |  726|       |/// Arg2 [in] is the source or the next method.
  |  |  727|       |/// If iterator is undefined, result = undefined.
  |  |  728|       |/// If iterator is a number:
  |  |  729|       |///   If iterator is less than source.length, return source[iterator++]
  |  |  730|       |///   Else iterator = undefined and result = undefined
  |  |  731|       |/// Else:
  |  |  732|       |///   n = iterator.next()
  |  |  733|       |///   If n.done, iterator = undefined and result = undefined.
  |  |  734|       |///   Else result = n.value
  |  |  735|       |/// See IR.md for IteratorNextInst.
  |  |  736|      0|DEFINE_OPCODE_3(IteratorNext, Reg8, Reg8, Reg8)
  |  |  737|       |
  |  |  738|       |/// Arg1 [in] is the iterator or array index.
  |  |  739|       |/// Arg2 is a bool indicating whether to ignore the inner exception.
  |  |  740|       |/// If the iterator is an object, call iterator.return().
  |  |  741|       |/// If Arg2 is true, ignore exceptions which are thrown by iterator.return().
  |  |  742|       |/// See IR.md for IteratorCloseInst.
  |  |  743|      0|DEFINE_OPCODE_2(IteratorClose, Reg8, UInt8)
  |  |  744|       |
  |  |  745|       |// Jump instructions must be defined through the following DEFINE_JUMP macros.
  |  |  746|       |// The numeric suffix indicates number of operands the instruction takes.
  |  |  747|       |// The macros will automatically generate two opcodes for each definition,
  |  |  748|       |// one short jump that takes Addr8 as target and one long jump that takes
  |  |  749|       |// Addr32 as target. The address is relative to the offset of the instruction.
  |  |  750|      0|#define DEFINE_JUMP_1(name)           \
  |  |  751|      0|  DEFINE_OPCODE_1(name, Addr8)        \
  |  |  752|      0|  DEFINE_OPCODE_1(name##Long, Addr32) \
  |  |  753|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  754|       |
  |  |  755|      0|#define DEFINE_JUMP_2(name)                 \
  |  |  756|      0|  DEFINE_OPCODE_2(name, Addr8, Reg8)        \
  |  |  757|      0|  DEFINE_OPCODE_2(name##Long, Addr32, Reg8) \
  |  |  758|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  759|       |
  |  |  760|      0|#define DEFINE_JUMP_3(name)                       \
  |  |  761|      0|  DEFINE_OPCODE_3(name, Addr8, Reg8, Reg8)        \
  |  |  762|      0|  DEFINE_OPCODE_3(name##Long, Addr32, Reg8, Reg8) \
  |  |  763|      0|  DEFINE_JUMP_LONG_VARIANT(name, name##Long)
  |  |  764|       |
  |  |  765|       |/// Unconditional branch to Arg1.
  |  |  766|      0|DEFINE_JUMP_1(Jmp)
  |  |  767|       |/// Conditional branches to Arg1 based on Arg2.
  |  |  768|      0|DEFINE_JUMP_2(JmpTrue)
  |  |  769|      0|DEFINE_JUMP_2(JmpFalse)
  |  |  770|       |/// Jump if the value is undefined.
  |  |  771|      0|DEFINE_JUMP_2(JmpUndefined)
  |  |  772|       |/// Save the provided value, yield, and signal the VM to restart execution
  |  |  773|       |/// at the provided target.
  |  |  774|      0|DEFINE_JUMP_1(SaveGenerator)
  |  |  775|       |
  |  |  776|       |/// Conditional branches to Arg1 based on Arg2 and Arg3.
  |  |  777|       |/// The *N branches assume numbers and are illegal for other types.
  |  |  778|       |
  |  |  779|       |/// Not conditionals are required for NaN comparisons
  |  |  780|       |/// Since we want to be able to reorder targets to allow for fall-throughs,
  |  |  781|       |/// we need to be able to say "jump when not less than to BB2" instead of
  |  |  782|       |/// "jump when less than to BB1".
  |  |  783|       |/// Since NaN comparisons always return false, "not less" != "greater or equal"
  |  |  784|      0|DEFINE_JUMP_3(JLess)
  |  |  785|      0|DEFINE_JUMP_3(JNotLess)
  |  |  786|      0|DEFINE_JUMP_3(JLessN)
  |  |  787|      0|DEFINE_JUMP_3(JNotLessN)
  |  |  788|      0|DEFINE_JUMP_3(JLessEqual)
  |  |  789|      0|DEFINE_JUMP_3(JNotLessEqual)
  |  |  790|      0|DEFINE_JUMP_3(JLessEqualN)
  |  |  791|      0|DEFINE_JUMP_3(JNotLessEqualN)
  |  |  792|      0|DEFINE_JUMP_3(JGreater)
  |  |  793|      0|DEFINE_JUMP_3(JNotGreater)
  |  |  794|      0|DEFINE_JUMP_3(JGreaterN)
  |  |  795|      0|DEFINE_JUMP_3(JNotGreaterN)
  |  |  796|      0|DEFINE_JUMP_3(JGreaterEqual)
  |  |  797|      0|DEFINE_JUMP_3(JNotGreaterEqual)
  |  |  798|      0|DEFINE_JUMP_3(JGreaterEqualN)
  |  |  799|      0|DEFINE_JUMP_3(JNotGreaterEqualN)
  |  |  800|      0|DEFINE_JUMP_3(JEqual)
  |  |  801|      0|DEFINE_JUMP_3(JNotEqual)
  |  |  802|      0|DEFINE_JUMP_3(JStrictEqual)
  |  |  803|      0|DEFINE_JUMP_3(JStrictNotEqual)
  |  |  804|       |
  |  |  805|       |#ifdef HERMES_RUN_WASM
  |  |  806|       |/// Arg1 = Arg2 + Arg3 (32-bit integer addition)
  |  |  807|       |DEFINE_OPCODE_3(Add32, Reg8, Reg8, Reg8)
  |  |  808|       |/// Arg1 = Arg2 - Arg3 (32-bit integer subtraction)
  |  |  809|       |DEFINE_OPCODE_3(Sub32, Reg8, Reg8, Reg8)
  |  |  810|       |/// Arg1 = Arg2 * Arg3 (32-bit integer multiplication)
  |  |  811|       |DEFINE_OPCODE_3(Mul32, Reg8, Reg8, Reg8)
  |  |  812|       |/// Arg1 = Arg2 / Arg3 (32-bit signed integer division)
  |  |  813|       |DEFINE_OPCODE_3(Divi32, Reg8, Reg8, Reg8)
  |  |  814|       |/// Arg1 = Arg2 / Arg3 (32-bit unsigned integer division)
  |  |  815|       |DEFINE_OPCODE_3(Divu32, Reg8, Reg8, Reg8)
  |  |  816|       |
  |  |  817|       |/// Arg1 = HEAP8[Arg3] (load signed 8-bit integer)
  |  |  818|       |DEFINE_OPCODE_3(Loadi8, Reg8, Reg8, Reg8)
  |  |  819|       |/// Arg1 = HEAPU8[Arg3] (load unsigned 8-bit integer)
  |  |  820|       |DEFINE_OPCODE_3(Loadu8, Reg8, Reg8, Reg8)
  |  |  821|       |/// Arg1 = HEAP16[Arg3 >> 1] (load signed 16-bit integer)
  |  |  822|       |DEFINE_OPCODE_3(Loadi16, Reg8, Reg8, Reg8)
  |  |  823|       |/// Arg1 = HEAPU16[Arg3 >> 1] (load unsigned 16-bit integer)
  |  |  824|       |DEFINE_OPCODE_3(Loadu16, Reg8, Reg8, Reg8)
  |  |  825|       |/// Arg1 = HEAP32[Arg3 >> 2] (load signed 32-bit integer)
  |  |  826|       |DEFINE_OPCODE_3(Loadi32, Reg8, Reg8, Reg8)
  |  |  827|       |/// Arg1 = HEAPU32[Arg3 >> 2] (load unsigned 32-bit integer)
  |  |  828|       |DEFINE_OPCODE_3(Loadu32, Reg8, Reg8, Reg8)
  |  |  829|       |
  |  |  830|       |/// HEAP8[Arg2] = Arg3 (store signed or unsigned 8-bit integer)
  |  |  831|       |DEFINE_OPCODE_3(Store8, Reg8, Reg8, Reg8)
  |  |  832|       |/// HEAP16[Arg2] = Arg3 (store signed or unsigned 16-bit integer)
  |  |  833|       |DEFINE_OPCODE_3(Store16, Reg8, Reg8, Reg8)
  |  |  834|       |/// HEAP32[Arg2] = Arg3 (store signed or unsigned 32-bit integer)
  |  |  835|       |DEFINE_OPCODE_3(Store32, Reg8, Reg8, Reg8)
  |  |  836|       |#endif
  |  |  837|       |
  |  |  838|       |// Implementations can rely on the following pairs of instructions having the
  |  |  839|       |// same number and type of operands.
  |  |  840|      0|ASSERT_EQUAL_LAYOUT3(Call, Construct)
  |  |  841|      0|ASSERT_EQUAL_LAYOUT4(GetById, TryGetById)
  |  |  842|      0|ASSERT_EQUAL_LAYOUT4(PutById, TryPutById)
  |  |  843|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnById, PutNewOwnNEById)
  |  |  844|      0|ASSERT_EQUAL_LAYOUT3(PutNewOwnByIdLong, PutNewOwnNEByIdLong)
  |  |  845|      0|ASSERT_EQUAL_LAYOUT3(Add, AddN)
  |  |  846|      0|ASSERT_EQUAL_LAYOUT3(Sub, SubN)
  |  |  847|      0|ASSERT_EQUAL_LAYOUT3(Mul, MulN)
  |  |  848|       |
  |  |  849|       |// Call and CallLong must agree on the first 2 parameters.
  |  |  850|      0|ASSERT_EQUAL_LAYOUT2(Call, CallLong)
  |  |  851|      0|ASSERT_EQUAL_LAYOUT2(Construct, ConstructLong)
  |  |  852|       |
  |  |  853|      0|#undef DEFINE_JUMP_1
  |  |  854|      0|#undef DEFINE_JUMP_2
  |  |  855|      0|#undef DEFINE_JUMP_3
  |  |  856|       |
  |  |  857|       |// Undefine all macros used to avoid confusing next include.
  |  |  858|      0|#undef DEFINE_OPERAND_TYPE
  |  |  859|      0|#undef DEFINE_OPCODE_0
  |  |  860|      0|#undef DEFINE_OPCODE_1
  |  |  861|      0|#undef DEFINE_OPCODE_2
  |  |  862|      0|#undef DEFINE_OPCODE_3
  |  |  863|      0|#undef DEFINE_OPCODE_4
  |  |  864|      0|#undef DEFINE_OPCODE_5
  |  |  865|      0|#undef DEFINE_OPCODE_6
  |  |  866|      0|#undef DEFINE_OPCODE
  |  |  867|      0|#undef DEFINE_JUMP_LONG_VARIANT
  |  |  868|      0|#undef DEFINE_RET_TARGET
  |  |  869|      0|#undef ASSERT_EQUAL_LAYOUT1
  |  |  870|      0|#undef ASSERT_EQUAL_LAYOUT2
  |  |  871|      0|#undef ASSERT_EQUAL_LAYOUT3
  |  |  872|      0|#undef ASSERT_EQUAL_LAYOUT4
  |  |  873|      0|#undef ASSERT_MONOTONE_INCREASING
  |  |  874|      0|#undef OPERAND_BIGINT_ID
  |  |  875|      0|#undef OPERAND_FUNCTION_ID
  |  |  876|      0|#undef OPERAND_STRING_ID
  ------------------
  727|      0|    default:
  ------------------
  |  Branch (727:5): [True: 0, False: 1.48k]
  ------------------
  728|      0|      return false;
  729|  1.48k|  }
  730|  1.48k|}
_ZZN6hermes2vm11Interpreter17interpretFunctionILb0ELb0EEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeERNS0_16InterpreterStateEEN7IPSaverD2Ev:
  866|    155|    ~IPSaver() {
  867|    155|      runtime_.setCurrentIP(ip_);
  868|    155|    }

_ZN6hermes2vm18ArrayImplBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   22|      2|void ArrayImplBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   23|      2|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<ArrayImpl>());
   24|      2|  JSObjectBuildMeta(cell, mb);
   25|      2|  const auto *self = static_cast<const ArrayImpl *>(cell);
   26|       |  // This edge has to be called "elements" in order for Chrome to attribute
   27|       |  // the size of the indexed storage as part of total usage of "JS Arrays".
   28|      2|  mb.addField("elements", &self->indexedStorage_);
   29|      2|}
_ZN6hermes2vm9ArrayImpl31_getOwnIndexedPropertyFlagsImplEPNS0_8JSObjectERNS0_7RuntimeEj:
   82|   354k|    uint32_t index) {
   83|   354k|  auto *self = vmcast<ArrayImpl>(selfObj);
   84|       |
   85|       |  // Check whether the index is within the storage.
   86|   354k|  if (index >= self->beginIndex_ && index < self->endIndex_ &&
  ------------------
  |  Branch (86:7): [True: 354k, False: 0]
  |  Branch (86:7): [True: 0, False: 354k]
  |  Branch (86:37): [True: 195k, False: 158k]
  ------------------
   87|   354k|      !self->getIndexedStorage(runtime)
  ------------------
  |  Branch (87:7): [True: 0, False: 195k]
  ------------------
   88|   195k|           ->at(runtime, index - self->beginIndex_)
   89|   195k|           .isEmpty()) {
   90|      0|    PropertyFlags indexedElementFlags{};
   91|      0|    indexedElementFlags.enumerable = 1;
   92|      0|    indexedElementFlags.writable = 1;
   93|      0|    indexedElementFlags.configurable = 1;
   94|       |
   95|      0|    if (LLVM_UNLIKELY(self->flags_.sealed)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   96|      0|      indexedElementFlags.configurable = 0;
   97|      0|      if (LLVM_UNLIKELY(self->flags_.frozen))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
   98|      0|        indexedElementFlags.writable = 0;
   99|      0|    }
  100|       |
  101|      0|    return indexedElementFlags;
  102|      0|  }
  103|       |
  104|   354k|  return llvh::None;
  105|   354k|}
_ZN6hermes2vm9ArrayImpl18_getOwnIndexedImplENS0_12PseudoHandleINS0_8JSObjectEEERNS0_7RuntimeEj:
  117|   459k|    uint32_t index) {
  118|   459k|  NoAllocScope noAllocs{runtime};
  119|       |
  120|   459k|  return vmcast<ArrayImpl>(selfObj.get())
  121|   459k|      ->at(runtime, index)
  122|   459k|      .unboxToHV(runtime);
  123|   459k|}
_ZN6hermes2vm9ArrayImpl18setStorageEndIndexENS0_6HandleIS1_EERNS0_7RuntimeEj:
  128|  10.9k|    uint32_t newLength) {
  129|  10.9k|  auto *self = selfHandle.get();
  130|       |
  131|  10.9k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  21.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.9k]
  |  |  |  Branch (189:53): [True: 10.9k, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 10.9k]
  |  |  ------------------
  ------------------
  132|  10.9k|          newLength > self->beginIndex_ &&
  133|  10.9k|          newLength - self->beginIndex_ > StorageType::maxElements())) {
  134|      0|    return runtime.raiseRangeError("Out of memory for array elements");
  135|      0|  }
  136|       |
  137|       |  // If indexedStorage hasn't even been allocated.
  138|  10.9k|  if (LLVM_UNLIKELY(!self->getIndexedStorage(runtime))) {
  ------------------
  |  |  189|  10.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 10.9k]
  |  |  ------------------
  ------------------
  139|      0|    if (newLength == 0) {
  ------------------
  |  Branch (139:9): [True: 0, False: 0]
  ------------------
  140|      0|      return ExecutionStatus::RETURNED;
  141|      0|    }
  142|      0|    auto arrRes = StorageType::create(runtime, newLength, newLength);
  143|      0|    if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  144|      0|      return ExecutionStatus::EXCEPTION;
  145|      0|    }
  146|      0|    auto newStorage = runtime.makeHandle<StorageType>(std::move(*arrRes));
  147|      0|    selfHandle->setIndexedStorage(runtime, newStorage.get(), runtime.getHeap());
  148|      0|    selfHandle->beginIndex_ = 0;
  149|      0|    selfHandle->endIndex_ = newLength;
  150|      0|    return ExecutionStatus::RETURNED;
  151|      0|  }
  152|       |
  153|  10.9k|  auto beginIndex = self->beginIndex_;
  154|       |
  155|  10.9k|  {
  156|  10.9k|    NoAllocScope scope{runtime};
  157|  10.9k|    auto *const indexedStorage = self->getIndexedStorage(runtime);
  158|       |
  159|  10.9k|    if (newLength <= beginIndex) {
  ------------------
  |  Branch (159:9): [True: 0, False: 10.9k]
  ------------------
  160|       |      // the new length is prior to beginIndex, clearing the storage.
  161|      0|      selfHandle->endIndex_ = beginIndex;
  162|       |      // Remove the storage. If this array grows again it can be re-allocated.
  163|      0|      self->setIndexedStorage(runtime, nullptr, runtime.getHeap());
  164|      0|      return ExecutionStatus::RETURNED;
  165|  10.9k|    } else if (newLength - beginIndex <= indexedStorage->capacity()) {
  ------------------
  |  Branch (165:16): [True: 10.9k, False: 9]
  ------------------
  166|  10.9k|      selfHandle->endIndex_ = newLength;
  167|  10.9k|      StorageType::resizeWithinCapacity(
  168|  10.9k|          indexedStorage, runtime, newLength - beginIndex);
  169|  10.9k|      return ExecutionStatus::RETURNED;
  170|  10.9k|    }
  171|  10.9k|  }
  172|       |
  173|      9|  auto indexedStorage =
  174|      9|      runtime.makeMutableHandle(selfHandle->getIndexedStorage(runtime));
  175|       |
  176|      9|  if (StorageType::resize(indexedStorage, runtime, newLength - beginIndex) ==
  ------------------
  |  Branch (176:7): [True: 0, False: 9]
  ------------------
  177|      9|      ExecutionStatus::EXCEPTION) {
  178|      0|    return ExecutionStatus::EXCEPTION;
  179|      0|  }
  180|      9|  selfHandle->endIndex_ = newLength;
  181|      9|  selfHandle->setIndexedStorage(
  182|      9|      runtime, indexedStorage.get(), runtime.getHeap());
  183|      9|  return ExecutionStatus::RETURNED;
  184|      9|}
_ZN6hermes2vm9ArrayImpl18_setOwnIndexedImplENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
  190|  1.20M|    Handle<> value) {
  191|  1.20M|  auto *self = vmcast<ArrayImpl>(selfHandle.get());
  192|  1.20M|  auto beginIndex = self->beginIndex_;
  193|  1.20M|  auto endIndex = self->endIndex_;
  194|       |
  195|  1.20M|  if (LLVM_UNLIKELY(self->flags_.frozen))
  ------------------
  |  |  189|  1.20M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.20M]
  |  |  ------------------
  ------------------
  196|      0|    return false;
  197|       |
  198|       |  // Check whether the index is within the storage.
  199|  1.20M|  if (LLVM_LIKELY(index >= beginIndex && index < endIndex)) {
  ------------------
  |  |  188|  2.41M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 195k, False: 1.00M]
  |  |  |  Branch (188:51): [True: 1.20M, False: 0]
  |  |  |  Branch (188:51): [True: 195k, False: 1.00M]
  |  |  ------------------
  ------------------
  200|   195k|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  201|   195k|    Handle<ArrayImpl>::vmcast(selfHandle)
  202|   195k|        ->getIndexedStorage(runtime)
  203|   195k|        ->set(runtime, index - beginIndex, shv);
  204|   195k|    return true;
  205|   195k|  }
  206|       |
  207|       |  // If indexedStorage hasn't even been allocated.
  208|  1.00M|  if (LLVM_UNLIKELY(!self->getIndexedStorage(runtime))) {
  ------------------
  |  |  189|  1.00M|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 7, False: 1.00M]
  |  |  ------------------
  ------------------
  209|       |    // Allocate storage with capacity for 4 elements and length 1.
  210|      7|    auto arrRes = StorageType::create(runtime, 4, 1);
  211|      7|    if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7]
  |  |  ------------------
  ------------------
  212|      0|      return ExecutionStatus::EXCEPTION;
  213|      0|    }
  214|      7|    auto newStorage = runtime.makeHandle<StorageType>(std::move(*arrRes));
  215|      7|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  216|      7|    self = vmcast<ArrayImpl>(selfHandle.get());
  217|       |
  218|      7|    self->setIndexedStorage(runtime, newStorage.get(), runtime.getHeap());
  219|      7|    self->beginIndex_ = index;
  220|      7|    self->endIndex_ = index + 1;
  221|      7|    newStorage->set(runtime, 0, shv);
  222|      7|    return true;
  223|      7|  }
  224|       |
  225|  1.00M|  {
  226|  1.00M|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  227|  1.00M|    NoAllocScope scope{runtime};
  228|  1.00M|    self = vmcast<ArrayImpl>(selfHandle.get());
  229|  1.00M|    auto *const indexedStorage = self->getIndexedStorage(runtime);
  230|       |
  231|       |    // Can we do it without reallocation for sure?
  232|  1.00M|    if (index >= endIndex && index - beginIndex < indexedStorage->capacity()) {
  ------------------
  |  Branch (232:9): [True: 1.00M, False: 0]
  |  Branch (232:30): [True: 1.00M, False: 606]
  ------------------
  233|  1.00M|      self->endIndex_ = index + 1;
  234|  1.00M|      StorageType::resizeWithinCapacity(
  235|  1.00M|          indexedStorage, runtime, index - beginIndex + 1);
  236|       |      // self shouldn't have moved since there haven't been any allocations.
  237|  1.00M|      indexedStorage->set(runtime, index - beginIndex, shv);
  238|  1.00M|      return true;
  239|  1.00M|    }
  240|  1.00M|  }
  241|       |
  242|    606|  auto indexedStorageHandle =
  243|    606|      runtime.makeMutableHandle(self->getIndexedStorage(runtime));
  244|       |  // We only shift an array if the shift amount is within the limit.
  245|    606|  constexpr uint32_t shiftLimit = (1 << 20);
  246|       |
  247|       |  // Is the array empty?
  248|    606|  if (LLVM_UNLIKELY(endIndex == beginIndex)) {
  ------------------
  |  |  189|    606|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 606]
  |  |  ------------------
  ------------------
  249|      0|    if (StorageType::resize(indexedStorageHandle, runtime, 1) ==
  ------------------
  |  Branch (249:9): [True: 0, False: 0]
  ------------------
  250|      0|        ExecutionStatus::EXCEPTION) {
  251|      0|      return ExecutionStatus::EXCEPTION;
  252|      0|    }
  253|      0|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  254|      0|    indexedStorageHandle->set(runtime, 0, shv);
  255|      0|    self = vmcast<ArrayImpl>(selfHandle.get());
  256|      0|    self->beginIndex_ = index;
  257|      0|    self->endIndex_ = index + 1;
  258|    606|  } else if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  2.43k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 606]
  |  |  |  Branch (189:53): [True: 6, False: 600]
  |  |  |  Branch (189:53): [True: 0, False: 6]
  |  |  |  Branch (189:53): [True: 0, False: 606]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  259|    606|                 (index > endIndex && index - endIndex > shiftLimit) ||
  260|    606|                 (index < beginIndex && beginIndex - index > shiftLimit))) {
  261|       |    // The new index is too far away from the current index range.
  262|       |    // Shifting will lead to a very large allocation.
  263|       |    // This is likely a misuse of the array (e.g. use array as an object).
  264|       |    // In this case, we should just treat the index access as
  265|       |    // a property access.
  266|      0|    auto vr = valueToSymbolID(
  267|      0|        runtime, runtime.makeHandle(HermesValue::encodeNumberValue(index)));
  268|      0|    assert(
  269|      0|        vr != ExecutionStatus::EXCEPTION &&
  270|      0|        "valueToIdentifier() failed for uint32_t value");
  271|       |
  272|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  273|      0|            JSObject::defineNewOwnProperty(
  274|      0|                selfHandle,
  275|      0|                runtime,
  276|      0|                **vr,
  277|      0|                PropertyFlags::defaultNewNamedPropertyFlags(),
  278|      0|                value) == ExecutionStatus::EXCEPTION)) {
  279|      0|      return ExecutionStatus::EXCEPTION;
  280|      0|    }
  281|       |    // self->indexedStorage_ is unmodified, we should return directly.
  282|      0|    return true;
  283|    606|  } else if (index >= endIndex) {
  ------------------
  |  Branch (283:14): [True: 606, False: 0]
  ------------------
  284|       |    // Extending to the right.
  285|    606|    if (StorageType::resize(
  ------------------
  |  Branch (285:9): [True: 0, False: 606]
  ------------------
  286|    606|            indexedStorageHandle, runtime, index - beginIndex + 1) ==
  287|    606|        ExecutionStatus::EXCEPTION) {
  288|      0|      return ExecutionStatus::EXCEPTION;
  289|      0|    }
  290|    606|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  291|    606|    self = vmcast<ArrayImpl>(selfHandle.get());
  292|    606|    self->endIndex_ = index + 1;
  293|    606|    indexedStorageHandle->set(runtime, index - beginIndex, shv);
  294|    606|  } else {
  295|       |    // Extending to the left. 'index' will become the new 'beginIndex'.
  296|      0|    assert(index < beginIndex);
  297|       |
  298|      0|    if (StorageType::resizeLeft(
  ------------------
  |  Branch (298:9): [True: 0, False: 0]
  ------------------
  299|      0|            indexedStorageHandle,
  300|      0|            runtime,
  301|      0|            indexedStorageHandle->size(runtime) + beginIndex - index) ==
  302|      0|        ExecutionStatus::EXCEPTION) {
  303|      0|      return ExecutionStatus::EXCEPTION;
  304|      0|    }
  305|      0|    const auto shv = SmallHermesValue::encodeHermesValue(*value, runtime);
  306|      0|    self = vmcast<ArrayImpl>(selfHandle.get());
  307|      0|    self->beginIndex_ = index;
  308|      0|    indexedStorageHandle->set(runtime, 0, shv);
  309|      0|  }
  310|       |
  311|       |  // Update the potentially changed pointer.
  312|    606|  self->setIndexedStorage(
  313|    606|      runtime, indexedStorageHandle.get(), runtime.getHeap());
  314|    606|  return true;
  315|    606|}
_ZN6hermes2vm18ArgumentsBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  386|      1|void ArgumentsBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  387|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<Arguments>());
  388|      1|  ArrayImplBuildMeta(cell, mb);
  389|      1|  mb.setVTable(&Arguments::vt);
  390|      1|}
_ZN6hermes2vm16JSArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  501|      1|void JSArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  502|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSArray>());
  503|      1|  ArrayImplBuildMeta(cell, mb);
  504|      1|  mb.setVTable(&JSArray::vt);
  505|      1|}
_ZN6hermes2vm7JSArray11createClassERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
  509|    198|    Handle<JSObject> prototypeHandle) {
  510|    198|  Handle<HiddenClass> classHandle = runtime.getHiddenClassForPrototype(
  511|    198|      *prototypeHandle, numOverlapSlots<JSArray>());
  512|       |
  513|    198|  PropertyFlags pf{};
  514|    198|  pf.enumerable = 0;
  515|    198|  pf.writable = 1;
  516|    198|  pf.configurable = 0;
  517|    198|  pf.internalSetter = 1;
  518|       |
  519|    198|  auto added = HiddenClass::addProperty(
  520|    198|      classHandle, runtime, Predefined::getSymbolID(Predefined::length), pf);
  521|    198|  assert(
  522|    198|      added != ExecutionStatus::EXCEPTION &&
  523|    198|      "Adding the first properties shouldn't cause overflow");
  524|      0|  assert(
  525|    198|      added->second == lengthPropIndex() && "JSArray.length has invalid index");
  526|      0|  classHandle = added->first;
  527|       |
  528|    198|  assert(
  529|    198|      classHandle->getNumProperties() == jsArrayPropertyCount() &&
  530|    198|      "JSArray class defined with incorrect number of properties");
  531|       |
  532|      0|  return classHandle;
  533|    198|}
_ZN6hermes2vm7JSArray24createNoAllocPropStorageERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEjj:
  540|   428k|    size_type length) {
  541|   428k|  assert(length <= capacity && "length must be <= capacity");
  542|       |
  543|      0|  assert(
  544|   428k|      classHandle->getNumProperties() >= jsArrayPropertyCount() &&
  545|   428k|      "invalid number of properties in JSArray hidden class");
  546|       |
  547|      0|  auto self = JSObjectInit::initToHandle(
  548|   428k|      runtime,
  549|   428k|      runtime.makeAFixed<JSArray>(
  550|   428k|          runtime, prototypeHandle, classHandle, GCPointerBase::NoBarriers()));
  551|       |
  552|       |  // Only allocate the storage if capacity is not zero.
  553|   428k|  if (capacity) {
  ------------------
  |  Branch (553:7): [True: 415k, False: 12.3k]
  ------------------
  554|   415k|    if (LLVM_UNLIKELY(capacity > StorageType::maxElements()))
  ------------------
  |  |  189|   415k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 415k]
  |  |  ------------------
  ------------------
  555|      0|      return runtime.raiseRangeError("Out of memory for array elements");
  556|   415k|    auto arrRes = StorageType::create(runtime, capacity);
  557|   415k|    if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (557:9): [True: 0, False: 415k]
  ------------------
  558|      0|      return ExecutionStatus::EXCEPTION;
  559|      0|    }
  560|   415k|    self->setIndexedStorage(runtime, arrRes->get(), runtime.getHeap());
  561|   415k|  }
  562|   428k|  auto shv = SmallHermesValue::encodeNumberValue(length, runtime);
  563|   428k|  putLength(self.get(), runtime, shv);
  564|       |
  565|   428k|  return self;
  566|   428k|}
_ZN6hermes2vm7JSArray25createAndAllocPropStorageERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS4_INS0_11HiddenClassEEEjj:
  573|   404k|    size_type length) {
  574|   404k|  CallResult<Handle<JSArray>> res = createNoAllocPropStorage(
  575|   404k|      runtime, prototypeHandle, classHandle, capacity, length);
  576|   404k|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  577|      0|    return ExecutionStatus::EXCEPTION;
  578|      0|  }
  579|       |
  580|       |  // Allocate property storage with size corresponding to number of properties
  581|       |  // in the hidden class.
  582|   404k|  Handle<JSArray> arr = std::move(*res);
  583|   404k|  runtime.ignoreAllocationFailure(JSObject::allocatePropStorage(
  584|   404k|      arr, runtime, classHandle->getNumProperties()));
  585|       |
  586|   404k|  return arr;
  587|   404k|}
_ZN6hermes2vm7JSArray6createERNS0_7RuntimeEjj:
  590|  23.6k|JSArray::create(Runtime &runtime, size_type capacity, size_type length) {
  591|  23.6k|  return JSArray::createNoAllocPropStorage(
  592|  23.6k|      runtime,
  593|  23.6k|      Handle<JSObject>::vmcast(&runtime.arrayPrototype),
  594|  23.6k|      Handle<HiddenClass>::vmcast(&runtime.arrayClass),
  595|  23.6k|      capacity,
  596|  23.6k|      length);
  597|  23.6k|}
_ZN6hermes2vm7JSArray9setLengthENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
  603|      7|    PropOpFlags opFlags) {
  604|       |  // Convert the value to uint32_t.
  605|      7|  double d;
  606|      7|  if (newLength->isNumber()) {
  ------------------
  |  Branch (606:7): [True: 7, False: 0]
  ------------------
  607|      7|    d = newLength->getNumber();
  608|      7|  } else {
  609|      0|    auto res = toNumber_RJS(runtime, newLength);
  610|      0|    if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (610:9): [True: 0, False: 0]
  ------------------
  611|      0|      return ExecutionStatus::EXCEPTION;
  612|      0|    d = res->getNumber();
  613|      0|  }
  614|       |
  615|       |  // NOTE: in theory this produces UB, however in practice it is well defined.
  616|       |  // Regardless what happens in the conversion, 'ulen' can never compare equal
  617|       |  // to 'd' unless 'd' is really an uint32 number, in which case the conversion
  618|       |  // would have succeeded.
  619|       |  // The only way this could fail is if the conversion throws an exception or
  620|       |  // aborts the application, which is not the case on any platform we are
  621|       |  // targeting.
  622|      7|  uint32_t ulen = (uint32_t)d;
  623|      7|  if (ulen != d)
  ------------------
  |  Branch (623:7): [True: 0, False: 7]
  ------------------
  624|      0|    return runtime.raiseRangeError("Invalid array length");
  625|       |
  626|      7|  return setLength(selfHandle, runtime, ulen, opFlags);
  627|      7|}
_ZN6hermes2vm7JSArray9setLengthENS0_6HandleIS1_EERNS0_7RuntimeEjNS0_11PropOpFlagsE:
  633|   145k|    PropOpFlags opFlags) {
  634|       |  // Fast-path: if we are enlarging, do nothing.
  635|   145k|  const auto currentLength = getLength(*selfHandle, runtime);
  636|   145k|  if (LLVM_LIKELY(newLength >= currentLength)) {
  ------------------
  |  |  188|   145k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 145k, False: 0]
  |  |  ------------------
  ------------------
  637|   145k|    auto shv = SmallHermesValue::encodeNumberValue(newLength, runtime);
  638|   145k|    putLength(*selfHandle, runtime, shv);
  639|   145k|    return true;
  640|   145k|  }
  641|       |
  642|       |  // Length adjusted to the index of the highest non-deletable property + 1.
  643|       |  // Nothing smaller than it can be deleted.
  644|      0|  uint32_t adjustedLength = newLength;
  645|       |
  646|       |  // If we are sealed, we can't shrink past non-empty properties.
  647|      0|  if (LLVM_UNLIKELY(selfHandle->flags_.sealed)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  648|       |    // We must scan backwards looking for a non-empty property. We only have
  649|       |    // to scan in the intersection between the range of present values and
  650|       |    // the range between the current length and the new length.
  651|       |    //              newLength         currentLength
  652|       |    //                 |                    |
  653|       |    //                 +--------------------+
  654|       |    //       begin                end
  655|       |    //         |                   |
  656|       |    //         +-------------------+
  657|       |    //                 +-----------+
  658|       |    //                 |           |
  659|       |    //          lowestScanLen  highestLen
  660|       |    //
  661|       |
  662|      0|    auto *self = selfHandle.get();
  663|      0|    auto range = _getOwnIndexedRangeImpl(self, runtime);
  664|      0|    uint32_t lowestScanLen = std::max(range.first, newLength);
  665|      0|    uint32_t highestLen = std::min(range.second, currentLength);
  666|       |
  667|      0|    for (; highestLen > lowestScanLen; --highestLen) {
  ------------------
  |  Branch (667:12): [True: 0, False: 0]
  ------------------
  668|      0|      if (!self->unsafeAt(runtime, highestLen - 1).isEmpty()) {
  ------------------
  |  Branch (668:11): [True: 0, False: 0]
  ------------------
  669|      0|        adjustedLength = highestLen;
  670|      0|        break;
  671|      0|      }
  672|      0|    }
  673|      0|  }
  674|       |
  675|      0|  if (LLVM_UNLIKELY(selfHandle->clazz_.getNonNull(runtime)
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  676|      0|                        ->getHasIndexLikeProperties())) {
  677|       |    // Uh-oh. We are making the array smaller and we have index-like named
  678|       |    // properties, so we may have to delete some of them: the ones greater or
  679|       |    // equal to 'newLength'.
  680|       |
  681|       |    // We iterate all named properties to find all index-like ones that need to
  682|       |    // be deleted. At the same time we keep track of the highest index of a non-
  683|       |    // deletable property - nothing smaller than that can be deleted because the
  684|       |    // highest non-deletable would have terminated the deletion process.
  685|       |
  686|      0|    using IndexProp = std::pair<uint32_t, SymbolID>;
  687|      0|    llvh::SmallVector<IndexProp, 8> toBeDeleted;
  688|       |
  689|      0|    GCScope scope{runtime};
  690|       |
  691|      0|    HiddenClass::forEachProperty(
  692|      0|        runtime.makeHandle(selfHandle->clazz_),
  693|      0|        runtime,
  694|      0|        [&runtime, &adjustedLength, &toBeDeleted, &scope](
  695|      0|            SymbolID id, NamedPropertyDescriptor desc) {
  696|      0|          GCScopeMarkerRAII marker{scope};
  697|       |          // If this property is not an integer index, or it doesn't need to be
  698|       |          // deleted (it is less than 'adjustedLength'), ignore it.
  699|      0|          auto propNameAsIndex = toArrayIndex(
  700|      0|              runtime.getIdentifierTable().getStringView(runtime, id));
  701|      0|          if (!propNameAsIndex || *propNameAsIndex < adjustedLength)
  702|      0|            return;
  703|       |
  704|      0|          if (!desc.flags.configurable) {
  705|      0|            adjustedLength = *propNameAsIndex + 1;
  706|      0|          } else {
  707|      0|            toBeDeleted.push_back({*propNameAsIndex, id});
  708|      0|          }
  709|      0|        });
  710|       |
  711|       |    // Scan the properties to be deleted in reverse order (to make deletion more
  712|       |    // efficient) and delete those >= adjustedLength.
  713|      0|    for (auto it = toBeDeleted.rbegin(), e = toBeDeleted.rend(); it != e;
  ------------------
  |  Branch (713:66): [True: 0, False: 0]
  ------------------
  714|      0|         ++it) {
  715|      0|      if (it->first >= adjustedLength) {
  ------------------
  |  Branch (715:11): [True: 0, False: 0]
  ------------------
  716|      0|        GCScopeMarkerRAII marker{scope};
  717|      0|        auto cr = JSObject::deleteNamed(selfHandle, runtime, it->second);
  718|      0|        assert(
  719|      0|            cr != ExecutionStatus::EXCEPTION && *cr &&
  720|      0|            "Failed to delete a configurable property");
  721|      0|        (void)cr;
  722|      0|      }
  723|      0|    }
  724|      0|  }
  725|       |
  726|      0|  if (adjustedLength < selfHandle->getEndIndex()) {
  ------------------
  |  Branch (726:7): [True: 0, False: 0]
  ------------------
  727|      0|    auto cr = setStorageEndIndex(selfHandle, runtime, adjustedLength);
  728|      0|    if (cr == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (728:9): [True: 0, False: 0]
  ------------------
  729|      0|      return ExecutionStatus::EXCEPTION;
  730|      0|    }
  731|      0|  }
  732|      0|  auto shv = SmallHermesValue::encodeNumberValue(adjustedLength, runtime);
  733|      0|  putLength(*selfHandle, runtime, shv);
  734|       |
  735|      0|  if (adjustedLength != newLength) {
  ------------------
  |  Branch (735:7): [True: 0, False: 0]
  ------------------
  736|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (736:9): [True: 0, False: 0]
  ------------------
  737|      0|      return runtime.raiseTypeError(
  738|      0|          TwineChar16("Cannot delete property '") + (adjustedLength - 1) + "'");
  739|      0|    }
  740|      0|    return false;
  741|      0|  }
  742|       |
  743|      0|  return true;
  744|      0|}
_ZN6hermes2vm24JSArrayIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  760|      1|void JSArrayIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  761|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSArrayIterator>());
  762|      1|  JSObjectBuildMeta(cell, mb);
  763|      1|  const auto *self = static_cast<const JSArrayIterator *>(cell);
  764|      1|  mb.setVTable(&JSArrayIterator::vt);
  765|      1|  mb.addField("iteratedObject", &self->iteratedObject_);
  766|      1|}

_ZN6hermes2vm22JSArrayBufferBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   44|      1|void JSArrayBufferBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   45|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSArrayBuffer>());
   46|      1|  JSObjectBuildMeta(cell, mb);
   47|      1|  mb.setVTable(&JSArrayBuffer::vt);
   48|      1|}

_ZN6hermes2vm19JSCallSiteBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   33|      1|void JSCallSiteBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   34|      1|  mb.addJSObjectOverlapSlots(JSCallSite::numOverlapSlots<JSCallSite>());
   35|      1|  JSObjectBuildMeta(cell, mb);
   36|      1|  const auto *self = static_cast<const JSCallSite *>(cell);
   37|      1|  mb.setVTable(&JSCallSite::vt);
   38|      1|  mb.addField("error", &self->error_);
   39|      1|}

_ZN6hermes2vm24JSCallableProxyBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   33|      1|void JSCallableProxyBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   34|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSCallableProxy>());
   35|      1|  NativeFunctionBuildMeta(cell, mb);
   36|      1|  const auto *self = static_cast<const JSCallableProxy *>(cell);
   37|      1|  mb.setVTable(&JSCallableProxy::vt);
   38|      1|  mb.addField("@target", &self->slots_.target);
   39|      1|  mb.addField("@handler", &self->slots_.handler);
   40|      1|}

_ZN6hermes2vm19JSDataViewBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   27|      1|void JSDataViewBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   28|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSDataView>());
   29|      1|  JSObjectBuildMeta(cell, mb);
   30|      1|  const auto *self = static_cast<const JSDataView *>(cell);
   31|      1|  mb.setVTable(&JSDataView::vt);
   32|      1|  mb.addField("buffer", &self->buffer_);
   33|      1|}

_ZN6hermes2vm15JSDateBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   30|      1|void JSDateBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   31|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSDate>());
   32|      1|  JSObjectBuildMeta(cell, mb);
   33|      1|  mb.setVTable(&JSDate::vt);
   34|      1|}

_ZN6hermes2vm16JSErrorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   48|      1|void JSErrorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   49|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSError>());
   50|      1|  JSObjectBuildMeta(cell, mb);
   51|      1|  const auto *self = static_cast<const JSError *>(cell);
   52|      1|  mb.setVTable(&JSError::vt);
   53|      1|  mb.addField("funcNames", &self->funcNames_);
   54|      1|  mb.addField("domains", &self->domains_);
   55|      1|}
_ZN6hermes2vm7JSError23getErrorFromStackTargetERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
   59|     24|    Handle<JSObject> targetHandle) {
   60|     24|  if (targetHandle) {
  ------------------
  |  Branch (60:7): [True: 24, False: 0]
  ------------------
   61|     24|    NamedPropertyDescriptor desc;
   62|     24|    bool exists = JSObject::getOwnNamedDescriptor(
   63|     24|        targetHandle,
   64|     24|        runtime,
   65|     24|        Predefined::getSymbolID(Predefined::InternalPropertyCapturedError),
   66|     24|        desc);
   67|     24|    if (exists) {
  ------------------
  |  Branch (67:9): [True: 0, False: 24]
  ------------------
   68|      0|      auto sv = JSObject::getNamedSlotValueUnsafe(*targetHandle, runtime, desc);
   69|      0|      return runtime.makeHandle(vmcast<JSError>(sv.getObject(runtime)));
   70|      0|    }
   71|     24|    if (vmisa<JSError>(*targetHandle)) {
  ------------------
  |  Branch (71:9): [True: 24, False: 0]
  ------------------
   72|     24|      return Handle<JSError>::vmcast(targetHandle);
   73|     24|    }
   74|     24|  }
   75|      0|  return runtime.raiseTypeError(
   76|      0|      "Error.stack getter called with an invalid receiver");
   77|     24|}
_ZN6hermes2vm16errorStackGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
   80|     24|errorStackGetter(void *, Runtime &runtime, NativeArgs args) {
   81|     24|  GCScope gcScope(runtime);
   82|       |
   83|     24|  auto targetHandle = args.dyncastThis<JSObject>();
   84|     24|  auto errorHandleRes = JSError::getErrorFromStackTarget(runtime, targetHandle);
   85|     24|  if (errorHandleRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (85:7): [True: 0, False: 24]
  ------------------
   86|      0|    return ExecutionStatus::EXCEPTION;
   87|      0|  }
   88|     24|  auto errorHandle = *errorHandleRes;
   89|     24|  if (!errorHandle->stacktrace_) {
  ------------------
  |  Branch (89:7): [True: 0, False: 24]
  ------------------
   90|       |    // Stacktrace has not been set, we simply return empty string.
   91|       |    // This is different from other VMs where stacktrace is created when
   92|       |    // the error object is created. We only set it when the error
   93|       |    // is raised.
   94|      0|    return HermesValue::encodeStringValue(
   95|      0|        runtime.getPredefinedString(Predefined::emptyString));
   96|      0|  }
   97|       |  // It's possible we're getting the stack for a stack overflow
   98|       |  // RangeError.  Allow ourselves a little extra room to do this.
   99|     24|  vm::ScopedNativeDepthReducer reducer(runtime);
  100|     24|  SmallU16String<32> stack;
  101|       |
  102|     24|  auto errorCtor = Handle<JSObject>::vmcast(&runtime.errorConstructor);
  103|       |
  104|     24|  auto prepareStackTraceRes = JSObject::getNamed_RJS(
  105|     24|      errorCtor,
  106|     24|      runtime,
  107|     24|      Predefined::getSymbolID(Predefined::prepareStackTrace),
  108|     24|      PropOpFlags().plusThrowOnError());
  109|       |
  110|     24|  if (prepareStackTraceRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (110:7): [True: 0, False: 24]
  ------------------
  111|      0|    return ExecutionStatus::EXCEPTION;
  112|      0|  }
  113|       |
  114|     24|  MutableHandle<> stackTraceFormatted{runtime};
  115|       |
  116|     24|  auto prepareStackTrace = Handle<Callable>::dyn_vmcast(
  117|     24|      runtime.makeHandle(std::move(*prepareStackTraceRes)));
  118|     24|  if (LLVM_UNLIKELY(prepareStackTrace && !runtime.formattingStackTrace())) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  |  Branch (189:53): [True: 0, False: 24]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  119|      0|    const auto &recursionGuard = llvh::make_scope_exit(
  120|      0|        [&runtime]() { runtime.setFormattingStackTrace(false); });
  121|      0|    (void)recursionGuard;
  122|       |
  123|      0|    runtime.setFormattingStackTrace(true);
  124|       |
  125|      0|    auto callSitesRes = JSError::constructCallSitesArray(runtime, errorHandle);
  126|       |
  127|      0|    if (LLVM_UNLIKELY(callSitesRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  128|      0|      return ExecutionStatus::EXCEPTION;
  129|      0|    }
  130|      0|    auto prepareRes = Callable::executeCall2(
  131|      0|        prepareStackTrace,
  132|      0|        runtime,
  133|      0|        runtime.getNullValue(),
  134|      0|        targetHandle.getHermesValue(),
  135|      0|        *callSitesRes);
  136|      0|    if (LLVM_UNLIKELY(prepareRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  137|      0|      return ExecutionStatus::EXCEPTION;
  138|      0|    }
  139|      0|    stackTraceFormatted = std::move(*prepareRes);
  140|     24|  } else {
  141|     24|    if (JSError::constructStackTraceString(
  ------------------
  |  Branch (141:9): [True: 0, False: 24]
  ------------------
  142|     24|            runtime, errorHandle, targetHandle, stack) ==
  143|     24|        ExecutionStatus::EXCEPTION) {
  144|      0|      return ExecutionStatus::EXCEPTION;
  145|      0|    }
  146|       |
  147|     24|    auto strRes = StringPrimitive::create(runtime, stack);
  148|     24|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  149|       |      // StringPrimitive creation can throw if the stacktrace string is too
  150|       |      // long. In that case, we replace it with a predefined string.
  151|      0|      stackTraceFormatted = HermesValue::encodeStringValue(
  152|      0|          runtime.getPredefinedString(Predefined::stacktraceTooLong));
  153|      0|      runtime.clearThrownValue();
  154|     24|    } else {
  155|     24|      stackTraceFormatted = std::move(*strRes);
  156|     24|    }
  157|     24|  }
  158|       |
  159|       |  // We no longer need the accessor. Redefine the stack property to a regular
  160|       |  // property.
  161|     24|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  162|     24|  if (JSObject::defineOwnProperty(
  ------------------
  |  Branch (162:7): [True: 0, False: 24]
  ------------------
  163|     24|          targetHandle,
  164|     24|          runtime,
  165|     24|          Predefined::getSymbolID(Predefined::stack),
  166|     24|          dpf,
  167|     24|          stackTraceFormatted) == ExecutionStatus::EXCEPTION) {
  168|      0|    return ExecutionStatus::EXCEPTION;
  169|      0|  }
  170|     24|  return *stackTraceFormatted;
  171|     24|}
_ZN6hermes2vm7JSError6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
  197|     24|    Handle<JSObject> parentHandle) {
  198|     24|  return create(runtime, parentHandle, /*catchable*/ true);
  199|     24|}
_ZN6hermes2vm7JSError6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEEb:
  210|     24|    bool catchable) {
  211|     24|  auto *cell = runtime.makeAFixed<JSError, HasFinalizer::Yes>(
  212|     24|      runtime,
  213|     24|      parentHandle,
  214|     24|      runtime.getHiddenClassForPrototype(
  215|     24|          *parentHandle, numOverlapSlots<JSError>()),
  216|     24|      catchable);
  217|     24|  return JSObjectInit::initToPseudoHandle(runtime, cell);
  218|     24|}
_ZN6hermes2vm7JSError10setupStackENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeE:
  222|     24|    Runtime &runtime) {
  223|       |  // Lazily allocate the accessor.
  224|     24|  if (runtime.jsErrorStackAccessor.isUndefined()) {
  ------------------
  |  Branch (224:7): [True: 24, False: 0]
  ------------------
  225|       |    // This code path allocates quite a few handles, so make sure we
  226|       |    // don't disturb the parent GCScope and free them.
  227|     24|    GCScope gcScope{runtime};
  228|       |
  229|     24|    auto getter = NativeFunction::create(
  230|     24|        runtime,
  231|     24|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  232|     24|        nullptr,
  233|     24|        errorStackGetter,
  234|     24|        Predefined::getSymbolID(Predefined::emptyString),
  235|     24|        0,
  236|     24|        Runtime::makeNullHandle<JSObject>());
  237|       |
  238|     24|    auto setter = NativeFunction::create(
  239|     24|        runtime,
  240|     24|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  241|     24|        nullptr,
  242|     24|        errorStackSetter,
  243|     24|        Predefined::getSymbolID(Predefined::emptyString),
  244|     24|        1,
  245|     24|        Runtime::makeNullHandle<JSObject>());
  246|       |
  247|     24|    auto crtRes = PropertyAccessor::create(runtime, getter, setter);
  248|     24|    if (crtRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (248:9): [True: 0, False: 24]
  ------------------
  249|      0|      return ExecutionStatus::EXCEPTION;
  250|      0|    }
  251|       |
  252|     24|    runtime.jsErrorStackAccessor = *crtRes;
  253|     24|  }
  254|       |
  255|     24|  auto accessor =
  256|     24|      Handle<PropertyAccessor>::vmcast(&runtime.jsErrorStackAccessor);
  257|       |
  258|     24|  DefinePropertyFlags dpf{};
  259|     24|  dpf.setEnumerable = 1;
  260|     24|  dpf.setConfigurable = 1;
  261|     24|  dpf.setGetter = 1;
  262|     24|  dpf.setSetter = 1;
  263|     24|  dpf.enumerable = 0;
  264|     24|  dpf.configurable = 1;
  265|       |
  266|     24|  auto res = JSObject::defineOwnProperty(
  267|     24|      selfHandle,
  268|     24|      runtime,
  269|     24|      Predefined::getSymbolID(Predefined::stack),
  270|     24|      dpf,
  271|     24|      accessor);
  272|       |
  273|       |  // Ignore failures to set the "stack" property as other engines do.
  274|     24|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  275|      0|    runtime.clearThrownValue();
  276|      0|  }
  277|       |
  278|     24|  return ExecutionStatus::RETURNED;
  279|     24|}
_ZN6hermes2vm7JSError10setMessageENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEE:
  284|     24|    Handle<> message) {
  285|     24|  auto stringMessage = Handle<StringPrimitive>::dyn_vmcast(message);
  286|     24|  if (LLVM_UNLIKELY(!stringMessage)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  287|      0|    auto strRes = toString_RJS(runtime, message);
  288|      0|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  289|      0|      return ExecutionStatus::EXCEPTION;
  290|      0|    }
  291|      0|    stringMessage = runtime.makeHandle(std::move(*strRes));
  292|      0|  }
  293|       |
  294|     24|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  295|     24|  return JSObject::defineOwnProperty(
  296|     24|             selfHandle,
  297|     24|             runtime,
  298|     24|             Predefined::getSymbolID(Predefined::message),
  299|     24|             dpf,
  300|     24|             stringMessage)
  301|     24|      .getStatus();
  302|     24|}
_ZN6hermes2vm7JSError16recordStackTraceENS0_6HandleIS1_EERNS0_7RuntimeEbPNS0_9CodeBlockEPKNS_4inst4InstE:
  382|     48|    const Inst *ip) {
  383|     48|  if (selfHandle->stacktrace_)
  ------------------
  |  Branch (383:7): [True: 0, False: 48]
  ------------------
  384|      0|    return ExecutionStatus::RETURNED;
  385|       |
  386|     48|  auto frames = runtime.getStackFrames();
  387|       |
  388|       |  // Check if the top frame is a JSFunction and we don't have the current
  389|       |  // CodeBlock, do nothing.
  390|     48|  if (!skipTopFrame && !codeBlock && frames.begin() != frames.end() &&
  ------------------
  |  Branch (390:7): [True: 48, False: 0]
  |  Branch (390:7): [True: 24, False: 24]
  |  Branch (390:24): [True: 24, False: 24]
  |  Branch (390:38): [True: 24, False: 0]
  ------------------
  391|     48|      frames.begin()->getCalleeCodeBlock(runtime)) {
  ------------------
  |  Branch (391:7): [True: 24, False: 0]
  ------------------
  392|     24|    return ExecutionStatus::RETURNED;
  393|     24|  }
  394|       |
  395|     24|  StackTracePtr stack{new StackTrace()};
  396|     24|  auto domainsRes = ArrayStorageSmall::create(runtime, 1);
  397|     24|  if (LLVM_UNLIKELY(domainsRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  398|      0|    return ExecutionStatus::EXCEPTION;
  399|      0|  }
  400|     24|  auto domains = runtime.makeMutableHandle<ArrayStorageSmall>(
  401|     24|      vmcast<ArrayStorageSmall>(*domainsRes));
  402|       |
  403|       |  // Add the domain to the domains list, provided that it's not the same as the
  404|       |  // last domain in the list. This allows us to save storage with a constant
  405|       |  // time check, but we don't have to loop through and check every domain to
  406|       |  // deduplicate.
  407|     24|  auto addDomain = [&domains,
  408|     24|                    &runtime](CodeBlock *codeBlock) -> ExecutionStatus {
  409|     24|    GCScopeMarkerRAII marker{runtime};
  410|     24|    Handle<Domain> domain = codeBlock->getRuntimeModule()->getDomain(runtime);
  411|     24|    if (domains->size() > 0 &&
  412|     24|        vmcast<Domain>(domains->at(domains->size() - 1).getObject(runtime)) ==
  413|     24|            domain.get()) {
  414|     24|      return ExecutionStatus::RETURNED;
  415|     24|    }
  416|     24|    return ArrayStorageSmall::push_back(domains, runtime, domain);
  417|     24|  };
  418|       |
  419|     24|  if (!skipTopFrame) {
  ------------------
  |  Branch (419:7): [True: 24, False: 0]
  ------------------
  420|     24|    if (codeBlock) {
  ------------------
  |  Branch (420:9): [True: 24, False: 0]
  ------------------
  421|     24|      stack->emplace_back(codeBlock, codeBlock->getOffsetOf(ip));
  422|     24|      if (LLVM_UNLIKELY(addDomain(codeBlock) == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  423|      0|        return ExecutionStatus::EXCEPTION;
  424|      0|      }
  425|     24|    } else {
  426|      0|      stack->emplace_back(nullptr, 0);
  427|      0|    }
  428|     24|  }
  429|       |
  430|     24|  const StackFramePtr framesEnd = *runtime.getStackFrames().end();
  431|       |
  432|       |  // Fill in the call stack.
  433|       |  // Each stack frame tracks information about the caller.
  434|     24|  for (StackFramePtr cf : runtime.getStackFrames()) {
  ------------------
  |  Branch (434:25): [True: 24, False: 24]
  ------------------
  435|     24|    CodeBlock *savedCodeBlock = cf.getSavedCodeBlock();
  436|     24|    const Inst *const savedIP = cf.getSavedIP();
  437|       |    // Go up one frame and get the callee code block but use the current
  438|       |    // frame's saved IP. This also allows us to account for bound functions,
  439|       |    // which have savedCodeBlock == nullptr in order to allow proper returns in
  440|       |    // the interpreter.
  441|     24|    StackFramePtr prev = cf->getPreviousFrame();
  442|     24|    if (prev != framesEnd) {
  ------------------
  |  Branch (442:9): [True: 0, False: 24]
  ------------------
  443|      0|      if (CodeBlock *parentCB = prev->getCalleeCodeBlock(runtime)) {
  ------------------
  |  Branch (443:22): [True: 0, False: 0]
  ------------------
  444|      0|        savedCodeBlock = parentCB;
  445|      0|      }
  446|      0|    }
  447|     24|    if (savedCodeBlock && savedIP) {
  ------------------
  |  Branch (447:9): [True: 0, False: 24]
  |  Branch (447:27): [True: 0, False: 0]
  ------------------
  448|      0|      stack->emplace_back(savedCodeBlock, savedCodeBlock->getOffsetOf(savedIP));
  449|      0|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  450|      0|              addDomain(savedCodeBlock) == ExecutionStatus::EXCEPTION)) {
  451|      0|        return ExecutionStatus::EXCEPTION;
  452|      0|      }
  453|     24|    } else {
  454|     24|      stack->emplace_back(nullptr, 0);
  455|     24|    }
  456|     24|  }
  457|     24|  selfHandle->domains_.set(runtime, domains.get(), runtime.getHeap());
  458|       |
  459|       |  // Remove the last entry.
  460|     24|  stack->pop_back();
  461|       |
  462|     24|  auto funcNames =
  463|     24|      getCallStackFunctionNames(runtime, skipTopFrame, stack->size());
  464|       |
  465|       |  // Either the function names is empty, or they have the same count.
  466|     24|  assert(
  467|     24|      (!funcNames || funcNames->size() == stack->size()) &&
  468|     24|      "Function names and stack trace must have same size.");
  469|       |
  470|      0|  selfHandle->stacktrace_ = std::move(stack);
  471|     24|  selfHandle->funcNames_.set(runtime, *funcNames, runtime.getHeap());
  472|     24|  return ExecutionStatus::RETURNED;
  473|     24|}
_ZN6hermes2vm7JSError12getDebugInfoEPNS0_9CodeBlockEj:
  478|     24|    uint32_t bytecodeOffset) {
  479|     24|  auto offset = codeBlock->getDebugSourceLocationsOffset();
  480|     24|  if (!offset.hasValue()) {
  ------------------
  |  Branch (480:7): [True: 0, False: 24]
  ------------------
  481|      0|    return llvh::None;
  482|      0|  }
  483|       |
  484|     24|  return codeBlock->getRuntimeModule()
  485|     24|      ->getBytecode()
  486|     24|      ->getDebugInfo()
  487|     24|      ->getLocationForAddress(offset.getValue(), bytecodeOffset);
  488|     24|}
_ZN6hermes2vm7JSError22getFunctionNameAtIndexERNS0_7RuntimeENS0_6HandleIS1_EEm:
  493|     24|    size_t index) {
  494|     24|  IdentifierTable &idt = runtime.getIdentifierTable();
  495|     24|  MutableHandle<StringPrimitive> name{
  496|     24|      runtime, runtime.getPredefinedString(Predefined::emptyString)};
  497|       |
  498|       |  // If funcNames_ is set and contains a string primitive, use that.
  499|     24|  if (selfHandle->funcNames_) {
  ------------------
  |  Branch (499:7): [True: 24, False: 0]
  ------------------
  500|     24|    assert(
  501|     24|        index < selfHandle->funcNames_.getNonNull(runtime)->size() &&
  502|     24|        "Index out of bounds");
  503|      0|    name = dyn_vmcast<StringPrimitive>(
  504|     24|        selfHandle->funcNames_.getNonNull(runtime)->at(index).unboxToHV(
  505|     24|            runtime));
  506|     24|  }
  507|       |
  508|     24|  if (!name || name->getStringLength() == 0) {
  ------------------
  |  Branch (508:7): [True: 0, False: 24]
  |  Branch (508:16): [True: 0, False: 24]
  ------------------
  509|       |    // We did not have an explicit function name, or it was not a nonempty
  510|       |    // string. If we have a code block, try its debug info.
  511|      0|    if (const CodeBlock *codeBlock =
  ------------------
  |  Branch (511:26): [True: 0, False: 0]
  ------------------
  512|      0|            selfHandle->stacktrace_->at(index).codeBlock) {
  513|      0|      name = idt.getStringPrim(runtime, codeBlock->getNameMayAllocate());
  514|      0|    }
  515|      0|  }
  516|       |
  517|     24|  if (!name || name->getStringLength() == 0) {
  ------------------
  |  Branch (517:7): [True: 0, False: 24]
  |  Branch (517:16): [True: 0, False: 24]
  ------------------
  518|      0|    return runtime.makeNullHandle<StringPrimitive>();
  519|      0|  }
  520|       |
  521|     24|  return std::move(name);
  522|     24|}
_ZN6hermes2vm7JSError25appendFunctionNameAtIndexERNS0_7RuntimeENS0_6HandleIS1_EEmRN4llvh15SmallVectorImplIDsEE:
  528|     24|    llvh::SmallVectorImpl<char16_t> &str) {
  529|     24|  auto name = getFunctionNameAtIndex(runtime, selfHandle, index);
  530|       |
  531|     24|  if (!name)
  ------------------
  |  Branch (531:7): [True: 0, False: 24]
  ------------------
  532|      0|    return false;
  533|       |
  534|     24|  name->appendUTF16String(str);
  535|     24|  return true;
  536|     24|}
_ZN6hermes2vm7JSError25constructStackTraceStringERNS0_7RuntimeENS0_6HandleIS1_EENS4_INS0_8JSObjectEEERNS0_12SmallXStringIDsLj32EEE:
  542|     24|    SmallU16String<32> &stack) {
  543|     24|  GCScope gcScope(runtime);
  544|       |  // First of all, the stacktrace string starts with target.toString.
  545|     24|  auto res = toString_RJS(runtime, targetHandle);
  546|     24|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  547|      0|    if (isUncatchableError(runtime.getThrownValue())) {
  ------------------
  |  Branch (547:9): [True: 0, False: 0]
  ------------------
  548|       |      // If toString throws an uncatchable exception, propagate it up.
  549|      0|      return ExecutionStatus::EXCEPTION;
  550|      0|    }
  551|       |    // If toString throws an exception, we just use <error>.
  552|      0|    stack.append(u"<error>");
  553|       |    // There is not much we can do if exception thrown when trying to
  554|       |    // get the stacktrace. We just name it <error>, and it should be
  555|       |    // sufficient to tell what happened here.
  556|      0|    runtime.clearThrownValue();
  557|     24|  } else {
  558|     24|    res->get()->appendUTF16String(stack);
  559|     24|  }
  560|       |
  561|       |  // Virtual offsets are computed by walking the list of bytecode functions. If
  562|       |  // we have an extremely deep stack, this could get expensive. Assume that very
  563|       |  // deep stacks are most likely due to runaway recursion and so use a local
  564|       |  // cache of virtual offsets.
  565|     24|  llvh::DenseMap<const CodeBlock *, uint32_t> virtualOffsetCache;
  566|       |
  567|       |  // Append each function location in the call stack to stack trace.
  568|     24|  auto marker = gcScope.createMarker();
  569|     24|  for (size_t index = 0,
  570|     24|              max = selfHandle->stacktrace_->size() -
  571|     24|           selfHandle->firstExposedFrameIndex_;
  572|     48|       index < max;
  ------------------
  |  Branch (572:8): [True: 24, False: 24]
  ------------------
  573|     24|       index++) {
  574|     24|    char buf[NUMBER_TO_STRING_BUF_SIZE];
  575|       |
  576|       |    // If the trace contains more than 100 entries, limit the string to the
  577|       |    // first 50 and the last 50 entries and include a line about the truncation.
  578|     24|    static constexpr unsigned PRINT_HEAD = 50;
  579|     24|    static constexpr unsigned PRINT_TAIL = 50;
  580|     24|    if (LLVM_UNLIKELY(max > PRINT_HEAD + PRINT_TAIL)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  581|      0|      if (index == PRINT_HEAD) {
  ------------------
  |  Branch (581:11): [True: 0, False: 0]
  ------------------
  582|      0|        stack.append("\n    ... skipping ");
  583|      0|        numberToString(max - PRINT_HEAD - PRINT_TAIL, buf, sizeof(buf));
  584|      0|        stack.append(buf);
  585|      0|        stack.append(" frames");
  586|      0|        continue;
  587|      0|      }
  588|       |
  589|       |      // Skip the middle frames.
  590|      0|      if (index > PRINT_HEAD && index < max - PRINT_TAIL) {
  ------------------
  |  Branch (590:11): [True: 0, False: 0]
  |  Branch (590:33): [True: 0, False: 0]
  ------------------
  591|      0|        index = max - PRINT_TAIL;
  592|      0|      }
  593|      0|    }
  594|       |
  595|     24|    const size_t absIndex = index + selfHandle->firstExposedFrameIndex_;
  596|     24|    const StackTraceInfo &sti = selfHandle->stacktrace_->at(absIndex);
  597|     24|    gcScope.flushToMarker(marker);
  598|       |    // For each stacktrace entry, we add a line with the following format:
  599|       |    // at <functionName> (<fileName>:<lineNo>:<columnNo>)
  600|       |
  601|     24|    stack.append(u"\n    at ");
  602|       |
  603|     24|    if (!appendFunctionNameAtIndex(runtime, selfHandle, absIndex, stack))
  ------------------
  |  Branch (603:9): [True: 0, False: 24]
  ------------------
  604|      0|      stack.append(u"anonymous");
  605|       |
  606|       |    // If we have a null codeBlock, it's a native function, which do not have
  607|       |    // lines and columns.
  608|     24|    if (!sti.codeBlock) {
  ------------------
  |  Branch (608:9): [True: 0, False: 24]
  ------------------
  609|      0|      stack.append(u" (native)");
  610|      0|      continue;
  611|      0|    }
  612|       |
  613|       |    // We are not a native function.
  614|     24|    int32_t lineNo;
  615|     24|    int32_t columnNo;
  616|     24|    OptValue<SymbolID> fileName;
  617|     24|    bool isAddress = false;
  618|     24|    OptValue<hbc::DebugSourceLocation> location =
  619|     24|        getDebugInfo(sti.codeBlock, sti.bytecodeOffset);
  620|     24|    if (location) {
  ------------------
  |  Branch (620:9): [True: 24, False: 0]
  ------------------
  621|       |      // Use the line and column from the debug info.
  622|     24|      lineNo = location->line;
  623|     24|      columnNo = location->column;
  624|     24|    } else {
  625|       |      // Use a "line" and "column" synthesized from the bytecode.
  626|       |      // In our synthesized stack trace, a line corresponds to a bytecode
  627|       |      // module. This matches the interpretation in DebugInfo.cpp. Currently we
  628|       |      // can only have one bytecode module without debug information, namely the
  629|       |      // one loaded from disk, which is always at index 1.
  630|       |      // TODO: find a way to track the bytecode modules explicitly.
  631|       |      // TODO: we do not yet have a way of getting the file name separate from
  632|       |      // the debug info. For now we end up leaving it as "unknown".
  633|      0|      auto pair = virtualOffsetCache.insert({sti.codeBlock, 0});
  634|      0|      uint32_t &virtualOffset = pair.first->second;
  635|      0|      if (pair.second) {
  ------------------
  |  Branch (635:11): [True: 0, False: 0]
  ------------------
  636|       |        // Code block was not in the cache, update the cache.
  637|      0|        virtualOffset = sti.codeBlock->getVirtualOffset();
  638|      0|      }
  639|       |      // Add 1 to the SegmentID to account for 1-based indexing of
  640|       |      // symbolication tools.
  641|      0|      lineNo =
  642|      0|          sti.codeBlock->getRuntimeModule()->getBytecode()->getSegmentID() + 1;
  643|      0|      columnNo = sti.bytecodeOffset + virtualOffset;
  644|      0|      isAddress = true;
  645|      0|    }
  646|       |
  647|     24|    stack.append(u" (");
  648|     24|    if (isAddress)
  ------------------
  |  Branch (648:9): [True: 0, False: 24]
  ------------------
  649|      0|      stack.append(u"address at ");
  650|       |
  651|       |    // Append the filename. If we have a source location, use the filename from
  652|       |    // that location; otherwise use the RuntimeModule's sourceURL; otherwise
  653|       |    // report unknown.
  654|     24|    RuntimeModule *runtimeModule = sti.codeBlock->getRuntimeModule();
  655|     24|    if (location) {
  ------------------
  |  Branch (655:9): [True: 24, False: 0]
  ------------------
  656|     24|      stack.append(
  657|     24|          runtimeModule->getBytecode()->getDebugInfo()->getFilenameByID(
  658|     24|              location->filenameId));
  659|     24|    } else {
  660|      0|      auto sourceURL = runtimeModule->getSourceURL();
  661|      0|      stack.append(sourceURL.empty() ? "unknown" : sourceURL);
  ------------------
  |  Branch (661:20): [True: 0, False: 0]
  ------------------
  662|      0|    }
  663|     24|    stack.push_back(u':');
  664|       |
  665|     24|    numberToString(lineNo, buf, NUMBER_TO_STRING_BUF_SIZE);
  666|     24|    stack.append(buf);
  667|       |
  668|     24|    stack.push_back(u':');
  669|       |
  670|     24|    numberToString(columnNo, buf, NUMBER_TO_STRING_BUF_SIZE);
  671|     24|    stack.append(buf);
  672|       |
  673|     24|    stack.push_back(u')');
  674|     24|  }
  675|     24|  return ExecutionStatus::RETURNED;
  676|     24|}
_ZN6hermes2vm7JSError13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  770|     24|void JSError::_finalizeImpl(GCCell *cell, GC &) {
  771|     24|  JSError *self = vmcast<JSError>(cell);
  772|     24|  self->~JSError();
  773|     24|}
JSError.cpp:_ZZN6hermes2vm7JSError16recordStackTraceENS0_6HandleIS1_EERNS0_7RuntimeEbPNS0_9CodeBlockEPKNS_4inst4InstEENK3$_1clES7_:
  408|     24|                    &runtime](CodeBlock *codeBlock) -> ExecutionStatus {
  409|     24|    GCScopeMarkerRAII marker{runtime};
  410|     24|    Handle<Domain> domain = codeBlock->getRuntimeModule()->getDomain(runtime);
  411|     24|    if (domains->size() > 0 &&
  ------------------
  |  Branch (411:9): [True: 0, False: 24]
  |  Branch (411:9): [True: 0, False: 24]
  ------------------
  412|     24|        vmcast<Domain>(domains->at(domains->size() - 1).getObject(runtime)) ==
  ------------------
  |  Branch (412:9): [True: 0, False: 0]
  ------------------
  413|      0|            domain.get()) {
  414|      0|      return ExecutionStatus::RETURNED;
  415|      0|    }
  416|     24|    return ArrayStorageSmall::push_back(domains, runtime, domain);
  417|     24|  };
JSError.cpp:_ZN6hermes2vmL25getCallStackFunctionNamesERNS0_7RuntimeEbm:
  314|     24|    size_t sizeHint) {
  315|     24|  auto arrRes = PropStorage::create(runtime, sizeHint);
  316|     24|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  317|      0|    runtime.clearThrownValue();
  318|      0|    return Runtime::makeNullHandle<PropStorage>();
  319|      0|  }
  320|     24|  MutableHandle<PropStorage> names{runtime, vmcast<PropStorage>(*arrRes)};
  321|       |
  322|     24|  GCScope gcScope(runtime);
  323|     24|  MutableHandle<> name{runtime};
  324|     24|  auto marker = gcScope.createMarker();
  325|       |
  326|     24|  uint32_t frameIndex = 0;
  327|     24|  uint32_t namesIndex = 0;
  328|     24|  for (StackFramePtr cf : runtime.getStackFrames()) {
  ------------------
  |  Branch (328:25): [True: 24, False: 24]
  ------------------
  329|     24|    if (frameIndex++ == 0 && skipTopFrame)
  ------------------
  |  Branch (329:9): [True: 24, False: 0]
  |  Branch (329:30): [True: 0, False: 24]
  ------------------
  330|      0|      continue;
  331|       |
  332|     24|    name = HermesValue::encodeUndefinedValue();
  333|     24|    if (auto callableHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (333:14): [True: 24, False: 0]
  ------------------
  334|     24|            Handle<>(&cf.getCalleeClosureOrCBRef()))) {
  335|     24|      NamedPropertyDescriptor desc;
  336|     24|      JSObject *propObj = JSObject::getNamedDescriptorPredefined(
  337|     24|          callableHandle, runtime, Predefined::displayName, desc);
  338|       |
  339|     24|      if (!propObj) {
  ------------------
  |  Branch (339:11): [True: 24, False: 0]
  ------------------
  340|     24|        propObj = JSObject::getNamedDescriptorPredefined(
  341|     24|            callableHandle, runtime, Predefined::name, desc);
  342|     24|      }
  343|       |
  344|     24|      if (propObj && !desc.flags.accessor &&
  ------------------
  |  Branch (344:11): [True: 24, False: 0]
  |  Branch (344:22): [True: 24, False: 0]
  ------------------
  345|     24|          LLVM_LIKELY(!desc.flags.proxyObject) &&
  ------------------
  |  |  188|     48|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24, False: 0]
  |  |  ------------------
  ------------------
  346|     24|          LLVM_LIKELY(!desc.flags.hostObject)) {
  ------------------
  |  |  188|     24|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24, False: 0]
  |  |  ------------------
  ------------------
  347|     24|        name = JSObject::getNamedSlotValueUnsafe(propObj, runtime, desc)
  348|     24|                   .unboxToHV(runtime);
  349|     24|      } else if (desc.flags.proxyObject) {
  ------------------
  |  Branch (349:18): [True: 0, False: 0]
  ------------------
  350|      0|        name = HermesValue::encodeStringValue(
  351|      0|            runtime.getPredefinedString(Predefined::proxyTrap));
  352|      0|      }
  353|     24|    } else if (!cf.getCalleeClosureOrCBRef().isObject()) {
  ------------------
  |  Branch (353:16): [True: 0, False: 0]
  ------------------
  354|       |      // If CalleeClosureOrCB is not an object pointer, then it must be a native
  355|       |      // pointer to a CodeBlock.
  356|      0|      auto *cb =
  357|      0|          cf.getCalleeClosureOrCBRef().getNativePointer<const CodeBlock>();
  358|      0|      if (cb->getNameMayAllocate().isValid())
  ------------------
  |  Branch (358:11): [True: 0, False: 0]
  ------------------
  359|      0|        name = HermesValue::encodeStringValue(
  360|      0|            runtime.getStringPrimFromSymbolID(cb->getNameMayAllocate()));
  361|      0|    }
  362|     24|    if (PropStorage::resize(names, runtime, namesIndex + 1) ==
  ------------------
  |  Branch (362:9): [True: 0, False: 24]
  ------------------
  363|     24|        ExecutionStatus::EXCEPTION) {
  364|      0|      runtime.clearThrownValue();
  365|      0|      return Runtime::makeNullHandle<PropStorage>();
  366|      0|    }
  367|     24|    auto shv =
  368|     24|        SmallHermesValue::encodeHermesValue(name.getHermesValue(), runtime);
  369|     24|    names->set(namesIndex, shv, runtime.getHeap());
  370|     24|    ++namesIndex;
  371|     24|    gcScope.flushToMarker(marker);
  372|     24|  }
  373|       |
  374|     24|  return std::move(names);
  375|     24|}

_ZN6hermes2vm20JSGeneratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   29|      1|void JSGeneratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   30|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSGenerator>());
   31|      1|  JSObjectBuildMeta(cell, mb);
   32|      1|  const auto *self = static_cast<const JSGenerator *>(cell);
   33|      1|  mb.setVTable(&JSGenerator::vt);
   34|      1|  mb.addField("innerFunction", &self->innerFunction_);
   35|      1|}

_ZN6hermes2vm22createArrayConstructorERNS0_7RuntimeE:
   35|     99|Handle<JSObject> createArrayConstructor(Runtime &runtime) {
   36|     99|  auto arrayPrototype = Handle<JSArray>::vmcast(&runtime.arrayPrototype);
   37|       |
   38|       |  // Array.prototype.xxx methods.
   39|     99|  defineMethod(
   40|     99|      runtime,
   41|     99|      arrayPrototype,
   42|     99|      Predefined::getSymbolID(Predefined::toString),
   43|     99|      nullptr,
   44|     99|      arrayPrototypeToString,
   45|     99|      0);
   46|     99|  defineMethod(
   47|     99|      runtime,
   48|     99|      arrayPrototype,
   49|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
   50|     99|      nullptr,
   51|     99|      arrayPrototypeToLocaleString,
   52|     99|      0);
   53|     99|  defineMethod(
   54|     99|      runtime,
   55|     99|      arrayPrototype,
   56|     99|      Predefined::getSymbolID(Predefined::at),
   57|     99|      nullptr,
   58|     99|      arrayPrototypeAt,
   59|     99|      1);
   60|     99|  defineMethod(
   61|     99|      runtime,
   62|     99|      arrayPrototype,
   63|     99|      Predefined::getSymbolID(Predefined::concat),
   64|     99|      nullptr,
   65|     99|      arrayPrototypeConcat,
   66|     99|      1);
   67|     99|  defineMethod(
   68|     99|      runtime,
   69|     99|      arrayPrototype,
   70|     99|      Predefined::getSymbolID(Predefined::join),
   71|     99|      nullptr,
   72|     99|      arrayPrototypeJoin,
   73|     99|      1);
   74|     99|  defineMethod(
   75|     99|      runtime,
   76|     99|      arrayPrototype,
   77|     99|      Predefined::getSymbolID(Predefined::push),
   78|     99|      nullptr,
   79|     99|      arrayPrototypePush,
   80|     99|      1);
   81|     99|  defineMethod(
   82|     99|      runtime,
   83|     99|      arrayPrototype,
   84|     99|      Predefined::getSymbolID(Predefined::sort),
   85|     99|      nullptr,
   86|     99|      arrayPrototypeSort,
   87|     99|      1);
   88|     99|  defineMethod(
   89|     99|      runtime,
   90|     99|      arrayPrototype,
   91|     99|      Predefined::getSymbolID(Predefined::forEach),
   92|     99|      nullptr,
   93|     99|      arrayPrototypeForEach,
   94|     99|      1);
   95|     99|  defineMethod(
   96|     99|      runtime,
   97|     99|      arrayPrototype,
   98|     99|      Predefined::getSymbolID(Predefined::flat),
   99|     99|      nullptr,
  100|     99|      arrayPrototypeFlat,
  101|     99|      0);
  102|     99|  defineMethod(
  103|     99|      runtime,
  104|     99|      arrayPrototype,
  105|     99|      Predefined::getSymbolID(Predefined::flatMap),
  106|     99|      nullptr,
  107|     99|      arrayPrototypeFlatMap,
  108|     99|      1);
  109|       |
  110|     99|  defineMethod(
  111|     99|      runtime,
  112|     99|      arrayPrototype,
  113|     99|      Predefined::getSymbolID(Predefined::keys),
  114|     99|      (void *)IterationKind::Key,
  115|     99|      arrayPrototypeIterator,
  116|     99|      0);
  117|     99|  defineMethod(
  118|     99|      runtime,
  119|     99|      arrayPrototype,
  120|     99|      Predefined::getSymbolID(Predefined::values),
  121|     99|      (void *)IterationKind::Value,
  122|     99|      arrayPrototypeIterator,
  123|     99|      0);
  124|     99|  defineMethod(
  125|     99|      runtime,
  126|     99|      arrayPrototype,
  127|     99|      Predefined::getSymbolID(Predefined::entries),
  128|     99|      (void *)IterationKind::Entry,
  129|     99|      arrayPrototypeIterator,
  130|     99|      0);
  131|       |
  132|     99|  auto propValue = runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
  133|     99|      arrayPrototype, runtime, Predefined::getSymbolID(Predefined::values)));
  134|     99|  runtime.arrayPrototypeValues = std::move(propValue);
  135|       |
  136|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  137|       |
  138|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  139|     99|      arrayPrototype,
  140|     99|      runtime,
  141|     99|      Predefined::getSymbolID(Predefined::SymbolIterator),
  142|     99|      dpf,
  143|     99|      Handle<>(&runtime.arrayPrototypeValues)));
  144|       |
  145|     99|  auto cons = defineSystemConstructor<JSArray>(
  146|     99|      runtime,
  147|     99|      Predefined::getSymbolID(Predefined::Array),
  148|     99|      arrayConstructor,
  149|     99|      arrayPrototype,
  150|     99|      1,
  151|     99|      CellKind::JSArrayKind);
  152|       |
  153|     99|  defineMethod(
  154|     99|      runtime,
  155|     99|      cons,
  156|     99|      Predefined::getSymbolID(Predefined::isArray),
  157|     99|      nullptr,
  158|     99|      arrayIsArray,
  159|     99|      1);
  160|       |
  161|     99|  defineMethod(
  162|     99|      runtime,
  163|     99|      arrayPrototype,
  164|     99|      Predefined::getSymbolID(Predefined::slice),
  165|     99|      nullptr,
  166|     99|      arrayPrototypeSlice,
  167|     99|      2);
  168|     99|  defineMethod(
  169|     99|      runtime,
  170|     99|      arrayPrototype,
  171|     99|      Predefined::getSymbolID(Predefined::splice),
  172|     99|      nullptr,
  173|     99|      arrayPrototypeSplice,
  174|     99|      2);
  175|     99|  defineMethod(
  176|     99|      runtime,
  177|     99|      arrayPrototype,
  178|     99|      Predefined::getSymbolID(Predefined::copyWithin),
  179|     99|      nullptr,
  180|     99|      arrayPrototypeCopyWithin,
  181|     99|      2);
  182|     99|  defineMethod(
  183|     99|      runtime,
  184|     99|      arrayPrototype,
  185|     99|      Predefined::getSymbolID(Predefined::pop),
  186|     99|      nullptr,
  187|     99|      arrayPrototypePop,
  188|     99|      0);
  189|     99|  defineMethod(
  190|     99|      runtime,
  191|     99|      arrayPrototype,
  192|     99|      Predefined::getSymbolID(Predefined::shift),
  193|     99|      nullptr,
  194|     99|      arrayPrototypeShift,
  195|     99|      0);
  196|     99|  defineMethod(
  197|     99|      runtime,
  198|     99|      arrayPrototype,
  199|     99|      Predefined::getSymbolID(Predefined::unshift),
  200|     99|      nullptr,
  201|     99|      arrayPrototypeUnshift,
  202|     99|      1);
  203|     99|  defineMethod(
  204|     99|      runtime,
  205|     99|      arrayPrototype,
  206|     99|      Predefined::getSymbolID(Predefined::indexOf),
  207|     99|      nullptr,
  208|     99|      arrayPrototypeIndexOf,
  209|     99|      1);
  210|     99|  defineMethod(
  211|     99|      runtime,
  212|     99|      arrayPrototype,
  213|     99|      Predefined::getSymbolID(Predefined::lastIndexOf),
  214|     99|      nullptr,
  215|     99|      arrayPrototypeLastIndexOf,
  216|     99|      1);
  217|     99|  defineMethod(
  218|     99|      runtime,
  219|     99|      arrayPrototype,
  220|     99|      Predefined::getSymbolID(Predefined::every),
  221|     99|      nullptr,
  222|     99|      arrayPrototypeEvery,
  223|     99|      1);
  224|     99|  defineMethod(
  225|     99|      runtime,
  226|     99|      arrayPrototype,
  227|     99|      Predefined::getSymbolID(Predefined::some),
  228|     99|      nullptr,
  229|     99|      arrayPrototypeSome,
  230|     99|      1);
  231|     99|  defineMethod(
  232|     99|      runtime,
  233|     99|      arrayPrototype,
  234|     99|      Predefined::getSymbolID(Predefined::map),
  235|     99|      nullptr,
  236|     99|      arrayPrototypeMap,
  237|     99|      1);
  238|     99|  defineMethod(
  239|     99|      runtime,
  240|     99|      arrayPrototype,
  241|     99|      Predefined::getSymbolID(Predefined::filter),
  242|     99|      nullptr,
  243|     99|      arrayPrototypeFilter,
  244|     99|      1);
  245|     99|  defineMethod(
  246|     99|      runtime,
  247|     99|      arrayPrototype,
  248|     99|      Predefined::getSymbolID(Predefined::fill),
  249|     99|      nullptr,
  250|     99|      arrayPrototypeFill,
  251|     99|      1);
  252|     99|  defineMethod(
  253|     99|      runtime,
  254|     99|      arrayPrototype,
  255|     99|      Predefined::getSymbolID(Predefined::find),
  256|     99|      nullptr,
  257|     99|      arrayPrototypeFind,
  258|     99|      1);
  259|     99|  defineMethod(
  260|     99|      runtime,
  261|     99|      arrayPrototype,
  262|     99|      Predefined::getSymbolID(Predefined::findIndex),
  263|       |      // Pass a non-null pointer here to indicate we're finding the index.
  264|     99|      (void *)true,
  265|     99|      arrayPrototypeFind,
  266|     99|      1);
  267|     99|  defineMethod(
  268|     99|      runtime,
  269|     99|      arrayPrototype,
  270|     99|      Predefined::getSymbolID(Predefined::findLast),
  271|     99|      nullptr,
  272|     99|      arrayPrototypeFindLast,
  273|     99|      1);
  274|     99|  defineMethod(
  275|     99|      runtime,
  276|     99|      arrayPrototype,
  277|     99|      Predefined::getSymbolID(Predefined::findLastIndex),
  278|       |      // Pass a non-null pointer here to indicate we're finding the index.
  279|     99|      (void *)true,
  280|     99|      arrayPrototypeFindLast,
  281|     99|      1);
  282|     99|  defineMethod(
  283|     99|      runtime,
  284|     99|      arrayPrototype,
  285|     99|      Predefined::getSymbolID(Predefined::reduce),
  286|     99|      nullptr,
  287|     99|      arrayPrototypeReduce,
  288|     99|      1);
  289|     99|  defineMethod(
  290|     99|      runtime,
  291|     99|      arrayPrototype,
  292|     99|      Predefined::getSymbolID(Predefined::reduceRight),
  293|     99|      nullptr,
  294|     99|      arrayPrototypeReduceRight,
  295|     99|      1);
  296|     99|  defineMethod(
  297|     99|      runtime,
  298|     99|      arrayPrototype,
  299|     99|      Predefined::getSymbolID(Predefined::reverse),
  300|     99|      nullptr,
  301|     99|      arrayPrototypeReverse,
  302|     99|      0);
  303|     99|  defineMethod(
  304|     99|      runtime,
  305|     99|      arrayPrototype,
  306|     99|      Predefined::getSymbolID(Predefined::includes),
  307|     99|      nullptr,
  308|     99|      arrayPrototypeIncludes,
  309|     99|      1);
  310|       |
  311|     99|  defineMethod(
  312|     99|      runtime,
  313|     99|      cons,
  314|     99|      Predefined::getSymbolID(Predefined::of),
  315|     99|      nullptr,
  316|     99|      arrayOf,
  317|     99|      0);
  318|     99|  defineMethod(
  319|     99|      runtime,
  320|     99|      cons,
  321|     99|      Predefined::getSymbolID(Predefined::from),
  322|     99|      nullptr,
  323|     99|      arrayFrom,
  324|     99|      1);
  325|       |
  326|     99|  return cons;
  327|     99|}
_ZN6hermes2vm22arrayPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
  394|    153|arrayPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
  395|    153|  auto objRes = toObject(runtime, args.getThisHandle());
  396|    153|  if (LLVM_UNLIKELY(objRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  397|      0|    return ExecutionStatus::EXCEPTION;
  398|      0|  }
  399|    153|  auto array = runtime.makeHandle<JSObject>(objRes.getValue());
  400|       |
  401|    153|  auto propRes = JSObject::getNamed_RJS(
  402|    153|      array, runtime, Predefined::getSymbolID(Predefined::join));
  403|    153|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  404|      0|    return ExecutionStatus::EXCEPTION;
  405|      0|  }
  406|    153|  auto func =
  407|    153|      Handle<Callable>::dyn_vmcast(runtime.makeHandle(std::move(*propRes)));
  408|       |
  409|    153|  if (!func) {
  ------------------
  |  Branch (409:7): [True: 0, False: 153]
  ------------------
  410|       |    // If not callable, set func to be Object.prototype.toString.
  411|      0|    return directObjectPrototypeToString(runtime, array);
  412|      0|  }
  413|       |
  414|    153|  return Callable::executeCall0(func, runtime, array).toCallResultHermesValue();
  415|    153|}
_ZN6hermes2vm18arrayPrototypeJoinEPvRNS0_7RuntimeENS0_10NativeArgsE:
  823|    153|arrayPrototypeJoin(void *, Runtime &runtime, NativeArgs args) {
  824|    153|  GCScope gcScope(runtime);
  825|    153|  auto objRes = toObject(runtime, args.getThisHandle());
  826|    153|  if (LLVM_UNLIKELY(objRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  827|      0|    return ExecutionStatus::EXCEPTION;
  828|      0|  }
  829|    153|  auto O = runtime.makeHandle<JSObject>(objRes.getValue());
  830|       |
  831|    153|  auto emptyString = runtime.getPredefinedStringHandle(Predefined::emptyString);
  832|       |
  833|    153|  if (runtime.insertVisitedObject(*O))
  ------------------
  |  Branch (833:7): [True: 0, False: 153]
  ------------------
  834|      0|    return emptyString.getHermesValue();
  835|    153|  auto cycleScope =
  836|    153|      llvh::make_scope_exit([&] { runtime.removeVisitedObject(*O); });
  837|       |
  838|    153|  auto propRes = JSObject::getNamed_RJS(
  839|    153|      O, runtime, Predefined::getSymbolID(Predefined::length));
  840|    153|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  841|      0|    return ExecutionStatus::EXCEPTION;
  842|      0|  }
  843|    153|  auto intRes = toLengthU64(runtime, runtime.makeHandle(std::move(*propRes)));
  844|    153|  if (LLVM_UNLIKELY(intRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  845|      0|    return ExecutionStatus::EXCEPTION;
  846|      0|  }
  847|    153|  uint64_t len = *intRes;
  848|       |
  849|       |  // Use comma for separator if the first argument is undefined.
  850|    153|  auto separator = args.getArg(0).isUndefined()
  ------------------
  |  Branch (850:20): [True: 153, False: 0]
  ------------------
  851|    153|      ? runtime.makeHandle(HermesValue::encodeStringValue(
  852|    153|            runtime.getPredefinedString(Predefined::comma)))
  853|    153|      : args.getArgHandle(0);
  854|    153|  auto strRes = toString_RJS(runtime, separator);
  855|    153|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  856|      0|    return ExecutionStatus::EXCEPTION;
  857|      0|  }
  858|    153|  auto sep = runtime.makeHandle(std::move(*strRes));
  859|       |
  860|    153|  if (len == 0) {
  ------------------
  |  Branch (860:7): [True: 0, False: 153]
  ------------------
  861|      0|    return HermesValue::encodeStringValue(
  862|      0|        runtime.getPredefinedString(Predefined::emptyString));
  863|      0|  }
  864|       |
  865|       |  // Track the size of the resultant string. Use a 64-bit value to detect
  866|       |  // overflow.
  867|    153|  SafeUInt32 size;
  868|       |
  869|       |  // Storage for the strings for each element.
  870|    153|  if (LLVM_UNLIKELY(len > JSArray::StorageType::maxElements())) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  871|      0|    return runtime.raiseRangeError("Out of memory for array elements.");
  872|      0|  }
  873|    153|  auto arrRes = JSArray::create(runtime, len, 0);
  874|    153|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    153|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 153]
  |  |  ------------------
  ------------------
  875|      0|    return ExecutionStatus::EXCEPTION;
  876|      0|  }
  877|    153|  auto strings = *arrRes;
  878|       |
  879|       |  // Call toString on all the elements of the array.
  880|    153|  for (MutableHandle<> i{runtime, HermesValue::encodeNumberValue(0)};
  881|   122k|       i->getNumber() < len;
  ------------------
  |  Branch (881:8): [True: 122k, False: 153]
  ------------------
  882|   122k|       i = HermesValue::encodeNumberValue(i->getNumber() + 1)) {
  883|       |    // Add the size of the separator, except the first time.
  884|   122k|    if (i->getNumberAs<uint32_t>())
  ------------------
  |  Branch (884:9): [True: 122k, False: 153]
  ------------------
  885|   122k|      size.add(sep->getStringLength());
  886|       |
  887|   122k|    GCScope gcScope2(runtime);
  888|   122k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   122k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 122k]
  |  |  ------------------
  ------------------
  889|   122k|            (propRes = JSObject::getComputed_RJS(O, runtime, i)) ==
  890|   122k|            ExecutionStatus::EXCEPTION)) {
  891|      0|      return ExecutionStatus::EXCEPTION;
  892|      0|    }
  893|       |
  894|   122k|    auto elem = runtime.makeHandle(std::move(*propRes));
  895|       |
  896|   122k|    if (elem->isUndefined() || elem->isNull()) {
  ------------------
  |  Branch (896:9): [True: 0, False: 122k]
  |  Branch (896:32): [True: 0, False: 122k]
  ------------------
  897|      0|      JSArray::setElementAt(strings, runtime, i->getNumber(), emptyString);
  898|   122k|    } else {
  899|       |      // Otherwise, call toString_RJS() and push the result, incrementing size.
  900|   122k|      auto strRes = toString_RJS(runtime, elem);
  901|   122k|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   122k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 122k]
  |  |  ------------------
  ------------------
  902|      0|        return ExecutionStatus::EXCEPTION;
  903|      0|      }
  904|   122k|      auto S = runtime.makeHandle(std::move(*strRes));
  905|   122k|      size.add(S->getStringLength());
  906|   122k|      JSArray::setElementAt(strings, runtime, i->getNumber(), S);
  907|   122k|    }
  908|       |
  909|       |    // Check for string overflow on every iteration to create the illusion that
  910|       |    // we are appending to the string. Also, prevent uint32_t overflow.
  911|   122k|    if (size.isOverflowed()) {
  ------------------
  |  Branch (911:9): [True: 0, False: 122k]
  ------------------
  912|      0|      return runtime.raiseRangeError("String is too long");
  913|      0|    }
  914|   122k|  }
  915|       |
  916|       |  // Allocate the complete result.
  917|    153|  auto builder = StringBuilder::createStringBuilder(runtime, size);
  918|    153|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (918:7): [True: 0, False: 153]
  ------------------
  919|      0|    return ExecutionStatus::EXCEPTION;
  920|      0|  }
  921|    153|  MutableHandle<StringPrimitive> element{runtime};
  922|    153|  element = strings->at(runtime, 0).getString(runtime);
  923|    153|  builder->appendStringPrim(element);
  924|   122k|  for (size_t i = 1; i < len; ++i) {
  ------------------
  |  Branch (924:22): [True: 122k, False: 153]
  ------------------
  925|   122k|    builder->appendStringPrim(sep);
  926|   122k|    element = strings->at(runtime, i).getString(runtime);
  927|   122k|    builder->appendStringPrim(element);
  928|   122k|  }
  929|    153|  return HermesValue::encodeStringValue(*builder->getStringPrimitive());
  930|    153|}
Array.cpp:_ZZN6hermes2vm18arrayPrototypeJoinEPvRNS0_7RuntimeENS0_10NativeArgsEENK3$_1clEv:
  836|    153|      llvh::make_scope_exit([&] { runtime.removeVisitedObject(*O); });

_ZN6hermes2vm28createArrayBufferConstructorERNS0_7RuntimeE:
   34|     99|Handle<JSObject> createArrayBufferConstructor(Runtime &runtime) {
   35|     99|  auto arrayBufferPrototype =
   36|     99|      Handle<JSObject>::vmcast(&runtime.arrayBufferPrototype);
   37|     99|  auto cons = defineSystemConstructor<JSArrayBuffer>(
   38|     99|      runtime,
   39|     99|      Predefined::getSymbolID(Predefined::ArrayBuffer),
   40|     99|      arrayBufferConstructor,
   41|     99|      arrayBufferPrototype,
   42|     99|      1,
   43|     99|      CellKind::JSArrayBufferKind);
   44|       |
   45|       |  // ArrayBuffer.prototype.xxx() methods.
   46|     99|  defineAccessor(
   47|     99|      runtime,
   48|     99|      arrayBufferPrototype,
   49|     99|      Predefined::getSymbolID(Predefined::byteLength),
   50|     99|      nullptr,
   51|     99|      arrayBufferPrototypeByteLength,
   52|     99|      nullptr,
   53|     99|      false,
   54|     99|      true);
   55|     99|  defineMethod(
   56|     99|      runtime,
   57|     99|      arrayBufferPrototype,
   58|     99|      Predefined::getSymbolID(Predefined::slice),
   59|     99|      nullptr,
   60|     99|      arrayBufferPrototypeSlice,
   61|     99|      2);
   62|       |
   63|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   64|     99|  dpf.writable = 0;
   65|     99|  dpf.enumerable = 0;
   66|     99|  defineProperty(
   67|     99|      runtime,
   68|     99|      arrayBufferPrototype,
   69|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   70|     99|      runtime.getPredefinedStringHandle(Predefined::ArrayBuffer),
   71|     99|      dpf);
   72|       |
   73|       |  // ArrayBuffer.xxx() methods.
   74|     99|  defineMethod(
   75|     99|      runtime,
   76|     99|      cons,
   77|     99|      Predefined::getSymbolID(Predefined::isView),
   78|     99|      nullptr,
   79|     99|      arrayBufferIsView,
   80|     99|      1);
   81|       |
   82|     99|  return cons;
   83|     99|}

_ZN6hermes2vm30populateArrayIteratorPrototypeERNS0_7RuntimeE:
   21|     99|void populateArrayIteratorPrototype(Runtime &runtime) {
   22|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.arrayIteratorPrototype);
   23|       |
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      proto,
   27|     99|      Predefined::getSymbolID(Predefined::next),
   28|     99|      nullptr,
   29|     99|      arrayIteratorPrototypeNext,
   30|     99|      0);
   31|       |
   32|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   33|     99|  dpf.writable = 0;
   34|     99|  dpf.enumerable = 0;
   35|     99|  defineProperty(
   36|     99|      runtime,
   37|     99|      proto,
   38|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   39|     99|      runtime.getPredefinedStringHandle(Predefined::ArrayIterator),
   40|     99|      dpf);
   41|     99|}

_ZN6hermes2vm30createAsyncFunctionConstructorERNS0_7RuntimeE:
   24|     99|Handle<JSObject> createAsyncFunctionConstructor(Runtime &runtime) {
   25|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.asyncFunctionPrototype);
   26|       |
   27|       |  /// 26.7.2 Properties of the AsyncFunction Constructor
   28|       |  /// has a [[Prototype]] internal slot whose value is %Function%.
   29|     99|  auto cons = runtime.makeHandle(NativeConstructor::create(
   30|     99|      runtime,
   31|     99|      Handle<JSObject>::vmcast(&runtime.functionConstructor),
   32|     99|      nullptr,
   33|     99|      asyncFunctionConstructor,
   34|     99|      1,
   35|     99|      NativeConstructor::creatorFunction<JSAsyncFunction>,
   36|     99|      CellKind::JSAsyncFunctionKind));
   37|       |
   38|       |  /// has a "name" property whose value is "AsyncFunction".
   39|       |  /// 26.7.2.1 AsyncFunction.length
   40|       |  /// 26.7.2.2 AsyncFunction.prototype
   41|     99|  auto st = Callable::defineNameLengthAndPrototype(
   42|     99|      cons,
   43|     99|      runtime,
   44|     99|      Predefined::getSymbolID(Predefined::AsyncFunction),
   45|     99|      1,
   46|     99|      proto,
   47|     99|      Callable::WritablePrototype::No,
   48|     99|      false);
   49|     99|  (void)st;
   50|     99|  assert(
   51|     99|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
   52|       |
   53|      0|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   54|     99|  dpf.writable = 0;
   55|     99|  dpf.enumerable = 0;
   56|       |
   57|       |  /// 26.7.3 Properties of the AsyncFunction Prototype Object
   58|       |
   59|       |  /// 26.7.3.1 AsyncFunction.prototype.constructor
   60|       |  /// The initial value of is %AsyncFunction%.
   61|     99|  defineProperty(
   62|     99|      runtime,
   63|     99|      proto,
   64|     99|      Predefined::getSymbolID(Predefined::constructor),
   65|     99|      cons,
   66|     99|      dpf);
   67|       |
   68|       |  /// 26.7.3.2 AsyncFunction.prototype [ @@toStringTag ]
   69|       |  /// The initial value is the String value "AsyncFunction".
   70|     99|  defineProperty(
   71|     99|      runtime,
   72|     99|      proto,
   73|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   74|     99|      runtime.getPredefinedStringHandle(Predefined::AsyncFunction),
   75|     99|      dpf);
   76|       |
   77|     99|  return cons;
   78|     99|}

_ZN6hermes2vm23createBigIntConstructorERNS0_7RuntimeE:
   21|     99|Handle<JSObject> createBigIntConstructor(Runtime &runtime) {
   22|     99|  auto bigintPrototype = Handle<JSObject>::vmcast(&runtime.bigintPrototype);
   23|       |
   24|     99|  auto cons = defineSystemConstructor<JSBigInt>(
   25|     99|      runtime,
   26|     99|      Predefined::getSymbolID(Predefined::BigInt),
   27|     99|      bigintConstructor,
   28|     99|      bigintPrototype,
   29|     99|      1,
   30|     99|      CellKind::JSBigIntKind);
   31|       |
   32|       |  // BigInt.prototype.xxx methods.
   33|       |  // https://tc39.es/ecma262/#sec-properties-of-the-bigint-prototype-object
   34|     99|  void *ctx = nullptr;
   35|     99|  defineMethod(
   36|     99|      runtime,
   37|     99|      bigintPrototype,
   38|     99|      Predefined::getSymbolID(Predefined::toString),
   39|     99|      ctx,
   40|     99|      bigintPrototypeToString,
   41|     99|      0);
   42|     99|  defineMethod(
   43|     99|      runtime,
   44|     99|      bigintPrototype,
   45|     99|      Predefined::getSymbolID(Predefined::valueOf),
   46|     99|      ctx,
   47|     99|      bigintPrototypeValueOf,
   48|     99|      0);
   49|     99|  defineMethod(
   50|     99|      runtime,
   51|     99|      bigintPrototype,
   52|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
   53|     99|      ctx,
   54|     99|      bigintPrototypeToLocaleString,
   55|     99|      1);
   56|       |
   57|       |  // BigInt.xxx() methods.
   58|       |  // https://tc39.es/ecma262/#sec-properties-of-the-bigint-constructor
   59|     99|  defineMethod(
   60|     99|      runtime,
   61|     99|      cons,
   62|     99|      Predefined::getSymbolID(Predefined::asIntN),
   63|     99|      reinterpret_cast<void *>(&BigIntPrimitive::asIntN),
   64|     99|      bigintTruncate,
   65|     99|      2);
   66|     99|  defineMethod(
   67|     99|      runtime,
   68|     99|      cons,
   69|     99|      Predefined::getSymbolID(Predefined::asUintN),
   70|     99|      reinterpret_cast<void *>(&BigIntPrimitive::asUintN),
   71|     99|      bigintTruncate,
   72|     99|      2);
   73|       |
   74|       |  // BigInt.xxx properties
   75|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   76|     99|  dpf.writable = 0;
   77|     99|  dpf.enumerable = 0;
   78|     99|  defineProperty(
   79|     99|      runtime,
   80|     99|      bigintPrototype,
   81|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   82|     99|      runtime.getPredefinedStringHandle(Predefined::BigInt),
   83|     99|      dpf);
   84|       |
   85|     99|  return cons;
   86|     99|}

_ZN6hermes2vm24createBooleanConstructorERNS0_7RuntimeE:
   21|     99|Handle<JSObject> createBooleanConstructor(Runtime &runtime) {
   22|     99|  auto booleanPrototype = Handle<JSBoolean>::vmcast(&runtime.booleanPrototype);
   23|       |
   24|     99|  auto cons = defineSystemConstructor<JSBoolean>(
   25|     99|      runtime,
   26|     99|      Predefined::getSymbolID(Predefined::Boolean),
   27|     99|      booleanConstructor,
   28|     99|      booleanPrototype,
   29|     99|      1,
   30|     99|      CellKind::JSBooleanKind);
   31|       |
   32|       |  // Boolean.prototype.xxx methods.
   33|     99|  defineMethod(
   34|     99|      runtime,
   35|     99|      booleanPrototype,
   36|     99|      Predefined::getSymbolID(Predefined::toString),
   37|     99|      nullptr,
   38|     99|      booleanPrototypeToString,
   39|     99|      0);
   40|     99|  defineMethod(
   41|     99|      runtime,
   42|     99|      booleanPrototype,
   43|     99|      Predefined::getSymbolID(Predefined::valueOf),
   44|     99|      nullptr,
   45|     99|      booleanPrototypeValueOf,
   46|     99|      0);
   47|       |
   48|     99|  return cons;
   49|     99|}

_ZN6hermes2vm25populateCallSitePrototypeERNS0_7RuntimeE:
   20|     99|void populateCallSitePrototype(Runtime &runtime) {
   21|     99|  auto callSitePrototype = Handle<JSObject>::vmcast(&runtime.callSitePrototype);
   22|       |
   23|       |  // CallSite.prototype.xxx methods.
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      callSitePrototype,
   27|     99|      Predefined::getSymbolID(Predefined::getFunctionName),
   28|     99|      nullptr,
   29|     99|      callSitePrototypeGetFunctionName,
   30|     99|      0);
   31|     99|  defineMethod(
   32|     99|      runtime,
   33|     99|      callSitePrototype,
   34|     99|      Predefined::getSymbolID(Predefined::getFileName),
   35|     99|      nullptr,
   36|     99|      callSitePrototypeGetFileName,
   37|     99|      0);
   38|     99|  defineMethod(
   39|     99|      runtime,
   40|     99|      callSitePrototype,
   41|     99|      Predefined::getSymbolID(Predefined::getLineNumber),
   42|     99|      nullptr,
   43|     99|      callSitePrototypeGetLineNumber,
   44|     99|      0);
   45|     99|  defineMethod(
   46|     99|      runtime,
   47|     99|      callSitePrototype,
   48|     99|      Predefined::getSymbolID(Predefined::getColumnNumber),
   49|     99|      nullptr,
   50|     99|      callSitePrototypeGetColumnNumber,
   51|     99|      0);
   52|     99|  defineMethod(
   53|     99|      runtime,
   54|     99|      callSitePrototype,
   55|     99|      Predefined::getSymbolID(Predefined::getBytecodeAddress),
   56|     99|      nullptr,
   57|     99|      callSitePrototypeGetBytecodeAddress,
   58|     99|      0);
   59|     99|  defineMethod(
   60|     99|      runtime,
   61|     99|      callSitePrototype,
   62|     99|      Predefined::getSymbolID(Predefined::isNative),
   63|     99|      nullptr,
   64|     99|      callSitePrototypeIsNative,
   65|     99|      0);
   66|     99|  defineMethod(
   67|     99|      runtime,
   68|     99|      callSitePrototype,
   69|     99|      Predefined::getSymbolID(Predefined::getThis),
   70|     99|      nullptr,
   71|     99|      callSitePrototypeGetThis,
   72|     99|      0);
   73|     99|  defineMethod(
   74|     99|      runtime,
   75|     99|      callSitePrototype,
   76|     99|      Predefined::getSymbolID(Predefined::getTypeName),
   77|     99|      nullptr,
   78|     99|      callSitePrototypeGetTypeName,
   79|     99|      0);
   80|     99|  defineMethod(
   81|     99|      runtime,
   82|     99|      callSitePrototype,
   83|     99|      Predefined::getSymbolID(Predefined::getFunction),
   84|     99|      nullptr,
   85|     99|      callSitePrototypeGetFunction,
   86|     99|      0);
   87|     99|  defineMethod(
   88|     99|      runtime,
   89|     99|      callSitePrototype,
   90|     99|      Predefined::getSymbolID(Predefined::getMethodName),
   91|     99|      nullptr,
   92|     99|      callSitePrototypeGetMethodName,
   93|     99|      0);
   94|     99|  defineMethod(
   95|     99|      runtime,
   96|     99|      callSitePrototype,
   97|     99|      Predefined::getSymbolID(Predefined::getEvalOrigin),
   98|     99|      nullptr,
   99|     99|      callSitePrototypeGetEvalOrigin,
  100|     99|      0);
  101|     99|  defineMethod(
  102|     99|      runtime,
  103|     99|      callSitePrototype,
  104|     99|      Predefined::getSymbolID(Predefined::isToplevel),
  105|     99|      nullptr,
  106|     99|      callSitePrototypeIsToplevel,
  107|     99|      0);
  108|     99|  defineMethod(
  109|     99|      runtime,
  110|     99|      callSitePrototype,
  111|     99|      Predefined::getSymbolID(Predefined::isEval),
  112|     99|      nullptr,
  113|     99|      callSitePrototypeIsEval,
  114|     99|      0);
  115|     99|  defineMethod(
  116|     99|      runtime,
  117|     99|      callSitePrototype,
  118|     99|      Predefined::getSymbolID(Predefined::isConstructor),
  119|     99|      nullptr,
  120|     99|      callSitePrototypeIsConstructor,
  121|     99|      0);
  122|     99|  defineMethod(
  123|     99|      runtime,
  124|     99|      callSitePrototype,
  125|     99|      Predefined::getSymbolID(Predefined::isAsync),
  126|     99|      nullptr,
  127|     99|      callSitePrototypeIsAsync,
  128|     99|      0);
  129|     99|  defineMethod(
  130|     99|      runtime,
  131|     99|      callSitePrototype,
  132|     99|      Predefined::getSymbolID(Predefined::isPromiseAll),
  133|     99|      nullptr,
  134|     99|      callSitePrototypeIsPromiseAll,
  135|     99|      0);
  136|     99|  defineMethod(
  137|     99|      runtime,
  138|     99|      callSitePrototype,
  139|     99|      Predefined::getSymbolID(Predefined::getPromiseIndex),
  140|     99|      nullptr,
  141|     99|      callSitePrototypeGetPromiseIndex,
  142|     99|      0);
  143|       |
  144|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  145|     99|  dpf.writable = 0;
  146|     99|  dpf.enumerable = 0;
  147|     99|  defineProperty(
  148|     99|      runtime,
  149|     99|      callSitePrototype,
  150|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  151|     99|      runtime.getPredefinedStringHandle(Predefined::CallSite),
  152|     99|      dpf);
  153|     99|}

_ZN6hermes2vm25createDataViewConstructorERNS0_7RuntimeE:
  223|     99|Handle<JSObject> createDataViewConstructor(Runtime &runtime) {
  224|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.dataViewPrototype);
  225|     99|  auto cons = defineSystemConstructor<JSDataView>(
  226|     99|      runtime,
  227|     99|      Predefined::getSymbolID(Predefined::DataView),
  228|     99|      dataViewConstructor,
  229|     99|      proto,
  230|     99|      1,
  231|     99|      CellKind::JSDataViewKind);
  232|       |
  233|       |  // DataView.prototype.xxx() methods.
  234|     99|  defineAccessor(
  235|     99|      runtime,
  236|     99|      proto,
  237|     99|      Predefined::getSymbolID(Predefined::buffer),
  238|     99|      nullptr,
  239|     99|      dataViewPrototypeBuffer,
  240|     99|      nullptr,
  241|     99|      false,
  242|     99|      true);
  243|     99|  defineAccessor(
  244|     99|      runtime,
  245|     99|      proto,
  246|     99|      Predefined::getSymbolID(Predefined::byteLength),
  247|     99|      nullptr,
  248|     99|      dataViewPrototypeByteLength,
  249|     99|      nullptr,
  250|     99|      false,
  251|     99|      true);
  252|     99|  defineAccessor(
  253|     99|      runtime,
  254|     99|      proto,
  255|     99|      Predefined::getSymbolID(Predefined::byteOffset),
  256|     99|      nullptr,
  257|     99|      dataViewPrototypeByteOffset,
  258|     99|      nullptr,
  259|     99|      false,
  260|     99|      true);
  261|       |
  262|     99|#define TYPED_ARRAY(name, type)                       \
  263|     99|  defineMethod(                                       \
  264|     99|      runtime,                                        \
  265|     99|      proto,                                          \
  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  267|     99|      nullptr,                                        \
  268|     99|      dataViewPrototypeGet##name,                     \
  269|     99|      1);                                             \
  270|     99|  defineMethod(                                       \
  271|     99|      runtime,                                        \
  272|     99|      proto,                                          \
  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  274|     99|      nullptr,                                        \
  275|     99|      dataViewPrototypeSet##name,                     \
  276|     99|      2);
  277|     99|#define TYPED_ARRAY_NO_CLAMP
  278|     99|#include "hermes/VM/TypedArrays.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |    9|       |
  |  |   10|       |#ifndef TYPED_ARRAY
  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |   12|       |#endif
  |  |   13|       |
  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   18|       |#ifndef TYPED_ARRAY_NO_CLAMP
  |  |   19|       |TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |   20|       |#else
  |  |   21|     99|#undef TYPED_ARRAY_NO_CLAMP
  |  |   22|     99|#endif
  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  ------------------
  |  |  |  |  263|     99|  defineMethod(                                       \
  |  |  |  |  264|     99|      runtime,                                        \
  |  |  |  |  265|     99|      proto,                                          \
  |  |  |  |  266|     99|      Predefined::getSymbolID(Predefined::get##name), \
  |  |  |  |  267|     99|      nullptr,                                        \
  |  |  |  |  268|     99|      dataViewPrototypeGet##name,                     \
  |  |  |  |  269|     99|      1);                                             \
  |  |  |  |  270|     99|  defineMethod(                                       \
  |  |  |  |  271|     99|      runtime,                                        \
  |  |  |  |  272|     99|      proto,                                          \
  |  |  |  |  273|     99|      Predefined::getSymbolID(Predefined::set##name), \
  |  |  |  |  274|     99|      nullptr,                                        \
  |  |  |  |  275|     99|      dataViewPrototypeSet##name,                     \
  |  |  |  |  276|     99|      2);
  |  |  ------------------
  |  |   29|       |
  |  |   30|     99|#undef TYPED_ARRAY
  ------------------
  279|       |
  280|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  281|     99|  dpf.writable = 0;
  282|     99|  dpf.enumerable = 0;
  283|     99|  defineProperty(
  284|     99|      runtime,
  285|     99|      proto,
  286|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  287|     99|      runtime.getPredefinedStringHandle(Predefined::DataView),
  288|     99|      dpf);
  289|       |
  290|       |  // DataView.xxx() methods.
  291|       |
  292|     99|  return cons;
  293|     99|}

_ZN6hermes2vm21createDateConstructorERNS0_7RuntimeE:
  109|     99|Handle<JSObject> createDateConstructor(Runtime &runtime) {
  110|     99|  auto datePrototype = Handle<JSObject>::vmcast(&runtime.datePrototype);
  111|     99|  auto cons = defineSystemConstructor<JSDate>(
  112|     99|      runtime,
  113|     99|      Predefined::getSymbolID(Predefined::Date),
  114|     99|      dateConstructor,
  115|     99|      datePrototype,
  116|     99|      7,
  117|     99|      CellKind::JSDateKind);
  118|       |
  119|       |  // Date.prototype.xxx() methods.
  120|     99|  defineMethod(
  121|     99|      runtime,
  122|     99|      datePrototype,
  123|     99|      Predefined::getSymbolID(Predefined::valueOf),
  124|     99|      nullptr,
  125|     99|      datePrototypeGetTime,
  126|     99|      0);
  127|     99|  defineMethod(
  128|     99|      runtime,
  129|     99|      datePrototype,
  130|     99|      Predefined::getSymbolID(Predefined::getTime),
  131|     99|      nullptr,
  132|     99|      datePrototypeGetTime,
  133|     99|      0);
  134|       |
  135|     99|  auto defineToStringMethod = [&](SymbolID name, ToStringKind kind) {
  136|     99|    defineMethod(
  137|     99|        runtime,
  138|     99|        datePrototype,
  139|     99|        name,
  140|     99|        (void *)kind,
  141|     99|        datePrototypeToStringHelper,
  142|     99|        0);
  143|     99|  };
  144|       |
  145|     99|  defineToStringMethod(
  146|     99|      Predefined::getSymbolID(Predefined::toString),
  147|     99|      ToStringKind::DatetimeToString);
  148|     99|  defineToStringMethod(
  149|     99|      Predefined::getSymbolID(Predefined::toDateString),
  150|     99|      ToStringKind::DateToString);
  151|     99|  defineToStringMethod(
  152|     99|      Predefined::getSymbolID(Predefined::toTimeString),
  153|     99|      ToStringKind::TimeToString);
  154|     99|  defineToStringMethod(
  155|     99|      Predefined::getSymbolID(Predefined::toISOString),
  156|     99|      ToStringKind::ISOToString);
  157|     99|  defineToStringMethod(
  158|     99|      Predefined::getSymbolID(Predefined::toUTCString),
  159|     99|      ToStringKind::UTCToString);
  160|     99|  defineToStringMethod(
  161|     99|      Predefined::getSymbolID(Predefined::toGMTString),
  162|     99|      ToStringKind::UTCToString);
  163|       |
  164|     99|  auto defineToLocaleStringMethod = [&](SymbolID name,
  165|     99|                                        ToLocaleStringKind kind) {
  166|     99|    defineMethod(
  167|     99|        runtime,
  168|     99|        datePrototype,
  169|     99|        name,
  170|     99|        (void *)kind,
  171|     99|        datePrototypeToLocaleStringHelper,
  172|     99|        0);
  173|     99|  };
  174|       |
  175|     99|  defineToLocaleStringMethod(
  176|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
  177|     99|      ToLocaleStringKind::DatetimeToLocaleString);
  178|     99|  defineToLocaleStringMethod(
  179|     99|      Predefined::getSymbolID(Predefined::toLocaleDateString),
  180|     99|      ToLocaleStringKind::DateToLocaleString);
  181|     99|  defineToLocaleStringMethod(
  182|     99|      Predefined::getSymbolID(Predefined::toLocaleTimeString),
  183|     99|      ToLocaleStringKind::TimeToLocaleString);
  184|       |
  185|     99|  auto defineGetterMethod = [&](SymbolID name, GetterKind kind) {
  186|     99|    defineMethod(
  187|     99|        runtime,
  188|     99|        datePrototype,
  189|     99|        name,
  190|     99|        (void *)kind,
  191|     99|        datePrototypeGetterHelper,
  192|     99|        0);
  193|     99|  };
  194|       |
  195|     99|  defineGetterMethod(
  196|     99|      Predefined::getSymbolID(Predefined::getFullYear),
  197|     99|      GetterKind::GetFullYear);
  198|     99|  defineGetterMethod(
  199|     99|      Predefined::getSymbolID(Predefined::getYear), GetterKind::GetYear);
  200|     99|  defineGetterMethod(
  201|     99|      Predefined::getSymbolID(Predefined::getMonth), GetterKind::GetMonth);
  202|     99|  defineGetterMethod(
  203|     99|      Predefined::getSymbolID(Predefined::getDate), GetterKind::GetDate);
  204|     99|  defineGetterMethod(
  205|     99|      Predefined::getSymbolID(Predefined::getDay), GetterKind::GetDay);
  206|     99|  defineGetterMethod(
  207|     99|      Predefined::getSymbolID(Predefined::getHours), GetterKind::GetHours);
  208|     99|  defineGetterMethod(
  209|     99|      Predefined::getSymbolID(Predefined::getMinutes), GetterKind::GetMinutes);
  210|     99|  defineGetterMethod(
  211|     99|      Predefined::getSymbolID(Predefined::getSeconds), GetterKind::GetSeconds);
  212|     99|  defineGetterMethod(
  213|     99|      Predefined::getSymbolID(Predefined::getMilliseconds),
  214|     99|      GetterKind::GetMilliseconds);
  215|     99|  defineGetterMethod(
  216|     99|      Predefined::getSymbolID(Predefined::getUTCFullYear),
  217|     99|      GetterKind::GetUTCFullYear);
  218|     99|  defineGetterMethod(
  219|     99|      Predefined::getSymbolID(Predefined::getUTCMonth),
  220|     99|      GetterKind::GetUTCMonth);
  221|     99|  defineGetterMethod(
  222|     99|      Predefined::getSymbolID(Predefined::getUTCDate), GetterKind::GetUTCDate);
  223|     99|  defineGetterMethod(
  224|     99|      Predefined::getSymbolID(Predefined::getUTCDay), GetterKind::GetUTCDay);
  225|     99|  defineGetterMethod(
  226|     99|      Predefined::getSymbolID(Predefined::getUTCHours),
  227|     99|      GetterKind::GetUTCHours);
  228|     99|  defineGetterMethod(
  229|     99|      Predefined::getSymbolID(Predefined::getUTCMinutes),
  230|     99|      GetterKind::GetUTCMinutes);
  231|     99|  defineGetterMethod(
  232|     99|      Predefined::getSymbolID(Predefined::getUTCSeconds),
  233|     99|      GetterKind::GetUTCSeconds);
  234|     99|  defineGetterMethod(
  235|     99|      Predefined::getSymbolID(Predefined::getUTCMilliseconds),
  236|     99|      GetterKind::GetUTCMilliseconds);
  237|     99|  defineGetterMethod(
  238|     99|      Predefined::getSymbolID(Predefined::getTimezoneOffset),
  239|     99|      GetterKind::GetTimezoneOffset);
  240|       |
  241|     99|  defineMethod(
  242|     99|      runtime,
  243|     99|      datePrototype,
  244|     99|      Predefined::getSymbolID(Predefined::setTime),
  245|     99|      nullptr,
  246|     99|      datePrototypeSetTime,
  247|     99|      1);
  248|       |
  249|     99|  auto defineSetterMethod =
  250|     99|      [&](SymbolID name, uint32_t length, bool isUTC, NativeFunctionPtr func) {
  251|     99|        defineMethod(
  252|     99|            runtime,
  253|     99|            datePrototype,
  254|     99|            name,
  255|     99|            reinterpret_cast<void *>(isUTC),
  256|     99|            func,
  257|     99|            length);
  258|     99|      };
  259|       |
  260|     99|  defineSetterMethod(
  261|     99|      Predefined::getSymbolID(Predefined::setMilliseconds),
  262|     99|      1,
  263|     99|      false,
  264|     99|      datePrototypeSetMilliseconds);
  265|     99|  defineSetterMethod(
  266|     99|      Predefined::getSymbolID(Predefined::setUTCMilliseconds),
  267|     99|      1,
  268|     99|      true,
  269|     99|      datePrototypeSetMilliseconds);
  270|     99|  defineSetterMethod(
  271|     99|      Predefined::getSymbolID(Predefined::setSeconds),
  272|     99|      2,
  273|     99|      false,
  274|     99|      datePrototypeSetSeconds);
  275|     99|  defineSetterMethod(
  276|     99|      Predefined::getSymbolID(Predefined::setUTCSeconds),
  277|     99|      2,
  278|     99|      true,
  279|     99|      datePrototypeSetSeconds);
  280|     99|  defineSetterMethod(
  281|     99|      Predefined::getSymbolID(Predefined::setMinutes),
  282|     99|      3,
  283|     99|      false,
  284|     99|      datePrototypeSetMinutes);
  285|     99|  defineSetterMethod(
  286|     99|      Predefined::getSymbolID(Predefined::setUTCMinutes),
  287|     99|      3,
  288|     99|      true,
  289|     99|      datePrototypeSetMinutes);
  290|     99|  defineSetterMethod(
  291|     99|      Predefined::getSymbolID(Predefined::setHours),
  292|     99|      4,
  293|     99|      false,
  294|     99|      datePrototypeSetHours);
  295|     99|  defineSetterMethod(
  296|     99|      Predefined::getSymbolID(Predefined::setUTCHours),
  297|     99|      4,
  298|     99|      true,
  299|     99|      datePrototypeSetHours);
  300|     99|  defineSetterMethod(
  301|     99|      Predefined::getSymbolID(Predefined::setDate),
  302|     99|      1,
  303|     99|      false,
  304|     99|      datePrototypeSetDate);
  305|     99|  defineSetterMethod(
  306|     99|      Predefined::getSymbolID(Predefined::setUTCDate),
  307|     99|      1,
  308|     99|      true,
  309|     99|      datePrototypeSetDate);
  310|     99|  defineSetterMethod(
  311|     99|      Predefined::getSymbolID(Predefined::setMonth),
  312|     99|      2,
  313|     99|      false,
  314|     99|      datePrototypeSetMonth);
  315|     99|  defineSetterMethod(
  316|     99|      Predefined::getSymbolID(Predefined::setUTCMonth),
  317|     99|      2,
  318|     99|      true,
  319|     99|      datePrototypeSetMonth);
  320|     99|  defineSetterMethod(
  321|     99|      Predefined::getSymbolID(Predefined::setFullYear),
  322|     99|      3,
  323|     99|      false,
  324|     99|      datePrototypeSetFullYear);
  325|     99|  defineSetterMethod(
  326|     99|      Predefined::getSymbolID(Predefined::setUTCFullYear),
  327|     99|      3,
  328|     99|      true,
  329|     99|      datePrototypeSetFullYear);
  330|     99|  defineSetterMethod(
  331|     99|      Predefined::getSymbolID(Predefined::setYear),
  332|     99|      1,
  333|     99|      false,
  334|     99|      datePrototypeSetYear);
  335|       |
  336|     99|  defineMethod(
  337|     99|      runtime,
  338|     99|      datePrototype,
  339|     99|      Predefined::getSymbolID(Predefined::toJSON),
  340|     99|      nullptr,
  341|     99|      datePrototypeToJSON,
  342|     99|      1);
  343|       |
  344|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  345|     99|  dpf.writable = 0;
  346|     99|  dpf.enumerable = 0;
  347|     99|  (void)defineMethod(
  348|     99|      runtime,
  349|     99|      datePrototype,
  350|     99|      Predefined::getSymbolID(Predefined::SymbolToPrimitive),
  351|     99|      Predefined::getSymbolID(Predefined::squareSymbolToPrimitive),
  352|     99|      nullptr,
  353|     99|      datePrototypeSymbolToPrimitive,
  354|     99|      1,
  355|     99|      dpf);
  356|       |
  357|       |  // Date.xxx() methods.
  358|     99|  defineMethod(
  359|     99|      runtime,
  360|     99|      cons,
  361|     99|      Predefined::getSymbolID(Predefined::parse),
  362|     99|      nullptr,
  363|     99|      dateParse,
  364|     99|      1);
  365|     99|  defineMethod(
  366|     99|      runtime,
  367|     99|      cons,
  368|     99|      Predefined::getSymbolID(Predefined::UTC),
  369|     99|      nullptr,
  370|     99|      dateUTC,
  371|     99|      7);
  372|     99|  defineMethod(
  373|     99|      runtime,
  374|     99|      cons,
  375|     99|      Predefined::getSymbolID(Predefined::now),
  376|     99|      nullptr,
  377|     99|      dateNow,
  378|     99|      0);
  379|       |
  380|     99|  return cons;
  381|     99|}
Date.cpp:_ZZN6hermes2vm21createDateConstructorERNS0_7RuntimeEENK3$_0clENS0_8SymbolIDENS0_12ToStringKindE:
  135|    594|  auto defineToStringMethod = [&](SymbolID name, ToStringKind kind) {
  136|    594|    defineMethod(
  137|    594|        runtime,
  138|    594|        datePrototype,
  139|    594|        name,
  140|    594|        (void *)kind,
  141|    594|        datePrototypeToStringHelper,
  142|    594|        0);
  143|    594|  };
Date.cpp:_ZZN6hermes2vm21createDateConstructorERNS0_7RuntimeEENK3$_1clENS0_8SymbolIDENS0_18ToLocaleStringKindE:
  165|    297|                                        ToLocaleStringKind kind) {
  166|    297|    defineMethod(
  167|    297|        runtime,
  168|    297|        datePrototype,
  169|    297|        name,
  170|    297|        (void *)kind,
  171|    297|        datePrototypeToLocaleStringHelper,
  172|    297|        0);
  173|    297|  };
Date.cpp:_ZZN6hermes2vm21createDateConstructorERNS0_7RuntimeEENK3$_2clENS0_8SymbolIDENS0_10GetterKindE:
  185|  1.78k|  auto defineGetterMethod = [&](SymbolID name, GetterKind kind) {
  186|  1.78k|    defineMethod(
  187|  1.78k|        runtime,
  188|  1.78k|        datePrototype,
  189|  1.78k|        name,
  190|  1.78k|        (void *)kind,
  191|  1.78k|        datePrototypeGetterHelper,
  192|  1.78k|        0);
  193|  1.78k|  };
Date.cpp:_ZZN6hermes2vm21createDateConstructorERNS0_7RuntimeEENK3$_3clENS0_8SymbolIDEjbPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEE:
  250|  1.48k|      [&](SymbolID name, uint32_t length, bool isUTC, NativeFunctionPtr func) {
  251|  1.48k|        defineMethod(
  252|  1.48k|            runtime,
  253|  1.48k|            datePrototype,
  254|  1.48k|            name,
  255|  1.48k|            reinterpret_cast<void *>(isUTC),
  256|  1.48k|            func,
  257|  1.48k|            length);
  258|  1.48k|      };

_ZN6hermes2vm28createDebuggerInternalObjectERNS0_7RuntimeE:
   17|     99|Handle<JSObject> createDebuggerInternalObject(Runtime &runtime) {
   18|     99|  Handle<JSObject> intern = runtime.makeHandle(JSObject::create(runtime));
   19|       |
   20|       |  // Configurable property stored in the Debugger
   21|       |  // To be used when a debugger transitions to an attached state.
   22|     99|  defineAccessor(
   23|     99|      runtime,
   24|     99|      intern,
   25|     99|      runtime.getIdentifierTable().registerLazyIdentifier(
   26|     99|          createASCIIRef("isDebuggerAttached")),
   27|     99|      nullptr,
   28|     99|      isDebuggerAttached,
   29|     99|      nullptr,
   30|     99|      true,
   31|     99|      false);
   32|       |
   33|       |  // Configurable property to poll whether
   34|       |  // the VM will pause the debugger on exceptions.
   35|     99|  defineAccessor(
   36|     99|      runtime,
   37|     99|      intern,
   38|     99|      runtime.getIdentifierTable().registerLazyIdentifier(
   39|     99|          createASCIIRef("shouldPauseOnThrow")),
   40|     99|      nullptr,
   41|     99|      shouldPauseOnThrow,
   42|     99|      nullptr,
   43|     99|      true,
   44|     99|      false);
   45|       |
   46|     99|  JSObject::preventExtensions(*intern);
   47|     99|  runtime.debuggerInternalObject_ = intern.getHermesValue();
   48|       |
   49|     99|  return intern;
   50|     99|}

_ZN6hermes2vm22createErrorConstructorERNS0_7RuntimeE:
   26|     99|Handle<JSObject> createErrorConstructor(Runtime &runtime) {
   27|     99|  auto errorPrototype = Handle<JSObject>::vmcast(&runtime.ErrorPrototype);
   28|       |
   29|       |  // Error.prototype.xxx methods.
   30|     99|  defineMethod(
   31|     99|      runtime,
   32|     99|      errorPrototype,
   33|     99|      Predefined::getSymbolID(Predefined::toString),
   34|     99|      nullptr,
   35|     99|      errorPrototypeToString,
   36|     99|      0);
   37|       |
   38|       |  // Error.prototype.xxx properties.
   39|       |  // Error.prototype has two own properties: name and message.
   40|     99|  auto defaultName = runtime.getPredefinedString(Predefined::Error);
   41|     99|  defineProperty(
   42|     99|      runtime,
   43|     99|      errorPrototype,
   44|     99|      Predefined::getSymbolID(Predefined::name),
   45|     99|      runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));
   46|       |
   47|     99|  auto defaultMessage = runtime.getPredefinedString(Predefined::emptyString);
   48|     99|  defineProperty(
   49|     99|      runtime,
   50|     99|      errorPrototype,
   51|     99|      Predefined::getSymbolID(Predefined::message),
   52|     99|      runtime.makeHandle(HermesValue::encodeStringValue(defaultMessage)));
   53|       |
   54|     99|  auto cons = defineSystemConstructor<JSError>(
   55|     99|      runtime,
   56|     99|      Predefined::getSymbolID(Predefined::Error),
   57|     99|      ErrorConstructor,
   58|     99|      errorPrototype,
   59|     99|      1,
   60|     99|      CellKind::JSErrorKind);
   61|       |
   62|     99|  defineMethod(
   63|     99|      runtime,
   64|     99|      cons,
   65|     99|      Predefined::getSymbolID(Predefined::captureStackTrace),
   66|     99|      nullptr,
   67|     99|      errorCaptureStackTrace,
   68|     99|      2);
   69|       |
   70|     99|  return cons;
   71|     99|}
_ZN6hermes2vm31createAggregateErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm26createEvalErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm27createRangeErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm31createReferenceErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm28createSyntaxErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm26createTypeErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm25createURIErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm29createTimeoutErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm26createQuitErrorConstructorERNS0_7RuntimeE:
   76|     99|  Handle<JSObject> create##error_name##Constructor(Runtime &runtime) {      \
   77|     99|    auto errorPrototype =                                                   \
   78|     99|        Handle<JSObject>::vmcast(&runtime.error_name##Prototype);           \
   79|     99|    auto defaultName = runtime.getPredefinedString(Predefined::error_name); \
   80|     99|    defineProperty(                                                         \
   81|     99|        runtime,                                                            \
   82|     99|        errorPrototype,                                                     \
   83|     99|        Predefined::getSymbolID(Predefined::name),                          \
   84|     99|        runtime.makeHandle(HermesValue::encodeStringValue(defaultName)));   \
   85|     99|    defineProperty(                                                         \
   86|     99|        runtime,                                                            \
   87|     99|        errorPrototype,                                                     \
   88|     99|        Predefined::getSymbolID(Predefined::message),                       \
   89|     99|        runtime.getPredefinedStringHandle(Predefined::emptyString));        \
   90|     99|    return defineSystemConstructor(                                         \
   91|     99|        runtime,                                                            \
   92|     99|        Predefined::getSymbolID(Predefined::error_name),                    \
   93|     99|        error_name##Constructor,                                            \
   94|     99|        errorPrototype,                                                     \
   95|     99|        Handle<JSObject>::vmcast(&runtime.errorConstructor),                \
   96|     99|        argCount,                                                           \
   97|     99|        NativeConstructor::creatorFunction<JSError>,                        \
   98|     99|        CellKind::JSErrorKind);                                             \
   99|     99|  }
_ZN6hermes2vm22errorPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
  248|     24|errorPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
  249|     24|  GCScope gcScope{runtime};
  250|       |
  251|       |  // 1. Let O be the this value.
  252|     24|  auto O = args.dyncastThis<JSObject>();
  253|       |
  254|       |  // 2. If Type(O) is not Object, throw a TypeError exception.
  255|     24|  if (LLVM_UNLIKELY(!O)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  256|      0|    return runtime.raiseTypeErrorForValue(
  257|      0|        "Error.prototype.toString called on incompatible receiver ",
  258|      0|        args.getThisHandle(),
  259|      0|        "");
  260|      0|  }
  261|       |
  262|       |  // 3. Let name be ? Get(O, "name").
  263|     24|  auto propRes = JSObject::getNamed_RJS(
  264|     24|      O, runtime, Predefined::getSymbolID(Predefined::name), PropOpFlags());
  265|     24|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  266|      0|    return ExecutionStatus::EXCEPTION;
  267|      0|  }
  268|     24|  Handle<> name = runtime.makeHandle(std::move(*propRes));
  269|       |
  270|       |  // 4. If name is undefined, set name to "Error"; otherwise set name to ?
  271|       |  // ToString(name).
  272|     24|  MutableHandle<StringPrimitive> nameStr{runtime};
  273|     24|  if (name->isUndefined()) {
  ------------------
  |  Branch (273:7): [True: 0, False: 24]
  ------------------
  274|      0|    nameStr = runtime.getPredefinedString(Predefined::Error);
  275|     24|  } else {
  276|     24|    auto strRes = toString_RJS(runtime, name);
  277|     24|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  278|      0|      return ExecutionStatus::EXCEPTION;
  279|      0|    }
  280|     24|    nameStr = strRes->get();
  281|     24|  }
  282|       |
  283|       |  // 5. Let msg be ? Get(O, "message").
  284|     24|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  285|     24|          (propRes = JSObject::getNamed_RJS(
  286|     24|               O,
  287|     24|               runtime,
  288|     24|               Predefined::getSymbolID(Predefined::message),
  289|     24|               PropOpFlags())) == ExecutionStatus::EXCEPTION)) {
  290|      0|    return ExecutionStatus::EXCEPTION;
  291|      0|  }
  292|     24|  Handle<> msg = runtime.makeHandle(std::move(*propRes));
  293|       |
  294|       |  // 6. If msg is undefined, set msg to the empty String;
  295|       |  //    otherwise set msg to ? ToString(msg).
  296|     24|  MutableHandle<StringPrimitive> msgStr{runtime};
  297|     24|  if (msg->isUndefined()) {
  ------------------
  |  Branch (297:7): [True: 0, False: 24]
  ------------------
  298|       |    // If msg is undefined, then let msg be the empty String.
  299|      0|    msgStr = runtime.getPredefinedString(Predefined::emptyString);
  300|     24|  } else {
  301|     24|    auto strRes = toString_RJS(runtime, msg);
  302|     24|    if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  303|      0|      return ExecutionStatus::EXCEPTION;
  304|      0|    }
  305|     24|    msgStr = strRes->get();
  306|     24|  }
  307|       |
  308|       |  // 7. If name is the empty String, return msg.
  309|     24|  if (nameStr->getStringLength() == 0) {
  ------------------
  |  Branch (309:7): [True: 0, False: 24]
  ------------------
  310|      0|    return msgStr.getHermesValue();
  311|      0|  }
  312|       |
  313|       |  // 8. If msg is the empty String, return name.
  314|     24|  if (msgStr->getStringLength() == 0) {
  ------------------
  |  Branch (314:7): [True: 0, False: 24]
  ------------------
  315|      0|    return nameStr.getHermesValue();
  316|      0|  }
  317|       |
  318|       |  // 9. Return the string-concatenation of name, the code unit 0x003A (COLON),
  319|       |  // the code unit 0x0020 (SPACE), and msg.
  320|     24|  SafeUInt32 length{nameStr->getStringLength()};
  321|     24|  length.add(2);
  322|     24|  length.add(msgStr->getStringLength());
  323|     24|  CallResult<StringBuilder> builderRes =
  324|     24|      StringBuilder::createStringBuilder(runtime, length);
  325|     24|  if (LLVM_UNLIKELY(builderRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     24|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 24]
  |  |  ------------------
  ------------------
  326|      0|    return ExecutionStatus::EXCEPTION;
  327|      0|  }
  328|     24|  auto builder = std::move(*builderRes);
  329|     24|  builder.appendStringPrim(nameStr);
  330|     24|  builder.appendASCIIRef({": ", 2});
  331|     24|  builder.appendStringPrim(msgStr);
  332|     24|  return builder.getStringPrimitive().getHermesValue();
  333|     24|}

_ZN6hermes2vm25createFunctionConstructorERNS0_7RuntimeE:
   28|     99|Handle<JSObject> createFunctionConstructor(Runtime &runtime) {
   29|     99|  auto functionPrototype = Handle<Callable>::vmcast(&runtime.functionPrototype);
   30|       |
   31|     99|  auto cons = defineSystemConstructor<JSFunction>(
   32|     99|      runtime,
   33|     99|      Predefined::getSymbolID(Predefined::Function),
   34|     99|      functionConstructor,
   35|     99|      functionPrototype,
   36|     99|      1,
   37|     99|      CellKind::JSFunctionKind);
   38|       |
   39|       |  // Function.prototype.xxx() methods.
   40|     99|  defineMethod(
   41|     99|      runtime,
   42|     99|      functionPrototype,
   43|     99|      Predefined::getSymbolID(Predefined::toString),
   44|     99|      nullptr,
   45|     99|      functionPrototypeToString,
   46|     99|      0);
   47|     99|  defineMethod(
   48|     99|      runtime,
   49|     99|      functionPrototype,
   50|     99|      Predefined::getSymbolID(Predefined::apply),
   51|     99|      nullptr,
   52|     99|      functionPrototypeApply,
   53|     99|      2);
   54|     99|  defineMethod(
   55|     99|      runtime,
   56|     99|      functionPrototype,
   57|     99|      Predefined::getSymbolID(Predefined::call),
   58|     99|      nullptr,
   59|     99|      functionPrototypeCall,
   60|     99|      1);
   61|     99|  defineMethod(
   62|     99|      runtime,
   63|     99|      functionPrototype,
   64|     99|      Predefined::getSymbolID(Predefined::bind),
   65|     99|      nullptr,
   66|     99|      functionPrototypeBind,
   67|     99|      1);
   68|       |
   69|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   70|     99|  dpf.writable = 0;
   71|     99|  dpf.enumerable = 0;
   72|     99|  dpf.configurable = 0;
   73|     99|  (void)defineMethod(
   74|     99|      runtime,
   75|     99|      functionPrototype,
   76|     99|      Predefined::getSymbolID(Predefined::SymbolHasInstance),
   77|     99|      Predefined::getSymbolID(Predefined::squareSymbolHasInstance),
   78|     99|      nullptr,
   79|     99|      functionPrototypeSymbolHasInstance,
   80|     99|      1,
   81|     99|      dpf);
   82|       |
   83|     99|  return cons;
   84|     99|}
_ZN6hermes2vm21functionPrototypeBindEPvRNS0_7RuntimeENS0_10NativeArgsE:
  256|     99|functionPrototypeBind(void *, Runtime &runtime, NativeArgs args) {
  257|     99|  auto target = Handle<Callable>::dyn_vmcast(args.getThisHandle());
  258|     99|  if (!target) {
  ------------------
  |  Branch (258:7): [True: 0, False: 99]
  ------------------
  259|      0|    return runtime.raiseTypeError("Can't bind() a non-callable");
  260|      0|  }
  261|       |
  262|     99|  return BoundFunction::create(
  263|     99|      runtime, target, args.getArgCount(), args.begin());
  264|     99|}

_ZN6hermes2vm34createGeneratorFunctionConstructorERNS0_7RuntimeE:
   17|     99|Handle<JSObject> createGeneratorFunctionConstructor(Runtime &runtime) {
   18|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.generatorFunctionPrototype);
   19|       |
   20|     99|  auto cons = runtime.makeHandle(NativeConstructor::create(
   21|     99|      runtime,
   22|     99|      Handle<JSObject>::vmcast(&runtime.functionConstructor),
   23|     99|      nullptr,
   24|     99|      generatorFunctionConstructor,
   25|     99|      1,
   26|     99|      NativeConstructor::creatorFunction<JSGeneratorFunction>,
   27|     99|      CellKind::JSGeneratorFunctionKind));
   28|       |
   29|     99|  auto st = Callable::defineNameLengthAndPrototype(
   30|     99|      cons,
   31|     99|      runtime,
   32|     99|      Predefined::getSymbolID(Predefined::GeneratorFunction),
   33|     99|      1,
   34|     99|      proto,
   35|     99|      Callable::WritablePrototype::No,
   36|     99|      false);
   37|     99|  (void)st;
   38|     99|  assert(
   39|     99|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
   40|       |
   41|      0|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   42|     99|  dpf.writable = 0;
   43|     99|  dpf.enumerable = 0;
   44|       |
   45|       |  // The initial value of GeneratorFunction.prototype.constructor is the
   46|       |  // intrinsic object %GeneratorFunction%.
   47|     99|  defineProperty(
   48|     99|      runtime,
   49|     99|      proto,
   50|     99|      Predefined::getSymbolID(Predefined::constructor),
   51|     99|      cons,
   52|     99|      dpf);
   53|       |
   54|       |  // The value of GeneratorFunction.prototype.prototype is the
   55|       |  // %GeneratorPrototype% intrinsic object.
   56|     99|  defineProperty(
   57|     99|      runtime,
   58|     99|      proto,
   59|     99|      Predefined::getSymbolID(Predefined::prototype),
   60|     99|      Handle<>(&runtime.generatorPrototype),
   61|     99|      dpf);
   62|       |
   63|     99|  defineProperty(
   64|     99|      runtime,
   65|     99|      proto,
   66|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   67|     99|      runtime.getPredefinedStringHandle(Predefined::GeneratorFunction),
   68|     99|      dpf);
   69|       |
   70|     99|  return cons;
   71|     99|}

_ZN6hermes2vm26populateGeneratorPrototypeERNS0_7RuntimeE:
   21|     99|void populateGeneratorPrototype(Runtime &runtime) {
   22|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.generatorPrototype);
   23|       |
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      proto,
   27|     99|      Predefined::getSymbolID(Predefined::next),
   28|     99|      nullptr,
   29|     99|      generatorPrototypeNext,
   30|     99|      1);
   31|       |
   32|     99|  defineMethod(
   33|     99|      runtime,
   34|     99|      proto,
   35|     99|      Predefined::getSymbolID(Predefined::returnStr),
   36|     99|      /* isThrow */ (void *)false,
   37|     99|      generatorPrototypeReturnOrThrow,
   38|     99|      1);
   39|     99|  defineMethod(
   40|     99|      runtime,
   41|     99|      proto,
   42|     99|      Predefined::getSymbolID(Predefined::throwStr),
   43|     99|      /* isThrow */ (void *)true,
   44|     99|      generatorPrototypeReturnOrThrow,
   45|     99|      1);
   46|       |
   47|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   48|     99|  dpf.writable = 0;
   49|     99|  dpf.enumerable = 0;
   50|       |
   51|       |  // The initial value of GeneratorFunction.prototype.constructor is the
   52|       |  // intrinsic object %Generator% (which is GeneratorFunction.prototype).
   53|     99|  defineProperty(
   54|     99|      runtime,
   55|     99|      proto,
   56|     99|      Predefined::getSymbolID(Predefined::constructor),
   57|     99|      Handle<>(&runtime.generatorFunctionPrototype),
   58|     99|      dpf);
   59|       |
   60|     99|  defineProperty(
   61|     99|      runtime,
   62|     99|      proto,
   63|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   64|     99|      runtime.getPredefinedStringHandle(Predefined::Generator),
   65|     99|      dpf);
   66|     99|}

_ZN6hermes2vm2gcEPvRNS0_7RuntimeENS0_10NativeArgsE:
  241|    133|CallResult<HermesValue> gc(void *, Runtime &runtime, NativeArgs) {
  242|    133|  runtime.collect("forced");
  243|    133|  return HermesValue::encodeUndefinedValue();
  244|    133|}
_ZN6hermes2vm16initGlobalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsE:
  262|     99|void initGlobalObject(Runtime &runtime, const JSLibFlags &jsLibFlags) {
  263|     99|  GCScope gcScope{runtime, "initGlobalObject", 330};
  264|       |
  265|       |  // Not enumerable, not writable, not configurable.
  266|     99|  DefinePropertyFlags constantDPF =
  267|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags();
  268|     99|  constantDPF.enumerable = 0;
  269|     99|  constantDPF.writable = 0;
  270|     99|  constantDPF.configurable = 0;
  271|       |
  272|       |  // Not enumerable, but writable and configurable.
  273|     99|  DefinePropertyFlags normalDPF =
  274|     99|      DefinePropertyFlags::getNewNonEnumerableFlags();
  275|       |
  276|       |  // Not enumerable, not writable but configurable.
  277|     99|  DefinePropertyFlags configurableOnlyPDF =
  278|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags();
  279|     99|  configurableOnlyPDF.enumerable = 0;
  280|     99|  configurableOnlyPDF.writable = 0;
  281|       |
  282|       |  /// Clear the configurable flag.
  283|     99|  DefinePropertyFlags clearConfigurableDPF{};
  284|     99|  clearConfigurableDPF.setConfigurable = 1;
  285|     99|  clearConfigurableDPF.configurable = 0;
  286|       |
  287|       |  // Define a function on the global object with name \p name.
  288|       |  // Allocates a NativeObject and puts it in the global object.
  289|     99|  auto defineGlobalFunc =
  290|     99|      [&](SymbolID name, NativeFunctionPtr functionPtr, unsigned paramCount) {
  291|     99|        gcScope.clearAllHandles();
  292|       |
  293|     99|        auto func = NativeFunction::createWithoutPrototype(
  294|     99|            runtime, nullptr, functionPtr, name, paramCount);
  295|     99|        runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  296|     99|            runtime.getGlobal(), runtime, name, normalDPF, func));
  297|     99|        return func;
  298|     99|      };
  299|       |
  300|       |  // 15.1.1.1 NaN.
  301|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  302|     99|      runtime.getGlobal(),
  303|     99|      runtime,
  304|     99|      Predefined::getSymbolID(Predefined::NaN),
  305|     99|      constantDPF,
  306|     99|      runtime.makeHandle(HermesValue::encodeNaNValue())));
  307|       |
  308|       |  // 15.1.1.2 Infinity.
  309|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  310|     99|      runtime.getGlobal(),
  311|     99|      runtime,
  312|     99|      Predefined::getSymbolID(Predefined::Infinity),
  313|     99|      constantDPF,
  314|     99|      runtime.makeHandle(HermesValue::encodeDoubleValue(
  315|     99|          std::numeric_limits<double>::infinity()))));
  316|       |
  317|       |  // 15.1.1.2 undefined.
  318|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  319|     99|      runtime.getGlobal(),
  320|     99|      runtime,
  321|     99|      Predefined::getSymbolID(Predefined::undefined),
  322|     99|      constantDPF,
  323|     99|      runtime.makeHandle(HermesValue::encodeUndefinedValue())));
  324|       |
  325|       |  // "Forward declaration" of Object.prototype. Its properties will be populated
  326|       |  // later.
  327|       |
  328|     99|  runtime.objectPrototype =
  329|     99|      JSObject::create(runtime, Runtime::makeNullHandle<JSObject>())
  330|     99|          .getHermesValue();
  331|     99|  runtime.objectPrototypeRawPtr = vmcast<JSObject>(runtime.objectPrototype);
  332|       |
  333|       |  // "Forward declaration" of Error.prototype. Its properties will be populated
  334|       |  // later.
  335|     99|  runtime.ErrorPrototype = JSObject::create(runtime).getHermesValue();
  336|       |
  337|       |// "Forward declaration" of the prototype for native error types. Their
  338|       |// properties will be populated later.
  339|     99|#define NATIVE_ERROR_TYPE(name)                                       \
  340|     99|  runtime.name##Prototype =                                           \
  341|     99|      JSObject::create(                                               \
  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  343|     99|          .getHermesValue();
  344|     99|#define AGGREGATE_ERROR_TYPE(name) NATIVE_ERROR_TYPE(name)
  345|     99|#include "hermes/VM/NativeErrorTypes.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// If ALL_ERROR_TYPE is defined, it will #define both
  |  |    9|       |// NATIVE_ERROR_TYPE and AGGREGATE_ERROR_TYPE.
  |  |   10|       |
  |  |   11|       |#ifdef ALL_ERROR_TYPE
  |  |   12|       |#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |   13|       |#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |   14|       |#else
  |  |   15|     99|#define ALL_ERROR_TYPE(name)
  |  |   16|     99|#endif // ALL_ERROR_TYPE
  |  |   17|       |
  |  |   18|       |#ifndef NATIVE_ERROR_TYPE
  |  |   19|       |#define NATIVE_ERROR_TYPE(name)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|       |#ifndef AGGREGATE_ERROR_TYPE
  |  |   23|       |#define AGGREGATE_ERROR_TYPE(name)
  |  |   24|       |#endif
  |  |   25|       |
  |  |   26|       |// The Error object, and all native error objects defined in ES5.1 15.11.
  |  |   27|       |// Use ALL_ERROR_TYPE to include Error; use NATIVE_ERROR_TYPE to exclude Error.
  |  |   28|       |// We need the macros to avoid rewriting the same code for each of them.
  |  |   29|       |
  |  |   30|     99|ALL_ERROR_TYPE(Error)
  |  |   31|     99|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  ------------------
  |  |  |  |  344|     99|#define AGGREGATE_ERROR_TYPE(name) NATIVE_ERROR_TYPE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  |  |  343|     99|          .getHermesValue();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|     99|NATIVE_ERROR_TYPE(EvalError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   33|     99|NATIVE_ERROR_TYPE(RangeError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   34|     99|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   35|     99|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   36|     99|NATIVE_ERROR_TYPE(TypeError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   37|     99|NATIVE_ERROR_TYPE(URIError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   38|     99|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   39|     99|NATIVE_ERROR_TYPE(QuitError)
  |  |  ------------------
  |  |  |  |  340|     99|  runtime.name##Prototype =                                           \
  |  |  |  |  341|     99|      JSObject::create(                                               \
  |  |  |  |  342|     99|          runtime, Handle<JSObject>::vmcast(&runtime.ErrorPrototype)) \
  |  |  |  |  343|     99|          .getHermesValue();
  |  |  ------------------
  |  |   40|       |
  |  |   41|     99|#undef AGGREGATE_ERROR_TYPE
  |  |   42|     99|#undef NATIVE_ERROR_TYPE
  |  |   43|     99|#undef ALL_ERROR_TYPE
  ------------------
  346|       |
  347|       |  // "Forward declaration" of the internal CallSite prototype. Its properties
  348|       |  // will be populated later.
  349|     99|  runtime.callSitePrototype =
  350|     99|      JSObject::create(
  351|     99|          runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  352|     99|          .getHermesValue();
  353|       |
  354|       |  // "Forward declaration" of Function.prototype. Its properties will be
  355|       |  // populated later.
  356|     99|  Handle<NativeFunction> funcRes = NativeFunction::create(
  357|     99|      runtime,
  358|     99|      Handle<JSObject>::vmcast(&runtime.objectPrototype),
  359|     99|      nullptr,
  360|     99|      emptyFunction,
  361|     99|      Predefined::getSymbolID(Predefined::emptyString),
  362|     99|      0,
  363|     99|      Runtime::makeNullHandle<JSObject>());
  364|     99|  runtime.functionPrototype = funcRes.getHermesValue();
  365|     99|  runtime.functionPrototypeRawPtr = funcRes.get();
  366|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  367|     99|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  368|     99|      runtime,
  369|     99|      Predefined::getSymbolID(Predefined::length),
  370|     99|      configurableOnlyPDF,
  371|     99|      Runtime::getZeroValue()));
  372|       |
  373|       |  // [[ThrowTypeError]].
  374|     99|  auto throwTypeErrorFunction = NativeFunction::create(
  375|     99|      runtime,
  376|     99|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  377|     99|      (void *)TypeErrorKind::NonStrictOnly,
  378|     99|      throwTypeError,
  379|     99|      Predefined::getSymbolID(Predefined::emptyString),
  380|     99|      0,
  381|     99|      Runtime::makeNullHandle<JSObject>());
  382|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  383|     99|      throwTypeErrorFunction,
  384|     99|      runtime,
  385|     99|      Predefined::getSymbolID(Predefined::length),
  386|     99|      clearConfigurableDPF,
  387|     99|      Runtime::getUndefinedValue()));
  388|     99|  runtime.throwTypeErrorAccessor =
  389|     99|      runtime.ignoreAllocationFailure(PropertyAccessor::create(
  390|     99|          runtime, throwTypeErrorFunction, throwTypeErrorFunction));
  391|       |
  392|       |  // Define the 'parseInt' function.
  393|     99|  runtime.parseIntFunction =
  394|     99|      defineGlobalFunc(
  395|     99|          Predefined::getSymbolID(Predefined::parseInt), parseInt, 2)
  396|     99|          .getHermesValue();
  397|       |
  398|       |  // Define the 'parseFloat' function.
  399|     99|  runtime.parseFloatFunction =
  400|     99|      defineGlobalFunc(
  401|     99|          Predefined::getSymbolID(Predefined::parseFloat), parseFloat, 1)
  402|     99|          .getHermesValue();
  403|       |
  404|       |  // "Forward declaration" of String.prototype. Its properties will be
  405|       |  // populated later.
  406|     99|  runtime.stringPrototype =
  407|     99|      runtime
  408|     99|          .ignoreAllocationFailure(JSString::create(
  409|     99|              runtime,
  410|     99|              runtime.getPredefinedStringHandle(Predefined::emptyString),
  411|     99|              Handle<JSObject>::vmcast(&runtime.objectPrototype)))
  412|     99|          .getHermesValue();
  413|       |
  414|       |  // "Forward declaration" of BigInt.prototype. Its properties will be
  415|       |  // populated later.
  416|     99|  runtime.bigintPrototype = JSObject::create(runtime).getHermesValue();
  417|       |
  418|       |  // "Forward declaration" of Number.prototype. Its properties will be
  419|       |  // populated later.
  420|     99|  runtime.numberPrototype =
  421|     99|      JSNumber::create(
  422|     99|          runtime, +0.0, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  423|     99|          .getHermesValue();
  424|       |
  425|       |  // "Forward declaration" of Boolean.prototype. Its properties will be
  426|       |  // populated later.
  427|     99|  runtime.booleanPrototype =
  428|     99|      JSBoolean::create(
  429|     99|          runtime, false, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  430|     99|          .getHermesValue();
  431|       |
  432|       |  // "Forward declaration" of Symbol.prototype. Its properties will be
  433|       |  // populated later.
  434|     99|  runtime.symbolPrototype = JSObject::create(runtime).getHermesValue();
  435|       |
  436|       |  // "Forward declaration" of Date.prototype. Its properties will be
  437|       |  // populated later.
  438|     99|  runtime.datePrototype =
  439|     99|      JSObject::create(
  440|     99|          runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  441|     99|          .getHermesValue();
  442|       |
  443|       |  // "Forward declaration" of %IteratorPrototype%.
  444|     99|  runtime.iteratorPrototype = JSObject::create(runtime).getHermesValue();
  445|       |
  446|       |  // "Forward declaration" of Array.prototype. Its properties will be
  447|       |  // populated later.
  448|     99|  runtime.arrayPrototype =
  449|     99|      runtime
  450|     99|          .ignoreAllocationFailure(JSArray::createNoAllocPropStorage(
  451|     99|              runtime,
  452|     99|              Handle<JSObject>::vmcast(&runtime.objectPrototype),
  453|     99|              JSArray::createClass(
  454|     99|                  runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype)),
  455|     99|              0,
  456|     99|              0))
  457|     99|          .getHermesValue();
  458|       |
  459|       |  // Declare the array class.
  460|     99|  runtime.arrayClass =
  461|     99|      JSArray::createClass(
  462|     99|          runtime, Handle<JSObject>::vmcast(&runtime.arrayPrototype))
  463|     99|          .getHermesValue();
  464|       |
  465|       |  // Declare the regexp match object class.
  466|     99|  runtime.regExpMatchClass =
  467|     99|      JSRegExp::createMatchClass(
  468|     99|          runtime, Handle<HiddenClass>::vmcast(&runtime.arrayClass))
  469|     99|          .getHermesValue();
  470|       |
  471|       |  // "Forward declaration" of ArrayBuffer.prototype. Its properties will be
  472|       |  // populated later.
  473|     99|  runtime.arrayBufferPrototype =
  474|     99|      JSObject::create(
  475|     99|          runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  476|     99|          .getHermesValue();
  477|       |
  478|       |  // "Forward declaration" of DataView.prototype. Its properties will be
  479|       |  // populated later.
  480|     99|  runtime.dataViewPrototype =
  481|     99|      JSObject::create(
  482|     99|          runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  483|     99|          .getHermesValue();
  484|       |
  485|       |  // "Forward declaration" of TypedArrayBase.prototype. Its properties will be
  486|       |  // populated later.
  487|     99|  runtime.typedArrayBasePrototype = JSObject::create(runtime).getHermesValue();
  488|       |
  489|       |// Typed arrays
  490|       |// NOTE: a TypedArray's prototype is a normal object, not a TypedArray.
  491|     99|#define TYPED_ARRAY(name, type)                                                \
  492|     99|  runtime.name##ArrayPrototype =                                               \
  493|     99|      JSObject::create(                                                        \
  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  495|     99|          .getHermesValue();
  496|     99|#include "hermes/VM/TypedArrays.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |    9|       |
  |  |   10|       |#ifndef TYPED_ARRAY
  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |   12|       |#endif
  |  |   13|       |
  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   18|     99|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |   19|     99|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   20|       |#else
  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |   22|       |#endif
  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  ------------------
  |  |  |  |  492|     99|  runtime.name##ArrayPrototype =                                               \
  |  |  |  |  493|     99|      JSObject::create(                                                        \
  |  |  |  |  494|     99|          runtime, Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype)) \
  |  |  |  |  495|     99|          .getHermesValue();
  |  |  ------------------
  |  |   29|       |
  |  |   30|     99|#undef TYPED_ARRAY
  ------------------
  497|       |
  498|       |  // "Forward declaration" of Set.prototype. Its properties will be
  499|       |  // populated later.
  500|     99|  runtime.setPrototype = JSObject::create(runtime).getHermesValue();
  501|       |
  502|     99|  runtime.setIteratorPrototype =
  503|     99|      createSetIteratorPrototype(runtime).getHermesValue();
  504|       |
  505|       |  // "Forward declaration" of Map.prototype. Its properties will be
  506|       |  // populated later.
  507|     99|  runtime.mapPrototype = JSObject::create(runtime).getHermesValue();
  508|       |
  509|     99|  runtime.mapIteratorPrototype =
  510|     99|      createMapIteratorPrototype(runtime).getHermesValue();
  511|       |
  512|       |  // "Forward declaration" of RegExp.prototype.
  513|       |  // ES6: 21.2.5 "The RegExp prototype object is an ordinary object. It is not a
  514|       |  // RegExp instance..."
  515|     99|  runtime.regExpPrototype =
  516|     99|      JSObject::create(
  517|     99|          runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype))
  518|     99|          .getHermesValue();
  519|       |
  520|       |  // "Forward declaration" of WeakMap.prototype.
  521|     99|  runtime.weakMapPrototype = JSObject::create(runtime).getHermesValue();
  522|       |
  523|       |  // "Forward declaration" of WeakSet.prototype.
  524|     99|  runtime.weakSetPrototype = JSObject::create(runtime).getHermesValue();
  525|       |
  526|       |  // Only define WeakRef if microtasks are being used.
  527|     99|  if (LLVM_UNLIKELY(runtime.hasMicrotaskQueue())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  528|       |    // "Forward declaration" of WeakRef.prototype.
  529|      0|    runtime.weakRefPrototype = JSObject::create(runtime).getHermesValue();
  530|      0|  }
  531|       |
  532|       |  // "Forward declaration" of %ArrayIteratorPrototype%.
  533|     99|  runtime.arrayIteratorPrototype =
  534|     99|      JSObject::create(
  535|     99|          runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype))
  536|     99|          .getHermesValue();
  537|       |
  538|       |  // "Forward declaration" of %StringIteratorPrototype%.
  539|     99|  runtime.stringIteratorPrototype =
  540|     99|      JSObject::create(
  541|     99|          runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype))
  542|     99|          .getHermesValue();
  543|       |
  544|       |  // "Forward declaration" of %RegExpStringIteratorPrototype%.
  545|     99|  runtime.regExpStringIteratorPrototype =
  546|     99|      JSObject::create(
  547|     99|          runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype))
  548|     99|          .getHermesValue();
  549|       |
  550|       |  // "Forward declaration" of "Generator prototype object"
  551|     99|  runtime.generatorPrototype =
  552|     99|      JSObject::create(
  553|     99|          runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype))
  554|     99|          .getHermesValue();
  555|       |
  556|       |  // "Forward declaration" of %GeneratorFunction.prototype%
  557|     99|  runtime.generatorFunctionPrototype =
  558|     99|      JSObject::create(
  559|     99|          runtime, Handle<JSObject>::vmcast(&runtime.functionPrototype))
  560|     99|          .getHermesValue();
  561|       |
  562|       |  // "Forward declaration" of %AsyncFunction.prototype%
  563|     99|  runtime.asyncFunctionPrototype =
  564|     99|      JSObject::create(
  565|     99|          runtime, Handle<JSObject>::vmcast(&runtime.functionPrototype))
  566|     99|          .getHermesValue();
  567|       |
  568|       |  // Object constructor.
  569|     99|  createObjectConstructor(runtime);
  570|       |
  571|       |  // JSError constructor.
  572|     99|  runtime.errorConstructor = createErrorConstructor(runtime).getHermesValue();
  573|       |
  574|       |// All Native Error constructors.
  575|     99|#define NATIVE_ERROR_TYPE(name)       \
  576|     99|  create##name##Constructor(runtime); \
  577|     99|  gcScope.clearAllHandles();
  578|     99|#define AGGREGATE_ERROR_TYPE(name) NATIVE_ERROR_TYPE(name)
  579|     99|#include "hermes/VM/NativeErrorTypes.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// If ALL_ERROR_TYPE is defined, it will #define both
  |  |    9|       |// NATIVE_ERROR_TYPE and AGGREGATE_ERROR_TYPE.
  |  |   10|       |
  |  |   11|       |#ifdef ALL_ERROR_TYPE
  |  |   12|       |#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |   13|       |#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |   14|       |#else
  |  |   15|     99|#define ALL_ERROR_TYPE(name)
  |  |   16|     99|#endif // ALL_ERROR_TYPE
  |  |   17|       |
  |  |   18|       |#ifndef NATIVE_ERROR_TYPE
  |  |   19|       |#define NATIVE_ERROR_TYPE(name)
  |  |   20|       |#endif
  |  |   21|       |
  |  |   22|       |#ifndef AGGREGATE_ERROR_TYPE
  |  |   23|       |#define AGGREGATE_ERROR_TYPE(name)
  |  |   24|       |#endif
  |  |   25|       |
  |  |   26|       |// The Error object, and all native error objects defined in ES5.1 15.11.
  |  |   27|       |// Use ALL_ERROR_TYPE to include Error; use NATIVE_ERROR_TYPE to exclude Error.
  |  |   28|       |// We need the macros to avoid rewriting the same code for each of them.
  |  |   29|       |
  |  |   30|     99|ALL_ERROR_TYPE(Error)
  |  |   31|     99|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  ------------------
  |  |  |  |  578|     99|#define AGGREGATE_ERROR_TYPE(name) NATIVE_ERROR_TYPE(name)
  |  |  |  |  ------------------
  |  |  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|     99|NATIVE_ERROR_TYPE(EvalError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   33|     99|NATIVE_ERROR_TYPE(RangeError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   34|     99|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   35|     99|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   36|     99|NATIVE_ERROR_TYPE(TypeError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   37|     99|NATIVE_ERROR_TYPE(URIError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   38|     99|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   39|     99|NATIVE_ERROR_TYPE(QuitError)
  |  |  ------------------
  |  |  |  |  576|     99|  create##name##Constructor(runtime); \
  |  |  |  |  577|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   40|       |
  |  |   41|     99|#undef AGGREGATE_ERROR_TYPE
  |  |   42|     99|#undef NATIVE_ERROR_TYPE
  |  |   43|     99|#undef ALL_ERROR_TYPE
  ------------------
  580|       |
  581|       |  // Populate the internal CallSite prototype.
  582|     99|  populateCallSitePrototype(runtime);
  583|       |
  584|       |  // String constructor.
  585|     99|  createStringConstructor(runtime);
  586|       |
  587|       |  // BigInt constructor.
  588|     99|  createBigIntConstructor(runtime);
  589|       |
  590|       |  // Function constructor.
  591|     99|  runtime.functionConstructor =
  592|     99|      createFunctionConstructor(runtime).getHermesValue();
  593|       |
  594|       |  // Number constructor.
  595|     99|  createNumberConstructor(runtime);
  596|       |
  597|       |  // Boolean constructor.
  598|     99|  createBooleanConstructor(runtime);
  599|       |
  600|       |  // Date constructor.
  601|     99|  createDateConstructor(runtime);
  602|       |
  603|       |  // RegExp constructor
  604|     99|  createRegExpConstructor(runtime);
  605|     99|  runtime.regExpLastInput = HermesValue::encodeUndefinedValue();
  606|     99|  runtime.regExpLastRegExp = HermesValue::encodeUndefinedValue();
  607|       |
  608|       |  // Array constructor.
  609|     99|  createArrayConstructor(runtime);
  610|       |
  611|     99|  if (runtime.hasArrayBuffer()) {
  ------------------
  |  Branch (611:7): [True: 99, False: 0]
  ------------------
  612|       |    // ArrayBuffer constructor.
  613|     99|    createArrayBufferConstructor(runtime);
  614|       |
  615|       |    // DataView constructor.
  616|     99|    createDataViewConstructor(runtime);
  617|       |
  618|       |    // TypedArrayBase constructor.
  619|     99|    runtime.typedArrayBaseConstructor =
  620|     99|        createTypedArrayBaseConstructor(runtime).getHermesValue();
  621|       |
  622|     99|#define TYPED_ARRAY(name, type)                                 \
  623|     99|  runtime.name##ArrayConstructor =                              \
  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  625|     99|  gcScope.clearAllHandles();
  626|     99|#include "hermes/VM/TypedArrays.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |    9|       |
  |  |   10|       |#ifndef TYPED_ARRAY
  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |   12|       |#endif
  |  |   13|       |
  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   18|     99|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |   19|     99|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   20|       |#else
  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |   22|       |#endif
  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  ------------------
  |  |  |  |  623|     99|  runtime.name##ArrayConstructor =                              \
  |  |  |  |  624|     99|      create##name##ArrayConstructor(runtime).getHermesValue(); \
  |  |  |  |  625|     99|  gcScope.clearAllHandles();
  |  |  ------------------
  |  |   29|       |
  |  |   30|     99|#undef TYPED_ARRAY
  ------------------
  627|     99|  } else {
  628|      0|    gcScope.clearAllHandles();
  629|      0|  } // hasArrayBuffer
  630|       |
  631|       |  // Set constructor.
  632|     99|  createSetConstructor(runtime);
  633|       |
  634|       |  // Map constructor.
  635|     99|  createMapConstructor(runtime);
  636|       |
  637|       |  // WeakMap constructor.
  638|     99|  createWeakMapConstructor(runtime);
  639|       |
  640|       |  // WeakSet constructor.
  641|     99|  createWeakSetConstructor(runtime);
  642|       |
  643|       |  // Only define WeakRef constructor if microtasks are being used.
  644|     99|  if (LLVM_UNLIKELY(runtime.hasMicrotaskQueue())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  645|       |    // WeakRef constructor.
  646|      0|    createWeakRefConstructor(runtime);
  647|      0|  }
  648|       |
  649|       |  // Symbol constructor.
  650|     99|  createSymbolConstructor(runtime);
  651|       |
  652|       |  /// %IteratorPrototype%.
  653|     99|  populateIteratorPrototype(runtime);
  654|       |
  655|       |  /// Array Iterator.
  656|     99|  populateArrayIteratorPrototype(runtime);
  657|       |
  658|       |  /// String Iterator.
  659|     99|  populateStringIteratorPrototype(runtime);
  660|       |
  661|       |  /// RegExp String Iterator.
  662|     99|  populateRegExpStringIteratorPrototype(runtime);
  663|       |
  664|       |  // GeneratorFunction constructor (not directly exposed in the global object).
  665|     99|  createGeneratorFunctionConstructor(runtime);
  666|       |
  667|       |  // AsyncFunction constructor (not directly exposed in the global object).
  668|     99|  createAsyncFunctionConstructor(runtime);
  669|       |
  670|       |  // %GeneratorPrototype%.
  671|     99|  populateGeneratorPrototype(runtime);
  672|       |
  673|       |  // Proxy constructor.
  674|     99|  if (LLVM_UNLIKELY(runtime.hasES6Proxy())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  675|     99|    createProxyConstructor(runtime);
  676|     99|  }
  677|       |
  678|       |  // Define the global Math object
  679|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  680|     99|      runtime.getGlobal(),
  681|     99|      runtime,
  682|     99|      Predefined::getSymbolID(Predefined::Math),
  683|     99|      normalDPF,
  684|     99|      createMathObject(runtime)));
  685|       |
  686|       |  // Define the global JSON object
  687|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  688|     99|      runtime.getGlobal(),
  689|     99|      runtime,
  690|     99|      Predefined::getSymbolID(Predefined::JSON),
  691|     99|      normalDPF,
  692|     99|      createJSONObject(runtime)));
  693|       |
  694|     99|  if (LLVM_UNLIKELY(runtime.hasES6Proxy())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  695|       |    // Define the global Reflect object
  696|     99|    runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  697|     99|        runtime.getGlobal(),
  698|     99|        runtime,
  699|     99|        Predefined::getSymbolID(Predefined::Reflect),
  700|     99|        normalDPF,
  701|     99|        createReflectObject(runtime)));
  702|     99|  }
  703|       |
  704|       |  // Define the global %HermesInternal object.
  705|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  706|     99|      runtime.getGlobal(),
  707|     99|      runtime,
  708|     99|      Predefined::getSymbolID(Predefined::HermesInternal),
  709|     99|      constantDPF,
  710|     99|      createHermesInternalObject(runtime, jsLibFlags)));
  711|       |
  712|     99|#ifdef HERMES_ENABLE_DEBUGGER
  713|       |
  714|       |  // Define the global %DebuggerInternal object.
  715|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  716|     99|      runtime.getGlobal(),
  717|     99|      runtime,
  718|     99|      runtime.getIdentifierTable().registerLazyIdentifier(
  719|     99|          createASCIIRef("DebuggerInternal")),
  720|     99|      constantDPF,
  721|     99|      createDebuggerInternalObject(runtime)));
  722|       |
  723|     99|#endif // HERMES_ENABLE_DEBUGGER
  724|       |
  725|       |  // Define the 'print' function.
  726|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::print), print, 1);
  727|       |
  728|       |  // Define the 'eval' function.
  729|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::eval), eval, 1);
  730|       |
  731|       |  // Define the 'isNaN' function.
  732|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::isNaN), isNaN, 1);
  733|       |
  734|       |  // Define the 'isFinite' function.
  735|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::isFinite), isFinite, 1);
  736|       |
  737|       |  // Define the 'escape' function.
  738|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::escape), escape, 1);
  739|       |
  740|       |  // Define the 'unescape' function.
  741|     99|  defineGlobalFunc(Predefined::getSymbolID(Predefined::unescape), unescape, 1);
  742|       |
  743|       |  // Define the 'decodeURI' function.
  744|     99|  defineGlobalFunc(
  745|     99|      Predefined::getSymbolID(Predefined::decodeURI), decodeURI, 1);
  746|       |
  747|       |  // Define the 'decodeURIComponent' function.
  748|     99|  defineGlobalFunc(
  749|     99|      Predefined::getSymbolID(Predefined::decodeURIComponent),
  750|     99|      decodeURIComponent,
  751|     99|      1);
  752|       |
  753|       |  // Define the 'encodeURI' function.
  754|     99|  defineGlobalFunc(
  755|     99|      Predefined::getSymbolID(Predefined::encodeURI), encodeURI, 1);
  756|       |
  757|       |  // Define the 'encodeURIComponent' function.
  758|     99|  defineGlobalFunc(
  759|     99|      Predefined::getSymbolID(Predefined::encodeURIComponent),
  760|     99|      encodeURIComponent,
  761|     99|      1);
  762|       |
  763|       |  // Define the 'globalThis' property.
  764|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  765|     99|      runtime.getGlobal(),
  766|     99|      runtime,
  767|     99|      Predefined::getSymbolID(Predefined::globalThis),
  768|     99|      normalDPF,
  769|     99|      runtime.getGlobal()));
  770|       |
  771|       |  // Define the 'require' function.
  772|     99|  runtime.requireFunction =
  773|     99|      NativeFunction::create(
  774|     99|          runtime,
  775|     99|          Handle<JSObject>::vmcast(&runtime.functionPrototype),
  776|     99|          nullptr,
  777|     99|          require,
  778|     99|          Predefined::getSymbolID(Predefined::require),
  779|     99|          1,
  780|     99|          Runtime::makeNullHandle<JSObject>())
  781|     99|          .getHermesValue();
  782|       |
  783|     99|  if (jsLibFlags.enableHermesInternal) {
  ------------------
  |  Branch (783:7): [True: 99, False: 0]
  ------------------
  784|       |    // Define the 'gc' function.
  785|     99|    defineGlobalFunc(Predefined::getSymbolID(Predefined::gc), gc, 0);
  786|     99|  }
  787|       |
  788|       |#ifdef HERMES_ENABLE_IR_INSTRUMENTATION
  789|       |  // Define the global __instrument object
  790|       |  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  791|       |      runtime.getGlobal(),
  792|       |      runtime,
  793|       |      runtime.getIdentifierTable().registerLazyIdentifier(
  794|       |          createASCIIRef("__instrument")),
  795|       |      normalDPF,
  796|       |      createInstrumentObject(runtime)));
  797|       |#endif
  798|       |
  799|       |#ifdef HERMES_ENABLE_INTL
  800|       |  // Define the global Intl object
  801|       |  // TODO T65916424: Consider how we can move this somewhere more modular.
  802|       |  if (runtime.hasIntl()) {
  803|       |    runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  804|       |        runtime.getGlobal(),
  805|       |        runtime,
  806|       |        Predefined::getSymbolID(Predefined::Intl),
  807|       |        normalDPF,
  808|       |        intl::createIntlObject(runtime)));
  809|       |  }
  810|       |#endif
  811|     99|}
GlobalObject.cpp:_ZZN6hermes2vm16initGlobalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsEENK3$_0clENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEj:
  290|  1.28k|      [&](SymbolID name, NativeFunctionPtr functionPtr, unsigned paramCount) {
  291|  1.28k|        gcScope.clearAllHandles();
  292|       |
  293|  1.28k|        auto func = NativeFunction::createWithoutPrototype(
  294|  1.28k|            runtime, nullptr, functionPtr, name, paramCount);
  295|  1.28k|        runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  296|  1.28k|            runtime.getGlobal(), runtime, name, normalDPF, func));
  297|  1.28k|        return func;
  298|  1.28k|      };

_ZN6hermes2vm30hermesBuiltinGetTemplateObjectEPvRNS0_7RuntimeENS0_10NativeArgsE:
   62|    283|hermesBuiltinGetTemplateObject(void *, Runtime &runtime, NativeArgs args) {
   63|    283|  if (LLVM_UNLIKELY(args.getArgCount() < 3)) {
  ------------------
  |  |  189|    283|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 283]
  |  |  ------------------
  ------------------
   64|      0|    return runtime.raiseTypeError("At least three arguments expected");
   65|      0|  }
   66|    283|  if (LLVM_UNLIKELY(!args.getArg(0).isNumber())) {
  ------------------
  |  |  189|    283|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 283]
  |  |  ------------------
  ------------------
   67|      0|    return runtime.raiseTypeError("First argument should be a number");
   68|      0|  }
   69|    283|  if (LLVM_UNLIKELY(!args.getArg(1).isBool())) {
  ------------------
  |  |  189|    283|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 283]
  |  |  ------------------
  ------------------
   70|      0|    return runtime.raiseTypeError("Second argument should be a bool");
   71|      0|  }
   72|       |
   73|    283|  GCScope gcScope{runtime};
   74|       |
   75|       |  // Try finding the template object in the template object cache.
   76|    283|  uint32_t templateObjID = args.getArg(0).getNumberAs<uint32_t>();
   77|    283|  auto savedCB = runtime.getStackFrames().begin()->getSavedCodeBlock();
   78|    283|  if (LLVM_UNLIKELY(!savedCB)) {
  ------------------
  |  |  189|    283|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 283]
  |  |  ------------------
  ------------------
   79|      0|    return runtime.raiseTypeError("Cannot be called from native code");
   80|      0|  }
   81|    283|  RuntimeModule *runtimeModule = savedCB->getRuntimeModule();
   82|    283|  JSObject *cachedTemplateObj =
   83|    283|      runtimeModule->findCachedTemplateObject(templateObjID);
   84|    283|  if (cachedTemplateObj) {
  ------------------
  |  Branch (84:7): [True: 214, False: 69]
  ------------------
   85|    214|    return HermesValue::encodeObjectValue(cachedTemplateObj);
   86|    214|  }
   87|       |
   88|     69|  bool dup = args.getArg(1).getBool();
   89|     69|  if (LLVM_UNLIKELY(!dup && args.getArgCount() % 2 == 1)) {
  ------------------
  |  |  189|     74|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  |  Branch (189:53): [True: 5, False: 64]
  |  |  |  Branch (189:53): [True: 0, False: 5]
  |  |  ------------------
  ------------------
   90|      0|    return runtime.raiseTypeError(
   91|      0|        "There must be the same number of raw and cooked strings.");
   92|      0|  }
   93|     69|  uint32_t count = dup ? args.getArgCount() - 2 : args.getArgCount() / 2 - 1;
  ------------------
  |  Branch (93:20): [True: 64, False: 5]
  ------------------
   94|       |
   95|       |  // Create template object and raw object.
   96|     69|  auto arrRes = JSArray::create(runtime, count, 0);
   97|     69|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
   98|      0|    return ExecutionStatus::EXCEPTION;
   99|      0|  }
  100|     69|  auto rawObj = Handle<JSObject>::vmcast(*arrRes);
  101|     69|  auto arrRes2 = JSArray::create(runtime, count, 0);
  102|     69|  if (LLVM_UNLIKELY(arrRes2 == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  103|      0|    return ExecutionStatus::EXCEPTION;
  104|      0|  }
  105|     69|  auto templateObj = Handle<JSObject>::vmcast(*arrRes2);
  106|       |
  107|       |  // Set cooked and raw strings as elements in template object and raw object,
  108|       |  // respectively.
  109|     69|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  110|     69|  dpf.writable = 0;
  111|     69|  dpf.configurable = 0;
  112|     69|  MutableHandle<> idx{runtime};
  113|     69|  MutableHandle<> rawValue{runtime};
  114|     69|  MutableHandle<> cookedValue{runtime};
  115|     69|  uint32_t cookedBegin = dup ? 2 : 2 + count;
  ------------------
  |  Branch (115:26): [True: 64, False: 5]
  ------------------
  116|     69|  auto marker = gcScope.createMarker();
  117|  67.2k|  for (uint32_t i = 0; i < count; ++i) {
  ------------------
  |  Branch (117:24): [True: 67.1k, False: 69]
  ------------------
  118|  67.1k|    idx = HermesValue::encodeNumberValue(i);
  119|       |
  120|  67.1k|    cookedValue = args.getArg(cookedBegin + i);
  121|  67.1k|    auto putRes = JSObject::defineOwnComputedPrimitive(
  122|  67.1k|        templateObj, runtime, idx, dpf, cookedValue);
  123|  67.1k|    assert(
  124|  67.1k|        putRes != ExecutionStatus::EXCEPTION && *putRes &&
  125|  67.1k|        "Failed to set cooked value to template object.");
  126|       |
  127|      0|    rawValue = args.getArg(2 + i);
  128|  67.1k|    putRes = JSObject::defineOwnComputedPrimitive(
  129|  67.1k|        rawObj, runtime, idx, dpf, rawValue);
  130|  67.1k|    assert(
  131|  67.1k|        putRes != ExecutionStatus::EXCEPTION && *putRes &&
  132|  67.1k|        "Failed to set raw value to raw object.");
  133|       |
  134|      0|    gcScope.flushToMarker(marker);
  135|  67.1k|  }
  136|       |  // Make 'length' property on the raw object read-only.
  137|     69|  DefinePropertyFlags readOnlyDPF{};
  138|     69|  readOnlyDPF.setWritable = 1;
  139|     69|  readOnlyDPF.setConfigurable = 1;
  140|     69|  readOnlyDPF.writable = 0;
  141|     69|  readOnlyDPF.configurable = 0;
  142|     69|  auto readOnlyRes = JSObject::defineOwnProperty(
  143|     69|      rawObj,
  144|     69|      runtime,
  145|     69|      Predefined::getSymbolID(Predefined::length),
  146|     69|      readOnlyDPF,
  147|     69|      Runtime::getUndefinedValue(),
  148|     69|      PropOpFlags().plusThrowOnError());
  149|     69|  if (LLVM_UNLIKELY(readOnlyRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  150|      0|    return ExecutionStatus::EXCEPTION;
  151|      0|  }
  152|     69|  if (LLVM_UNLIKELY(!*readOnlyRes)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  153|      0|    return runtime.raiseTypeError(
  154|      0|        "Failed to set 'length' property on the raw object read-only.");
  155|      0|  }
  156|     69|  JSObject::preventExtensions(rawObj.get());
  157|       |
  158|       |  // Set raw object as a read-only non-enumerable property of the template
  159|       |  // object.
  160|     69|  PropertyFlags constantPF{};
  161|     69|  constantPF.writable = 0;
  162|     69|  constantPF.configurable = 0;
  163|     69|  constantPF.enumerable = 0;
  164|     69|  auto putNewRes = JSObject::defineNewOwnProperty(
  165|     69|      templateObj,
  166|     69|      runtime,
  167|     69|      Predefined::getSymbolID(Predefined::raw),
  168|     69|      constantPF,
  169|     69|      rawObj);
  170|     69|  if (LLVM_UNLIKELY(putNewRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  171|      0|    return ExecutionStatus::EXCEPTION;
  172|      0|  }
  173|       |  // Make 'length' property on the template object read-only.
  174|     69|  readOnlyRes = JSObject::defineOwnProperty(
  175|     69|      templateObj,
  176|     69|      runtime,
  177|     69|      Predefined::getSymbolID(Predefined::length),
  178|     69|      readOnlyDPF,
  179|     69|      Runtime::getUndefinedValue(),
  180|     69|      PropOpFlags().plusThrowOnError());
  181|     69|  if (LLVM_UNLIKELY(readOnlyRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  182|      0|    return ExecutionStatus::EXCEPTION;
  183|      0|  }
  184|     69|  if (LLVM_UNLIKELY(!*readOnlyRes)) {
  ------------------
  |  |  189|     69|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 69]
  |  |  ------------------
  ------------------
  185|      0|    return runtime.raiseTypeError(
  186|      0|        "Failed to set 'length' property on the raw object read-only.");
  187|      0|  }
  188|     69|  JSObject::preventExtensions(templateObj.get());
  189|       |
  190|       |  // Cache the template object.
  191|     69|  runtimeModule->cacheTemplateObject(templateObjID, templateObj);
  192|       |
  193|     69|  return templateObj.getHermesValue();
  194|     69|}
_ZN6hermes2vm20createHermesBuiltinsERNS0_7RuntimeEN4llvh15MutableArrayRefIPNS0_8CallableEEE:
  822|     99|    llvh::MutableArrayRef<Callable *> builtins) {
  823|     99|  auto defineInternMethod = [&](BuiltinMethod::Enum builtinIndex,
  824|     99|                                Predefined::Str symID,
  825|     99|                                NativeFunctionPtr func,
  826|     99|                                uint8_t count = 0) {
  827|     99|    auto method = NativeFunction::create(
  828|     99|        runtime,
  829|     99|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  830|     99|        nullptr /* context */,
  831|     99|        func,
  832|     99|        Predefined::getSymbolID(symID),
  833|     99|        count,
  834|     99|        Runtime::makeNullHandle<JSObject>());
  835|       |
  836|     99|    assert(builtins[builtinIndex] == nullptr && "builtin already defined");
  837|     99|    builtins[builtinIndex] = *method;
  838|     99|  };
  839|       |
  840|       |  // HermesBuiltin function properties
  841|     99|  namespace P = Predefined;
  842|     99|  namespace B = BuiltinMethod;
  843|     99|  defineInternMethod(
  844|     99|      B::HermesBuiltin_silentSetPrototypeOf,
  845|     99|      P::silentSetPrototypeOf,
  846|     99|      silentObjectSetPrototypeOf,
  847|     99|      2);
  848|     99|  defineInternMethod(
  849|     99|      B::HermesBuiltin_getTemplateObject,
  850|     99|      P::getTemplateObject,
  851|     99|      hermesBuiltinGetTemplateObject);
  852|     99|  defineInternMethod(
  853|     99|      B::HermesBuiltin_ensureObject,
  854|     99|      P::ensureObject,
  855|     99|      hermesBuiltinEnsureObject,
  856|     99|      2);
  857|     99|  defineInternMethod(
  858|     99|      B::HermesBuiltin_getMethod, P::getMethod, hermesBuiltinGetMethod, 2);
  859|     99|  defineInternMethod(
  860|     99|      B::HermesBuiltin_throwTypeError,
  861|     99|      P::throwTypeError,
  862|     99|      hermesBuiltinThrowTypeError,
  863|     99|      1);
  864|     99|  defineInternMethod(
  865|     99|      B::HermesBuiltin_generatorSetDelegated,
  866|     99|      P::generatorSetDelegated,
  867|     99|      hermesBuiltinGeneratorSetDelegated,
  868|     99|      1);
  869|     99|  defineInternMethod(
  870|     99|      B::HermesBuiltin_copyDataProperties,
  871|     99|      P::copyDataProperties,
  872|     99|      hermesBuiltinCopyDataProperties,
  873|     99|      3);
  874|     99|  defineInternMethod(
  875|     99|      B::HermesBuiltin_copyRestArgs,
  876|     99|      P::copyRestArgs,
  877|     99|      hermesBuiltinCopyRestArgs,
  878|     99|      1);
  879|     99|  defineInternMethod(
  880|     99|      B::HermesBuiltin_arraySpread,
  881|     99|      P::arraySpread,
  882|     99|      hermesBuiltinArraySpread,
  883|     99|      2);
  884|     99|  defineInternMethod(B::HermesBuiltin_apply, P::apply, hermesBuiltinApply, 2);
  885|     99|  defineInternMethod(
  886|     99|      B::HermesBuiltin_exportAll, P::exportAll, hermesBuiltinExportAll);
  887|     99|  defineInternMethod(
  888|     99|      B::HermesBuiltin_exponentiationOperator,
  889|     99|      P::exponentiationOperator,
  890|     99|      hermesBuiltinExponentiate);
  891|     99|  defineInternMethod(
  892|     99|      B::HermesBuiltin_initRegexNamedGroups,
  893|     99|      P::initRegexNamedGroups,
  894|     99|      hermesBuiltinInitRegexNamedGroups);
  895|       |
  896|       |  // Define the 'requireFast' function, which takes a number argument.
  897|     99|  defineInternMethod(
  898|     99|      B::HermesBuiltin_requireFast, P::requireFast, requireFast, 1);
  899|     99|}
HermesBuiltin.cpp:_ZZN6hermes2vm20createHermesBuiltinsERNS0_7RuntimeEN4llvh15MutableArrayRefIPNS0_8CallableEEEENK3$_3clENS_13BuiltinMethod4EnumENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEh:
  826|  1.38k|                                uint8_t count = 0) {
  827|  1.38k|    auto method = NativeFunction::create(
  828|  1.38k|        runtime,
  829|  1.38k|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  830|  1.38k|        nullptr /* context */,
  831|  1.38k|        func,
  832|  1.38k|        Predefined::getSymbolID(symID),
  833|  1.38k|        count,
  834|  1.38k|        Runtime::makeNullHandle<JSObject>());
  835|       |
  836|  1.38k|    assert(builtins[builtinIndex] == nullptr && "builtin already defined");
  837|      0|    builtins[builtinIndex] = *method;
  838|  1.38k|  };

_ZN6hermes2vm24hermesInternalHasPromiseEPvRNS0_7RuntimeENS0_10NativeArgsE:
  508|    198|hermesInternalHasPromise(void *, Runtime &runtime, NativeArgs args) {
  509|    198|  return HermesValue::encodeBoolValue(runtime.hasES6Promise());
  510|    198|}
_ZN6hermes2vm28hermesInternalUseEngineQueueEPvRNS0_7RuntimeENS0_10NativeArgsE:
  513|     99|hermesInternalUseEngineQueue(void *, Runtime &runtime, NativeArgs args) {
  514|     99|  return HermesValue::encodeBoolValue(runtime.hasMicrotaskQueue());
  515|     99|}
_ZN6hermes2vm45hermesInternalSetPromiseRejectionTrackingHookEPvRNS0_7RuntimeENS0_10NativeArgsE:
  708|     99|    NativeArgs args) {
  709|     99|  runtime.promiseRejectionTrackingHook_ = args.getArg(0);
  710|     99|  return HermesValue::encodeUndefinedValue();
  711|     99|}
_ZN6hermes2vm26createHermesInternalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsE:
  830|     99|    const JSLibFlags &flags) {
  831|     99|  namespace P = Predefined;
  832|     99|  Handle<JSObject> intern = runtime.makeHandle(JSObject::create(runtime));
  833|     99|  GCScope gcScope{runtime};
  834|       |
  835|     99|  DefinePropertyFlags constantDPF =
  836|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags();
  837|     99|  constantDPF.enumerable = 0;
  838|     99|  constantDPF.writable = 0;
  839|     99|  constantDPF.configurable = 0;
  840|       |
  841|     99|  auto defineInternMethod =
  842|     99|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count = 0) {
  843|     99|        (void)defineMethod(
  844|     99|            runtime,
  845|     99|            intern,
  846|     99|            Predefined::getSymbolID(symID),
  847|     99|            nullptr /* context */,
  848|     99|            func,
  849|     99|            count,
  850|     99|            constantDPF);
  851|     99|      };
  852|       |
  853|     99|  auto defineInternMethodAndSymbol =
  854|     99|      [&](const char *name, NativeFunctionPtr func, uint8_t count = 0) {
  855|     99|        ASCIIRef ref = createASCIIRef(name);
  856|     99|        Handle<SymbolID> symHandle = runtime.ignoreAllocationFailure(
  857|     99|            runtime.getIdentifierTable().getSymbolHandle(runtime, ref));
  858|     99|        (void)defineMethod(
  859|     99|            runtime,
  860|     99|            intern,
  861|     99|            *symHandle,
  862|     99|            nullptr /* context */,
  863|     99|            func,
  864|     99|            count,
  865|     99|            constantDPF);
  866|     99|      };
  867|       |
  868|       |  // suppress unused-variable warning
  869|     99|  (void)defineInternMethodAndSymbol;
  870|       |
  871|       |  // Make a copy of the original String.prototype.concat implementation that we
  872|       |  // can use internally.
  873|       |  // TODO: we can't make HermesInternal.concat a static builtin method now
  874|       |  // because this method should be called with a meaningful `this`, but
  875|       |  // CallBuiltin instruction does not support it.
  876|     99|  auto propRes = JSObject::getNamed_RJS(
  877|     99|      runtime.makeHandle<JSObject>(runtime.stringPrototype),
  878|     99|      runtime,
  879|     99|      Predefined::getSymbolID(Predefined::concat));
  880|     99|  assert(
  881|     99|      propRes != ExecutionStatus::EXCEPTION && !(*propRes)->isUndefined() &&
  882|     99|      "Failed to get String.prototype.concat.");
  883|      0|  auto putRes = JSObject::defineOwnProperty(
  884|     99|      intern,
  885|     99|      runtime,
  886|     99|      Predefined::getSymbolID(Predefined::concat),
  887|     99|      constantDPF,
  888|     99|      runtime.makeHandle(std::move(*propRes)));
  889|     99|  assert(
  890|     99|      putRes != ExecutionStatus::EXCEPTION && *putRes &&
  891|     99|      "Failed to set HermesInternal.concat.");
  892|      0|  (void)putRes;
  893|       |
  894|       |  // HermesInternal functions that are known to be safe and are required to be
  895|       |  // present by the VM internals even under a security-sensitive environment
  896|       |  // where HermesInternal might be explicitly disabled.
  897|     99|  defineInternMethod(P::hasPromise, hermesInternalHasPromise);
  898|     99|  defineInternMethod(P::enqueueJob, hermesInternalEnqueueJob);
  899|     99|  defineInternMethod(
  900|     99|      P::setPromiseRejectionTrackingHook,
  901|     99|      hermesInternalSetPromiseRejectionTrackingHook);
  902|     99|  defineInternMethod(
  903|     99|      P::enablePromiseRejectionTracker,
  904|     99|      hermesInternalEnablePromiseRejectionTracker);
  905|     99|  defineInternMethod(P::useEngineQueue, hermesInternalUseEngineQueue);
  906|       |
  907|       |#ifdef HERMES_ENABLE_FUZZILLI
  908|       |  defineInternMethod(P::fuzzilli, hermesInternalFuzzilli);
  909|       |#endif
  910|       |
  911|       |  // All functions are known to be safe can be defined above this flag check.
  912|     99|  if (!flags.enableHermesInternal) {
  ------------------
  |  Branch (912:7): [True: 0, False: 99]
  ------------------
  913|      0|    JSObject::preventExtensions(*intern);
  914|      0|    return intern;
  915|      0|  }
  916|       |
  917|       |  // HermesInternal functions that are not necessarily required but are
  918|       |  // generally considered harmless to be exposed by default.
  919|     99|  defineInternMethod(P::getEpilogues, hermesInternalGetEpilogues);
  920|     99|  defineInternMethod(
  921|     99|      P::getInstrumentedStats, hermesInternalGetInstrumentedStats);
  922|     99|  defineInternMethod(
  923|     99|      P::getRuntimeProperties, hermesInternalGetRuntimeProperties);
  924|     99|  defineInternMethod(P::ttiReached, hermesInternalTTIReached);
  925|     99|  defineInternMethod(P::ttrcReached, hermesInternalTTRCReached);
  926|     99|  defineInternMethod(P::getFunctionLocation, hermesInternalGetFunctionLocation);
  927|       |
  928|       |  // HermesInternal function that are only meant to be used for testing purpose.
  929|       |  // They can change language semantics and are security risks.
  930|     99|  if (flags.enableHermesInternalTestMethods) {
  ------------------
  |  Branch (930:7): [True: 0, False: 99]
  ------------------
  931|      0|    defineInternMethod(
  932|      0|        P::detachArrayBuffer, hermesInternalDetachArrayBuffer, 1);
  933|      0|    defineInternMethod(P::getWeakSize, hermesInternalGetWeakSize);
  934|      0|    defineInternMethod(
  935|      0|        P::copyDataProperties, hermesBuiltinCopyDataProperties, 3);
  936|      0|    defineInternMethodAndSymbol("isProxy", hermesInternalIsProxy);
  937|      0|    defineInternMethodAndSymbol("isLazy", hermesInternalIsLazy);
  938|      0|    defineInternMethod(P::drainJobs, hermesInternalDrainJobs);
  939|      0|  }
  940|       |
  941|       |#ifdef HERMESVM_EXCEPTION_ON_OOM
  942|       |  defineInternMethodAndSymbol("getCallStack", hermesInternalGetCallStack, 0);
  943|       |#endif // HERMESVM_EXCEPTION_ON_OOM
  944|       |
  945|     99|  JSObject::preventExtensions(*intern);
  946|       |
  947|     99|  return intern;
  948|     99|}
HermesInternal.cpp:_ZZN6hermes2vm26createHermesInternalObjectERNS0_7RuntimeERKNS0_10JSLibFlagsEENK3$_4clENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEh:
  842|  1.08k|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count = 0) {
  843|  1.08k|        (void)defineMethod(
  844|  1.08k|            runtime,
  845|  1.08k|            intern,
  846|  1.08k|            Predefined::getSymbolID(symID),
  847|  1.08k|            nullptr /* context */,
  848|  1.08k|            func,
  849|  1.08k|            count,
  850|  1.08k|            constantDPF);
  851|  1.08k|      };

_ZN6hermes2vm25populateIteratorPrototypeERNS0_7RuntimeE:
   19|     99|void populateIteratorPrototype(Runtime &runtime) {
   20|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.iteratorPrototype);
   21|       |
   22|     99|  auto iteratorFunc = NativeFunction::create(
   23|     99|      runtime,
   24|     99|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
   25|     99|      nullptr,
   26|     99|      iteratorPrototypeIterator,
   27|     99|      Predefined::getSymbolID(Predefined::squareSymbolIterator),
   28|     99|      0,
   29|     99|      Runtime::makeNullHandle<JSObject>());
   30|       |
   31|     99|  defineProperty(
   32|     99|      runtime,
   33|     99|      proto,
   34|     99|      Predefined::getSymbolID(Predefined::SymbolIterator),
   35|     99|      runtime.makeHandle<NativeFunction>(*iteratorFunc));
   36|     99|}

_ZN6hermes2vm23defineSystemConstructorERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEENS0_6HandleINS0_8JSObjectEEESF_jPFNS4_INS0_12PseudoHandleISE_EELS7_6EEES2_SF_S9_ENS0_8CellKindE:
   34|  3.76k|    CellKind targetKind) {
   35|  3.76k|  auto constructor = runtime.makeHandle(NativeConstructor::create(
   36|  3.76k|      runtime,
   37|  3.76k|      constructorProtoObjectHandle,
   38|  3.76k|      nullptr,
   39|  3.76k|      nativeFunctionPtr,
   40|  3.76k|      paramCount,
   41|  3.76k|      creator,
   42|  3.76k|      targetKind));
   43|       |
   44|  3.76k|  auto st = Callable::defineNameLengthAndPrototype(
   45|  3.76k|      constructor,
   46|  3.76k|      runtime,
   47|  3.76k|      name,
   48|  3.76k|      paramCount,
   49|  3.76k|      prototypeObjectHandle,
   50|  3.76k|      Callable::WritablePrototype::No,
   51|  3.76k|      false);
   52|  3.76k|  (void)st;
   53|  3.76k|  assert(
   54|  3.76k|      st != ExecutionStatus::EXCEPTION && "defineLengthAndPrototype() failed");
   55|       |
   56|       |  // Define the global.
   57|      0|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   58|       |
   59|  3.76k|  auto res = JSObject::defineOwnProperty(
   60|  3.76k|      runtime.getGlobal(), runtime, name, dpf, constructor);
   61|  3.76k|  assert(
   62|  3.76k|      res != ExecutionStatus::EXCEPTION && *res &&
   63|  3.76k|      "defineOwnProperty() failed");
   64|      0|  (void)res;
   65|       |
   66|  3.76k|  return constructor;
   67|  3.76k|}
_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDES6_PvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEjNS0_19DefinePropertyFlagsE:
   77|  35.0k|    DefinePropertyFlags dpf) {
   78|  35.0k|  GCScope gcScope{runtime};
   79|       |
   80|  35.0k|  auto method = NativeFunction::create(
   81|  35.0k|      runtime,
   82|  35.0k|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
   83|  35.0k|      context,
   84|  35.0k|      nativeFunctionPtr,
   85|  35.0k|      methodName,
   86|  35.0k|      paramCount,
   87|  35.0k|      Runtime::makeNullHandle<JSObject>());
   88|       |
   89|  35.0k|  auto res = JSObject::defineOwnProperty(
   90|  35.0k|      objectHandle, runtime, propertyName, dpf, method);
   91|  35.0k|  (void)res;
   92|  35.0k|  assert(
   93|  35.0k|      res != ExecutionStatus::EXCEPTION && *res &&
   94|  35.0k|      "defineOwnProperty() failed");
   95|       |
   96|      0|  return method.getHermesValue();
   97|  35.0k|}
_ZN6hermes2vm23defineSystemConstructorERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEENS0_6HandleINS0_8JSObjectEEEjPFNS4_INS0_12PseudoHandleISE_EELS7_6EEES2_SF_S9_ENS0_8CellKindE:
  106|  1.78k|    CellKind targetKind) {
  107|  1.78k|  return defineSystemConstructor(
  108|  1.78k|      runtime,
  109|  1.78k|      name,
  110|  1.78k|      nativeFunctionPtr,
  111|  1.78k|      prototypeObjectHandle,
  112|  1.78k|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
  113|  1.78k|      paramCount,
  114|  1.78k|      creator,
  115|  1.78k|      targetKind);
  116|  1.78k|}
_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEj:
  124|  32.8k|    unsigned paramCount) {
  125|  32.8k|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  126|  32.8k|  (void)defineMethod(
  127|  32.8k|      runtime, objectHandle, name, context, nativeFunctionPtr, paramCount, dpf);
  128|  32.8k|}
_ZN6hermes2vm14defineAccessorERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDES6_PvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEESF_bb:
  139|  4.15k|    bool configurable) {
  140|  4.15k|  assert(
  141|  4.15k|      (getterFunc || setterFunc) &&
  142|  4.15k|      "at least a getter or a setter must be specified");
  143|      0|  ExecutionStatus status{};
  144|  4.15k|  (void)status;
  145|       |
  146|  4.15k|  GCScope gcScope{runtime};
  147|       |
  148|  4.15k|  StringView nameView =
  149|  4.15k|      runtime.getIdentifierTable().getStringView(runtime, methodName);
  150|  4.15k|  assert(nameView.isASCII() && "Only ASCII accessors are supported");
  151|       |
  152|      0|  MutableHandle<NativeFunction> getter{runtime};
  153|  4.15k|  if (getterFunc) {
  ------------------
  |  Branch (153:7): [True: 4.15k, False: 0]
  ------------------
  154|       |    // Set the name by prepending "get ".
  155|  4.15k|    llvh::SmallString<32> getterName{"get "};
  156|  4.15k|    llvh::raw_svector_ostream os{getterName};
  157|  4.15k|    os << nameView;
  158|       |
  159|  4.15k|    auto strRes = runtime.ignoreAllocationFailure(
  160|  4.15k|        StringPrimitive::create(runtime, getterName));
  161|  4.15k|    SymbolID getterFuncName =
  162|  4.15k|        runtime
  163|  4.15k|            .ignoreAllocationFailure(
  164|  4.15k|                runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
  165|  4.15k|                    runtime,
  166|  4.15k|                    createPseudoHandle(vmcast<StringPrimitive>(strRes))))
  167|  4.15k|            .get();
  168|       |
  169|  4.15k|    auto funcRes = NativeFunction::create(
  170|  4.15k|        runtime,
  171|  4.15k|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  172|  4.15k|        context,
  173|  4.15k|        getterFunc,
  174|  4.15k|        getterFuncName,
  175|  4.15k|        0,
  176|  4.15k|        Runtime::makeNullHandle<JSObject>());
  177|  4.15k|    getter = funcRes.get();
  178|  4.15k|  }
  179|       |
  180|  4.15k|  MutableHandle<NativeFunction> setter{runtime};
  181|  4.15k|  if (setterFunc) {
  ------------------
  |  Branch (181:7): [True: 99, False: 4.05k]
  ------------------
  182|       |    // Set the name by prepending "set ".
  183|     99|    llvh::SmallString<32> setterName{"set "};
  184|     99|    llvh::raw_svector_ostream os{setterName};
  185|     99|    os << nameView;
  186|       |
  187|     99|    auto strRes = runtime.ignoreAllocationFailure(
  188|     99|        StringPrimitive::create(runtime, setterName));
  189|     99|    SymbolID setterFuncName =
  190|     99|        runtime
  191|     99|            .ignoreAllocationFailure(
  192|     99|                runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
  193|     99|                    runtime,
  194|     99|                    createPseudoHandle(vmcast<StringPrimitive>(strRes))))
  195|     99|            .get();
  196|       |
  197|     99|    auto funcRes = NativeFunction::create(
  198|     99|        runtime,
  199|     99|        Handle<JSObject>::vmcast(&runtime.functionPrototype),
  200|     99|        context,
  201|     99|        setterFunc,
  202|     99|        setterFuncName,
  203|     99|        1,
  204|     99|        Runtime::makeNullHandle<JSObject>());
  205|     99|    setter = funcRes.get();
  206|     99|  }
  207|       |
  208|  4.15k|  auto crtRes = PropertyAccessor::create(runtime, getter, setter);
  209|  4.15k|  assert(crtRes != ExecutionStatus::EXCEPTION && "unable to define accessor");
  210|      0|  auto accessor = runtime.makeHandle<PropertyAccessor>(*crtRes);
  211|       |
  212|  4.15k|  DefinePropertyFlags dpf{};
  213|  4.15k|  dpf.setEnumerable = 1;
  214|  4.15k|  dpf.setConfigurable = 1;
  215|  4.15k|  dpf.setGetter = 1;
  216|  4.15k|  dpf.setSetter = 1;
  217|  4.15k|  dpf.enumerable = enumerable;
  218|  4.15k|  dpf.configurable = configurable;
  219|       |
  220|  4.15k|  auto res = JSObject::defineOwnProperty(
  221|  4.15k|      objectHandle, runtime, propertyName, dpf, accessor);
  222|  4.15k|  (void)res;
  223|  4.15k|  assert(
  224|  4.15k|      res != ExecutionStatus::EXCEPTION && *res &&
  225|  4.15k|      "defineOwnProperty() failed");
  226|  4.15k|}
_ZN6hermes2vm14definePropertyERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDENS3_INS0_11HermesValueEEENS0_19DefinePropertyFlagsE:
  233|  8.21k|    DefinePropertyFlags dpf) {
  234|  8.21k|  auto res = JSObject::defineOwnProperty(
  235|  8.21k|      objectHandle, runtime, name, dpf, value, PropOpFlags());
  236|  8.21k|  (void)res;
  237|  8.21k|  assert(
  238|  8.21k|      res != ExecutionStatus::EXCEPTION && *res &&
  239|  8.21k|      "defineOwnProperty() failed");
  240|  8.21k|}
_ZN6hermes2vm14definePropertyERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDENS3_INS0_11HermesValueEEE:
  246|  2.67k|    Handle<> value) {
  247|  2.67k|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  248|       |
  249|  2.67k|  return defineProperty(runtime, objectHandle, name, value, dpf);
  250|  2.67k|}

_ZN6hermes2vm12defineMethodERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEEjNS0_19DefinePropertyFlagsE:
  121|  34.1k|    DefinePropertyFlags dpf) {
  122|  34.1k|  return defineMethod(
  123|  34.1k|      runtime,
  124|  34.1k|      objectHandle,
  125|  34.1k|      name,
  126|  34.1k|      name,
  127|  34.1k|      context,
  128|  34.1k|      nativeFunctionPtr,
  129|  34.1k|      paramCount,
  130|  34.1k|      dpf);
  131|  34.1k|}
_ZN6hermes2vm14defineAccessorERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEPvPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEES7_S2_NS0_10NativeArgsEESF_bb:
  179|  4.05k|    bool configurable) {
  180|  4.05k|  defineAccessor(
  181|  4.05k|      runtime,
  182|  4.05k|      objectHandle,
  183|  4.05k|      name,
  184|  4.05k|      name,
  185|  4.05k|      context,
  186|  4.05k|      getterFunc,
  187|  4.05k|      setterFunc,
  188|  4.05k|      enumerable,
  189|  4.05k|      configurable);
  190|  4.05k|}
_ZN6hermes2vm12setLastIndexENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeENS0_13HermesValue32E:
  350|   404k|setLastIndex(Handle<JSObject> regexp, Runtime &runtime, SmallHermesValue shv) {
  351|   404k|  return runtime.putNamedThrowOnError(
  352|   404k|      regexp, PropCacheID::RegExpLastIndex, shv);
  353|   404k|}
_ZN6hermes2vm12setLastIndexENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeEd:
  357|   404k|setLastIndex(Handle<JSObject> regexp, Runtime &runtime, double value) {
  358|   404k|  auto shv = SmallHermesValue::encodeNumberValue(value, runtime);
  359|   404k|  return setLastIndex(regexp, runtime, shv);
  360|   404k|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSArrayEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSArrayBufferEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSBigIntEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_10JSDataViewEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSErrorEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSMapImplILNS0_8CellKindE48EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSObjectEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_IS2_EEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_7JSProxyEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSMapImplILNS0_8CellKindE47EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSStringEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_10JSFunctionEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSNumberEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_9JSBooleanEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSRegExpEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_8JSSymbolEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_6JSDateEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS7_NS0_10NativeArgsEENS3_INS0_8JSObjectEEEjNS0_8CellKindE:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSWeakMapImplILNS0_8CellKindE51EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}
_ZN6hermes2vm23defineSystemConstructorINS0_13JSWeakMapImplILNS0_8CellKindE52EEEEENS0_6HandleINS0_17NativeConstructorEEERNS0_7RuntimeENS0_8SymbolIDEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS9_NS0_10NativeArgsEENS5_INS0_8JSObjectEEEjS3_:
   70|     99|    CellKind targetKind) {
   71|     99|  return defineSystemConstructor(
   72|     99|      runtime,
   73|     99|      name,
   74|     99|      nativeFunctionPtr,
   75|     99|      prototypeObjectHandle,
   76|     99|      paramCount,
   77|     99|      NativeConstructor::creatorFunction<NativeClass>,
   78|     99|      targetKind);
   79|     99|}

_ZN6hermes2vm16createJSONObjectERNS0_7RuntimeE:
   20|     99|Handle<JSObject> createJSONObject(Runtime &runtime) {
   21|     99|  auto objRes = JSJSON::create(
   22|     99|      runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype));
   23|     99|  assert(
   24|     99|      objRes != ExecutionStatus::EXCEPTION && "unable to define JSON object");
   25|      0|  auto json = runtime.makeHandle<JSJSON>(*objRes);
   26|       |
   27|     99|  defineMethod(
   28|     99|      runtime,
   29|     99|      json,
   30|     99|      Predefined::getSymbolID(Predefined::parse),
   31|     99|      nullptr,
   32|     99|      jsonParse,
   33|     99|      2);
   34|     99|  defineMethod(
   35|     99|      runtime,
   36|     99|      json,
   37|     99|      Predefined::getSymbolID(Predefined::stringify),
   38|     99|      nullptr,
   39|     99|      jsonStringify,
   40|     99|      3);
   41|       |
   42|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   43|     99|  dpf.writable = 0;
   44|     99|  dpf.enumerable = 0;
   45|     99|  defineProperty(
   46|     99|      runtime,
   47|     99|      json,
   48|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   49|     99|      runtime.getPredefinedStringHandle(Predefined::JSON),
   50|     99|      dpf);
   51|       |
   52|     99|  return json;
   53|     99|}

_ZN6hermes2vm20createMapConstructorERNS0_7RuntimeE:
   20|     99|Handle<JSObject> createMapConstructor(Runtime &runtime) {
   21|     99|  auto mapPrototype = Handle<JSObject>::vmcast(&runtime.mapPrototype);
   22|       |
   23|       |  // Map.prototype.xxx methods.
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      mapPrototype,
   27|     99|      Predefined::getSymbolID(Predefined::clear),
   28|     99|      nullptr,
   29|     99|      mapPrototypeClear,
   30|     99|      0);
   31|       |
   32|     99|  defineMethod(
   33|     99|      runtime,
   34|     99|      mapPrototype,
   35|     99|      Predefined::getSymbolID(Predefined::deleteStr),
   36|     99|      nullptr,
   37|     99|      mapPrototypeDelete,
   38|     99|      1);
   39|       |
   40|     99|  defineMethod(
   41|     99|      runtime,
   42|     99|      mapPrototype,
   43|     99|      Predefined::getSymbolID(Predefined::entries),
   44|     99|      nullptr,
   45|     99|      mapPrototypeEntries,
   46|     99|      0);
   47|       |
   48|     99|  defineMethod(
   49|     99|      runtime,
   50|     99|      mapPrototype,
   51|     99|      Predefined::getSymbolID(Predefined::forEach),
   52|     99|      nullptr,
   53|     99|      mapPrototypeForEach,
   54|     99|      1);
   55|       |
   56|     99|  defineMethod(
   57|     99|      runtime,
   58|     99|      mapPrototype,
   59|     99|      Predefined::getSymbolID(Predefined::get),
   60|     99|      nullptr,
   61|     99|      mapPrototypeGet,
   62|     99|      1);
   63|       |
   64|     99|  defineMethod(
   65|     99|      runtime,
   66|     99|      mapPrototype,
   67|     99|      Predefined::getSymbolID(Predefined::has),
   68|     99|      nullptr,
   69|     99|      mapPrototypeHas,
   70|     99|      1);
   71|       |
   72|     99|  defineMethod(
   73|     99|      runtime,
   74|     99|      mapPrototype,
   75|     99|      Predefined::getSymbolID(Predefined::keys),
   76|     99|      nullptr,
   77|     99|      mapPrototypeKeys,
   78|     99|      0);
   79|       |
   80|     99|  defineMethod(
   81|     99|      runtime,
   82|     99|      mapPrototype,
   83|     99|      Predefined::getSymbolID(Predefined::set),
   84|     99|      nullptr,
   85|     99|      mapPrototypeSet,
   86|     99|      2);
   87|       |
   88|     99|  defineAccessor(
   89|     99|      runtime,
   90|     99|      mapPrototype,
   91|     99|      Predefined::getSymbolID(Predefined::size),
   92|     99|      nullptr,
   93|     99|      mapPrototypeSizeGetter,
   94|     99|      nullptr,
   95|     99|      false,
   96|     99|      true);
   97|       |
   98|     99|  defineMethod(
   99|     99|      runtime,
  100|     99|      mapPrototype,
  101|     99|      Predefined::getSymbolID(Predefined::values),
  102|     99|      nullptr,
  103|     99|      mapPrototypeValues,
  104|     99|      0);
  105|       |
  106|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  107|       |
  108|     99|  PseudoHandle<> propValue =
  109|     99|      runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
  110|     99|          mapPrototype, runtime, Predefined::getSymbolID(Predefined::entries)));
  111|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  112|     99|      mapPrototype,
  113|     99|      runtime,
  114|     99|      Predefined::getSymbolID(Predefined::SymbolIterator),
  115|     99|      dpf,
  116|     99|      runtime.makeHandle<NativeFunction>(propValue.get())));
  117|       |
  118|     99|  dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  119|     99|  dpf.writable = 0;
  120|     99|  dpf.enumerable = 0;
  121|     99|  defineProperty(
  122|     99|      runtime,
  123|     99|      mapPrototype,
  124|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  125|     99|      runtime.getPredefinedStringHandle(Predefined::Map),
  126|     99|      dpf);
  127|       |
  128|     99|  auto cons = defineSystemConstructor<JSMap>(
  129|     99|      runtime,
  130|     99|      Predefined::getSymbolID(Predefined::Map),
  131|     99|      mapConstructor,
  132|     99|      mapPrototype,
  133|     99|      0,
  134|     99|      CellKind::JSMapKind);
  135|       |
  136|     99|  return cons;
  137|     99|}
_ZN6hermes2vm26createMapIteratorPrototypeERNS0_7RuntimeE:
  310|     99|Handle<JSObject> createMapIteratorPrototype(Runtime &runtime) {
  311|     99|  auto parentHandle = runtime.makeHandle(JSObject::create(
  312|     99|      runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype)));
  313|     99|  defineMethod(
  314|     99|      runtime,
  315|     99|      parentHandle,
  316|     99|      Predefined::getSymbolID(Predefined::next),
  317|     99|      nullptr,
  318|     99|      mapIteratorPrototypeNext,
  319|     99|      0);
  320|       |
  321|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  322|     99|  dpf.writable = 0;
  323|     99|  dpf.enumerable = 0;
  324|     99|  defineProperty(
  325|     99|      runtime,
  326|     99|      parentHandle,
  327|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  328|     99|      runtime.getPredefinedStringHandle(Predefined::MapIterator),
  329|     99|      dpf);
  330|       |
  331|     99|  return parentHandle;
  332|     99|}

_ZN6hermes2vm16createMathObjectERNS0_7RuntimeE:
  364|     99|Handle<JSObject> createMathObject(Runtime &runtime) {
  365|     99|  auto objRes = JSMath::create(
  366|     99|      runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype));
  367|     99|  assert(objRes != ExecutionStatus::EXCEPTION && "unable to define Math");
  368|      0|  auto math = runtime.makeHandle<JSMath>(*objRes);
  369|       |
  370|     99|  DefinePropertyFlags constantDPF =
  371|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags();
  372|     99|  constantDPF.enumerable = 0;
  373|     99|  constantDPF.writable = 0;
  374|     99|  constantDPF.configurable = 0;
  375|       |
  376|     99|  MutableHandle<> numberHandle{runtime};
  377|       |
  378|       |  // ES5.1 15.8.1, Math value properties
  379|     99|  auto setMathValueProperty = [&](SymbolID name, double value) {
  380|     99|    numberHandle = HermesValue::encodeNumberValue(value);
  381|     99|    auto result = JSObject::defineOwnProperty(
  382|     99|        math, runtime, name, constantDPF, numberHandle);
  383|     99|    assert(
  384|     99|        result != ExecutionStatus::EXCEPTION &&
  385|     99|        "defineOwnProperty() failed on a new object");
  386|     99|    (void)result;
  387|     99|  };
  388|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::E), M_E);
  389|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::LN10), M_LN10);
  390|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::LN2), M_LN2);
  391|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::LOG2E), M_LOG2E);
  392|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::LOG10E), M_LOG10E);
  393|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::PI), M_PI);
  394|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::SQRT1_2), M_SQRT1_2);
  395|     99|  setMathValueProperty(Predefined::getSymbolID(Predefined::SQRT2), M_SQRT2);
  396|       |
  397|       |  // ES5.1 15.8.2, Math function properties
  398|     99|  auto setMathFunctionProperty1Arg = [&runtime, math](
  399|     99|                                         SymbolID name, MathKind kind) {
  400|     99|    defineMethod(runtime, math, name, (void *)kind, runContextFunc1Arg, 1);
  401|     99|  };
  402|       |
  403|     99|  auto setMathFunctionProperty2Arg = [&runtime, math](
  404|     99|                                         SymbolID name, MathKind kind) {
  405|     99|    defineMethod(runtime, math, name, (void *)kind, runContextFunc2Arg, 2);
  406|     99|  };
  407|       |
  408|       |  // We use the C versions of some of these functions from <math.h>
  409|       |  // because on Android, the C++ <cmath> library doesn't have them.
  410|     99|  setMathFunctionProperty1Arg(
  411|     99|      Predefined::getSymbolID(Predefined::abs), MathKind::abs);
  412|     99|  setMathFunctionProperty1Arg(
  413|     99|      Predefined::getSymbolID(Predefined::acos), MathKind::acos);
  414|     99|  setMathFunctionProperty1Arg(
  415|     99|      Predefined::getSymbolID(Predefined::acosh), MathKind::acosh);
  416|     99|  setMathFunctionProperty1Arg(
  417|     99|      Predefined::getSymbolID(Predefined::asin), MathKind::asin);
  418|     99|  setMathFunctionProperty1Arg(
  419|     99|      Predefined::getSymbolID(Predefined::asinh), MathKind::asinh);
  420|     99|  setMathFunctionProperty1Arg(
  421|     99|      Predefined::getSymbolID(Predefined::atan), MathKind::atan);
  422|     99|  setMathFunctionProperty1Arg(
  423|     99|      Predefined::getSymbolID(Predefined::atanh), MathKind::atanh);
  424|     99|  setMathFunctionProperty2Arg(
  425|     99|      Predefined::getSymbolID(Predefined::atan2), MathKind::atan2);
  426|     99|  setMathFunctionProperty1Arg(
  427|     99|      Predefined::getSymbolID(Predefined::cbrt), MathKind::cbrt);
  428|     99|  setMathFunctionProperty1Arg(
  429|     99|      Predefined::getSymbolID(Predefined::ceil), MathKind::ceil);
  430|     99|  defineMethod(
  431|     99|      runtime,
  432|     99|      math,
  433|     99|      Predefined::getSymbolID(Predefined::clz32),
  434|     99|      nullptr,
  435|     99|      mathClz32,
  436|     99|      1);
  437|     99|  setMathFunctionProperty1Arg(
  438|     99|      Predefined::getSymbolID(Predefined::cos), MathKind::cos);
  439|     99|  setMathFunctionProperty1Arg(
  440|     99|      Predefined::getSymbolID(Predefined::cosh), MathKind::cosh);
  441|     99|  setMathFunctionProperty1Arg(
  442|     99|      Predefined::getSymbolID(Predefined::exp), MathKind::exp);
  443|     99|  setMathFunctionProperty1Arg(
  444|     99|      Predefined::getSymbolID(Predefined::expm1), MathKind::expm1);
  445|     99|  setMathFunctionProperty1Arg(
  446|     99|      Predefined::getSymbolID(Predefined::floor), MathKind::floor);
  447|     99|  defineMethod(
  448|     99|      runtime,
  449|     99|      math,
  450|     99|      Predefined::getSymbolID(Predefined::fround),
  451|     99|      nullptr,
  452|     99|      mathFround,
  453|     99|      1);
  454|     99|  defineMethod(
  455|     99|      runtime,
  456|     99|      math,
  457|     99|      Predefined::getSymbolID(Predefined::hypot),
  458|     99|      nullptr,
  459|     99|      mathHypot,
  460|     99|      2);
  461|     99|  setMathFunctionProperty1Arg(
  462|     99|      Predefined::getSymbolID(Predefined::log), MathKind::log);
  463|     99|  setMathFunctionProperty1Arg(
  464|     99|      Predefined::getSymbolID(Predefined::log10), MathKind::log10);
  465|     99|  setMathFunctionProperty1Arg(
  466|     99|      Predefined::getSymbolID(Predefined::log1p), MathKind::log1p);
  467|     99|  setMathFunctionProperty1Arg(
  468|     99|      Predefined::getSymbolID(Predefined::log2), MathKind::log2);
  469|     99|  setMathFunctionProperty1Arg(
  470|     99|      Predefined::getSymbolID(Predefined::trunc), MathKind::trunc);
  471|     99|  defineMethod(
  472|     99|      runtime,
  473|     99|      math,
  474|     99|      Predefined::getSymbolID(Predefined::max),
  475|     99|      nullptr,
  476|     99|      mathMax,
  477|     99|      2);
  478|     99|  defineMethod(
  479|     99|      runtime,
  480|     99|      math,
  481|     99|      Predefined::getSymbolID(Predefined::min),
  482|     99|      nullptr,
  483|     99|      mathMin,
  484|     99|      2);
  485|     99|  defineMethod(
  486|     99|      runtime,
  487|     99|      math,
  488|     99|      Predefined::getSymbolID(Predefined::imul),
  489|     99|      nullptr,
  490|     99|      mathImul,
  491|     99|      2);
  492|     99|  defineMethod(
  493|     99|      runtime,
  494|     99|      math,
  495|     99|      Predefined::getSymbolID(Predefined::pow),
  496|     99|      nullptr,
  497|     99|      mathPow,
  498|     99|      2);
  499|     99|  defineMethod(
  500|     99|      runtime,
  501|     99|      math,
  502|     99|      Predefined::getSymbolID(Predefined::random),
  503|     99|      nullptr,
  504|     99|      mathRandom,
  505|     99|      0);
  506|     99|  setMathFunctionProperty1Arg(
  507|     99|      Predefined::getSymbolID(Predefined::round), MathKind::round);
  508|     99|  defineMethod(
  509|     99|      runtime,
  510|     99|      math,
  511|     99|      Predefined::getSymbolID(Predefined::sign),
  512|     99|      nullptr,
  513|     99|      mathSign,
  514|     99|      1);
  515|     99|  setMathFunctionProperty1Arg(
  516|     99|      Predefined::getSymbolID(Predefined::sin), MathKind::sin);
  517|     99|  setMathFunctionProperty1Arg(
  518|     99|      Predefined::getSymbolID(Predefined::sinh), MathKind::sinh);
  519|     99|  setMathFunctionProperty1Arg(
  520|     99|      Predefined::getSymbolID(Predefined::sqrt), MathKind::sqrt);
  521|     99|  setMathFunctionProperty1Arg(
  522|     99|      Predefined::getSymbolID(Predefined::tan), MathKind::tan);
  523|     99|  setMathFunctionProperty1Arg(
  524|     99|      Predefined::getSymbolID(Predefined::tanh), MathKind::tanh);
  525|       |
  526|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  527|     99|  dpf.writable = 0;
  528|     99|  dpf.enumerable = 0;
  529|     99|  defineProperty(
  530|     99|      runtime,
  531|     99|      math,
  532|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  533|     99|      runtime.getPredefinedStringHandle(Predefined::Math),
  534|     99|      dpf);
  535|       |
  536|     99|  return math;
  537|     99|}
Math.cpp:_ZZN6hermes2vm16createMathObjectERNS0_7RuntimeEENK3$_0clENS0_8SymbolIDEd:
  379|    792|  auto setMathValueProperty = [&](SymbolID name, double value) {
  380|    792|    numberHandle = HermesValue::encodeNumberValue(value);
  381|    792|    auto result = JSObject::defineOwnProperty(
  382|    792|        math, runtime, name, constantDPF, numberHandle);
  383|    792|    assert(
  384|    792|        result != ExecutionStatus::EXCEPTION &&
  385|    792|        "defineOwnProperty() failed on a new object");
  386|      0|    (void)result;
  387|    792|  };
Math.cpp:_ZZN6hermes2vm16createMathObjectERNS0_7RuntimeEENK3$_1clENS0_8SymbolIDENS0_8MathKindE:
  399|  2.47k|                                         SymbolID name, MathKind kind) {
  400|  2.47k|    defineMethod(runtime, math, name, (void *)kind, runContextFunc1Arg, 1);
  401|  2.47k|  };
Math.cpp:_ZZN6hermes2vm16createMathObjectERNS0_7RuntimeEENK3$_2clENS0_8SymbolIDENS0_8MathKindE:
  404|     99|                                         SymbolID name, MathKind kind) {
  405|     99|    defineMethod(runtime, math, name, (void *)kind, runContextFunc2Arg, 2);
  406|     99|  };

_ZN6hermes2vm23createNumberConstructorERNS0_7RuntimeE:
   32|     99|Handle<JSObject> createNumberConstructor(Runtime &runtime) {
   33|     99|  auto numberPrototype = Handle<JSNumber>::vmcast(&runtime.numberPrototype);
   34|       |
   35|     99|  auto cons = defineSystemConstructor<JSNumber>(
   36|     99|      runtime,
   37|     99|      Predefined::getSymbolID(Predefined::Number),
   38|     99|      numberConstructor,
   39|     99|      numberPrototype,
   40|     99|      1,
   41|     99|      CellKind::JSNumberKind);
   42|       |
   43|     99|  defineMethod(
   44|     99|      runtime,
   45|     99|      numberPrototype,
   46|     99|      Predefined::getSymbolID(Predefined::valueOf),
   47|     99|      nullptr,
   48|     99|      numberPrototypeValueOf,
   49|     99|      0);
   50|     99|  defineMethod(
   51|     99|      runtime,
   52|     99|      numberPrototype,
   53|     99|      Predefined::getSymbolID(Predefined::toString),
   54|     99|      nullptr,
   55|     99|      numberPrototypeToString,
   56|     99|      1);
   57|     99|  defineMethod(
   58|     99|      runtime,
   59|     99|      numberPrototype,
   60|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
   61|     99|      nullptr,
   62|     99|      numberPrototypeToLocaleString,
   63|     99|      0);
   64|     99|  defineMethod(
   65|     99|      runtime,
   66|     99|      numberPrototype,
   67|     99|      Predefined::getSymbolID(Predefined::toFixed),
   68|     99|      nullptr,
   69|     99|      numberPrototypeToFixed,
   70|     99|      1);
   71|     99|  defineMethod(
   72|     99|      runtime,
   73|     99|      numberPrototype,
   74|     99|      Predefined::getSymbolID(Predefined::toExponential),
   75|     99|      nullptr,
   76|     99|      numberPrototypeToExponential,
   77|     99|      1);
   78|     99|  defineMethod(
   79|     99|      runtime,
   80|     99|      numberPrototype,
   81|     99|      Predefined::getSymbolID(Predefined::toPrecision),
   82|     99|      nullptr,
   83|     99|      numberPrototypeToPrecision,
   84|     99|      1);
   85|       |
   86|     99|  DefinePropertyFlags constantDPF =
   87|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags();
   88|     99|  constantDPF.enumerable = 0;
   89|     99|  constantDPF.writable = 0;
   90|     99|  constantDPF.configurable = 0;
   91|       |
   92|     99|  MutableHandle<> numberValueHandle{runtime};
   93|     99|  auto setNumberValueProperty = [&](SymbolID name, double value) {
   94|     99|    numberValueHandle = HermesValue::encodeDoubleValue(value);
   95|     99|    auto result = JSObject::defineOwnProperty(
   96|     99|        cons, runtime, name, constantDPF, numberValueHandle);
   97|     99|    assert(
   98|     99|        result != ExecutionStatus::EXCEPTION &&
   99|     99|        "defineOwnProperty() failed on a new object");
  100|     99|    (void)result;
  101|     99|  };
  102|       |
  103|     99|  setNumberValueProperty(
  104|     99|      Predefined::getSymbolID(Predefined::MAX_VALUE),
  105|     99|      std::numeric_limits<double>::max());
  106|     99|  setNumberValueProperty(
  107|     99|      Predefined::getSymbolID(Predefined::MIN_VALUE),
  108|     99|      std::numeric_limits<double>::denorm_min());
  109|     99|  setNumberValueProperty(
  110|     99|      Predefined::getSymbolID(Predefined::NaN),
  111|     99|      std::numeric_limits<double>::quiet_NaN());
  112|     99|  setNumberValueProperty(
  113|     99|      Predefined::getSymbolID(Predefined::NEGATIVE_INFINITY),
  114|     99|      -std::numeric_limits<double>::infinity());
  115|     99|  setNumberValueProperty(
  116|     99|      Predefined::getSymbolID(Predefined::POSITIVE_INFINITY),
  117|     99|      std::numeric_limits<double>::infinity());
  118|       |  // ES6.0 20.1.2.1
  119|     99|  setNumberValueProperty(
  120|     99|      Predefined::getSymbolID(Predefined::EPSILON),
  121|     99|      std::numeric_limits<double>::epsilon());
  122|       |  // ES6.0 20.1.2.6
  123|     99|  constexpr double kMaxSafeInteger = 9007199254740991;
  124|     99|  setNumberValueProperty(
  125|     99|      Predefined::getSymbolID(Predefined::MAX_SAFE_INTEGER), kMaxSafeInteger);
  126|       |  // ES6.0 20.1.2.8
  127|     99|  setNumberValueProperty(
  128|     99|      Predefined::getSymbolID(Predefined::MIN_SAFE_INTEGER), -kMaxSafeInteger);
  129|       |
  130|     99|  defineMethod(
  131|     99|      runtime,
  132|     99|      cons,
  133|     99|      Predefined::getSymbolID(Predefined::isFinite),
  134|     99|      nullptr,
  135|     99|      numberIsFinite,
  136|     99|      1);
  137|     99|  defineMethod(
  138|     99|      runtime,
  139|     99|      cons,
  140|     99|      Predefined::getSymbolID(Predefined::isInteger),
  141|     99|      nullptr,
  142|     99|      numberIsInteger,
  143|     99|      1);
  144|     99|  defineMethod(
  145|     99|      runtime,
  146|     99|      cons,
  147|     99|      Predefined::getSymbolID(Predefined::isNaN),
  148|     99|      nullptr,
  149|     99|      numberIsNaN,
  150|     99|      1);
  151|     99|  defineMethod(
  152|     99|      runtime,
  153|     99|      cons,
  154|     99|      Predefined::getSymbolID(Predefined::isSafeInteger),
  155|     99|      nullptr,
  156|     99|      numberIsSafeInteger,
  157|     99|      1);
  158|     99|  defineProperty(
  159|     99|      runtime,
  160|     99|      cons,
  161|     99|      Predefined::getSymbolID(Predefined::parseInt),
  162|     99|      Handle<>(&runtime.parseIntFunction));
  163|     99|  defineProperty(
  164|     99|      runtime,
  165|     99|      cons,
  166|     99|      Predefined::getSymbolID(Predefined::parseFloat),
  167|     99|      Handle<>(&runtime.parseFloatFunction));
  168|     99|  return cons;
  169|     99|}
Number.cpp:_ZZN6hermes2vm23createNumberConstructorERNS0_7RuntimeEENK3$_0clENS0_8SymbolIDEd:
   93|    792|  auto setNumberValueProperty = [&](SymbolID name, double value) {
   94|    792|    numberValueHandle = HermesValue::encodeDoubleValue(value);
   95|    792|    auto result = JSObject::defineOwnProperty(
   96|    792|        cons, runtime, name, constantDPF, numberValueHandle);
   97|    792|    assert(
   98|    792|        result != ExecutionStatus::EXCEPTION &&
   99|    792|        "defineOwnProperty() failed on a new object");
  100|      0|    (void)result;
  101|    792|  };

_ZN6hermes2vm23createObjectConstructorERNS0_7RuntimeE:
   34|     99|Handle<JSObject> createObjectConstructor(Runtime &runtime) {
   35|     99|  auto objectPrototype = Handle<JSObject>::vmcast(&runtime.objectPrototype);
   36|       |
   37|     99|  auto cons = defineSystemConstructor<JSObject>(
   38|     99|      runtime,
   39|     99|      Predefined::getSymbolID(Predefined::Object),
   40|     99|      objectConstructor,
   41|     99|      Handle<JSObject>::vmcast(&runtime.objectPrototype),
   42|     99|      1,
   43|     99|      CellKind::JSObjectKind);
   44|     99|  void *ctx = nullptr;
   45|       |
   46|       |  // Object.prototype.xxx methods.
   47|     99|  defineMethod(
   48|     99|      runtime,
   49|     99|      objectPrototype,
   50|     99|      Predefined::getSymbolID(Predefined::toString),
   51|     99|      ctx,
   52|     99|      objectPrototypeToString,
   53|     99|      0);
   54|     99|  defineMethod(
   55|     99|      runtime,
   56|     99|      objectPrototype,
   57|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
   58|     99|      ctx,
   59|     99|      objectPrototypeToLocaleString,
   60|     99|      0);
   61|     99|  defineMethod(
   62|     99|      runtime,
   63|     99|      objectPrototype,
   64|     99|      Predefined::getSymbolID(Predefined::valueOf),
   65|     99|      ctx,
   66|     99|      objectPrototypeValueOf,
   67|     99|      0);
   68|     99|  defineMethod(
   69|     99|      runtime,
   70|     99|      objectPrototype,
   71|     99|      Predefined::getSymbolID(Predefined::hasOwnProperty),
   72|     99|      ctx,
   73|     99|      objectPrototypeHasOwnProperty,
   74|     99|      1);
   75|     99|  defineMethod(
   76|     99|      runtime,
   77|     99|      objectPrototype,
   78|     99|      Predefined::getSymbolID(Predefined::isPrototypeOf),
   79|     99|      ctx,
   80|     99|      objectPrototypeIsPrototypeOf,
   81|     99|      1);
   82|     99|  defineMethod(
   83|     99|      runtime,
   84|     99|      objectPrototype,
   85|     99|      Predefined::getSymbolID(Predefined::propertyIsEnumerable),
   86|     99|      ctx,
   87|     99|      objectPrototypePropertyIsEnumerable,
   88|     99|      1);
   89|     99|  defineAccessor(
   90|     99|      runtime,
   91|     99|      objectPrototype,
   92|     99|      Predefined::getSymbolID(Predefined::underscore_proto),
   93|     99|      ctx,
   94|     99|      objectPrototypeProto_getter,
   95|     99|      objectPrototypeProto_setter,
   96|     99|      false,
   97|     99|      true);
   98|     99|  defineMethod(
   99|     99|      runtime,
  100|     99|      objectPrototype,
  101|     99|      Predefined::getSymbolID(Predefined::__defineGetter__),
  102|     99|      ctx,
  103|     99|      objectPrototypeDefineGetter,
  104|     99|      2);
  105|     99|  defineMethod(
  106|     99|      runtime,
  107|     99|      objectPrototype,
  108|     99|      Predefined::getSymbolID(Predefined::__defineSetter__),
  109|     99|      ctx,
  110|     99|      objectPrototypeDefineSetter,
  111|     99|      2);
  112|     99|  defineMethod(
  113|     99|      runtime,
  114|     99|      objectPrototype,
  115|     99|      Predefined::getSymbolID(Predefined::__lookupGetter__),
  116|     99|      ctx,
  117|     99|      objectPrototypeLookupGetter,
  118|     99|      1);
  119|     99|  defineMethod(
  120|     99|      runtime,
  121|     99|      objectPrototype,
  122|     99|      Predefined::getSymbolID(Predefined::__lookupSetter__),
  123|     99|      ctx,
  124|     99|      objectPrototypeLookupSetter,
  125|     99|      1);
  126|       |
  127|       |  // Object.xxx() methods.
  128|     99|  defineMethod(
  129|     99|      runtime,
  130|     99|      cons,
  131|     99|      Predefined::getSymbolID(Predefined::getPrototypeOf),
  132|     99|      ctx,
  133|     99|      objectGetPrototypeOf,
  134|     99|      1);
  135|     99|  defineMethod(
  136|     99|      runtime,
  137|     99|      cons,
  138|     99|      Predefined::getSymbolID(Predefined::getOwnPropertyDescriptor),
  139|     99|      ctx,
  140|     99|      objectGetOwnPropertyDescriptor,
  141|     99|      2);
  142|     99|  defineMethod(
  143|     99|      runtime,
  144|     99|      cons,
  145|     99|      Predefined::getSymbolID(Predefined::getOwnPropertyDescriptors),
  146|     99|      ctx,
  147|     99|      objectGetOwnPropertyDescriptors,
  148|     99|      1);
  149|     99|  defineMethod(
  150|     99|      runtime,
  151|     99|      cons,
  152|     99|      Predefined::getSymbolID(Predefined::getOwnPropertyNames),
  153|     99|      ctx,
  154|     99|      objectGetOwnPropertyNames,
  155|     99|      1);
  156|     99|  defineMethod(
  157|     99|      runtime,
  158|     99|      cons,
  159|     99|      Predefined::getSymbolID(Predefined::getOwnPropertySymbols),
  160|     99|      ctx,
  161|     99|      objectGetOwnPropertySymbols,
  162|     99|      1);
  163|     99|  defineMethod(
  164|     99|      runtime,
  165|     99|      cons,
  166|     99|      Predefined::getSymbolID(Predefined::hasOwn),
  167|     99|      ctx,
  168|     99|      objectHasOwn,
  169|     99|      2);
  170|     99|  defineMethod(
  171|     99|      runtime,
  172|     99|      cons,
  173|     99|      Predefined::getSymbolID(Predefined::seal),
  174|     99|      ctx,
  175|     99|      objectSeal,
  176|     99|      1);
  177|     99|  defineMethod(
  178|     99|      runtime,
  179|     99|      cons,
  180|     99|      Predefined::getSymbolID(Predefined::freeze),
  181|     99|      ctx,
  182|     99|      objectFreeze,
  183|     99|      1);
  184|     99|  defineMethod(
  185|     99|      runtime,
  186|     99|      cons,
  187|     99|      Predefined::getSymbolID(Predefined::fromEntries),
  188|     99|      ctx,
  189|     99|      objectFromEntries,
  190|     99|      1);
  191|     99|  defineMethod(
  192|     99|      runtime,
  193|     99|      cons,
  194|     99|      Predefined::getSymbolID(Predefined::preventExtensions),
  195|     99|      ctx,
  196|     99|      objectPreventExtensions,
  197|     99|      1);
  198|       |
  199|     99|  defineMethod(
  200|     99|      runtime, cons, Predefined::getSymbolID(Predefined::is), ctx, objectIs, 2);
  201|     99|  defineMethod(
  202|     99|      runtime,
  203|     99|      cons,
  204|     99|      Predefined::getSymbolID(Predefined::isSealed),
  205|     99|      ctx,
  206|     99|      objectIsSealed,
  207|     99|      1);
  208|     99|  defineMethod(
  209|     99|      runtime,
  210|     99|      cons,
  211|     99|      Predefined::getSymbolID(Predefined::isFrozen),
  212|     99|      ctx,
  213|     99|      objectIsFrozen,
  214|     99|      1);
  215|     99|  defineMethod(
  216|     99|      runtime,
  217|     99|      cons,
  218|     99|      Predefined::getSymbolID(Predefined::isExtensible),
  219|     99|      ctx,
  220|     99|      objectIsExtensible,
  221|     99|      1);
  222|     99|  defineMethod(
  223|     99|      runtime,
  224|     99|      cons,
  225|     99|      Predefined::getSymbolID(Predefined::keys),
  226|     99|      ctx,
  227|     99|      objectKeys,
  228|     99|      1);
  229|     99|  defineMethod(
  230|     99|      runtime,
  231|     99|      cons,
  232|     99|      Predefined::getSymbolID(Predefined::values),
  233|     99|      ctx,
  234|     99|      objectValues,
  235|     99|      1);
  236|     99|  defineMethod(
  237|     99|      runtime,
  238|     99|      cons,
  239|     99|      Predefined::getSymbolID(Predefined::entries),
  240|     99|      ctx,
  241|     99|      objectEntries,
  242|     99|      1);
  243|     99|  defineMethod(
  244|     99|      runtime,
  245|     99|      cons,
  246|     99|      Predefined::getSymbolID(Predefined::create),
  247|     99|      ctx,
  248|     99|      objectCreate,
  249|     99|      2);
  250|     99|  defineMethod(
  251|     99|      runtime,
  252|     99|      cons,
  253|     99|      Predefined::getSymbolID(Predefined::defineProperty),
  254|     99|      ctx,
  255|     99|      objectDefineProperty,
  256|     99|      3);
  257|     99|  defineMethod(
  258|     99|      runtime,
  259|     99|      cons,
  260|     99|      Predefined::getSymbolID(Predefined::defineProperties),
  261|     99|      ctx,
  262|     99|      objectDefineProperties,
  263|     99|      2);
  264|     99|  defineMethod(
  265|     99|      runtime,
  266|     99|      cons,
  267|     99|      Predefined::getSymbolID(Predefined::assign),
  268|     99|      ctx,
  269|     99|      objectAssign,
  270|     99|      2);
  271|     99|  defineMethod(
  272|     99|      runtime,
  273|     99|      cons,
  274|     99|      Predefined::getSymbolID(Predefined::setPrototypeOf),
  275|     99|      ctx,
  276|     99|      objectSetPrototypeOf,
  277|     99|      2);
  278|       |
  279|     99|  return cons;
  280|     99|}
_ZN6hermes2vm22objectPrototypeValueOfEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1263|    242|objectPrototypeValueOf(void *, Runtime &runtime, NativeArgs args) {
 1264|    242|  auto res = toObject(runtime, args.getThisHandle());
 1265|    242|  if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    242|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 242]
  |  |  ------------------
  ------------------
 1266|      0|    return ExecutionStatus::EXCEPTION;
 1267|      0|  }
 1268|    242|  return res;
 1269|    242|}

_ZN6hermes2vm22createProxyConstructorERNS0_7RuntimeE:
  173|     99|Handle<JSObject> createProxyConstructor(Runtime &runtime) {
  174|     99|  Handle<NativeConstructor> cons = defineSystemConstructor<JSProxy>(
  175|     99|      runtime,
  176|     99|      Predefined::getSymbolID(Predefined::Proxy),
  177|     99|      proxyConstructor,
  178|     99|      runtime.makeNullHandle<JSObject>(),
  179|     99|      2,
  180|     99|      CellKind::JSProxyKind);
  181|       |
  182|     99|  defineMethod(
  183|     99|      runtime,
  184|     99|      cons,
  185|     99|      Predefined::getSymbolID(Predefined::revocable),
  186|     99|      nullptr,
  187|     99|      proxyRevocable,
  188|     99|      2);
  189|       |
  190|     99|  return cons;
  191|     99|}

_ZN6hermes2vm19createReflectObjectERNS0_7RuntimeE:
  254|     99|Handle<JSObject> createReflectObject(Runtime &runtime) {
  255|     99|  Handle<JSObject> reflect = runtime.makeHandle(JSObject::create(runtime));
  256|       |
  257|     99|  auto defineReflectMethod =
  258|     99|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count) {
  259|     99|        (void)defineMethod(
  260|     99|            runtime,
  261|     99|            reflect,
  262|     99|            Predefined::getSymbolID(symID),
  263|     99|            nullptr /* context */,
  264|     99|            func,
  265|     99|            count);
  266|     99|      };
  267|       |
  268|     99|  defineReflectMethod(Predefined::apply, reflectApply, 3);
  269|     99|  defineReflectMethod(Predefined::construct, reflectConstruct, 2);
  270|     99|  defineReflectMethod(Predefined::defineProperty, reflectDefineProperty, 3);
  271|     99|  defineReflectMethod(Predefined::deleteProperty, reflectDeleteProperty, 2);
  272|     99|  defineReflectMethod(Predefined::get, reflectGet, 2);
  273|     99|  defineReflectMethod(
  274|     99|      Predefined::getOwnPropertyDescriptor, reflectGetOwnPropertyDescriptor, 2);
  275|     99|  defineReflectMethod(Predefined::getPrototypeOf, reflectGetPrototypeOf, 1);
  276|     99|  defineReflectMethod(Predefined::has, reflectHas, 2);
  277|     99|  defineReflectMethod(Predefined::isExtensible, reflectIsExtensible, 1);
  278|     99|  defineReflectMethod(Predefined::ownKeys, reflectOwnKeys, 1);
  279|     99|  defineReflectMethod(
  280|     99|      Predefined::preventExtensions, reflectPreventExtensions, 1);
  281|     99|  defineReflectMethod(Predefined::set, reflectSet, 3);
  282|     99|  defineReflectMethod(Predefined::setPrototypeOf, reflectSetPrototypeOf, 2);
  283|       |
  284|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  285|     99|  dpf.writable = 0;
  286|     99|  dpf.enumerable = 0;
  287|     99|  dpf.configurable = 1;
  288|     99|  defineProperty(
  289|     99|      runtime,
  290|     99|      reflect,
  291|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  292|     99|      runtime.getPredefinedStringHandle(Predefined::Reflect),
  293|     99|      dpf);
  294|       |
  295|     99|  return reflect;
  296|     99|}
Reflect.cpp:_ZZN6hermes2vm19createReflectObjectERNS0_7RuntimeEENK3$_0clENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEh:
  258|  1.28k|      [&](Predefined::Str symID, NativeFunctionPtr func, uint8_t count) {
  259|  1.28k|        (void)defineMethod(
  260|  1.28k|            runtime,
  261|  1.28k|            reflect,
  262|  1.28k|            Predefined::getSymbolID(symID),
  263|  1.28k|            nullptr /* context */,
  264|  1.28k|            func,
  265|  1.28k|            count);
  266|  1.28k|      };

_ZN6hermes2vm23createRegExpConstructorERNS0_7RuntimeE:
   59|     99|Handle<JSObject> createRegExpConstructor(Runtime &runtime) {
   60|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.regExpPrototype);
   61|       |
   62|     99|  auto cons = defineSystemConstructor<JSRegExp>(
   63|     99|      runtime,
   64|     99|      Predefined::getSymbolID(Predefined::RegExp),
   65|     99|      regExpConstructor,
   66|     99|      proto,
   67|     99|      2,
   68|     99|      CellKind::JSRegExpKind);
   69|       |
   70|     99|  defineMethod(
   71|     99|      runtime,
   72|     99|      proto,
   73|     99|      Predefined::getSymbolID(Predefined::exec),
   74|     99|      nullptr,
   75|     99|      regExpPrototypeExec,
   76|     99|      1);
   77|       |
   78|     99|  defineMethod(
   79|     99|      runtime,
   80|     99|      proto,
   81|     99|      Predefined::getSymbolID(Predefined::test),
   82|     99|      nullptr,
   83|     99|      regExpPrototypeTest,
   84|     99|      1);
   85|       |
   86|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   87|       |
   88|     99|  (void)defineMethod(
   89|     99|      runtime,
   90|     99|      proto,
   91|     99|      Predefined::getSymbolID(Predefined::SymbolMatchAll),
   92|     99|      Predefined::getSymbolID(Predefined::squareSymbolMatchAll),
   93|     99|      nullptr,
   94|     99|      regExpPrototypeSymbolMatchAll,
   95|     99|      1,
   96|     99|      dpf);
   97|       |
   98|       |  // The RegExp prototype and constructors have a variety of getters defined on
   99|       |  // it; use this helper to define them. Note the context is passed as an
  100|       |  // intptr_t which we convert to void*.
  101|     99|  auto defineGetter = [&](Handle<JSObject> obj,
  102|     99|                          Predefined::Str sym,
  103|     99|                          NativeFunctionPtr getter,
  104|     99|                          intptr_t ctx = 0) {
  105|     99|    defineAccessor(
  106|     99|        runtime,
  107|     99|        obj,
  108|     99|        Predefined::getSymbolID(sym),
  109|     99|        ctx ? reinterpret_cast<void *>(ctx) : nullptr,
  110|     99|        getter,
  111|     99|        nullptr,
  112|     99|        false,
  113|     99|        true);
  114|     99|  };
  115|       |
  116|     99|  defineGetter(proto, Predefined::source, regExpSourceGetter);
  117|     99|  defineGetter(proto, Predefined::multiline, regExpFlagPropertyGetter, 'm');
  118|     99|  defineGetter(proto, Predefined::ignoreCase, regExpFlagPropertyGetter, 'i');
  119|     99|  defineGetter(proto, Predefined::global, regExpFlagPropertyGetter, 'g');
  120|     99|  defineGetter(proto, Predefined::unicode, regExpFlagPropertyGetter, 'u');
  121|     99|  defineGetter(proto, Predefined::sticky, regExpFlagPropertyGetter, 'y');
  122|     99|  defineGetter(proto, Predefined::dotAll, regExpFlagPropertyGetter, 's');
  123|       |
  124|     99|  defineGetter(cons, Predefined::dollar1, regExpDollarNumberGetter, 1);
  125|     99|  defineGetter(cons, Predefined::dollar2, regExpDollarNumberGetter, 2);
  126|     99|  defineGetter(cons, Predefined::dollar3, regExpDollarNumberGetter, 3);
  127|     99|  defineGetter(cons, Predefined::dollar4, regExpDollarNumberGetter, 4);
  128|     99|  defineGetter(cons, Predefined::dollar5, regExpDollarNumberGetter, 5);
  129|     99|  defineGetter(cons, Predefined::dollar6, regExpDollarNumberGetter, 6);
  130|     99|  defineGetter(cons, Predefined::dollar7, regExpDollarNumberGetter, 7);
  131|     99|  defineGetter(cons, Predefined::dollar8, regExpDollarNumberGetter, 8);
  132|     99|  defineGetter(cons, Predefined::dollar9, regExpDollarNumberGetter, 9);
  133|     99|  defineGetter(cons, Predefined::leftContext, regExpLeftContextGetter);
  134|     99|  defineGetter(cons, Predefined::dollarBacktick, regExpLeftContextGetter);
  135|     99|  defineGetter(cons, Predefined::rightContext, regExpRightContextGetter);
  136|     99|  defineGetter(cons, Predefined::dollarApostrophe, regExpRightContextGetter);
  137|     99|  defineGetter(cons, Predefined::dollarUnderscore, regExpInputGetter);
  138|     99|  defineGetter(cons, Predefined::input, regExpInputGetter);
  139|     99|  defineGetter(cons, Predefined::dollarAmpersand, regExpLastMatchGetter);
  140|     99|  defineGetter(cons, Predefined::lastMatch, regExpLastMatchGetter);
  141|     99|  defineGetter(cons, Predefined::dollarPlus, regExpLastParenGetter);
  142|     99|  defineGetter(cons, Predefined::lastParen, regExpLastParenGetter);
  143|       |
  144|     99|  defineMethod(
  145|     99|      runtime,
  146|     99|      proto,
  147|     99|      Predefined::getSymbolID(Predefined::toString),
  148|     99|      nullptr,
  149|     99|      regExpPrototypeToString,
  150|     99|      0);
  151|     99|  (void)defineMethod(
  152|     99|      runtime,
  153|     99|      proto,
  154|     99|      Predefined::getSymbolID(Predefined::SymbolMatch),
  155|     99|      Predefined::getSymbolID(Predefined::squareSymbolMatch),
  156|     99|      nullptr,
  157|     99|      regExpPrototypeSymbolMatch,
  158|     99|      1,
  159|     99|      dpf);
  160|     99|  (void)defineMethod(
  161|     99|      runtime,
  162|     99|      proto,
  163|     99|      Predefined::getSymbolID(Predefined::SymbolSearch),
  164|     99|      Predefined::getSymbolID(Predefined::squareSymbolSearch),
  165|     99|      nullptr,
  166|     99|      regExpPrototypeSymbolSearch,
  167|     99|      1,
  168|     99|      dpf);
  169|     99|  (void)defineMethod(
  170|     99|      runtime,
  171|     99|      proto,
  172|     99|      Predefined::getSymbolID(Predefined::SymbolReplace),
  173|     99|      Predefined::getSymbolID(Predefined::squareSymbolReplace),
  174|     99|      nullptr,
  175|     99|      regExpPrototypeSymbolReplace,
  176|     99|      2,
  177|     99|      dpf);
  178|     99|  (void)defineMethod(
  179|     99|      runtime,
  180|     99|      proto,
  181|     99|      Predefined::getSymbolID(Predefined::SymbolSplit),
  182|     99|      Predefined::getSymbolID(Predefined::squareSymbolSplit),
  183|     99|      nullptr,
  184|     99|      regExpPrototypeSymbolSplit,
  185|     99|      2,
  186|     99|      dpf);
  187|       |
  188|     99|  defineGetter(proto, Predefined::flags, regExpFlagsGetter);
  189|       |
  190|     99|  return cons;
  191|     99|}
_ZN6hermes2vm16directRegExpExecENS0_6HandleINS0_8JSRegExpEEERNS0_7RuntimeENS1_INS0_15StringPrimitiveEEE:
  467|   404k|    Handle<StringPrimitive> S) {
  468|   404k|  MutableHandle<JSArray> A{runtime};
  469|   404k|  GCScope gcScope{runtime};
  470|       |
  471|       |  // Let length be the number of code units in S.
  472|   404k|  const uint32_t length = S->getStringLength();
  473|       |
  474|       |  // Let lastIndex be ? ToLength(? Get(R, "lastIndex")).
  475|   404k|  auto propRes = runtime.getNamed(regexp, PropCacheID::RegExpLastIndex);
  476|   404k|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  477|      0|    return ExecutionStatus::EXCEPTION;
  478|      0|  }
  479|   404k|  auto lengthRes =
  480|   404k|      toLengthU64(runtime, runtime.makeHandle(std::move(*propRes)));
  481|   404k|  if (LLVM_UNLIKELY(lengthRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  482|      0|    return ExecutionStatus::EXCEPTION;
  483|      0|  }
  484|   404k|  uint64_t lastIndex = *lengthRes;
  485|       |
  486|       |  // Let flags be R.[[OriginalFlags]]
  487|   404k|  const regex::SyntaxFlags flags = JSRegExp::getSyntaxFlags(regexp.get());
  488|       |
  489|       |  // If flags contains "g", let global be true, else let global be false
  490|       |  // If flags contains "y", let sticky be true, else let sticky be false.
  491|       |  // If flags contains "u", let fullUnicode be true, else let fullUnicode be
  492|       |  // false.
  493|   404k|  const bool global = flags.global;
  494|   404k|  const bool sticky = flags.sticky;
  495|   404k|  const bool fullUnicode = flags.unicode;
  496|       |
  497|       |  // If global is false and sticky is false, set lastIndex to 0.
  498|   404k|  if (!global && !sticky) {
  ------------------
  |  Branch (498:7): [True: 0, False: 404k]
  |  Branch (498:18): [True: 0, False: 0]
  ------------------
  499|      0|    lastIndex = 0;
  500|      0|  }
  501|       |
  502|       |  // The ES6 spec is cast in terms of a loop on "matchSucceeded". This is
  503|       |  // handled internally by JSRegExp::search for efficiency reasons.
  504|       |  // (Note that lastIndex == length is allowed: it may match an empty range at
  505|       |  // the end of the string.)
  506|   404k|  CallResult<RegExpMatch> matchResult = RegExpMatch{};
  507|   404k|  if (lastIndex <= length) {
  ------------------
  |  Branch (507:7): [True: 404k, False: 0]
  ------------------
  508|   404k|    assert(
  509|   404k|        lastIndex <= UINT32_MAX &&
  510|   404k|        "lastIndex should fit in u32 because it is <= a string length");
  511|      0|    uint32_t searchStartOffset = static_cast<uint32_t>(lastIndex);
  512|   404k|    matchResult = JSRegExp::search(regexp, runtime, S, searchStartOffset);
  513|   404k|  }
  514|       |
  515|   404k|  if (LLVM_UNLIKELY(matchResult == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  516|      0|    return ExecutionStatus::EXCEPTION;
  517|   404k|  const RegExpMatch &match = *matchResult;
  518|   404k|  if (match.empty()) {
  ------------------
  |  Branch (518:7): [True: 4, False: 404k]
  ------------------
  519|       |    // No match. The following implements both:
  520|       |    //   If lastIndex > length, then
  521|       |    //     If global is true or sticky is true, then
  522|       |    //         Let setStatus be Set(R, "lastIndex", 0, true);
  523|       |    //         ReturnIfAbrupt(setStatus)
  524|       |    //     return null
  525|       |    // and also:
  526|       |    //   If r is failure, then
  527|       |    //     If sticky is true, then
  528|       |    //       Let setStatus be Set(R, "lastIndex", 0, true);
  529|       |    //       ReturnIfAbrupt(setStatus)
  530|       |    //     Return null
  531|      4|    if (global || sticky) {
  ------------------
  |  Branch (531:9): [True: 4, False: 0]
  |  Branch (531:19): [True: 0, False: 0]
  ------------------
  532|      4|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
  533|      4|              setLastIndex(regexp, runtime, 0) == ExecutionStatus::EXCEPTION)) {
  534|      0|        return ExecutionStatus::EXCEPTION;
  535|      0|      }
  536|      4|    }
  537|      4|    return Runtime::makeNullHandle<JSArray>();
  538|      4|  }
  539|       |
  540|       |  // We have a match!
  541|       |  // "If global is true or sticky is true, Let setStatus be Set(R, "lastIndex",
  542|       |  // e, true)."
  543|       |  // Here 'e' is the end of the total match.
  544|   404k|  assert(!match.empty() && "Match should not be empty");
  545|   404k|  if (global || sticky) {
  ------------------
  |  Branch (545:7): [True: 404k, False: 0]
  |  Branch (545:17): [True: 0, False: 0]
  ------------------
  546|   404k|    auto totalMatch = *match.front();
  547|   404k|    uint32_t e = totalMatch.location + totalMatch.length;
  548|       |
  549|       |    // If fullUnicode is true, then:
  550|       |    // a. e is an index into the Input character list, derived from S, matched
  551|       |    // by matcher. Let eUTF be the smallest index into S that corresponds to the
  552|       |    // character at element e of Input. If e is greater than or equal to the
  553|       |    // number of elements in Input, then eUTF is the number of code units in S.
  554|       |    // b. set e to eUTF.
  555|       |    // This is a longwinded way of saying that we don't set lastIndex to match
  556|       |    // the trailing member of a surrogate pair.
  557|   404k|    if (fullUnicode && e > 0 && e < S->getStringLength()) {
  ------------------
  |  Branch (557:9): [True: 0, False: 404k]
  |  Branch (557:24): [True: 0, False: 0]
  |  Branch (557:33): [True: 0, False: 0]
  ------------------
  558|      0|      if (isHighSurrogate(S->at(e - 1)) && isLowSurrogate(S->at(e))) {
  ------------------
  |  Branch (558:11): [True: 0, False: 0]
  |  Branch (558:44): [True: 0, False: 0]
  ------------------
  559|      0|        e -= 1;
  560|      0|      }
  561|      0|    }
  562|       |
  563|   404k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  564|   404k|            setLastIndex(regexp, runtime, e) == ExecutionStatus::EXCEPTION)) {
  565|      0|      return ExecutionStatus::EXCEPTION;
  566|      0|    }
  567|   404k|  }
  568|       |
  569|   404k|  auto arrRes = JSArray::createAndAllocPropStorage(
  570|   404k|      runtime,
  571|   404k|      Handle<JSObject>::vmcast(&runtime.arrayPrototype),
  572|   404k|      Handle<HiddenClass>::vmcast(&runtime.regExpMatchClass),
  573|   404k|      match.size(),
  574|   404k|      match.size());
  575|   404k|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  576|      0|    return ExecutionStatus::EXCEPTION;
  577|      0|  }
  578|   404k|  A = arrRes->get();
  579|       |
  580|       |  // A already has .index and .groups.
  581|   404k|  NamedPropertyDescriptor indexDesc;
  582|   404k|  bool res = JSObject::getOwnNamedDescriptor(
  583|   404k|      A, runtime, Predefined::getSymbolID(Predefined::index), indexDesc);
  584|   404k|  assert(res && "match object is missing .index property");
  585|      0|  (void)res;
  586|   404k|  auto indexSHV =
  587|   404k|      SmallHermesValue::encodeNumberValue(match.front()->location, runtime);
  588|   404k|  JSObject::setNamedSlotValueUnsafe(*A, runtime, indexDesc, indexSHV);
  589|       |
  590|   404k|  NamedPropertyDescriptor inputDesc;
  591|   404k|  res = JSObject::getOwnNamedDescriptor(
  592|   404k|      A, runtime, Predefined::getSymbolID(Predefined::input), inputDesc);
  593|   404k|  assert(res && "match object is missing .input property");
  594|      0|  (void)res;
  595|   404k|  auto inputSHV = SmallHermesValue::encodeStringValue(*S, runtime);
  596|   404k|  JSObject::setNamedSlotValueUnsafe(*A, runtime, inputDesc, inputSHV);
  597|       |
  598|       |  // Set capture groups (including the initial full match)
  599|   404k|  size_t idx = 0;
  600|   404k|  auto marker = gcScope.createMarker();
  601|   404k|  for (const auto &mg : match) {
  ------------------
  |  Branch (601:23): [True: 404k, False: 404k]
  ------------------
  602|   404k|    gcScope.flushToMarker(marker);
  603|   404k|    if (!mg) {
  ------------------
  |  Branch (603:9): [True: 0, False: 404k]
  ------------------
  604|       |      // Match groups that did not match anything become undefined.
  605|      0|      JSArray::setElementAt(A, runtime, idx, Runtime::getUndefinedValue());
  606|   404k|    } else {
  607|   404k|      assert(
  608|   404k|          mg->location + mg->length >= mg->location &&
  609|   404k|          mg->location + mg->length <= S->getStringLength() &&
  610|   404k|          "Capture group range unexpectedly out of bounds");
  611|      0|      auto strRes =
  612|   404k|          StringPrimitive::slice(runtime, S, mg->location, mg->length);
  613|   404k|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  614|      0|        return ExecutionStatus::EXCEPTION;
  615|      0|      }
  616|   404k|      JSArray::setElementAt(
  617|   404k|          A, runtime, idx, runtime.makeHandle<StringPrimitive>(*strRes));
  618|   404k|    }
  619|   404k|    idx++;
  620|   404k|  }
  621|   404k|  createGroupsObject(runtime, A, regexp->getGroupNameMappings(runtime));
  622|   404k|  return A;
  623|   404k|}
_ZN6hermes2vm10regExpExecERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS3_INS0_15StringPrimitiveEEE:
  658|   404k|regExpExec(Runtime &runtime, Handle<JSObject> R, Handle<StringPrimitive> S) {
  659|       |  // 3. Let exec be Get(R, "exec").
  660|       |  // 4. ReturnIfAbrupt(exec).
  661|   404k|  auto propRes = JSObject::getNamed_RJS(
  662|   404k|      R, runtime, Predefined::getSymbolID(Predefined::exec));
  663|   404k|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  664|      0|    return ExecutionStatus::EXCEPTION;
  665|      0|  }
  666|   404k|  auto exec = runtime.makeHandle(std::move(propRes.getValue()));
  667|       |  // 5. If IsCallable(exec) is true, then
  668|   404k|  if (auto execCallable = Handle<Callable>::dyn_vmcast(exec)) {
  ------------------
  |  Branch (668:12): [True: 404k, False: 0]
  ------------------
  669|       |    // a. Let result be Call(exec, R, «S»).
  670|       |    // b. ReturnIfAbrupt(result).
  671|   404k|    auto callRes =
  672|   404k|        Callable::executeCall1(execCallable, runtime, R, S.getHermesValue());
  673|   404k|    if (callRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (673:9): [True: 0, False: 404k]
  ------------------
  674|      0|      return ExecutionStatus::EXCEPTION;
  675|      0|    }
  676|       |    // c. If Type(result) is neither Object or Null, throw a TypeError
  677|       |    // exception.
  678|   404k|    if (!(*callRes)->isObject() && !(*callRes)->isNull()) {
  ------------------
  |  Branch (678:9): [True: 4, False: 404k]
  |  Branch (678:36): [True: 0, False: 4]
  ------------------
  679|      0|      return runtime.raiseTypeError(
  680|      0|          "The result of exec can only be object or null.");
  681|      0|    }
  682|       |    // d. Return result.
  683|   404k|    return callRes.toCallResultHermesValue();
  684|   404k|  }
  685|       |  // 6. If R does not have a [[RegExpMatcher]] internal slot, throw a TypeError
  686|       |  // exception.
  687|       |  // In our implementation, having a [[RegExpMatcher]] internal slot is
  688|       |  // equivalent to being a JSRegExp class instance.
  689|      0|  auto regExpObj = Handle<JSRegExp>::dyn_vmcast(R);
  690|      0|  if (LLVM_UNLIKELY(!regExpObj)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  691|      0|    return runtime.raiseTypeError(
  692|      0|        "Failed to execute an invalid regular expression object.");
  693|      0|  }
  694|       |  // 7. Return RegExpBuiltinExec(R, S).
  695|      0|  return regExpBuiltinExec(runtime, regExpObj, S);
  696|      0|}
_ZN6hermes2vm19regExpPrototypeExecEPvRNS0_7RuntimeENS0_10NativeArgsE:
  701|   404k|regExpPrototypeExec(void *, Runtime &runtime, NativeArgs args) {
  702|   404k|  Handle<JSRegExp> regexp = args.dyncastThis<JSRegExp>();
  703|   404k|  if (!regexp) {
  ------------------
  |  Branch (703:7): [True: 0, False: 404k]
  ------------------
  704|      0|    return runtime.raiseTypeError(
  705|      0|        "RegExp function called on non-RegExp object");
  706|      0|  }
  707|       |
  708|   404k|  auto strRes = toString_RJS(runtime, args.getArgHandle(0));
  709|   404k|  if (strRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (709:7): [True: 0, False: 404k]
  ------------------
  710|      0|    return ExecutionStatus::EXCEPTION;
  711|      0|  }
  712|   404k|  Handle<StringPrimitive> S = runtime.makeHandle(std::move(*strRes));
  713|   404k|  CallResult<Handle<JSArray>> result = directRegExpExec(regexp, runtime, S);
  714|   404k|  if (LLVM_UNLIKELY(result.getStatus() == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  715|      0|    return ExecutionStatus::EXCEPTION;
  716|      0|  }
  717|       |
  718|       |  // When the match is empty, result is a nullptr handle, which means
  719|       |  // result.getValue().getHermesValue() is not HermesValue::encodeNullValue()
  720|       |  // but HermesValue::encodeObjectValue(nullptr).
  721|   404k|  if (!result.getValue())
  ------------------
  |  Branch (721:7): [True: 4, False: 404k]
  ------------------
  722|      4|    return HermesValue::encodeNullValue();
  723|   404k|  return result.getValue().getHermesValue();
  724|   404k|}
_ZN6hermes2vm18regExpSourceGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
  767|    234|regExpSourceGetter(void *ctx, Runtime &runtime, NativeArgs args) {
  768|       |  // "If Type(R) is not Object, throw a TypeError exception"
  769|    234|  if (!args.dyncastThis<JSObject>()) {
  ------------------
  |  Branch (769:7): [True: 0, False: 234]
  ------------------
  770|      0|    return runtime.raiseTypeError(
  771|      0|        "RegExp.prototype.source getter called on non-RegExp");
  772|      0|  }
  773|       |
  774|    234|  Handle<JSRegExp> R = args.dyncastThis<JSRegExp>();
  775|    234|  if (!R) {
  ------------------
  |  Branch (775:7): [True: 0, False: 234]
  ------------------
  776|       |    // "If SameValue(R, %RegExpPrototype%) is true, return "(?:)". Otherwise,
  777|       |    // throw a TypeError exception.
  778|      0|    if (LLVM_UNLIKELY(thisIsRegExpProto(runtime, args))) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  779|       |      // Note we don't bother to predefine this string because this should
  780|       |      // hardly ever be encountered.
  781|      0|      const char *emptyPattern = "(?:)";
  782|      0|      return StringPrimitive::create(
  783|      0|          runtime, ASCIIRef{emptyPattern, strlen(emptyPattern)});
  784|      0|    }
  785|      0|    return runtime.raiseTypeError(
  786|      0|        "RegExp.prototype.source getter called on non-RegExp");
  787|      0|  }
  788|       |
  789|       |  // "Let src be the value of R’s [[OriginalSource]] internal slot."
  790|       |  // "Let flags be the value of R’s [[OriginalFlags]] internal slot."
  791|       |  // "Return EscapeRegExpPattern(src, flags)."
  792|       |  // Note that ES6 specifies that we provide the flags to EscapeRegExpPattern,
  793|       |  // however this is only to distinguish a Unicode from a non-Unicode regexp.
  794|       |  // Beacuse we do not yet support Unicode regexps we can omit the flags.
  795|    234|  return JSRegExp::escapePattern(
  796|    234|      runtime.makeHandle(JSRegExp::getPattern(R.get(), runtime)), runtime);
  797|    234|}
_ZN6hermes2vm24regExpFlagPropertyGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
  801|  1.41k|regExpFlagPropertyGetter(void *ctx, Runtime &runtime, NativeArgs args) {
  802|       |  // Note in ES8, the standard specifies that the RegExp prototype object is not
  803|       |  // a RegExp but that these accessors check for it as a special case.
  804|       |
  805|       |  // "Let R be the this value."
  806|       |  // "If Type(R) is not Object, throw a TypeError exception."
  807|       |  // "If R does not have an [[OriginalFlags]] internal slot, throw a TypeError
  808|       |  // exception." (Combine these two checks into a dyncast to JSRegExp).
  809|  1.41k|  Handle<JSRegExp> R = args.dyncastThis<JSRegExp>();
  810|  1.41k|  if (!R) {
  ------------------
  |  Branch (810:7): [True: 0, False: 1.41k]
  ------------------
  811|       |    // "If SameValue(R, %RegExpPrototype%) is true, return undefined. Otherwise,
  812|       |    // throw a TypeError exception"
  813|      0|    if (thisIsRegExpProto(runtime, args)) {
  ------------------
  |  Branch (813:9): [True: 0, False: 0]
  ------------------
  814|      0|      return HermesValue::encodeUndefinedValue();
  815|      0|    }
  816|      0|    return runtime.raiseTypeError("RegExp getter called on non-RegExp");
  817|      0|  }
  818|       |
  819|       |  // "Let flags be the value of R’s [[OriginalFlags]] internal slot."
  820|       |  // "If flags contains the code unit "i/m/g", return true."
  821|       |  // "Return false."
  822|  1.41k|  auto syntaxFlags = JSRegExp::getSyntaxFlags(R.get());
  823|  1.41k|  switch ((intptr_t)ctx) {
  824|    234|    case 'i':
  ------------------
  |  Branch (824:5): [True: 234, False: 1.17k]
  ------------------
  825|    234|      return HermesValue::encodeBoolValue(syntaxFlags.ignoreCase);
  826|    234|    case 'm':
  ------------------
  |  Branch (826:5): [True: 234, False: 1.17k]
  ------------------
  827|    234|      return HermesValue::encodeBoolValue(syntaxFlags.multiline);
  828|    238|    case 'g':
  ------------------
  |  Branch (828:5): [True: 238, False: 1.17k]
  ------------------
  829|    238|      return HermesValue::encodeBoolValue(syntaxFlags.global);
  830|    238|    case 'u':
  ------------------
  |  Branch (830:5): [True: 238, False: 1.17k]
  ------------------
  831|    238|      return HermesValue::encodeBoolValue(syntaxFlags.unicode);
  832|    234|    case 'y':
  ------------------
  |  Branch (832:5): [True: 234, False: 1.17k]
  ------------------
  833|    234|      return HermesValue::encodeBoolValue(syntaxFlags.sticky);
  834|    234|    case 's':
  ------------------
  |  Branch (834:5): [True: 234, False: 1.17k]
  ------------------
  835|    234|      return HermesValue::encodeBoolValue(syntaxFlags.dotAll);
  836|      0|    default:
  ------------------
  |  Branch (836:5): [True: 0, False: 1.41k]
  ------------------
  837|      0|      llvm_unreachable("Invalid flag passed to regExpFlagPropertyGetter");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  838|      0|      return HermesValue::encodeEmptyValue();
  839|  1.41k|  }
  840|  1.41k|}
_ZN6hermes2vm23regExpPrototypeToStringEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1189|    234|regExpPrototypeToString(void *, Runtime &runtime, NativeArgs args) {
 1190|    234|  Handle<JSObject> regexp = args.dyncastThis<JSObject>();
 1191|    234|  if (!regexp) {
  ------------------
  |  Branch (1191:7): [True: 0, False: 234]
  ------------------
 1192|      0|    return runtime.raiseTypeError(
 1193|      0|        "RegExp.prototype.toString() called on non-object");
 1194|      0|  }
 1195|       |
 1196|       |  // Let pattern be ToString(Get(R, "source"))
 1197|    234|  auto source = JSObject::getNamed_RJS(
 1198|    234|      regexp, runtime, Predefined::getSymbolID(Predefined::source));
 1199|    234|  if (LLVM_UNLIKELY(source == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    234|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 234]
  |  |  ------------------
  ------------------
 1200|      0|    return ExecutionStatus::EXCEPTION;
 1201|      0|  }
 1202|    234|  auto patternRes =
 1203|    234|      toString_RJS(runtime, runtime.makeHandle(std::move(*source)));
 1204|    234|  if (LLVM_UNLIKELY(patternRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    234|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 234]
  |  |  ------------------
  ------------------
 1205|      0|    return ExecutionStatus::EXCEPTION;
 1206|      0|  }
 1207|    234|  Handle<StringPrimitive> pattern = runtime.makeHandle(std::move(*patternRes));
 1208|       |
 1209|       |  // Let flags be ToString(Get(R, "flags"))
 1210|    234|  auto flagsObj = JSObject::getNamed_RJS(
 1211|    234|      regexp, runtime, Predefined::getSymbolID(Predefined::flags));
 1212|    234|  if (LLVM_UNLIKELY(flagsObj == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    234|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 234]
  |  |  ------------------
  ------------------
 1213|      0|    return ExecutionStatus::EXCEPTION;
 1214|      0|  }
 1215|    234|  auto flagsRes =
 1216|    234|      toString_RJS(runtime, runtime.makeHandle(std::move(*flagsObj)));
 1217|    234|  if (LLVM_UNLIKELY(flagsRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    234|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 234]
  |  |  ------------------
  ------------------
 1218|      0|    return ExecutionStatus::EXCEPTION;
 1219|      0|  }
 1220|    234|  Handle<StringPrimitive> flags = runtime.makeHandle(std::move(*flagsRes));
 1221|       |
 1222|       |  // 'Let result be the String value formed by concatenating "/", pattern, and
 1223|       |  // "/", and flags.' We expect 2 slashes plus at most 5 flags.
 1224|    234|  SmallU16String<32> result;
 1225|    234|  result.reserve(pattern->getStringLength() + 2 + 5);
 1226|       |
 1227|    234|  result.push_back(u'/');
 1228|    234|  pattern->appendUTF16String(result);
 1229|    234|  result.push_back(u'/');
 1230|    234|  flags->appendUTF16String(result);
 1231|    234|  return StringPrimitive::create(runtime, result);
 1232|    234|}
_ZN6hermes2vm26regExpPrototypeSymbolMatchEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1237|      4|regExpPrototypeSymbolMatch(void *, Runtime &runtime, NativeArgs args) {
 1238|      4|  GCScope gcScope{runtime};
 1239|       |
 1240|       |  // 1. Let rx be the this value.
 1241|      4|  Handle<JSObject> rx = args.dyncastThis<JSObject>();
 1242|       |
 1243|       |  // 2. If Type(rx) is not Object, throw a TypeError exception.
 1244|      4|  if (LLVM_UNLIKELY(!rx)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1245|      0|    return runtime.raiseTypeError(
 1246|      0|        "RegExp.prototype[@@match] should be called on a js object");
 1247|      0|  }
 1248|       |  // 3. Let S be ToString(string)
 1249|       |  // 4. ReturnIfAbrupt(S).
 1250|      4|  auto strRes = toString_RJS(runtime, args.getArgHandle(0));
 1251|      4|  if (strRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1251:7): [True: 0, False: 4]
  ------------------
 1252|      0|    return ExecutionStatus::EXCEPTION;
 1253|      0|  }
 1254|      4|  auto S = runtime.makeHandle(std::move(*strRes));
 1255|       |  // 5. Let global be ToBoolean(Get(rx, "global")).
 1256|       |  // 6. ReturnIfAbrupt(global).
 1257|      4|  auto propRes = JSObject::getNamed_RJS(
 1258|      4|      rx, runtime, Predefined::getSymbolID(Predefined::global));
 1259|      4|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1260|      0|    return ExecutionStatus::EXCEPTION;
 1261|      0|  }
 1262|      4|  auto global = toBoolean(propRes->get());
 1263|       |  // 7. If global is false, then
 1264|       |  //   a. Return RegExpExec(rx, S).
 1265|      4|  if (!global) {
  ------------------
  |  Branch (1265:7): [True: 0, False: 4]
  ------------------
 1266|      0|    return regExpExec(runtime, rx, S);
 1267|      0|  }
 1268|       |  // 8. Else global is true,
 1269|       |  // a. Let fullUnicode be ToBoolean(Get(rx, "unicode"))
 1270|       |  // b. ReturnIfAbrupt(fullUnicode)
 1271|      4|  auto unicodePropRes = JSObject::getNamed_RJS(
 1272|      4|      rx, runtime, Predefined::getSymbolID(Predefined::unicode));
 1273|      4|  if (LLVM_UNLIKELY(unicodePropRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1274|      0|    return ExecutionStatus::EXCEPTION;
 1275|      0|  }
 1276|      4|  bool fullUnicode = toBoolean(unicodePropRes->get());
 1277|       |
 1278|       |  // c. Let setStatus be Set(rx, "lastIndex", 0, true).
 1279|       |  // d. ReturnIfAbrupt(setStatus).
 1280|      4|  if (setLastIndex(rx, runtime, 0) == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1280:7): [True: 0, False: 4]
  ------------------
 1281|      0|    return ExecutionStatus::EXCEPTION;
 1282|      0|  }
 1283|       |  // e. Let A be ArrayCreate(0).
 1284|      4|  auto arrRes = JSArray::create(runtime, 0, 0);
 1285|      4|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1286|      0|    return ExecutionStatus::EXCEPTION;
 1287|      0|  }
 1288|      4|  auto A = *arrRes;
 1289|       |  // e. Let n be 0.
 1290|      4|  uint32_t n = 0;
 1291|       |
 1292|       |  // g. Repeat,
 1293|      4|  MutableHandle<> propValue{runtime};
 1294|      4|  MutableHandle<> result{runtime};
 1295|      4|  MutableHandle<StringPrimitive> matchStr{runtime};
 1296|      4|  auto marker = gcScope.createMarker();
 1297|   404k|  while (true) {
  ------------------
  |  Branch (1297:10): [Folded - Ignored]
  ------------------
 1298|   404k|    gcScope.flushToMarker(marker);
 1299|       |    // i. Let result be RegExpExec(rx, S).
 1300|   404k|    auto callRes = regExpExec(runtime, rx, S);
 1301|       |    // ii. ReturnIfAbrupt(result).
 1302|   404k|    if (LLVM_UNLIKELY(callRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
 1303|      0|      return ExecutionStatus::EXCEPTION;
 1304|      0|    }
 1305|   404k|    result = callRes.getValue();
 1306|       |    // iii. If result is null, then
 1307|   404k|    if (result->isNull()) {
  ------------------
  |  Branch (1307:9): [True: 4, False: 404k]
  ------------------
 1308|      4|      if (n == 0) {
  ------------------
  |  Branch (1308:11): [True: 0, False: 4]
  ------------------
 1309|      0|        return HermesValue::encodeNullValue();
 1310|      4|      } else {
 1311|      4|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1312|      4|                JSArray::setLengthProperty(A, runtime, n) ==
 1313|      4|                ExecutionStatus::EXCEPTION))
 1314|      0|          return ExecutionStatus::EXCEPTION;
 1315|      4|        return A.getHermesValue();
 1316|      4|      }
 1317|      4|    }
 1318|       |    // iv. Else result is not null,
 1319|   404k|    auto resultObj = Handle<JSObject>::vmcast(result);
 1320|       |    // 1. Let matchStr be ToString(Get(result, "0")).
 1321|       |    // 2. ReturnIfAbrupt(matchStr).
 1322|   404k|    auto propRes2 = JSObject::getComputed_RJS(
 1323|   404k|        resultObj, runtime, HandleRootOwner::getZeroValue());
 1324|   404k|    if (propRes2 == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1324:9): [True: 0, False: 404k]
  ------------------
 1325|      0|      return ExecutionStatus::EXCEPTION;
 1326|      0|    }
 1327|   404k|    propValue = std::move(propRes2.getValue());
 1328|   404k|    auto strRes2 = toString_RJS(runtime, propValue);
 1329|   404k|    if (strRes2 == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1329:9): [True: 0, False: 404k]
  ------------------
 1330|      0|      return ExecutionStatus::EXCEPTION;
 1331|      0|    }
 1332|   404k|    matchStr = strRes2->get();
 1333|       |    // 3. Let status be CreateDataProperty(A, ToString(n), matchStr).
 1334|       |    // 4. Assert: status is true.
 1335|   404k|    JSArray::setElementAt(A, runtime, n, matchStr);
 1336|       |    // 5. If matchStr is the empty String, then
 1337|   404k|    if (matchStr->getStringLength() == 0) {
  ------------------
  |  Branch (1337:9): [True: 0, False: 404k]
  ------------------
 1338|       |      // a. Let thisIndex be ToLength(Get(rx, "lastIndex")).
 1339|       |      // b. ReturnIfAbrupt(thisIndex).
 1340|      0|      if ((propRes = runtime.getNamed(rx, PropCacheID::RegExpLastIndex)) ==
  ------------------
  |  Branch (1340:11): [True: 0, False: 0]
  ------------------
 1341|      0|          ExecutionStatus::EXCEPTION) {
 1342|      0|        return ExecutionStatus::EXCEPTION;
 1343|      0|      }
 1344|      0|      propValue = std::move(propRes.getValue());
 1345|      0|      auto thisIndex = toLength(runtime, propValue);
 1346|      0|      if (thisIndex == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1346:11): [True: 0, False: 0]
  ------------------
 1347|      0|        return ExecutionStatus::EXCEPTION;
 1348|      0|      }
 1349|       |      // c. Let nextIndex be AdvanceStringIndex(S, thisIndex, fullUnicode).
 1350|      0|      double nextIndex = advanceStringIndex(
 1351|      0|          S.get(), thisIndex->getNumberAs<uint64_t>(), fullUnicode);
 1352|       |      // d. Let setStatus be Set(rx, "lastIndex", nextIndex, true).
 1353|      0|      auto setStatus = setLastIndex(rx, runtime, nextIndex);
 1354|       |      // e. ReturnIfAbrupt(setStatus).
 1355|      0|      if (setStatus == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1355:11): [True: 0, False: 0]
  ------------------
 1356|      0|        return ExecutionStatus::EXCEPTION;
 1357|      0|      }
 1358|      0|    }
 1359|       |    // 6. Increment n.
 1360|   404k|    n++;
 1361|   404k|  }
 1362|      0|  llvm_unreachable(
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1363|      4|      "RegExp.prototype[@@match] must stop when all matched results are returned.");
 1364|      4|}
_ZN6hermes2vm17regExpFlagsGetterEPvRNS0_7RuntimeENS0_10NativeArgsE:
 2079|    234|regExpFlagsGetter(void *ctx, Runtime &runtime, NativeArgs args) {
 2080|       |  // Let R be the this value.
 2081|       |  // If Type(R) is not Object, throw a TypeError exception
 2082|    234|  Handle<JSObject> R = args.dyncastThis<JSObject>();
 2083|    234|  if (!R) {
  ------------------
  |  Branch (2083:7): [True: 0, False: 234]
  ------------------
 2084|      0|    return runtime.raiseTypeError(
 2085|      0|        "RegExp.prototype.flags getter called on non-object");
 2086|      0|  }
 2087|       |
 2088|    234|  llvh::SmallString<5> result;
 2089|    234|  static const struct FlagProp {
 2090|    234|    char flagChar;
 2091|    234|    Predefined::Str name;
 2092|    234|  } flagProps[] = {
 2093|    234|      {'g', Predefined::global},
 2094|    234|      {'i', Predefined::ignoreCase},
 2095|    234|      {'m', Predefined::multiline},
 2096|    234|      {'s', Predefined::dotAll},
 2097|    234|      {'u', Predefined::unicode},
 2098|    234|      {'y', Predefined::sticky},
 2099|    234|  };
 2100|  1.40k|  for (FlagProp f : flagProps) {
  ------------------
  |  Branch (2100:19): [True: 1.40k, False: 234]
  ------------------
 2101|  1.40k|    auto flagVal =
 2102|  1.40k|        JSObject::getNamed_RJS(R, runtime, Predefined::getSymbolID(f.name));
 2103|  1.40k|    if (LLVM_UNLIKELY(flagVal == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  1.40k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.40k]
  |  |  ------------------
  ------------------
 2104|      0|      return ExecutionStatus::EXCEPTION;
 2105|      0|    }
 2106|  1.40k|    if (toBoolean(flagVal->get())) {
  ------------------
  |  Branch (2106:9): [True: 0, False: 1.40k]
  ------------------
 2107|      0|      result.push_back(f.flagChar);
 2108|      0|    }
 2109|  1.40k|  }
 2110|    234|  return StringPrimitive::create(runtime, result);
 2111|    234|}
RegExp.cpp:_ZZN6hermes2vm23createRegExpConstructorERNS0_7RuntimeEENK3$_0clENS0_6HandleINS0_8JSObjectEEENS0_10Predefined3StrEPFNS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEEPvS2_NS0_10NativeArgsEEl:
  104|  2.67k|                          intptr_t ctx = 0) {
  105|  2.67k|    defineAccessor(
  106|  2.67k|        runtime,
  107|  2.67k|        obj,
  108|  2.67k|        Predefined::getSymbolID(sym),
  109|  2.67k|        ctx ? reinterpret_cast<void *>(ctx) : nullptr,
  ------------------
  |  Branch (109:9): [True: 1.48k, False: 1.18k]
  ------------------
  110|  2.67k|        getter,
  111|  2.67k|        nullptr,
  112|  2.67k|        false,
  113|  2.67k|        true);
  114|  2.67k|  };
RegExp.cpp:_ZN6hermes2vmL18createGroupsObjectERNS0_7RuntimeENS0_6HandleINS0_7JSArrayEEENS3_INS0_8JSObjectEEE:
  423|   404k|    Handle<JSObject> mappingObj) {
  424|       |  // matchObj is created with a HiddenClass that already has the groups
  425|       |  // property.
  426|   404k|  NamedPropertyDescriptor groupsDesc;
  427|   404k|  auto pos = JSObject::getOwnNamedDescriptor(
  428|   404k|      matchObj,
  429|   404k|      runtime,
  430|   404k|      Predefined::getSymbolID(Predefined::groups),
  431|   404k|      groupsDesc);
  432|   404k|  assert(pos && "match object is missing .groups property");
  433|      0|  (void)pos;
  434|       |
  435|       |  // If there are no capture groups, then set groups to undefined.
  436|   404k|  if (!mappingObj) {
  ------------------
  |  Branch (436:7): [True: 404k, False: 0]
  ------------------
  437|   404k|    auto shv = SmallHermesValue::encodeUndefinedValue();
  438|   404k|    JSObject::setNamedSlotValueUnsafe(matchObj.get(), runtime, groupsDesc, shv);
  439|   404k|    return;
  440|   404k|  }
  441|       |
  442|       |  // The `__proto__` property on the groups object is not special,
  443|       |  // and does not affect the [[Prototype]] of the resulting groups object.
  444|       |  // This means that the prototype of the resulting groups object is null.
  445|      0|  auto clazzHandle = runtime.makeHandle(mappingObj->getClass(runtime));
  446|      0|  auto groupsObjRes = JSObject::create(
  447|      0|      runtime, Runtime::makeNullHandle<JSObject>(), clazzHandle);
  448|      0|  auto groupsObj = runtime.makeHandle(groupsObjRes.get());
  449|       |
  450|      0|  HiddenClass::forEachProperty(
  451|      0|      clazzHandle, runtime, [&](SymbolID id, NamedPropertyDescriptor desc) {
  452|      0|        auto groupIdx =
  453|      0|            JSObject::getNamedSlotValueUnsafe(*mappingObj, runtime, desc.slot)
  454|      0|                .getNumber(runtime);
  455|      0|        JSObject::setNamedSlotValueUnsafe(
  456|      0|            *groupsObj, runtime, desc.slot, matchObj->at(runtime, groupIdx));
  457|      0|      });
  458|       |
  459|      0|  auto shv = SmallHermesValue::encodeObjectValue(*groupsObj, runtime);
  460|      0|  JSObject::setNamedSlotValueUnsafe(matchObj.get(), runtime, groupsDesc, shv);
  461|      0|}

_ZN6hermes2vm37populateRegExpStringIteratorPrototypeERNS0_7RuntimeE:
   20|     99|void populateRegExpStringIteratorPrototype(Runtime &runtime) {
   21|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.regExpStringIteratorPrototype);
   22|       |
   23|     99|  defineMethod(
   24|     99|      runtime,
   25|     99|      proto,
   26|     99|      Predefined::getSymbolID(Predefined::next),
   27|     99|      nullptr,
   28|     99|      regExpStringIteratorPrototypeNext,
   29|     99|      0);
   30|       |
   31|       |  // ES11 21.2.7.1.2 %RegExpStringIteratorPrototype% [ @@toStringTag ]
   32|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   33|     99|  dpf.writable = 0;
   34|     99|  dpf.enumerable = 0;
   35|     99|  defineProperty(
   36|     99|      runtime,
   37|     99|      proto,
   38|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   39|     99|      runtime.getPredefinedStringHandle(Predefined::RegExpStringIterator),
   40|     99|      dpf);
   41|     99|}

_ZN6hermes2vm26createRuntimeCommonStorageEb:
   18|     99|    bool shouldTrace) {
   19|     99|  return std::make_shared<RuntimeCommonStorage>(shouldTrace);
   20|     99|}
_ZN6hermes2vm20RuntimeCommonStorageC2Eb:
   23|     99|    : shouldTrace(shouldTrace) {}
_ZN6hermes2vm20RuntimeCommonStorageD2Ev:
   24|     99|RuntimeCommonStorage::~RuntimeCommonStorage() {}

_ZN6hermes2vm20createSetConstructorERNS0_7RuntimeE:
   20|     99|Handle<JSObject> createSetConstructor(Runtime &runtime) {
   21|     99|  auto setPrototype = Handle<JSObject>::vmcast(&runtime.setPrototype);
   22|       |
   23|       |  // Set.prototype.xxx methods.
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      setPrototype,
   27|     99|      Predefined::getSymbolID(Predefined::add),
   28|     99|      nullptr,
   29|     99|      setPrototypeAdd,
   30|     99|      1);
   31|       |
   32|     99|  defineMethod(
   33|     99|      runtime,
   34|     99|      setPrototype,
   35|     99|      Predefined::getSymbolID(Predefined::clear),
   36|     99|      nullptr,
   37|     99|      setPrototypeClear,
   38|     99|      0);
   39|       |
   40|     99|  defineMethod(
   41|     99|      runtime,
   42|     99|      setPrototype,
   43|     99|      Predefined::getSymbolID(Predefined::deleteStr),
   44|     99|      nullptr,
   45|     99|      setPrototypeDelete,
   46|     99|      1);
   47|       |
   48|     99|  defineMethod(
   49|     99|      runtime,
   50|     99|      setPrototype,
   51|     99|      Predefined::getSymbolID(Predefined::entries),
   52|     99|      nullptr,
   53|     99|      setPrototypeEntries,
   54|     99|      0);
   55|       |
   56|     99|  defineMethod(
   57|     99|      runtime,
   58|     99|      setPrototype,
   59|     99|      Predefined::getSymbolID(Predefined::forEach),
   60|     99|      nullptr,
   61|     99|      setPrototypeForEach,
   62|     99|      1);
   63|       |
   64|     99|  defineMethod(
   65|     99|      runtime,
   66|     99|      setPrototype,
   67|     99|      Predefined::getSymbolID(Predefined::has),
   68|     99|      nullptr,
   69|     99|      setPrototypeHas,
   70|     99|      1);
   71|       |
   72|     99|  defineAccessor(
   73|     99|      runtime,
   74|     99|      setPrototype,
   75|     99|      Predefined::getSymbolID(Predefined::size),
   76|     99|      nullptr,
   77|     99|      setPrototypeSizeGetter,
   78|     99|      nullptr,
   79|     99|      false,
   80|     99|      true);
   81|       |
   82|     99|  defineMethod(
   83|     99|      runtime,
   84|     99|      setPrototype,
   85|     99|      Predefined::getSymbolID(Predefined::values),
   86|     99|      nullptr,
   87|     99|      setPrototypeValues,
   88|     99|      0);
   89|       |
   90|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
   91|       |
   92|       |  // Use the same valuesMethod for both keys() and values().
   93|     99|  Handle<NativeFunction> propValue = Handle<NativeFunction>::vmcast(
   94|     99|      runtime.makeHandle(runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
   95|     99|          setPrototype,
   96|     99|          runtime,
   97|     99|          Predefined::getSymbolID(Predefined::values)))));
   98|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
   99|     99|      setPrototype,
  100|     99|      runtime,
  101|     99|      Predefined::getSymbolID(Predefined::keys),
  102|     99|      dpf,
  103|     99|      propValue));
  104|     99|  runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
  105|     99|      setPrototype,
  106|     99|      runtime,
  107|     99|      Predefined::getSymbolID(Predefined::SymbolIterator),
  108|     99|      dpf,
  109|     99|      propValue));
  110|       |
  111|     99|  dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  112|     99|  dpf.writable = 0;
  113|     99|  dpf.enumerable = 0;
  114|     99|  defineProperty(
  115|     99|      runtime,
  116|     99|      setPrototype,
  117|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  118|     99|      runtime.getPredefinedStringHandle(Predefined::Set),
  119|     99|      dpf);
  120|       |
  121|     99|  auto cons = defineSystemConstructor<JSSet>(
  122|     99|      runtime,
  123|     99|      Predefined::getSymbolID(Predefined::Set),
  124|     99|      setConstructor,
  125|     99|      setPrototype,
  126|     99|      0,
  127|     99|      CellKind::JSSetKind);
  128|       |
  129|     99|  return cons;
  130|     99|}
_ZN6hermes2vm26createSetIteratorPrototypeERNS0_7RuntimeE:
  310|     99|Handle<JSObject> createSetIteratorPrototype(Runtime &runtime) {
  311|     99|  auto parentHandle = runtime.makeHandle(JSObject::create(
  312|     99|      runtime, Handle<JSObject>::vmcast(&runtime.iteratorPrototype)));
  313|     99|  defineMethod(
  314|     99|      runtime,
  315|     99|      parentHandle,
  316|     99|      Predefined::getSymbolID(Predefined::next),
  317|     99|      nullptr,
  318|     99|      setIteratorPrototypeNext,
  319|     99|      0);
  320|       |
  321|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  322|     99|  dpf.writable = 0;
  323|     99|  dpf.enumerable = 0;
  324|     99|  defineProperty(
  325|     99|      runtime,
  326|     99|      parentHandle,
  327|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  328|     99|      runtime.getPredefinedStringHandle(Predefined::SetIterator),
  329|     99|      dpf);
  330|       |
  331|     99|  return parentHandle;
  332|     99|}

_ZN6hermes2vm23createStringConstructorERNS0_7RuntimeE:
   43|     99|Handle<JSObject> createStringConstructor(Runtime &runtime) {
   44|     99|  auto stringPrototype = Handle<JSString>::vmcast(&runtime.stringPrototype);
   45|       |
   46|     99|  auto cons = defineSystemConstructor<JSString>(
   47|     99|      runtime,
   48|     99|      Predefined::getSymbolID(Predefined::String),
   49|     99|      stringConstructor,
   50|     99|      stringPrototype,
   51|     99|      1,
   52|     99|      CellKind::JSStringKind);
   53|       |
   54|       |  // String.prototype.xxx methods.
   55|     99|  void *ctx = nullptr;
   56|     99|  defineMethod(
   57|     99|      runtime,
   58|     99|      stringPrototype,
   59|     99|      Predefined::getSymbolID(Predefined::toString),
   60|     99|      ctx,
   61|     99|      stringPrototypeToString,
   62|     99|      0);
   63|     99|  defineMethod(
   64|     99|      runtime,
   65|     99|      stringPrototype,
   66|     99|      Predefined::getSymbolID(Predefined::at),
   67|     99|      ctx,
   68|     99|      stringPrototypeAt,
   69|     99|      1);
   70|     99|  defineMethod(
   71|     99|      runtime,
   72|     99|      stringPrototype,
   73|     99|      Predefined::getSymbolID(Predefined::valueOf),
   74|     99|      ctx,
   75|     99|      stringPrototypeToString,
   76|     99|      0);
   77|     99|  defineMethod(
   78|     99|      runtime,
   79|     99|      stringPrototype,
   80|     99|      Predefined::getSymbolID(Predefined::charCodeAt),
   81|     99|      ctx,
   82|     99|      stringPrototypeCharCodeAt,
   83|     99|      1);
   84|     99|  defineMethod(
   85|     99|      runtime,
   86|     99|      stringPrototype,
   87|     99|      Predefined::getSymbolID(Predefined::codePointAt),
   88|     99|      ctx,
   89|     99|      stringPrototypeCodePointAt,
   90|     99|      1);
   91|     99|  defineMethod(
   92|     99|      runtime,
   93|     99|      stringPrototype,
   94|     99|      Predefined::getSymbolID(Predefined::concat),
   95|     99|      ctx,
   96|     99|      stringPrototypeConcat,
   97|     99|      1);
   98|     99|  defineMethod(
   99|     99|      runtime,
  100|     99|      stringPrototype,
  101|     99|      Predefined::getSymbolID(Predefined::substring),
  102|     99|      ctx,
  103|     99|      stringPrototypeSubstring,
  104|     99|      2);
  105|     99|  defineMethod(
  106|     99|      runtime,
  107|     99|      stringPrototype,
  108|     99|      Predefined::getSymbolID(Predefined::toLowerCase),
  109|     99|      ctx,
  110|     99|      stringPrototypeToLowerCase,
  111|     99|      0);
  112|     99|  defineMethod(
  113|     99|      runtime,
  114|     99|      stringPrototype,
  115|     99|      Predefined::getSymbolID(Predefined::toLocaleLowerCase),
  116|     99|      ctx,
  117|     99|      stringPrototypeToLocaleLowerCase,
  118|     99|      0);
  119|     99|  defineMethod(
  120|     99|      runtime,
  121|     99|      stringPrototype,
  122|     99|      Predefined::getSymbolID(Predefined::toUpperCase),
  123|     99|      ctx,
  124|     99|      stringPrototypeToUpperCase,
  125|     99|      0);
  126|     99|  defineMethod(
  127|     99|      runtime,
  128|     99|      stringPrototype,
  129|     99|      Predefined::getSymbolID(Predefined::toLocaleUpperCase),
  130|     99|      ctx,
  131|     99|      stringPrototypeToLocaleUpperCase,
  132|     99|      0);
  133|     99|  defineMethod(
  134|     99|      runtime,
  135|     99|      stringPrototype,
  136|     99|      Predefined::getSymbolID(Predefined::substr),
  137|     99|      ctx,
  138|     99|      stringPrototypeSubstr,
  139|     99|      2);
  140|     99|  defineMethod(
  141|     99|      runtime,
  142|     99|      stringPrototype,
  143|     99|      Predefined::getSymbolID(Predefined::trim),
  144|     99|      ctx,
  145|     99|      stringPrototypeTrim,
  146|     99|      0);
  147|     99|  defineMethod(
  148|     99|      runtime,
  149|     99|      stringPrototype,
  150|     99|      Predefined::getSymbolID(Predefined::localeCompare),
  151|     99|      ctx,
  152|     99|      stringPrototypeLocaleCompare,
  153|     99|      1);
  154|     99|  defineMethod(
  155|     99|      runtime,
  156|     99|      stringPrototype,
  157|     99|      Predefined::getSymbolID(Predefined::normalize),
  158|     99|      ctx,
  159|     99|      stringPrototypeNormalize,
  160|     99|      0);
  161|     99|  defineMethod(
  162|     99|      runtime,
  163|     99|      stringPrototype,
  164|     99|      Predefined::getSymbolID(Predefined::repeat),
  165|     99|      ctx,
  166|     99|      stringPrototypeRepeat,
  167|     99|      1);
  168|       |
  169|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
  170|     99|  auto trimStartRes =
  171|     99|      runtime.makeHandle<Callable>(runtime.ignoreAllocationFailure(defineMethod(
  172|     99|          runtime,
  173|     99|          stringPrototype,
  174|     99|          Predefined::getSymbolID(Predefined::trimStart),
  175|     99|          ctx,
  176|     99|          stringPrototypeTrimStart,
  177|     99|          0,
  178|     99|          dpf)));
  179|     99|  auto trimEndRes =
  180|     99|      runtime.makeHandle<Callable>(runtime.ignoreAllocationFailure(defineMethod(
  181|     99|          runtime,
  182|     99|          stringPrototype,
  183|     99|          Predefined::getSymbolID(Predefined::trimEnd),
  184|     99|          ctx,
  185|     99|          stringPrototypeTrimEnd,
  186|     99|          0,
  187|     99|          dpf)));
  188|       |
  189|     99|  defineProperty(
  190|     99|      runtime,
  191|     99|      stringPrototype,
  192|     99|      Predefined::getSymbolID(Predefined::trimLeft),
  193|     99|      trimStartRes);
  194|     99|  defineProperty(
  195|     99|      runtime,
  196|     99|      stringPrototype,
  197|     99|      Predefined::getSymbolID(Predefined::trimRight),
  198|     99|      trimEndRes);
  199|       |
  200|     99|  (void)defineMethod(
  201|     99|      runtime,
  202|     99|      stringPrototype,
  203|     99|      Predefined::getSymbolID(Predefined::SymbolIterator),
  204|     99|      Predefined::getSymbolID(Predefined::squareSymbolIterator),
  205|     99|      ctx,
  206|     99|      stringPrototypeSymbolIterator,
  207|     99|      0,
  208|     99|      dpf);
  209|       |
  210|       |  // String.xxx() methods.
  211|     99|  defineMethod(
  212|     99|      runtime,
  213|     99|      cons,
  214|     99|      Predefined::getSymbolID(Predefined::fromCharCode),
  215|     99|      ctx,
  216|     99|      stringFromCharCode,
  217|     99|      1);
  218|     99|  defineMethod(
  219|     99|      runtime,
  220|     99|      cons,
  221|     99|      Predefined::getSymbolID(Predefined::fromCodePoint),
  222|     99|      ctx,
  223|     99|      stringFromCodePoint,
  224|     99|      1);
  225|     99|  defineMethod(
  226|     99|      runtime,
  227|     99|      cons,
  228|     99|      Predefined::getSymbolID(Predefined::raw),
  229|     99|      ctx,
  230|     99|      stringRaw,
  231|     99|      1);
  232|     99|  defineMethod(
  233|     99|      runtime,
  234|     99|      stringPrototype,
  235|     99|      Predefined::getSymbolID(Predefined::matchAll),
  236|     99|      ctx,
  237|     99|      stringPrototypeMatchAll,
  238|     99|      1);
  239|     99|  defineMethod(
  240|     99|      runtime,
  241|     99|      stringPrototype,
  242|     99|      Predefined::getSymbolID(Predefined::replaceAll),
  243|     99|      ctx,
  244|     99|      stringPrototypeReplaceAll,
  245|     99|      2);
  246|     99|  defineMethod(
  247|     99|      runtime,
  248|     99|      stringPrototype,
  249|     99|      Predefined::getSymbolID(Predefined::match),
  250|     99|      ctx,
  251|     99|      stringPrototypeMatch,
  252|     99|      1);
  253|     99|  defineMethod(
  254|     99|      runtime,
  255|     99|      stringPrototype,
  256|     99|      Predefined::getSymbolID(Predefined::padEnd),
  257|     99|      (void *)false,
  258|     99|      stringPrototypePad,
  259|     99|      1);
  260|     99|  defineMethod(
  261|     99|      runtime,
  262|     99|      stringPrototype,
  263|     99|      Predefined::getSymbolID(Predefined::padStart),
  264|     99|      (void *)true,
  265|     99|      stringPrototypePad,
  266|     99|      1);
  267|     99|  defineMethod(
  268|     99|      runtime,
  269|     99|      stringPrototype,
  270|     99|      Predefined::getSymbolID(Predefined::replace),
  271|     99|      ctx,
  272|     99|      stringPrototypeReplace,
  273|     99|      2);
  274|     99|  defineMethod(
  275|     99|      runtime,
  276|     99|      stringPrototype,
  277|     99|      Predefined::getSymbolID(Predefined::search),
  278|     99|      ctx,
  279|     99|      stringPrototypeSearch,
  280|     99|      1);
  281|     99|  defineMethod(
  282|     99|      runtime,
  283|     99|      stringPrototype,
  284|     99|      Predefined::getSymbolID(Predefined::charAt),
  285|     99|      ctx,
  286|     99|      stringPrototypeCharAt,
  287|     99|      1);
  288|     99|  defineMethod(
  289|     99|      runtime,
  290|     99|      stringPrototype,
  291|     99|      Predefined::getSymbolID(Predefined::endsWith),
  292|     99|      ctx,
  293|     99|      stringPrototypeEndsWith,
  294|     99|      1);
  295|     99|  defineMethod(
  296|     99|      runtime,
  297|     99|      stringPrototype,
  298|     99|      Predefined::getSymbolID(Predefined::slice),
  299|     99|      ctx,
  300|     99|      stringPrototypeSlice,
  301|     99|      2);
  302|     99|  defineMethod(
  303|     99|      runtime,
  304|     99|      stringPrototype,
  305|     99|      Predefined::getSymbolID(Predefined::split),
  306|     99|      ctx,
  307|     99|      stringPrototypeSplit,
  308|     99|      2);
  309|     99|  defineMethod(
  310|     99|      runtime,
  311|     99|      stringPrototype,
  312|     99|      Predefined::getSymbolID(Predefined::includes),
  313|     99|      (void *)false,
  314|     99|      stringPrototypeIncludesOrStartsWith,
  315|     99|      1);
  316|     99|  defineMethod(
  317|     99|      runtime,
  318|     99|      stringPrototype,
  319|     99|      Predefined::getSymbolID(Predefined::indexOf),
  320|     99|      ctx,
  321|     99|      stringPrototypeIndexOf,
  322|     99|      1);
  323|     99|  defineMethod(
  324|     99|      runtime,
  325|     99|      stringPrototype,
  326|     99|      Predefined::getSymbolID(Predefined::lastIndexOf),
  327|     99|      ctx,
  328|     99|      stringPrototypeLastIndexOf,
  329|     99|      1);
  330|     99|  defineMethod(
  331|     99|      runtime,
  332|     99|      stringPrototype,
  333|     99|      Predefined::getSymbolID(Predefined::startsWith),
  334|     99|      (void *)true,
  335|     99|      stringPrototypeIncludesOrStartsWith,
  336|     99|      1);
  337|       |
  338|     99|  return cons;
  339|     99|}
_ZN6hermes2vm21stringPrototypeRepeatEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1234|      5|stringPrototypeRepeat(void *, Runtime &runtime, NativeArgs args) {
 1235|       |  // 1. Let O be RequireObjectCoercible(this value).
 1236|      5|  auto O = args.getThisHandle();
 1237|      5|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 1238|      5|          checkObjectCoercible(runtime, O) == ExecutionStatus::EXCEPTION)) {
 1239|      0|    return ExecutionStatus::EXCEPTION;
 1240|      0|  }
 1241|       |  // 2. Let S be ToString(O).
 1242|       |  // 3. ReturnIfAbrupt(S).
 1243|      5|  auto sRes = toString_RJS(runtime, O);
 1244|      5|  if (LLVM_UNLIKELY(sRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 1245|      0|    return ExecutionStatus::EXCEPTION;
 1246|      0|  }
 1247|      5|  auto S = runtime.makeHandle(std::move(*sRes));
 1248|       |
 1249|       |  // 4. Let n be ToIntegerOrInfinity(count).
 1250|       |  // 5. ReturnIfAbrupt(n).
 1251|      5|  auto nRes = toIntegerOrInfinity(runtime, args.getArgHandle(0));
 1252|      5|  if (LLVM_UNLIKELY(nRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 1253|      0|    return ExecutionStatus::EXCEPTION;
 1254|      0|  }
 1255|      5|  double n = nRes->getNumber();
 1256|       |
 1257|       |  // 6. If n < 0, throw a RangeError exception.
 1258|       |  // 7. If n is +Infinity, throw a RangeError exception.
 1259|      5|  if (n < 0 || n == std::numeric_limits<double>::infinity()) {
  ------------------
  |  Branch (1259:7): [True: 0, False: 5]
  |  Branch (1259:16): [True: 0, False: 5]
  ------------------
 1260|      0|    return runtime.raiseRangeError(
 1261|      0|        "String.prototype.repeat count must be finite and non-negative");
 1262|      0|  }
 1263|       |
 1264|       |  // 8. Let T be a String value that is made from n copies of S appended
 1265|       |  // together. If n is 0, T is the empty String.
 1266|      5|  double strLen = S->getStringLength();
 1267|       |
 1268|      5|  if (n == 0 || strLen == 0) {
  ------------------
  |  Branch (1268:7): [True: 0, False: 5]
  |  Branch (1268:17): [True: 0, False: 5]
  ------------------
 1269|      0|    return HermesValue::encodeStringValue(
 1270|      0|        runtime.getPredefinedString(Predefined::emptyString));
 1271|      0|  }
 1272|       |
 1273|      5|  if (n > std::numeric_limits<uint32_t>::max() ||
  ------------------
  |  Branch (1273:7): [True: 0, False: 5]
  ------------------
 1274|      5|      S->getStringLength() > (double)StringPrimitive::MAX_STRING_LENGTH / n) {
  ------------------
  |  Branch (1274:7): [True: 0, False: 5]
  ------------------
 1275|       |    // Check for overflow.
 1276|      0|    return runtime.raiseRangeError(
 1277|      0|        "String.prototype.repeat result exceeds limit");
 1278|      0|  }
 1279|       |
 1280|       |  // It's safe to multiply as the overflow check is done above.
 1281|      5|  SafeUInt32 finalLen(strLen * n);
 1282|       |
 1283|      5|  auto builderRes = StringBuilder::createStringBuilder(runtime, finalLen);
 1284|      5|  if (LLVM_UNLIKELY(builderRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
 1285|      0|    return ExecutionStatus::EXCEPTION;
 1286|      0|  }
 1287|       |
 1288|       |  // Using uint32_t for i is valid because we have bounds-checked n.
 1289|   191k|  for (uint32_t i = 0; i < n; ++i) {
  ------------------
  |  Branch (1289:24): [True: 191k, False: 5]
  ------------------
 1290|   191k|    builderRes->appendStringPrim(S);
 1291|   191k|  }
 1292|       |
 1293|       |  // 9. Return T.
 1294|      5|  return builderRes->getStringPrimitive().getHermesValue();
 1295|      5|}
_ZN6hermes2vm20stringPrototypeMatchEPvRNS0_7RuntimeENS0_10NativeArgsE:
 1783|      4|stringPrototypeMatch(void *, Runtime &runtime, NativeArgs args) {
 1784|       |  // 1. Let O be RequireObjectCoercible(this value).
 1785|       |  // 2. ReturnIfAbrupt(O).
 1786|      4|  auto O = args.getThisHandle();
 1787|      4|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1788|      4|          checkObjectCoercible(runtime, O) == ExecutionStatus::EXCEPTION)) {
 1789|      0|    return ExecutionStatus::EXCEPTION;
 1790|      0|  }
 1791|       |  // 3. If regexp is neither undefined nor null, then
 1792|      4|  auto regexp = args.getArgHandle(0);
 1793|      4|  if (!regexp->isUndefined() && !regexp->isNull()) {
  ------------------
  |  Branch (1793:7): [True: 4, False: 0]
  |  Branch (1793:33): [True: 4, False: 0]
  ------------------
 1794|       |    // a. Let matcher be GetMethod(regexp, @@match).
 1795|      4|    auto methodRes = getMethod(
 1796|      4|        runtime,
 1797|      4|        regexp,
 1798|      4|        runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolMatch)));
 1799|       |    // b. ReturnIfAbrupt(matcher).
 1800|      4|    if (LLVM_UNLIKELY(methodRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      4|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 4]
  |  |  ------------------
  ------------------
 1801|      0|      return ExecutionStatus::EXCEPTION;
 1802|      0|    }
 1803|       |    // c. If matcher is not undefined, then
 1804|       |    //   i. Return Call(matcher, regexp, «‍O»).
 1805|      4|    if (!methodRes->getHermesValue().isUndefined()) {
  ------------------
  |  Branch (1805:9): [True: 4, False: 0]
  ------------------
 1806|      4|      auto matcher = runtime.makeHandle<Callable>(std::move(*methodRes));
 1807|      4|      return Callable::executeCall1(
 1808|      4|                 matcher, runtime, regexp, O.getHermesValue())
 1809|      4|          .toCallResultHermesValue();
 1810|      4|    }
 1811|      4|  }
 1812|       |  // 4. Let S be ToString(O).
 1813|      0|  auto strRes = toString_RJS(runtime, O);
 1814|       |  // 5. ReturnIfAbrupt(S).
 1815|      0|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1816|      0|    return ExecutionStatus::EXCEPTION;
 1817|      0|  }
 1818|      0|  auto S = runtime.makeHandle(std::move(*strRes));
 1819|       |
 1820|       |  // 6. Let rx be RegExpCreate(regexp, undefined) (see 21.2.3.2.3).
 1821|       |  // 7. ReturnIfAbrupt(rx).
 1822|      0|  auto regRes = regExpCreate(runtime, regexp, Runtime::getUndefinedValue());
 1823|      0|  if (regRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1823:7): [True: 0, False: 0]
  ------------------
 1824|      0|    return ExecutionStatus::EXCEPTION;
 1825|      0|  }
 1826|      0|  Handle<JSRegExp> rx = regRes.getValue();
 1827|       |
 1828|       |  // 8. Return Invoke(rx, @@match, «‍S»).
 1829|      0|  auto propRes = JSObject::getNamed_RJS(
 1830|      0|      rx, runtime, Predefined::getSymbolID(Predefined::SymbolMatch));
 1831|      0|  if (LLVM_UNLIKELY(propRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1832|      0|    return ExecutionStatus::EXCEPTION;
 1833|      0|  }
 1834|      0|  auto func =
 1835|      0|      Handle<Callable>::dyn_vmcast(runtime.makeHandle(std::move(*propRes)));
 1836|      0|  if (LLVM_UNLIKELY(!func)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1837|      0|    return runtime.raiseTypeError(
 1838|      0|        "RegExp.prototype[@@match] must be callable.");
 1839|      0|  }
 1840|      0|  return Callable::executeCall1(func, runtime, rx, S.getHermesValue())
 1841|      0|      .toCallResultHermesValue();
 1842|      0|}
_ZN6hermes2vm20stringPrototypeSplitEPvRNS0_7RuntimeENS0_10NativeArgsE:
 2346|      3|stringPrototypeSplit(void *, Runtime &runtime, NativeArgs args) {
 2347|      3|  GCScope gcScope{runtime};
 2348|       |
 2349|       |  // 1. Let O be ? RequireObjectCoercible(this value).
 2350|      3|  auto O = args.getThisHandle();
 2351|      3|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2352|      3|          checkObjectCoercible(runtime, O) == ExecutionStatus::EXCEPTION)) {
 2353|      0|    return ExecutionStatus::EXCEPTION;
 2354|      0|  }
 2355|       |  // 2. If separator is neither undefined nor null, then
 2356|      3|  auto separator = args.getArgHandle(0);
 2357|      3|  if (!separator->isUndefined() && !separator->isNull()) {
  ------------------
  |  Branch (2357:7): [True: 3, False: 0]
  |  Branch (2357:36): [True: 3, False: 0]
  ------------------
 2358|       |    // a. Let splitter be ? GetMethod(separator, @@split).
 2359|      3|    auto methodRes = getMethod(
 2360|      3|        runtime,
 2361|      3|        separator,
 2362|      3|        runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSplit)));
 2363|      3|    if (LLVM_UNLIKELY(methodRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2364|      0|      return ExecutionStatus::EXCEPTION;
 2365|      0|    }
 2366|       |    // b. If splitter is not undefined, then
 2367|       |    // i. Return ? Call(splitter, separator, «‍O, limit»).
 2368|      3|    if (!methodRes->getHermesValue().isUndefined()) {
  ------------------
  |  Branch (2368:9): [True: 0, False: 3]
  ------------------
 2369|      0|      Handle<Callable> splitter =
 2370|      0|          Handle<Callable>::vmcast(runtime, methodRes->getHermesValue());
 2371|      0|      return Callable::executeCall2(
 2372|      0|                 splitter,
 2373|      0|                 runtime,
 2374|      0|                 separator,
 2375|      0|                 O.getHermesValue(),
 2376|      0|                 args.getArg(1))
 2377|      0|          .toCallResultHermesValue();
 2378|      0|    }
 2379|      3|  }
 2380|       |
 2381|       |  // 3. Let S be ? ToString(O).
 2382|      3|  auto strRes = toString_RJS(runtime, args.getThisHandle());
 2383|      3|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2384|      0|    return ExecutionStatus::EXCEPTION;
 2385|      0|  }
 2386|      3|  auto S = runtime.makeHandle(std::move(*strRes));
 2387|       |
 2388|       |  // 4. Let A be ! ArrayCreate(0).
 2389|      3|  auto arrRes = JSArray::create(runtime, 0, 0);
 2390|      3|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2391|      0|    return ExecutionStatus::EXCEPTION;
 2392|      0|  }
 2393|      3|  auto A = *arrRes;
 2394|       |  // 5. Let lengthA be 0.
 2395|      3|  uint32_t lengthA = 0;
 2396|       |
 2397|       |  // 6. If limit is undefined, let lim be 232 - 1; else let lim be ?
 2398|       |  // ToUint32(limit).
 2399|      3|  auto limit = args.getArgHandle(1);
 2400|      3|  uint32_t lim;
 2401|      3|  if (limit->isUndefined()) {
  ------------------
  |  Branch (2401:7): [True: 3, False: 0]
  ------------------
 2402|       |    // No limit supplied, make it max.
 2403|      3|    lim = 0xffffffff; // 2 ^ 32 - 1
 2404|      3|  } else {
 2405|      0|    auto intRes = toUInt32_RJS(runtime, limit);
 2406|      0|    if (LLVM_UNLIKELY(intRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2407|      0|      return ExecutionStatus::EXCEPTION;
 2408|      0|    }
 2409|      0|    lim = intRes->getNumber();
 2410|      0|  }
 2411|       |
 2412|       |  // 7. Let s be the length of S.
 2413|      3|  uint32_t s = S->getStringLength();
 2414|       |  // 8. Let p be 0.
 2415|       |  // End of the last match.
 2416|      3|  uint32_t p = 0;
 2417|       |
 2418|       |  // 9. Let R be ? ToString(separator).
 2419|       |  // The pattern which we want to separate on.
 2420|      3|  auto sepRes = toString_RJS(runtime, args.getArgHandle(0));
 2421|      3|  if (LLVM_UNLIKELY(sepRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2422|      0|    return ExecutionStatus::EXCEPTION;
 2423|      0|  }
 2424|      3|  Handle<StringPrimitive> R = runtime.makeHandle(std::move(sepRes.getValue()));
 2425|       |
 2426|       |  // 10. If lim = 0, return A.
 2427|      3|  if (lim == 0) {
  ------------------
  |  Branch (2427:7): [True: 0, False: 3]
  ------------------
 2428|       |    // Don't want any elements, so we're done.
 2429|      0|    return A.getHermesValue();
 2430|      0|  }
 2431|       |
 2432|       |  // 11. If separator is undefined, then
 2433|      3|  if (LLVM_UNLIKELY(separator->isUndefined())) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2434|       |    // a. Perform ! CreateDataPropertyOrThrow(A, "0", S).
 2435|      0|    (void)JSArray::setElementAt(A, runtime, 0, S);
 2436|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2437|      0|            JSArray::setLengthProperty(A, runtime, 1) ==
 2438|      0|            ExecutionStatus::EXCEPTION))
 2439|      0|      return ExecutionStatus::EXCEPTION;
 2440|       |    // b. Return A.
 2441|      0|    return A.getHermesValue();
 2442|      0|  }
 2443|       |
 2444|       |  // 12. If s = 0, then
 2445|      3|  if (s == 0) {
  ------------------
  |  Branch (2445:7): [True: 0, False: 3]
  ------------------
 2446|       |    // S is the empty string.
 2447|       |    // a. Let z be SplitMatch(S, 0, R).
 2448|      0|    auto matchResult = splitMatch(runtime, S, 0, R);
 2449|       |    // b. If z is not false, return A.
 2450|      0|    if (matchResult) {
  ------------------
  |  Branch (2450:9): [True: 0, False: 0]
  ------------------
 2451|      0|      return A.getHermesValue();
 2452|      0|    }
 2453|       |    // c. Perform ! CreateDataPropertyOrThrow(A, "0", S).
 2454|      0|    (void)JSArray::setElementAt(A, runtime, 0, S);
 2455|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2456|      0|            JSArray::setLengthProperty(A, runtime, 1) ==
 2457|      0|            ExecutionStatus::EXCEPTION))
 2458|      0|      return ExecutionStatus::EXCEPTION;
 2459|       |    // e. Return A.
 2460|      0|    return A.getHermesValue();
 2461|      0|  }
 2462|       |
 2463|       |  // 17. Let q be p.
 2464|       |  // Place to attempt the start of the next match.
 2465|      3|  uint32_t q = p;
 2466|       |
 2467|      3|  MutableHandle<> tmpHandle{runtime};
 2468|      3|  auto marker = gcScope.createMarker();
 2469|       |
 2470|       |  // 18. Repeat, while q ≠ s
 2471|       |  // Main loop: continue while we have space to find another match.
 2472|  54.9k|  while (q != s) {
  ------------------
  |  Branch (2472:10): [True: 54.9k, False: 0]
  ------------------
 2473|  54.9k|    gcScope.flushToMarker(marker);
 2474|       |
 2475|       |    // a. Let e be SplitMatch(S, q, R).
 2476|       |    // b. If e is false, let q = q+1.
 2477|       |
 2478|       |    // Find the next valid match. We know that q < s.
 2479|       |    // ES6's SplitMatch only finds matches at q, but we find matches at or
 2480|       |    // after q, so if it fails, we know we're done. In effect, we are performing
 2481|       |    // steps (a) and (b) over and over again.
 2482|  54.9k|    auto matchResult = splitMatch(runtime, S, q, R);
 2483|       |    // If we did find a match, fast-forward q to the start of that match.
 2484|  54.9k|    if (matchResult) {
  ------------------
  |  Branch (2484:9): [True: 54.9k, False: 3]
  ------------------
 2485|  54.9k|      q = *matchResult - R->getStringLength();
 2486|  54.9k|    }
 2487|  54.9k|    if (!matchResult || q >= s) {
  ------------------
  |  Branch (2487:9): [True: 3, False: 54.9k]
  |  Branch (2487:25): [True: 0, False: 54.9k]
  ------------------
 2488|       |      // There's no matches between index q and the end of the string, so we're
 2489|       |      // done searching. Note: This behavior differs from the spec
 2490|       |      // implementation, because we check for matches at or after q. However, in
 2491|       |      // line with the spec, we only count matches that start before the end of
 2492|       |      // the string.
 2493|      3|      break;
 2494|      3|    }
 2495|       |    // c. Else,
 2496|       |    // Found a match, so go ahead and update e, such that the match is the range
 2497|       |    // [q,e).
 2498|  54.9k|    uint32_t e = *matchResult;
 2499|       |    // i. If e = p, set q to q + 1.
 2500|  54.9k|    if (e == p) {
  ------------------
  |  Branch (2500:9): [True: 0, False: 54.9k]
  ------------------
 2501|       |      // The end of this match is the same as the end of the last match,
 2502|       |      // so we matched with the empty string.
 2503|       |      // We don't want to match the empty string at this location again,
 2504|       |      // so increment q in order to start the next search at the next position.
 2505|      0|      q++;
 2506|      0|    }
 2507|       |    // ii. Else,
 2508|  54.9k|    else {
 2509|       |      // Found a non-empty string match.
 2510|       |      // Add everything from the last match to the current one to A.
 2511|       |      // This has length q-p because q is the start of the current match,
 2512|       |      // and p was the end (exclusive) of the last match.
 2513|       |
 2514|       |      // 1. Let T be the String value equal to the substring of S consisting of
 2515|       |      // the code units at indices p (inclusive) through q (exclusive).
 2516|  54.9k|      auto strRes = StringPrimitive::slice(runtime, S, p, q - p);
 2517|  54.9k|      if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  54.9k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 54.9k]
  |  |  ------------------
  ------------------
 2518|      0|        return ExecutionStatus::EXCEPTION;
 2519|      0|      }
 2520|  54.9k|      tmpHandle = *strRes;
 2521|       |      // 2. Perform ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T)
 2522|  54.9k|      JSArray::setElementAt(A, runtime, lengthA, tmpHandle);
 2523|       |      // 3. Set lengthA to lengthA + 1.
 2524|  54.9k|      ++lengthA;
 2525|       |
 2526|       |      // 4. If lengthA = lim, return A.
 2527|  54.9k|      if (lengthA == lim) {
  ------------------
  |  Branch (2527:11): [True: 0, False: 54.9k]
  ------------------
 2528|       |        // Reached the limit, return early.
 2529|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2530|      0|                JSArray::setLengthProperty(A, runtime, lengthA) ==
 2531|      0|                ExecutionStatus::EXCEPTION))
 2532|      0|          return ExecutionStatus::EXCEPTION;
 2533|      0|        return A.getHermesValue();
 2534|      0|      }
 2535|       |      // 5. Set p to e.
 2536|       |      // Update p to point to the end of this match, maintaining the
 2537|       |      // invariant that it points to the end of the last match encountered.
 2538|  54.9k|      p = e;
 2539|       |      // 6. Set q to p.
 2540|       |      // Start position of the next search is updated to the end of this match.
 2541|  54.9k|      q = p;
 2542|  54.9k|    }
 2543|  54.9k|  }
 2544|       |
 2545|       |  // 15. Let T be the String value equal to the substring of S consisting of the
 2546|       |  // code units at indices p (inclusive) through s (exclusive).
 2547|       |  // Add the rest of the string (after the last match) to A.
 2548|      3|  auto elementStrRes = StringPrimitive::slice(runtime, S, p, s - p);
 2549|      3|  if (LLVM_UNLIKELY(elementStrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2550|      0|    return ExecutionStatus::EXCEPTION;
 2551|      0|  }
 2552|      3|  tmpHandle = *elementStrRes;
 2553|       |  // 16. Perform ! CreateDataPropertyOrThrow(A, ! ToString(lengthA), T).
 2554|      3|  JSArray::setElementAt(A, runtime, lengthA, tmpHandle);
 2555|      3|  ++lengthA;
 2556|       |
 2557|      3|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
 2558|      3|          JSArray::setLengthProperty(A, runtime, lengthA) ==
 2559|      3|          ExecutionStatus::EXCEPTION))
 2560|      0|    return ExecutionStatus::EXCEPTION;
 2561|       |
 2562|       |  // 27. Return A.
 2563|      3|  return A.getHermesValue();
 2564|      3|}
String.cpp:_ZN6hermes2vmL10splitMatchERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEEjS5_:
 2314|  54.9k|    Handle<StringPrimitive> R) {
 2315|       |  // 2. Let r be the number of code units in R.
 2316|  54.9k|  auto r = R->getStringLength();
 2317|       |  // 3. Let s be the number of code units in S.
 2318|  54.9k|  auto s = S->getStringLength();
 2319|       |  // 4. If q+r > s, return false.
 2320|  54.9k|  if (q + r > s) {
  ------------------
  |  Branch (2320:7): [True: 0, False: 54.9k]
  ------------------
 2321|      0|    return llvh::None;
 2322|      0|  }
 2323|       |
 2324|       |  // Handle the case where the search starts at the end of the string and R is
 2325|       |  // the empty string. This path should only be triggered when S is itself the
 2326|       |  // empty string.
 2327|  54.9k|  if (q == s) {
  ------------------
  |  Branch (2327:7): [True: 0, False: 54.9k]
  ------------------
 2328|      0|    return q;
 2329|      0|  }
 2330|       |
 2331|  54.9k|  auto SStr = StringPrimitive::createStringView(runtime, S);
 2332|  54.9k|  auto RStr = StringPrimitive::createStringView(runtime, R);
 2333|       |
 2334|  54.9k|  auto sliced = SStr.slice(q);
 2335|  54.9k|  auto searchResult =
 2336|  54.9k|      std::search(sliced.begin(), sliced.end(), RStr.begin(), RStr.end());
 2337|       |
 2338|  54.9k|  if (searchResult != sliced.end()) {
  ------------------
  |  Branch (2338:7): [True: 54.9k, False: 3]
  ------------------
 2339|  54.9k|    return q + (searchResult - sliced.begin()) + r;
 2340|  54.9k|  }
 2341|      3|  return llvh::None;
 2342|  54.9k|}

_ZN6hermes2vm31populateStringIteratorPrototypeERNS0_7RuntimeE:
   21|     99|void populateStringIteratorPrototype(Runtime &runtime) {
   22|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.stringIteratorPrototype);
   23|       |
   24|     99|  defineMethod(
   25|     99|      runtime,
   26|     99|      proto,
   27|     99|      Predefined::getSymbolID(Predefined::next),
   28|     99|      nullptr,
   29|     99|      stringIteratorPrototypeNext,
   30|     99|      0);
   31|       |
   32|     99|  auto dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   33|     99|  dpf.writable = 0;
   34|     99|  dpf.enumerable = 0;
   35|     99|  defineProperty(
   36|     99|      runtime,
   37|     99|      proto,
   38|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   39|     99|      runtime.getPredefinedStringHandle(Predefined::StringIterator),
   40|     99|      dpf);
   41|     99|}

_ZN6hermes2vm23createSymbolConstructorERNS0_7RuntimeE:
   23|     99|Handle<JSObject> createSymbolConstructor(Runtime &runtime) {
   24|     99|  auto symbolPrototype = Handle<JSObject>::vmcast(&runtime.symbolPrototype);
   25|       |
   26|     99|  auto cons = defineSystemConstructor<JSSymbol>(
   27|     99|      runtime,
   28|     99|      Predefined::getSymbolID(Predefined::Symbol),
   29|     99|      symbolConstructor,
   30|     99|      symbolPrototype,
   31|     99|      0,
   32|     99|      CellKind::JSSymbolKind);
   33|       |
   34|     99|  defineMethod(
   35|     99|      runtime,
   36|     99|      cons,
   37|     99|      Predefined::getSymbolID(Predefined::predefinedFor),
   38|     99|      nullptr,
   39|     99|      symbolFor,
   40|     99|      1);
   41|     99|  defineMethod(
   42|     99|      runtime,
   43|     99|      cons,
   44|     99|      Predefined::getSymbolID(Predefined::keyFor),
   45|     99|      nullptr,
   46|     99|      symbolKeyFor,
   47|     99|      1);
   48|       |
   49|       |  // Well-known symbols.
   50|     99|  DefinePropertyFlags dpf{};
   51|     99|  dpf.writable = 0;
   52|     99|  dpf.enumerable = 0;
   53|     99|  dpf.configurable = 0;
   54|     99|  dpf.setWritable = 0;
   55|     99|  dpf.setEnumerable = 0;
   56|     99|  dpf.setConfigurable = 0;
   57|     99|  dpf.setValue = 1;
   58|       |
   59|     99|  defineProperty(
   60|     99|      runtime,
   61|     99|      cons,
   62|     99|      Predefined::getSymbolID(Predefined::hasInstance),
   63|     99|      runtime.makeHandle(
   64|     99|          Predefined::getSymbolID(Predefined::SymbolHasInstance)),
   65|     99|      dpf);
   66|     99|  defineProperty(
   67|     99|      runtime,
   68|     99|      cons,
   69|     99|      Predefined::getSymbolID(Predefined::iterator),
   70|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolIterator)),
   71|     99|      dpf);
   72|     99|  defineProperty(
   73|     99|      runtime,
   74|     99|      cons,
   75|     99|      Predefined::getSymbolID(Predefined::isConcatSpreadable),
   76|     99|      runtime.makeHandle(
   77|     99|          Predefined::getSymbolID(Predefined::SymbolIsConcatSpreadable)),
   78|     99|      dpf);
   79|     99|  defineProperty(
   80|     99|      runtime,
   81|     99|      cons,
   82|     99|      Predefined::getSymbolID(Predefined::toPrimitive),
   83|     99|      runtime.makeHandle(
   84|     99|          Predefined::getSymbolID(Predefined::SymbolToPrimitive)),
   85|     99|      dpf);
   86|     99|  defineProperty(
   87|     99|      runtime,
   88|     99|      cons,
   89|     99|      Predefined::getSymbolID(Predefined::toStringTag),
   90|     99|      runtime.makeHandle(
   91|     99|          Predefined::getSymbolID(Predefined::SymbolToStringTag)),
   92|     99|      dpf);
   93|       |
   94|     99|  defineProperty(
   95|     99|      runtime,
   96|     99|      cons,
   97|     99|      Predefined::getSymbolID(Predefined::match),
   98|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolMatch)),
   99|     99|      dpf);
  100|       |
  101|     99|  defineProperty(
  102|     99|      runtime,
  103|     99|      cons,
  104|     99|      Predefined::getSymbolID(Predefined::matchAll),
  105|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolMatchAll)),
  106|     99|      dpf);
  107|       |
  108|     99|  defineProperty(
  109|     99|      runtime,
  110|     99|      cons,
  111|     99|      Predefined::getSymbolID(Predefined::search),
  112|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSearch)),
  113|     99|      dpf);
  114|       |
  115|     99|  defineProperty(
  116|     99|      runtime,
  117|     99|      cons,
  118|     99|      Predefined::getSymbolID(Predefined::replace),
  119|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolReplace)),
  120|     99|      dpf);
  121|       |
  122|     99|  defineProperty(
  123|     99|      runtime,
  124|     99|      cons,
  125|     99|      Predefined::getSymbolID(Predefined::split),
  126|     99|      runtime.makeHandle(Predefined::getSymbolID(Predefined::SymbolSplit)),
  127|     99|      dpf);
  128|       |
  129|       |  // Symbol.prototype.xxx methods.
  130|     99|  void *ctx = nullptr;
  131|     99|  defineAccessor(
  132|     99|      runtime,
  133|     99|      symbolPrototype,
  134|     99|      Predefined::getSymbolID(Predefined::description),
  135|     99|      ctx,
  136|     99|      symbolPrototypeDescriptionGetter,
  137|     99|      nullptr,
  138|     99|      false,
  139|     99|      true);
  140|     99|  defineMethod(
  141|     99|      runtime,
  142|     99|      symbolPrototype,
  143|     99|      Predefined::getSymbolID(Predefined::toString),
  144|     99|      ctx,
  145|     99|      symbolPrototypeToString,
  146|     99|      0);
  147|     99|  defineMethod(
  148|     99|      runtime,
  149|     99|      symbolPrototype,
  150|     99|      Predefined::getSymbolID(Predefined::valueOf),
  151|     99|      ctx,
  152|     99|      symbolPrototypeValueOf,
  153|     99|      0);
  154|       |
  155|     99|  dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  156|     99|  dpf.writable = 0;
  157|     99|  dpf.enumerable = 0;
  158|     99|  defineProperty(
  159|     99|      runtime,
  160|     99|      symbolPrototype,
  161|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
  162|     99|      runtime.getPredefinedStringHandle(Predefined::Symbol),
  163|     99|      dpf);
  164|     99|  (void)defineMethod(
  165|     99|      runtime,
  166|     99|      symbolPrototype,
  167|     99|      Predefined::getSymbolID(Predefined::SymbolToPrimitive),
  168|     99|      Predefined::getSymbolID(Predefined::squareSymbolToPrimitive),
  169|     99|      nullptr,
  170|     99|      symbolPrototypeValueOf,
  171|     99|      1,
  172|     99|      dpf);
  173|       |
  174|     99|  return cons;
  175|     99|}

_ZN6hermes2vm31createTypedArrayBaseConstructorERNS0_7RuntimeE:
 1744|     99|Handle<JSObject> createTypedArrayBaseConstructor(Runtime &runtime) {
 1745|     99|  auto proto = Handle<JSObject>::vmcast(&runtime.typedArrayBasePrototype);
 1746|       |
 1747|       |  // Create NativeConstructor manually to avoid global object assignment.
 1748|       |  // Use NativeConstructor because %TypedArray% is supposed to be
 1749|       |  // a constructor function object, but must not be called directly with "new".
 1750|     99|  auto cons = runtime.makeHandle(NativeConstructor::create(
 1751|     99|      runtime,
 1752|     99|      Handle<JSObject>::vmcast(&runtime.functionPrototype),
 1753|     99|      nullptr,
 1754|     99|      typedArrayBaseConstructor,
 1755|     99|      0,
 1756|     99|      NativeConstructor::creatorFunction<JSObject>,
 1757|     99|      CellKind::JSObjectKind));
 1758|       |
 1759|       |  // Define %TypedArray%.prototype to be proto.
 1760|     99|  auto st = Callable::defineNameLengthAndPrototype(
 1761|     99|      cons,
 1762|     99|      runtime,
 1763|     99|      Predefined::getSymbolID(Predefined::TypedArray),
 1764|     99|      0,
 1765|     99|      proto,
 1766|     99|      Callable::WritablePrototype::No,
 1767|     99|      false);
 1768|     99|  (void)st;
 1769|     99|  assert(
 1770|     99|      st != ExecutionStatus::EXCEPTION &&
 1771|     99|      "defineNameLengthAndPrototype() failed");
 1772|       |
 1773|       |  // TypedArrayBase.prototype.xxx().
 1774|       |  // Accessors.
 1775|      0|  defineAccessor(
 1776|     99|      runtime,
 1777|     99|      proto,
 1778|     99|      Predefined::getSymbolID(Predefined::buffer),
 1779|     99|      nullptr,
 1780|     99|      typedArrayPrototypeBuffer,
 1781|     99|      nullptr,
 1782|     99|      false,
 1783|     99|      true);
 1784|     99|  defineAccessor(
 1785|     99|      runtime,
 1786|     99|      proto,
 1787|     99|      Predefined::getSymbolID(Predefined::byteLength),
 1788|     99|      nullptr,
 1789|     99|      typedArrayPrototypeByteLength,
 1790|     99|      nullptr,
 1791|     99|      false,
 1792|     99|      true);
 1793|     99|  defineAccessor(
 1794|     99|      runtime,
 1795|     99|      proto,
 1796|     99|      Predefined::getSymbolID(Predefined::byteOffset),
 1797|     99|      nullptr,
 1798|     99|      typedArrayPrototypeByteOffset,
 1799|     99|      nullptr,
 1800|     99|      false,
 1801|     99|      true);
 1802|     99|  defineAccessor(
 1803|     99|      runtime,
 1804|     99|      proto,
 1805|     99|      Predefined::getSymbolID(Predefined::length),
 1806|     99|      nullptr,
 1807|     99|      typedArrayPrototypeLength,
 1808|     99|      nullptr,
 1809|     99|      false,
 1810|     99|      true);
 1811|     99|  defineAccessor(
 1812|     99|      runtime,
 1813|     99|      proto,
 1814|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
 1815|     99|      Predefined::getSymbolID(Predefined::squareSymbolToStringTag),
 1816|     99|      nullptr,
 1817|     99|      typedArrayPrototypeSymbolToStringTag,
 1818|     99|      nullptr,
 1819|     99|      false,
 1820|     99|      true);
 1821|       |  // Methods.
 1822|     99|  defineMethod(
 1823|     99|      runtime,
 1824|     99|      proto,
 1825|     99|      Predefined::getSymbolID(Predefined::at),
 1826|     99|      nullptr,
 1827|     99|      typedArrayPrototypeAt,
 1828|     99|      1);
 1829|     99|  defineMethod(
 1830|     99|      runtime,
 1831|     99|      proto,
 1832|     99|      Predefined::getSymbolID(Predefined::copyWithin),
 1833|     99|      nullptr,
 1834|     99|      typedArrayPrototypeCopyWithin,
 1835|     99|      2);
 1836|     99|  defineMethod(
 1837|     99|      runtime,
 1838|     99|      proto,
 1839|     99|      Predefined::getSymbolID(Predefined::every),
 1840|     99|      (void *)true,
 1841|     99|      typedArrayPrototypeEverySome,
 1842|     99|      1);
 1843|     99|  defineMethod(
 1844|     99|      runtime,
 1845|     99|      proto,
 1846|     99|      Predefined::getSymbolID(Predefined::some),
 1847|     99|      (void *)false,
 1848|     99|      typedArrayPrototypeEverySome,
 1849|     99|      1);
 1850|     99|  defineMethod(
 1851|     99|      runtime,
 1852|     99|      proto,
 1853|     99|      Predefined::getSymbolID(Predefined::fill),
 1854|     99|      nullptr,
 1855|     99|      typedArrayPrototypeFill,
 1856|     99|      1);
 1857|     99|  defineMethod(
 1858|     99|      runtime,
 1859|     99|      proto,
 1860|     99|      Predefined::getSymbolID(Predefined::filter),
 1861|     99|      (void *)false,
 1862|     99|      typedArrayPrototypeMapFilter,
 1863|     99|      1);
 1864|     99|  defineMethod(
 1865|     99|      runtime,
 1866|     99|      proto,
 1867|     99|      Predefined::getSymbolID(Predefined::find),
 1868|     99|      (void *)false,
 1869|     99|      typedArrayPrototypeFind,
 1870|     99|      1);
 1871|     99|  defineMethod(
 1872|     99|      runtime,
 1873|     99|      proto,
 1874|     99|      Predefined::getSymbolID(Predefined::findIndex),
 1875|     99|      (void *)true,
 1876|     99|      typedArrayPrototypeFind,
 1877|     99|      1);
 1878|     99|  defineMethod(
 1879|     99|      runtime,
 1880|     99|      proto,
 1881|     99|      Predefined::getSymbolID(Predefined::findLast),
 1882|     99|      (void *)false,
 1883|     99|      typedArrayPrototypeFindLast,
 1884|     99|      1);
 1885|     99|  defineMethod(
 1886|     99|      runtime,
 1887|     99|      proto,
 1888|     99|      Predefined::getSymbolID(Predefined::findLastIndex),
 1889|     99|      (void *)true,
 1890|     99|      typedArrayPrototypeFindLast,
 1891|     99|      1);
 1892|     99|  defineMethod(
 1893|     99|      runtime,
 1894|     99|      proto,
 1895|     99|      Predefined::getSymbolID(Predefined::forEach),
 1896|     99|      nullptr,
 1897|     99|      typedArrayPrototypeForEach,
 1898|     99|      1);
 1899|     99|  defineMethod(
 1900|     99|      runtime,
 1901|     99|      proto,
 1902|     99|      Predefined::getSymbolID(Predefined::includes),
 1903|     99|      (void *)IndexOfMode::includes,
 1904|     99|      typedArrayPrototypeIndexOf,
 1905|     99|      1);
 1906|     99|  defineMethod(
 1907|     99|      runtime,
 1908|     99|      proto,
 1909|     99|      Predefined::getSymbolID(Predefined::indexOf),
 1910|     99|      (void *)IndexOfMode::indexOf,
 1911|     99|      typedArrayPrototypeIndexOf,
 1912|     99|      1);
 1913|     99|  defineMethod(
 1914|     99|      runtime,
 1915|     99|      proto,
 1916|     99|      Predefined::getSymbolID(Predefined::lastIndexOf),
 1917|     99|      (void *)IndexOfMode::lastIndexOf,
 1918|     99|      typedArrayPrototypeIndexOf,
 1919|     99|      1);
 1920|     99|  defineMethod(
 1921|     99|      runtime,
 1922|     99|      proto,
 1923|     99|      Predefined::getSymbolID(Predefined::join),
 1924|     99|      nullptr,
 1925|     99|      typedArrayPrototypeJoin,
 1926|     99|      1);
 1927|     99|  defineMethod(
 1928|     99|      runtime,
 1929|     99|      proto,
 1930|     99|      Predefined::getSymbolID(Predefined::map),
 1931|     99|      (void *)true,
 1932|     99|      typedArrayPrototypeMapFilter,
 1933|     99|      1);
 1934|     99|  defineMethod(
 1935|     99|      runtime,
 1936|     99|      proto,
 1937|     99|      Predefined::getSymbolID(Predefined::reduce),
 1938|     99|      (void *)false,
 1939|     99|      typedArrayPrototypeReduce,
 1940|     99|      1);
 1941|     99|  defineMethod(
 1942|     99|      runtime,
 1943|     99|      proto,
 1944|     99|      Predefined::getSymbolID(Predefined::reduceRight),
 1945|     99|      (void *)true,
 1946|     99|      typedArrayPrototypeReduce,
 1947|     99|      1);
 1948|     99|  defineMethod(
 1949|     99|      runtime,
 1950|     99|      proto,
 1951|     99|      Predefined::getSymbolID(Predefined::reverse),
 1952|     99|      nullptr,
 1953|     99|      typedArrayPrototypeReverse,
 1954|     99|      0);
 1955|     99|  defineMethod(
 1956|     99|      runtime,
 1957|     99|      proto,
 1958|     99|      Predefined::getSymbolID(Predefined::set),
 1959|     99|      nullptr,
 1960|     99|      typedArrayPrototypeSet,
 1961|     99|      1);
 1962|     99|  defineMethod(
 1963|     99|      runtime,
 1964|     99|      proto,
 1965|     99|      Predefined::getSymbolID(Predefined::slice),
 1966|     99|      nullptr,
 1967|     99|      typedArrayPrototypeSlice,
 1968|     99|      2);
 1969|     99|  defineMethod(
 1970|     99|      runtime,
 1971|     99|      proto,
 1972|     99|      Predefined::getSymbolID(Predefined::sort),
 1973|     99|      nullptr,
 1974|     99|      typedArrayPrototypeSort,
 1975|     99|      1);
 1976|     99|  defineMethod(
 1977|     99|      runtime,
 1978|     99|      proto,
 1979|     99|      Predefined::getSymbolID(Predefined::subarray),
 1980|     99|      nullptr,
 1981|     99|      typedArrayPrototypeSubarray,
 1982|     99|      2);
 1983|       |
 1984|     99|  defineMethod(
 1985|     99|      runtime,
 1986|     99|      proto,
 1987|     99|      Predefined::getSymbolID(Predefined::keys),
 1988|     99|      (void *)IterationKind::Key,
 1989|     99|      typedArrayPrototypeIterator,
 1990|     99|      0);
 1991|     99|  defineMethod(
 1992|     99|      runtime,
 1993|     99|      proto,
 1994|     99|      Predefined::getSymbolID(Predefined::values),
 1995|     99|      (void *)IterationKind::Value,
 1996|     99|      typedArrayPrototypeIterator,
 1997|     99|      0);
 1998|     99|  defineMethod(
 1999|     99|      runtime,
 2000|     99|      proto,
 2001|     99|      Predefined::getSymbolID(Predefined::entries),
 2002|     99|      (void *)IterationKind::Entry,
 2003|     99|      typedArrayPrototypeIterator,
 2004|     99|      0);
 2005|       |
 2006|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getNewNonEnumerableFlags();
 2007|       |
 2008|       |  // Use the same valuesMethod for Symbol.iterator.
 2009|     99|  {
 2010|     99|    auto propValue = runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
 2011|     99|        proto, runtime, Predefined::getSymbolID(Predefined::values)));
 2012|     99|    runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
 2013|     99|        proto,
 2014|     99|        runtime,
 2015|     99|        Predefined::getSymbolID(Predefined::SymbolIterator),
 2016|     99|        dpf,
 2017|     99|        runtime.makeHandle<NativeFunction>(propValue.getHermesValue())));
 2018|     99|  }
 2019|       |
 2020|     99|  {
 2021|     99|    auto propValue = runtime.ignoreAllocationFailure(JSObject::getNamed_RJS(
 2022|     99|        Handle<JSArray>::vmcast(&runtime.arrayPrototype),
 2023|     99|        runtime,
 2024|     99|        Predefined::getSymbolID(Predefined::toString)));
 2025|     99|    runtime.ignoreAllocationFailure(JSObject::defineOwnProperty(
 2026|     99|        proto,
 2027|     99|        runtime,
 2028|     99|        Predefined::getSymbolID(Predefined::toString),
 2029|     99|        dpf,
 2030|     99|        Handle<NativeFunction>::vmcast(
 2031|     99|            runtime.makeHandle(std::move(propValue)))));
 2032|     99|  }
 2033|       |
 2034|     99|  defineMethod(
 2035|     99|      runtime,
 2036|     99|      proto,
 2037|     99|      Predefined::getSymbolID(Predefined::toLocaleString),
 2038|     99|      nullptr,
 2039|     99|      typedArrayPrototypeToLocaleString,
 2040|     99|      0);
 2041|       |
 2042|       |  // TypedArrayBase.xxx
 2043|     99|  defineMethod(
 2044|     99|      runtime,
 2045|     99|      cons,
 2046|     99|      Predefined::getSymbolID(Predefined::from),
 2047|     99|      nullptr,
 2048|     99|      typedArrayFrom,
 2049|     99|      1);
 2050|       |
 2051|     99|  defineMethod(
 2052|     99|      runtime,
 2053|     99|      cons,
 2054|     99|      Predefined::getSymbolID(Predefined::of),
 2055|     99|      nullptr,
 2056|     99|      typedArrayOf,
 2057|     99|      0);
 2058|       |
 2059|     99|  return cons;
 2060|     99|}
_ZN6hermes2vm26createInt8ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm27createInt16ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm27createInt32ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm27createUint8ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm34createUint8ClampedArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm28createUint16ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm28createUint32ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm29createFloat32ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm29createFloat64ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm30createBigInt64ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
_ZN6hermes2vm31createBigUint64ArrayConstructorERNS0_7RuntimeE:
 2063|     99|  Handle<JSObject> create##name##ArrayConstructor(Runtime &runtime) { \
 2064|     99|    return createTypedArrayConstructor<                               \
 2065|     99|        type,                                                         \
 2066|     99|        CellKind::name##ArrayKind,                                    \
 2067|     99|        name##ArrayConstructor>(runtime);                             \
 2068|     99|  }
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIaLNS0_8CellKindE35EXadL_ZNS0_20Int8ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIsLNS0_8CellKindE36EXadL_ZNS0_21Int16ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIiLNS0_8CellKindE37EXadL_ZNS0_21Int32ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIhLNS0_8CellKindE38EXadL_ZNS0_21Uint8ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIhLNS0_8CellKindE39EXadL_ZNS0_28Uint8ClampedArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorItLNS0_8CellKindE40EXadL_ZNS0_22Uint16ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIjLNS0_8CellKindE41EXadL_ZNS0_22Uint32ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIfLNS0_8CellKindE42EXadL_ZNS0_23Float32ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIdLNS0_8CellKindE43EXadL_ZNS0_23Float64ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorIlLNS0_8CellKindE44EXadL_ZNS0_24BigInt64ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}
TypedArray.cpp:_ZN6hermes2vm12_GLOBAL__N_127createTypedArrayConstructorImLNS0_8CellKindE45EXadL_ZNS0_25BigUint64ArrayConstructorEPvRNS0_7RuntimeENS0_10NativeArgsEEEEENS0_6HandleINS0_8JSObjectEEES6_:
  260|     99|Handle<JSObject> createTypedArrayConstructor(Runtime &runtime) {
  261|     99|  using TA = JSTypedArray<T, C>;
  262|     99|  auto proto = TA::getPrototype(runtime);
  263|       |
  264|     99|  auto cons = defineSystemConstructor(
  265|     99|      runtime,
  266|     99|      TA::getName(runtime),
  267|     99|      Ctor,
  268|     99|      proto,
  269|     99|      Handle<JSObject>::vmcast(&runtime.typedArrayBaseConstructor),
  270|     99|      3,
  271|     99|      NativeConstructor::creatorFunction<TA>,
  272|     99|      C);
  273|       |
  274|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  275|     99|  dpf.enumerable = 0;
  276|     99|  dpf.configurable = 0;
  277|     99|  dpf.writable = 0;
  278|       |
  279|     99|  auto bytesPerElement =
  280|     99|      runtime.makeHandle(HermesValue::encodeNumberValue(sizeof(T)));
  281|       |  // %TypedArray%.prototype.xxx.
  282|     99|  defineProperty(
  283|     99|      runtime,
  284|     99|      proto,
  285|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  286|     99|      bytesPerElement,
  287|     99|      dpf);
  288|       |
  289|       |  // %TypedArray%.xxx.
  290|     99|  defineProperty(
  291|     99|      runtime,
  292|     99|      cons,
  293|     99|      Predefined::getSymbolID(Predefined::BYTES_PER_ELEMENT),
  294|     99|      bytesPerElement,
  295|     99|      dpf);
  296|     99|  return cons;
  297|     99|}

_ZN6hermes2vm24createWeakMapConstructorERNS0_7RuntimeE:
   17|     99|Handle<JSObject> createWeakMapConstructor(Runtime &runtime) {
   18|     99|  auto weakMapPrototype = Handle<JSObject>::vmcast(&runtime.weakMapPrototype);
   19|       |
   20|     99|  defineMethod(
   21|     99|      runtime,
   22|     99|      weakMapPrototype,
   23|     99|      Predefined::getSymbolID(Predefined::deleteStr),
   24|     99|      nullptr,
   25|     99|      weakMapPrototypeDelete,
   26|     99|      1);
   27|       |
   28|     99|  defineMethod(
   29|     99|      runtime,
   30|     99|      weakMapPrototype,
   31|     99|      Predefined::getSymbolID(Predefined::get),
   32|     99|      nullptr,
   33|     99|      weakMapPrototypeGet,
   34|     99|      1);
   35|       |
   36|     99|  defineMethod(
   37|     99|      runtime,
   38|     99|      weakMapPrototype,
   39|     99|      Predefined::getSymbolID(Predefined::has),
   40|     99|      nullptr,
   41|     99|      weakMapPrototypeHas,
   42|     99|      1);
   43|       |
   44|     99|  defineMethod(
   45|     99|      runtime,
   46|     99|      weakMapPrototype,
   47|     99|      Predefined::getSymbolID(Predefined::set),
   48|     99|      nullptr,
   49|     99|      weakMapPrototypeSet,
   50|     99|      2);
   51|       |
   52|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   53|     99|  dpf.writable = 0;
   54|     99|  dpf.enumerable = 0;
   55|     99|  defineProperty(
   56|     99|      runtime,
   57|     99|      weakMapPrototype,
   58|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   59|     99|      runtime.getPredefinedStringHandle(Predefined::WeakMap),
   60|     99|      dpf);
   61|       |
   62|     99|  auto cons = defineSystemConstructor<JSWeakMap>(
   63|     99|      runtime,
   64|     99|      Predefined::getSymbolID(Predefined::WeakMap),
   65|     99|      weakMapConstructor,
   66|     99|      weakMapPrototype,
   67|     99|      0,
   68|     99|      CellKind::JSWeakMapKind);
   69|       |
   70|       |  // ES6.0 23.3.3.1
   71|     99|  defineProperty(
   72|     99|      runtime,
   73|     99|      weakMapPrototype,
   74|     99|      Predefined::getSymbolID(Predefined::constructor),
   75|     99|      cons);
   76|       |
   77|     99|  return cons;
   78|     99|}

_ZN6hermes2vm24createWeakSetConstructorERNS0_7RuntimeE:
   17|     99|Handle<JSObject> createWeakSetConstructor(Runtime &runtime) {
   18|     99|  auto weakSetPrototype = Handle<JSObject>::vmcast(&runtime.weakSetPrototype);
   19|       |
   20|     99|  defineMethod(
   21|     99|      runtime,
   22|     99|      weakSetPrototype,
   23|     99|      Predefined::getSymbolID(Predefined::add),
   24|     99|      nullptr,
   25|     99|      weakSetPrototypeAdd,
   26|     99|      1);
   27|       |
   28|     99|  defineMethod(
   29|     99|      runtime,
   30|     99|      weakSetPrototype,
   31|     99|      Predefined::getSymbolID(Predefined::deleteStr),
   32|     99|      nullptr,
   33|     99|      weakSetPrototypeDelete,
   34|     99|      1);
   35|       |
   36|     99|  defineMethod(
   37|     99|      runtime,
   38|     99|      weakSetPrototype,
   39|     99|      Predefined::getSymbolID(Predefined::has),
   40|     99|      nullptr,
   41|     99|      weakSetPrototypeHas,
   42|     99|      1);
   43|       |
   44|     99|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
   45|     99|  dpf.writable = 0;
   46|     99|  dpf.enumerable = 0;
   47|     99|  defineProperty(
   48|     99|      runtime,
   49|     99|      weakSetPrototype,
   50|     99|      Predefined::getSymbolID(Predefined::SymbolToStringTag),
   51|     99|      runtime.getPredefinedStringHandle(Predefined::WeakSet),
   52|     99|      dpf);
   53|       |
   54|     99|  auto cons = defineSystemConstructor<JSWeakSet>(
   55|     99|      runtime,
   56|     99|      Predefined::getSymbolID(Predefined::WeakSet),
   57|     99|      weakSetConstructor,
   58|     99|      weakSetPrototype,
   59|     99|      0,
   60|     99|      CellKind::JSWeakSetKind);
   61|       |
   62|       |  // ES6.0 23.4.3.1
   63|     99|  defineProperty(
   64|     99|      runtime,
   65|     99|      weakSetPrototype,
   66|     99|      Predefined::getSymbolID(Predefined::constructor),
   67|     99|      cons);
   68|       |
   69|     99|  return cons;
   70|     99|}

_ZN6hermes2vm9encodeURIEPvRNS0_7RuntimeENS0_10NativeArgsE:
  233|    137|CallResult<HermesValue> encodeURI(void *, Runtime &runtime, NativeArgs args) {
  234|    137|  auto strRes = toString_RJS(runtime, args.getArgHandle(0));
  235|    137|  if (LLVM_UNLIKELY(strRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    137|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 137]
  |  |  ------------------
  ------------------
  236|      0|    return ExecutionStatus::EXCEPTION;
  237|      0|  }
  238|    137|  auto res =
  239|    137|      encode(runtime, runtime.makeHandle(std::move(*strRes)), unescapedURISet);
  240|    137|  if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (240:7): [True: 0, False: 137]
  ------------------
  241|      0|    return ExecutionStatus::EXCEPTION;
  242|    137|  return res->getHermesValue();
  243|    137|}
escape.cpp:_ZN6hermes2vmL9toHexCharEi:
   37|   482k|static inline char16_t toHexChar(int x) {
   38|   482k|  assert(0 <= x && x <= 15 && "toHexChar argument out of bounds");
   39|   482k|  if (0 <= x && x <= 9) {
  ------------------
  |  Branch (39:7): [True: 482k, False: 0]
  |  Branch (39:17): [True: 273k, False: 208k]
  ------------------
   40|   273k|    return x + u'0';
   41|   273k|  }
   42|   208k|  return x - 10 + u'A';
   43|   482k|}
escape.cpp:_ZN6hermes2vmL6encodeERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEEPFbDsE:
  182|    137|    CharSetFn unescapedSet) {
  183|    137|  auto str = StringPrimitive::createStringView(runtime, strHandle);
  184|    137|  auto strLen = str.length();
  185|    137|  SmallU16String<32> R{};
  186|    137|  R.reserve(strLen);
  187|   590k|  for (auto itr = str.begin(), e = str.end(); itr != e;) {
  ------------------
  |  Branch (187:47): [True: 590k, False: 137]
  ------------------
  188|       |    // Use int32_t to allow for arithmetic past 16 bits.
  189|   590k|    uint32_t C = *itr;
  190|   590k|    if (unescapedSet(C)) {
  ------------------
  |  Branch (190:9): [True: 360k, False: 229k]
  ------------------
  191|   360k|      R.push_back(C);
  192|   360k|    } else {
  193|   229k|      if (C >= 0xdc00 && C <= 0xdfff) {
  ------------------
  |  Branch (193:11): [True: 0, False: 229k]
  |  Branch (193:26): [True: 0, False: 0]
  ------------------
  194|      0|        return runtime.raiseURIError("Malformed encodeURI input");
  195|      0|      }
  196|       |      // Code point to convert to UTF8.
  197|   229k|      uint32_t V;
  198|   229k|      if (C < 0xd800 || C > 0xdbff) {
  ------------------
  |  Branch (198:11): [True: 229k, False: 45]
  |  Branch (198:25): [True: 0, False: 45]
  ------------------
  199|   229k|        V = C;
  200|   229k|      } else {
  201|     45|        ++itr;
  202|     45|        if (itr == e) {
  ------------------
  |  Branch (202:13): [True: 0, False: 45]
  ------------------
  203|      0|          return runtime.raiseURIError("Malformed encodeURI input");
  204|      0|        }
  205|     45|        uint32_t kChar = *itr;
  206|     45|        if (kChar < 0xdc00 || kChar > 0xdfff) {
  ------------------
  |  Branch (206:13): [True: 0, False: 45]
  |  Branch (206:31): [True: 0, False: 45]
  ------------------
  207|      0|          return runtime.raiseURIError("Malformed encodeURI input");
  208|      0|        }
  209|     45|        V = (C - 0xd800) * 0x400 + (kChar - 0xdc00) + 0x10000;
  210|     45|      }
  211|   229k|      char octets[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
  212|   229k|      char *targetStart = octets;
  213|   229k|      hermes::encodeUTF8(targetStart, V);
  214|       |      // Length of the octets array.
  215|   229k|      uint32_t L = targetStart - octets;
  216|   471k|      for (uint32_t j = 0; j < L; ++j) {
  ------------------
  |  Branch (216:28): [True: 241k, False: 229k]
  ------------------
  217|   241k|        auto jOctet = octets[j];
  218|   241k|        R.push_back(u'%');
  219|   241k|        R.push_back(toHexChar((jOctet >> 4) & 0xf));
  220|   241k|        R.push_back(toHexChar(jOctet & 0xf));
  221|   241k|      }
  222|   229k|    }
  223|   590k|    ++itr;
  224|   590k|  }
  225|       |
  226|    137|  auto finalStr = StringPrimitive::create(runtime, R);
  227|    137|  if (LLVM_UNLIKELY(finalStr == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    137|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 137]
  |  |  ------------------
  ------------------
  228|      0|    return ExecutionStatus::EXCEPTION;
  229|      0|  }
  230|    137|  return runtime.makeHandle<StringPrimitive>(*finalStr);
  231|    137|}
escape.cpp:_ZN6hermes2vmL15unescapedURISetEDs:
  167|   590k|static bool unescapedURISet(char16_t c) {
  168|   590k|  return uriReserved(c) || uriUnescaped(c) || c == '#';
  ------------------
  |  Branch (168:10): [True: 8.28k, False: 582k]
  |  Branch (168:28): [True: 352k, False: 229k]
  |  Branch (168:47): [True: 0, False: 229k]
  ------------------
  169|   590k|}
escape.cpp:_ZN6hermes2vmL11uriReservedEDs:
  161|   590k|static bool uriReserved(char16_t c) {
  162|   590k|  const UTF16Ref reserved = removeNullTerminator(u";/?:@&=+$,");
  163|   590k|  return std::find(reserved.begin(), reserved.end(), c) != reserved.end();
  164|   590k|}
escape.cpp:_ZN6hermes2vmL20removeNullTerminatorEN4llvh8ArrayRefIDsEE:
  139|  1.17M|static inline UTF16Ref removeNullTerminator(const UTF16Ref str) {
  140|  1.17M|  return str.slice(0, str.size() - 1);
  141|  1.17M|}
escape.cpp:_ZN6hermes2vmL12uriUnescapedEDs:
  147|   582k|static bool uriUnescaped(char16_t c) {
  148|   582k|  const UTF16Ref marks = removeNullTerminator(u"-_.!~*'()");
  149|   582k|  if (std::find(marks.begin(), marks.end(), c) != marks.end()) {
  ------------------
  |  Branch (149:7): [True: 21.7k, False: 560k]
  ------------------
  150|  21.7k|    return true;
  151|  21.7k|  }
  152|   560k|  if (u'0' <= c && c <= u'9') {
  ------------------
  |  Branch (152:7): [True: 341k, False: 219k]
  |  Branch (152:20): [True: 71.2k, False: 270k]
  ------------------
  153|  71.2k|    return true;
  154|  71.2k|  }
  155|       |  // Convert to lowercase and see if it's alphabetic.
  156|   489k|  c |= 32;
  157|   489k|  return u'a' <= c && c <= u'z';
  ------------------
  |  Branch (157:10): [True: 270k, False: 219k]
  |  Branch (157:23): [True: 259k, False: 10.8k]
  ------------------
  158|   560k|}

_ZN6hermes2vm5printEPvRNS0_7RuntimeENS0_10NativeArgsE:
   19|      5|CallResult<HermesValue> print(void *, Runtime &runtime, NativeArgs args) {
   20|      5|  GCScope scope(runtime);
   21|      5|  auto marker = scope.createMarker();
   22|      5|  bool first = true;
   23|       |
   24|  67.1k|  for (Handle<> arg : args.handles()) {
  ------------------
  |  Branch (24:21): [True: 67.1k, False: 5]
  ------------------
   25|  67.1k|    scope.flushToMarker(marker);
   26|  67.1k|    auto res = toString_RJS(runtime, arg);
   27|  67.1k|    if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (27:9): [True: 0, False: 67.1k]
  ------------------
   28|      0|      return ExecutionStatus::EXCEPTION;
   29|       |
   30|  67.1k|    if (!first)
  ------------------
  |  Branch (30:9): [True: 67.0k, False: 5]
  ------------------
   31|  67.0k|      llvh::outs() << " ";
   32|  67.1k|    SmallU16String<32> tmp;
   33|  67.1k|    llvh::outs() << StringPrimitive::createStringView(
   34|  67.1k|                        runtime, runtime.makeHandle(std::move(*res)))
   35|  67.1k|                        .getUTF16Ref(tmp);
   36|  67.1k|    first = false;
   37|  67.1k|  }
   38|       |
   39|      5|  llvh::outs() << "\n";
   40|      5|  llvh::outs().flush();
   41|      5|  return HermesValue::encodeUndefinedValue();
   42|      5|}

_ZN6hermes2vm9JSMapImplILNS0_8CellKindE47EE17MapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   22|      1|    Metadata::Builder &mb) {
   23|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSMapImpl<C>>());
   24|      1|  JSObjectBuildMeta(cell, mb);
   25|      1|  const auto *self = static_cast<const JSMapImpl<C> *>(cell);
   26|      1|  mb.addField("storage", &self->storage_);
   27|      1|}
_ZN6hermes2vm9JSMapImplILNS0_8CellKindE48EE17MapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   22|      1|    Metadata::Builder &mb) {
   23|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSMapImpl<C>>());
   24|      1|  JSObjectBuildMeta(cell, mb);
   25|      1|  const auto *self = static_cast<const JSMapImpl<C> *>(cell);
   26|      1|  mb.addField("storage", &self->storage_);
   27|      1|}
_ZN6hermes2vm17JSMapIteratorImplILNS0_8CellKindE50EE25MapOrSetIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   72|      1|    Metadata::Builder &mb) {
   73|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSMapIteratorImpl<C>>());
   74|      1|  JSObjectBuildMeta(cell, mb);
   75|      1|  const auto *self = static_cast<const JSMapIteratorImpl<C> *>(cell);
   76|      1|  mb.addField("data", &self->data_);
   77|      1|  mb.addField("itr", &self->itr_);
   78|      1|}
_ZN6hermes2vm17JSMapIteratorImplILNS0_8CellKindE49EE25MapOrSetIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   72|      1|    Metadata::Builder &mb) {
   73|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSMapIteratorImpl<C>>());
   74|      1|  JSObjectBuildMeta(cell, mb);
   75|      1|  const auto *self = static_cast<const JSMapIteratorImpl<C> *>(cell);
   76|      1|  mb.addField("data", &self->data_);
   77|      1|  mb.addField("itr", &self->itr_);
   78|      1|}
_ZN6hermes2vm14JSMapBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   29|      1|void JSMapBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   30|      1|  JSMap::MapOrSetBuildMeta(cell, mb);
   31|      1|  mb.setVTable(&JSMap::vt);
   32|      1|}
_ZN6hermes2vm14JSSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   34|      1|void JSSetBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   35|      1|  JSSet::MapOrSetBuildMeta(cell, mb);
   36|      1|  mb.setVTable(&JSSet::vt);
   37|      1|}
_ZN6hermes2vm22JSMapIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   80|      1|void JSMapIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   81|      1|  JSMapIterator::MapOrSetIteratorBuildMeta(cell, mb);
   82|      1|  mb.setVTable(&JSMapIterator::vt);
   83|      1|}
_ZN6hermes2vm22JSSetIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   85|      1|void JSSetIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   86|      1|  JSSetIterator::MapOrSetIteratorBuildMeta(cell, mb);
   87|      1|  mb.setVTable(&JSSetIterator::vt);
   88|      1|}

_ZN6hermes2vm17JSObjectBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   55|     51|void JSObjectBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   56|       |  // This call is just for debugging and consistency purposes.
   57|     51|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSObject>());
   58|       |
   59|     51|  const auto *self = static_cast<const JSObject *>(cell);
   60|     51|  mb.setVTable(&JSObject::vt);
   61|     51|  mb.addField("parent", &self->parent_);
   62|     51|  mb.addField("class", &self->clazz_);
   63|     51|  mb.addField("propStorage", &self->propStorage_);
   64|       |
   65|       |  // Declare the direct properties.
   66|     51|  static const char *directPropName[JSObject::DIRECT_PROPERTY_SLOTS] = {
   67|     51|      "directProp0",
   68|     51|      "directProp1",
   69|     51|      "directProp2",
   70|     51|      "directProp3",
   71|     51|      "directProp4"};
   72|     51|  for (unsigned i = mb.getJSObjectOverlapSlots();
   73|    149|       i < JSObject::DIRECT_PROPERTY_SLOTS;
  ------------------
  |  Branch (73:8): [True: 98, False: 51]
  ------------------
   74|     98|       ++i) {
   75|     98|    mb.addField(directPropName[i], self->directProps() + i);
   76|     98|  }
   77|     51|}
_ZN6hermes2vm8JSObject6createERNS0_7RuntimeENS0_6HandleIS1_EE:
   81|  10.9k|    Handle<JSObject> parentHandle) {
   82|  10.9k|  auto *cell = runtime.makeAFixed<JSObject>(
   83|  10.9k|      runtime,
   84|  10.9k|      parentHandle,
   85|  10.9k|      runtime.getHiddenClassForPrototype(
   86|  10.9k|          *parentHandle, numOverlapSlots<JSObject>()),
   87|  10.9k|      GCPointerBase::NoBarriers());
   88|  10.9k|  return JSObjectInit::initToPseudoHandle(runtime, cell);
   89|  10.9k|}
_ZN6hermes2vm8JSObject6createERNS0_7RuntimeE:
   91|  6.62k|PseudoHandle<JSObject> JSObject::create(Runtime &runtime) {
   92|  6.62k|  return create(runtime, Handle<JSObject>::vmcast(&runtime.objectPrototype));
   93|  6.62k|}
_ZN6hermes2vm8JSObject6createERNS0_7RuntimeEj:
   97|    877|    unsigned propertyCount) {
   98|    877|  auto self = create(runtime);
   99|       |
  100|    877|  return runtime.ignoreAllocationFailure(
  101|    877|      JSObject::allocatePropStorage(std::move(self), runtime, propertyCount));
  102|    877|}
_ZN6hermes2vm8JSObject6createERNS0_7RuntimeENS0_6HandleINS0_11HiddenClassEEE:
  106|    877|    Handle<HiddenClass> clazz) {
  107|    877|  auto obj = JSObject::create(runtime, clazz->getNumProperties());
  108|    877|  obj->clazz_.setNonNull(runtime, *clazz, runtime.getHeap());
  109|       |  // If the hidden class has index like property, we need to clear the fast path
  110|       |  // flag.
  111|    877|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|    877|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 877]
  |  |  ------------------
  ------------------
  112|    877|          obj->clazz_.getNonNull(runtime)->getHasIndexLikeProperties()))
  113|      0|    obj->flags_.fastIndexProperties = false;
  114|    877|  return obj;
  115|    877|}
_ZN6hermes2vm8JSObject20initializeLazyObjectERNS0_7RuntimeENS0_6HandleIS1_EE:
  128|    222|    Handle<JSObject> lazyObject) {
  129|    222|  assert(lazyObject->flags_.lazyObject && "object must be lazy");
  130|       |  // object is now assumed to be a regular object.
  131|      0|  lazyObject->flags_.lazyObject = 0;
  132|       |
  133|       |  // only functions can be lazy.
  134|    222|  assert(vmisa<Callable>(lazyObject.get()) && "unexpected lazy object");
  135|      0|  Callable::defineLazyProperties(Handle<Callable>::vmcast(lazyObject), runtime);
  136|    222|}
_ZN6hermes2vm8JSObject9setParentEPS1_RNS0_7RuntimeES2_NS0_11PropOpFlagsE:
  183|     99|    PropOpFlags opFlags) {
  184|     99|  if (LLVM_UNLIKELY(self->isProxyObject())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  185|      0|    return proxyOpFlags(
  186|      0|        runtime,
  187|      0|        opFlags,
  188|      0|        "Object is not extensible.",
  189|      0|        JSProxy::setPrototypeOf(
  190|      0|            runtime.makeHandle(self), runtime, runtime.makeHandle(parent)));
  191|      0|  }
  192|       |  // ES9 9.1.2
  193|       |  // 4.
  194|     99|  if (self->parent_.get(runtime) == parent)
  ------------------
  |  Branch (194:7): [True: 0, False: 99]
  ------------------
  195|      0|    return true;
  196|       |  // 5.
  197|     99|  if (!self->isExtensible()) {
  ------------------
  |  Branch (197:7): [True: 0, False: 99]
  ------------------
  198|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (198:9): [True: 0, False: 0]
  ------------------
  199|      0|      return runtime.raiseTypeError("Object is not extensible.");
  200|      0|    } else {
  201|      0|      return false;
  202|      0|    }
  203|      0|  }
  204|       |  // 6-8. Check for a prototype cycle.
  205|    198|  for (JSObject *cur = parent; cur; cur = cur->parent_.get(runtime)) {
  ------------------
  |  Branch (205:32): [True: 99, False: 99]
  ------------------
  206|     99|    if (cur == self) {
  ------------------
  |  Branch (206:9): [True: 0, False: 99]
  ------------------
  207|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (207:11): [True: 0, False: 0]
  ------------------
  208|      0|        return runtime.raiseTypeError("Prototype cycle detected");
  209|      0|      } else {
  210|      0|        return false;
  211|      0|      }
  212|     99|    } else if (LLVM_UNLIKELY(cur->isProxyObject())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  213|       |      // TODO this branch should also be used for module namespace and
  214|       |      // immutable prototype exotic objects.
  215|      0|      break;
  216|      0|    }
  217|     99|  }
  218|       |  // 9.
  219|     99|  self->parent_.set(runtime, parent, runtime.getHeap());
  220|       |  // 10.
  221|     99|  return true;
  222|     99|}
_ZN6hermes2vm8JSObject22allocateNewSlotStorageENS0_6HandleIS1_EERNS0_7RuntimeEjNS2_INS0_11HermesValueEEE:
  228|   300k|    Handle<> valueHandle) {
  229|       |  // If it is a direct property, just store the value and we are done.
  230|   300k|  if (LLVM_LIKELY(newSlotIndex < DIRECT_PROPERTY_SLOTS)) {
  ------------------
  |  |  188|   300k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 24.8k, False: 276k]
  |  |  ------------------
  ------------------
  231|  24.8k|    auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
  232|  24.8k|    selfHandle->directProps()[newSlotIndex].set(shv, runtime.getHeap());
  233|  24.8k|    return;
  234|  24.8k|  }
  235|       |
  236|       |  // Make the slot index relative to the indirect storage.
  237|   276k|  newSlotIndex -= DIRECT_PROPERTY_SLOTS;
  238|       |
  239|       |  // Allocate a new property storage if not already allocated.
  240|   276k|  if (LLVM_UNLIKELY(!selfHandle->propStorage_)) {
  ------------------
  |  |  189|   276k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 48.8k, False: 227k]
  |  |  ------------------
  ------------------
  241|       |    // Allocate new storage.
  242|  48.8k|    assert(newSlotIndex == 0 && "allocated slot must be at end");
  243|      0|    auto arrRes = runtime.ignoreAllocationFailure(
  244|  48.8k|        PropStorage::create(runtime, DEFAULT_PROPERTY_CAPACITY));
  245|  48.8k|    selfHandle->propStorage_.setNonNull(
  246|  48.8k|        runtime, vmcast<PropStorage>(arrRes), runtime.getHeap());
  247|   227k|  } else if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   227k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 5.76k, False: 221k]
  |  |  ------------------
  ------------------
  248|   227k|                 newSlotIndex >=
  249|   227k|                 selfHandle->propStorage_.getNonNull(runtime)->capacity())) {
  250|       |    // Reallocate the existing one.
  251|  5.76k|    assert(
  252|  5.76k|        newSlotIndex == selfHandle->propStorage_.getNonNull(runtime)->size() &&
  253|  5.76k|        "allocated slot must be at end");
  254|      0|    auto hnd = runtime.makeMutableHandle(selfHandle->propStorage_);
  255|  5.76k|    PropStorage::resize(hnd, runtime, newSlotIndex + 1);
  256|  5.76k|    selfHandle->propStorage_.setNonNull(runtime, *hnd, runtime.getHeap());
  257|  5.76k|  }
  258|       |
  259|      0|  {
  260|   276k|    NoAllocScope scope{runtime};
  261|   276k|    auto *const propStorage = selfHandle->propStorage_.getNonNull(runtime);
  262|   276k|    if (newSlotIndex >= propStorage->size()) {
  ------------------
  |  Branch (262:9): [True: 270k, False: 5.76k]
  ------------------
  263|   270k|      assert(
  264|   270k|          newSlotIndex == propStorage->size() &&
  265|   270k|          "allocated slot must be at end");
  266|      0|      PropStorage::resizeWithinCapacity(propStorage, runtime, newSlotIndex + 1);
  267|   270k|    }
  268|   276k|  }
  269|       |  // This must be done after the call to resizeWithinCapacity, since
  270|       |  // encodeHermesValue may allocate and cause the ArrayStorage to be trimmed.
  271|      0|  auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
  272|       |  // If we don't need to resize, just store it directly.
  273|   276k|  selfHandle->propStorage_.getNonNull(runtime)->set(
  274|   276k|      newSlotIndex, shv, runtime.getHeap());
  275|   276k|}
_ZN6hermes2vm8JSObject25getNamedPropertyValue_RJSENS0_6HandleIS1_EERNS0_7RuntimeES3_NS0_23NamedPropertyDescriptorE:
  281|     99|    NamedPropertyDescriptor desc) {
  282|     99|  if (LLVM_LIKELY(!desc.flags.accessor))
  ------------------
  |  |  188|     99|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 0]
  |  |  ------------------
  ------------------
  283|     99|    return getNamedSlotValue(propObj, runtime, desc);
  284|       |
  285|       |  // It's now valid to use the Internal variant because we know it's an
  286|       |  // accessor.
  287|      0|  auto *accessor = vmcast<PropertyAccessor>(
  288|      0|      getNamedSlotValueUnsafe(propObj.get(), runtime, desc).getObject(runtime));
  289|      0|  if (!accessor->getter)
  ------------------
  |  Branch (289:7): [True: 0, False: 0]
  ------------------
  290|      0|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
  291|       |
  292|       |  // Execute the accessor on this object.
  293|      0|  return accessor->getter.getNonNull(runtime)->executeCall0(
  294|      0|      runtime.makeHandle(accessor->getter), runtime, selfHandle);
  295|      0|}
_ZN6hermes2vm8JSObject24getNamedDescriptorUnsafeENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsERNS0_23NamedPropertyDescriptorE:
  872|   416k|    NamedPropertyDescriptor &desc) {
  873|   416k|  if (findProperty(selfHandle, runtime, name, expectedFlags, desc))
  ------------------
  |  Branch (873:7): [True: 5.46k, False: 411k]
  ------------------
  874|  5.46k|    return *selfHandle;
  875|       |
  876|       |  // Check here for host object flag.  This means that "normal" own
  877|       |  // properties above win over host-defined properties, but there's no
  878|       |  // cost imposed on own property lookups.  This should do what we
  879|       |  // need in practice, and we can define host vs js property
  880|       |  // disambiguation however we want.  This is here in order to avoid
  881|       |  // impacting perf for the common case where an own property exists
  882|       |  // in normal storage.
  883|   411k|  if (LLVM_UNLIKELY(selfHandle->flags_.hostObject)) {
  ------------------
  |  |  189|   411k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 411k]
  |  |  ------------------
  ------------------
  884|      0|    desc.flags.hostObject = true;
  885|      0|    desc.flags.writable = true;
  886|      0|    desc.slot = name.unsafeGetRaw();
  887|      0|    return *selfHandle;
  888|      0|  }
  889|       |
  890|   411k|  if (LLVM_UNLIKELY(selfHandle->flags_.lazyObject)) {
  ------------------
  |  |  189|   411k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 222, False: 410k]
  |  |  ------------------
  ------------------
  891|    222|    assert(
  892|    222|        !selfHandle->flags_.proxyObject &&
  893|    222|        "Proxy objects should never be lazy");
  894|       |    // Initialize the object and perform the lookup again.
  895|      0|    JSObject::initializeLazyObject(runtime, selfHandle);
  896|       |
  897|    222|    if (findProperty(selfHandle, runtime, name, expectedFlags, desc))
  ------------------
  |  Branch (897:9): [True: 0, False: 222]
  ------------------
  898|      0|      return *selfHandle;
  899|    222|  }
  900|       |
  901|   411k|  if (LLVM_UNLIKELY(selfHandle->flags_.proxyObject)) {
  ------------------
  |  |  189|   411k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 411k]
  |  |  ------------------
  ------------------
  902|      0|    desc.flags.proxyObject = true;
  903|      0|    desc.slot = name.unsafeGetRaw();
  904|      0|    return *selfHandle;
  905|      0|  }
  906|       |
  907|   411k|  if (selfHandle->parent_) {
  ------------------
  |  Branch (907:7): [True: 411k, False: 0]
  ------------------
  908|   411k|    MutableHandle<JSObject> mutableSelfHandle{
  909|   411k|        runtime, selfHandle->parent_.getNonNull(runtime)};
  910|       |
  911|   414k|    do {
  912|       |      // Check the most common case first, at the cost of some code duplication.
  913|   414k|      if (LLVM_LIKELY(
  ------------------
  |  |  188|  1.65M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 414k, False: 0]
  |  |  |  Branch (188:51): [True: 414k, False: 0]
  |  |  |  Branch (188:51): [True: 414k, False: 0]
  |  |  |  Branch (188:51): [True: 414k, False: 0]
  |  |  ------------------
  ------------------
  914|   414k|              !mutableSelfHandle->flags_.lazyObject &&
  915|   414k|              !mutableSelfHandle->flags_.hostObject &&
  916|   414k|              !mutableSelfHandle->flags_.proxyObject)) {
  917|   414k|      findProp:
  918|   414k|        if (findProperty(
  ------------------
  |  Branch (918:13): [True: 407k, False: 7.43k]
  ------------------
  919|   414k|                mutableSelfHandle,
  920|   414k|                runtime,
  921|   414k|                name,
  922|   414k|                PropertyFlags::invalid(),
  923|   414k|                desc)) {
  924|   407k|          assert(
  925|   407k|              !selfHandle->flags_.proxyObject &&
  926|   407k|              "Proxy object parents should never have own properties");
  927|      0|          return *mutableSelfHandle;
  928|   407k|        }
  929|   414k|      } else if (LLVM_UNLIKELY(mutableSelfHandle->flags_.lazyObject)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  930|      0|        JSObject::initializeLazyObject(runtime, mutableSelfHandle);
  931|      0|        goto findProp;
  932|      0|      } else if (LLVM_UNLIKELY(mutableSelfHandle->flags_.hostObject)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  933|      0|        desc.flags.hostObject = true;
  934|      0|        desc.flags.writable = true;
  935|      0|        desc.slot = name.unsafeGetRaw();
  936|      0|        return *mutableSelfHandle;
  937|      0|      } else {
  938|      0|        assert(
  939|      0|            mutableSelfHandle->flags_.proxyObject &&
  940|      0|            "descriptor flags are impossible");
  941|      0|        desc.flags.proxyObject = true;
  942|      0|        desc.slot = name.unsafeGetRaw();
  943|      0|        return *mutableSelfHandle;
  944|      0|      }
  945|   414k|    } while ((mutableSelfHandle = mutableSelfHandle->parent_.get(runtime)));
  ------------------
  |  Branch (945:14): [True: 3.58k, False: 3.85k]
  ------------------
  946|   411k|  }
  947|       |
  948|  3.85k|  return nullptr;
  949|   411k|}
_ZN6hermes2vm8JSObject30getComputedPrimitiveDescriptorENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEERNS0_13MutableHandleIS1_EERNS8_INS0_8SymbolIDEEERNS0_26ComputedPropertyDescriptorE:
  957|  67.8k|    ComputedPropertyDescriptor &desc) {
  958|  67.8k|  assert(
  959|  67.8k|      !nameValHandle->isObject() &&
  960|  67.8k|      "nameValHandle passed to "
  961|  67.8k|      "getComputedPrimitiveDescriptor cannot "
  962|  67.8k|      "be an object");
  963|       |
  964|      0|  propObj = selfHandle.get();
  965|       |
  966|  67.8k|  SymbolID id{};
  967|       |
  968|  67.8k|  GCScopeMarkerRAII marker{runtime};
  969|  68.7k|  do {
  970|       |    // A proxy is ignored here so we can check the bit later and
  971|       |    // return it back to the caller for additional processing.
  972|       |
  973|  68.7k|    Handle<JSObject> loopHandle = propObj;
  974|       |
  975|  68.7k|    CallResult<bool> res = getOwnComputedPrimitiveDescriptorImpl(
  976|  68.7k|        loopHandle,
  977|  68.7k|        runtime,
  978|  68.7k|        nameValHandle,
  979|  68.7k|        IgnoreProxy::Yes,
  980|  68.7k|        id,
  981|  68.7k|        tmpSymbolStorage,
  982|  68.7k|        desc);
  983|  68.7k|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  68.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 68.7k]
  |  |  ------------------
  ------------------
  984|      0|      return ExecutionStatus::EXCEPTION;
  985|      0|    }
  986|  68.7k|    if (*res) {
  ------------------
  |  Branch (986:9): [True: 67.3k, False: 1.46k]
  ------------------
  987|  67.3k|      return ExecutionStatus::RETURNED;
  988|  67.3k|    }
  989|       |
  990|  1.46k|    if (LLVM_UNLIKELY(propObj->flags_.hostObject)) {
  ------------------
  |  |  189|  1.46k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.46k]
  |  |  ------------------
  ------------------
  991|      0|      desc.flags.hostObject = true;
  992|      0|      desc.flags.writable = true;
  993|      0|      desc.slot = id.unsafeGetRaw();
  994|      0|      tmpSymbolStorage = id;
  995|      0|      return ExecutionStatus::RETURNED;
  996|      0|    }
  997|  1.46k|    if (LLVM_UNLIKELY(propObj->flags_.proxyObject)) {
  ------------------
  |  |  189|  1.46k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 1.46k]
  |  |  ------------------
  ------------------
  998|      0|      desc.flags.proxyObject = true;
  999|      0|      desc.slot = id.unsafeGetRaw();
 1000|      0|      tmpSymbolStorage = id;
 1001|      0|      return ExecutionStatus::RETURNED;
 1002|      0|    }
 1003|       |    // This isn't a proxy, so use the faster getParent() instead of
 1004|       |    // getPrototypeOf.
 1005|  1.46k|    propObj = propObj->getParent(runtime);
 1006|       |    // Flush at the end of the loop to allow first iteration to be as fast as
 1007|       |    // possible.
 1008|  1.46k|    marker.flush();
 1009|  1.46k|  } while (propObj);
  ------------------
  |  Branch (1009:12): [True: 955, False: 513]
  ------------------
 1010|    513|  return ExecutionStatus::RETURNED;
 1011|  67.8k|}
_ZN6hermes2vm8JSObject24getNamedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEENS0_11PropOpFlagsEPNS0_18PropertyCacheEntryE:
 1034|   412k|    PropertyCacheEntry *cacheEntry) {
 1035|   412k|  NamedPropertyDescriptor desc;
 1036|       |  // Locate the descriptor. propObj contains the object which may be anywhere
 1037|       |  // along the prototype chain.
 1038|   412k|  JSObject *propObj = getNamedDescriptorUnsafe(selfHandle, runtime, name, desc);
 1039|   412k|  if (!propObj) {
  ------------------
  |  Branch (1039:7): [True: 46, False: 412k]
  ------------------
 1040|     46|    if (LLVM_UNLIKELY(opFlags.getMustExist())) {
  ------------------
  |  |  189|     46|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 20, False: 26]
  |  |  ------------------
  ------------------
 1041|     20|      return runtime.raiseReferenceError(
 1042|     20|          TwineChar16("Property '") +
 1043|     20|          runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1044|     20|          "' doesn't exist");
 1045|     20|    }
 1046|     26|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1047|     46|  }
 1048|       |
 1049|   412k|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  1.64M|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 410k, False: 1.88k]
  |  |  |  Branch (188:51): [True: 410k, False: 1.88k]
  |  |  |  Branch (188:51): [True: 410k, False: 0]
  |  |  |  Branch (188:51): [True: 410k, False: 0]
  |  |  ------------------
  ------------------
 1050|   412k|          !desc.flags.accessor && !desc.flags.hostObject &&
 1051|   412k|          !desc.flags.proxyObject)) {
 1052|       |    // Populate the cache if requested.
 1053|   410k|    if (cacheEntry && !propObj->getClass(runtime)->isDictionaryNoCache()) {
  ------------------
  |  Branch (1053:9): [True: 198, False: 410k]
  |  Branch (1053:23): [True: 198, False: 0]
  ------------------
 1054|    198|      cacheEntry->clazz = propObj->getClassGCPtr();
 1055|    198|      cacheEntry->slot = desc.slot;
 1056|    198|    }
 1057|   410k|    return createPseudoHandle(
 1058|   410k|        getNamedSlotValueUnsafe(propObj, runtime, desc).unboxToHV(runtime));
 1059|   410k|  }
 1060|       |
 1061|  1.88k|  if (desc.flags.accessor) {
  ------------------
  |  Branch (1061:7): [True: 1.88k, False: 0]
  ------------------
 1062|  1.88k|    auto *accessor = vmcast<PropertyAccessor>(
 1063|  1.88k|        getNamedSlotValueUnsafe(propObj, runtime, desc).getPointer(runtime));
 1064|  1.88k|    if (!accessor->getter)
  ------------------
  |  Branch (1064:9): [True: 0, False: 1.88k]
  ------------------
 1065|      0|      return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1066|       |
 1067|       |    // Execute the accessor on this object.
 1068|  1.88k|    return Callable::executeCall0(
 1069|  1.88k|        runtime.makeHandle(accessor->getter), runtime, receiver);
 1070|  1.88k|  } else if (desc.flags.hostObject) {
  ------------------
  |  Branch (1070:14): [True: 0, False: 0]
  ------------------
 1071|      0|    auto res = vmcast<HostObject>(propObj)->get(name);
 1072|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1073|      0|      return ExecutionStatus::EXCEPTION;
 1074|      0|    }
 1075|      0|    return createPseudoHandle(*res);
 1076|      0|  } else {
 1077|      0|    assert(desc.flags.proxyObject && "descriptor flags are impossible");
 1078|      0|    return JSProxy::getNamed(
 1079|      0|        runtime.makeHandle(propObj), runtime, name, receiver);
 1080|      0|  }
 1081|  1.88k|}
_ZN6hermes2vm8JSObject27getComputedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_:
 1109|   527k|    Handle<> receiver) {
 1110|       |  // Try the fast-path first: no "index-like" properties and the "name" already
 1111|       |  // is a valid integer index.
 1112|   527k|  if (selfHandle->flags_.fastIndexProperties) {
  ------------------
  |  Branch (1112:7): [True: 459k, False: 67.7k]
  ------------------
 1113|   459k|    if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (1113:14): [True: 459k, False: 3]
  ------------------
 1114|       |      // Do we have this value present in our array storage? If so, return it.
 1115|   459k|      PseudoHandle<> ourValue =
 1116|   459k|          createPseudoHandle(getOwnIndexed(selfHandle, runtime, *arrayIndex));
 1117|   459k|      if (LLVM_LIKELY(!ourValue->isEmpty()))
  ------------------
  |  |  188|   459k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 459k, False: 0]
  |  |  ------------------
  ------------------
 1118|   459k|        return ourValue;
 1119|   459k|    }
 1120|   459k|  }
 1121|       |
 1122|       |  // If nameValHandle is an object, we should convert it to string now,
 1123|       |  // because toString may have side-effect, and we want to do this only
 1124|       |  // once.
 1125|  67.7k|  auto converted = toPropertyKeyIfObject(runtime, nameValHandle);
 1126|  67.7k|  if (LLVM_UNLIKELY(converted == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  67.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 67.7k]
  |  |  ------------------
  ------------------
 1127|      0|    return ExecutionStatus::EXCEPTION;
 1128|      0|  }
 1129|  67.7k|  auto nameValPrimitiveHandle = *converted;
 1130|       |
 1131|  67.7k|  ComputedPropertyDescriptor desc;
 1132|       |
 1133|       |  // Locate the descriptor. propObj contains the object which may be anywhere
 1134|       |  // along the prototype chain.
 1135|  67.7k|  MutableHandle<JSObject> propObj{runtime};
 1136|  67.7k|  MutableHandle<SymbolID> tmpPropNameStorage{runtime};
 1137|  67.7k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|  67.7k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 67.7k]
  |  |  ------------------
  ------------------
 1138|  67.7k|          getComputedPrimitiveDescriptor(
 1139|  67.7k|              selfHandle,
 1140|  67.7k|              runtime,
 1141|  67.7k|              nameValPrimitiveHandle,
 1142|  67.7k|              propObj,
 1143|  67.7k|              tmpPropNameStorage,
 1144|  67.7k|              desc) == ExecutionStatus::EXCEPTION)) {
 1145|      0|    return ExecutionStatus::EXCEPTION;
 1146|      0|  }
 1147|       |
 1148|  67.7k|  if (!propObj)
  ------------------
  |  Branch (1148:7): [True: 414, False: 67.3k]
  ------------------
 1149|    414|    return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1150|       |
 1151|  67.3k|  if (LLVM_LIKELY(
  ------------------
  |  |  188|   269k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 67.2k, False: 24]
  |  |  |  Branch (188:51): [True: 67.2k, False: 24]
  |  |  |  Branch (188:51): [True: 67.2k, False: 0]
  |  |  |  Branch (188:51): [True: 67.2k, False: 0]
  |  |  ------------------
  ------------------
 1152|  67.3k|          !desc.flags.accessor && !desc.flags.hostObject &&
 1153|  67.3k|          !desc.flags.proxyObject)) {
 1154|  67.2k|    return createPseudoHandle(getComputedSlotValueUnsafe(
 1155|  67.2k|        createPseudoHandle(propObj.get()), runtime, desc));
 1156|  67.2k|  }
 1157|       |
 1158|     24|  if (desc.flags.accessor) {
  ------------------
  |  Branch (1158:7): [True: 24, False: 0]
  ------------------
 1159|     24|    auto *accessor = vmcast<PropertyAccessor>(getComputedSlotValueUnsafe(
 1160|     24|        createPseudoHandle(propObj.get()), runtime, desc));
 1161|     24|    if (!accessor->getter)
  ------------------
  |  Branch (1161:9): [True: 0, False: 24]
  ------------------
 1162|      0|      return createPseudoHandle(HermesValue::encodeUndefinedValue());
 1163|       |
 1164|       |    // Execute the accessor on this object.
 1165|     24|    return accessor->getter.getNonNull(runtime)->executeCall0(
 1166|     24|        runtime.makeHandle(accessor->getter), runtime, receiver);
 1167|     24|  } else if (desc.flags.hostObject) {
  ------------------
  |  Branch (1167:14): [True: 0, False: 0]
  ------------------
 1168|      0|    SymbolID id{};
 1169|      0|    LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1170|      0|    auto propRes = vmcast<HostObject>(propObj.get())->get(id);
 1171|      0|    if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1171:9): [True: 0, False: 0]
  ------------------
 1172|      0|      return ExecutionStatus::EXCEPTION;
 1173|      0|    return createPseudoHandle(*propRes);
 1174|      0|  } else {
 1175|      0|    assert(desc.flags.proxyObject && "descriptor flags are impossible");
 1176|      0|    CallResult<Handle<>> key = toPropertyKey(runtime, nameValPrimitiveHandle);
 1177|      0|    if (key == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1177:9): [True: 0, False: 0]
  ------------------
 1178|      0|      return ExecutionStatus::EXCEPTION;
 1179|      0|    return JSProxy::getComputed(propObj, runtime, *key, receiver);
 1180|      0|  }
 1181|     24|}
_ZN6hermes2vm8JSObject24putNamedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS2_INS0_11HermesValueEEES8_NS0_11PropOpFlagsE:
 1325|  3.76k|    PropOpFlags opFlags) {
 1326|  3.76k|  NamedPropertyDescriptor desc;
 1327|       |
 1328|       |  // Look for the property in this object or along the prototype chain.
 1329|       |  // `name` will not be freed before this function returns,
 1330|       |  // so it will outlive the lifetime of `desc`.
 1331|  3.76k|  JSObject *propObj = getNamedDescriptorUnsafe(
 1332|  3.76k|      selfHandle,
 1333|  3.76k|      runtime,
 1334|  3.76k|      name,
 1335|  3.76k|      PropertyFlags::defaultNewNamedPropertyFlags(),
 1336|  3.76k|      desc);
 1337|       |
 1338|       |  // If the property exists (or, we hit a proxy/hostobject on the way
 1339|       |  // up the chain)
 1340|  3.76k|  if (propObj) {
  ------------------
  |  Branch (1340:7): [True: 7, False: 3.76k]
  ------------------
 1341|       |    // Get the simple case out of the way: If the property already
 1342|       |    // exists on selfHandle, is not an accessor, selfHandle and
 1343|       |    // receiver are the same, selfHandle is not a host
 1344|       |    // object/proxy/internal setter, and the property is writable,
 1345|       |    // just write into the same slot.
 1346|       |
 1347|      7|    if (LLVM_LIKELY(
  ------------------
  |  |  188|     63|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 7]
  |  |  |  Branch (188:51): [True: 7, False: 0]
  |  |  |  Branch (188:51): [True: 7, False: 0]
  |  |  |  Branch (188:51): [True: 7, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 7]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1348|      7|            *selfHandle == propObj &&
 1349|      7|            selfHandle.getHermesValue().getRaw() == receiver->getRaw() &&
 1350|      7|            !desc.flags.accessor && !desc.flags.internalSetter &&
 1351|      7|            !desc.flags.hostObject && !desc.flags.proxyObject &&
 1352|      7|            desc.flags.writable)) {
 1353|      0|      auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
 1354|      0|      setNamedSlotValueUnsafe(*selfHandle, runtime, desc, shv);
 1355|      0|      return true;
 1356|      0|    }
 1357|       |
 1358|      7|    if (LLVM_UNLIKELY(desc.flags.accessor)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7]
  |  |  ------------------
  ------------------
 1359|      0|      auto *accessor = vmcast<PropertyAccessor>(
 1360|      0|          getNamedSlotValueUnsafe(propObj, runtime, desc).getObject(runtime));
 1361|       |
 1362|       |      // If it is a read-only accessor, fail.
 1363|      0|      if (!accessor->setter) {
  ------------------
  |  Branch (1363:11): [True: 0, False: 0]
  ------------------
 1364|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1364:13): [True: 0, False: 0]
  ------------------
 1365|      0|          return runtime.raiseTypeError(
 1366|      0|              TwineChar16("Cannot assign to property '") +
 1367|      0|              runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1368|      0|              "' which has only a getter");
 1369|      0|        }
 1370|      0|        return false;
 1371|      0|      }
 1372|       |
 1373|       |      // Execute the accessor on this object.
 1374|      0|      if (accessor->setter.getNonNull(runtime)->executeCall1(
  ------------------
  |  Branch (1374:11): [True: 0, False: 0]
  ------------------
 1375|      0|              runtime.makeHandle(accessor->setter),
 1376|      0|              runtime,
 1377|      0|              receiver,
 1378|      0|              *valueHandle) == ExecutionStatus::EXCEPTION) {
 1379|      0|        return ExecutionStatus::EXCEPTION;
 1380|      0|      }
 1381|      0|      return true;
 1382|      0|    }
 1383|       |
 1384|      7|    if (LLVM_UNLIKELY(desc.flags.proxyObject)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7]
  |  |  ------------------
  ------------------
 1385|      0|      assert(
 1386|      0|          !opFlags.getMustExist() &&
 1387|      0|          "MustExist cannot be used with Proxy objects");
 1388|      0|      CallResult<bool> setRes = JSProxy::setNamed(
 1389|      0|          runtime.makeHandle(propObj), runtime, name, valueHandle, receiver);
 1390|      0|      if (LLVM_UNLIKELY(setRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1391|      0|        return ExecutionStatus::EXCEPTION;
 1392|      0|      }
 1393|      0|      if (!*setRes && opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1393:11): [True: 0, False: 0]
  |  Branch (1393:23): [True: 0, False: 0]
  ------------------
 1394|      0|        return runtime.raiseTypeError(
 1395|      0|            TwineChar16("Proxy set returned false for property '") +
 1396|      0|            runtime.getIdentifierTable().getStringView(runtime, name) + "'");
 1397|      0|      }
 1398|      0|      return setRes;
 1399|      0|    }
 1400|       |
 1401|      7|    if (LLVM_UNLIKELY(!desc.flags.writable)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7]
  |  |  ------------------
  ------------------
 1402|      0|      if (desc.flags.staticBuiltin) {
  ------------------
  |  Branch (1402:11): [True: 0, False: 0]
  ------------------
 1403|      0|        return raiseErrorForOverridingStaticBuiltin(
 1404|      0|            selfHandle, runtime, runtime.makeHandle(name));
 1405|      0|      }
 1406|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1406:11): [True: 0, False: 0]
  ------------------
 1407|      0|        return runtime.raiseTypeError(
 1408|      0|            TwineChar16("Cannot assign to read-only property '") +
 1409|      0|            runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1410|      0|            "'");
 1411|      0|      }
 1412|      0|      return false;
 1413|      0|    }
 1414|       |
 1415|      7|    if (*selfHandle == propObj && desc.flags.internalSetter) {
  ------------------
  |  Branch (1415:9): [True: 7, False: 0]
  |  Branch (1415:35): [True: 7, False: 0]
  ------------------
 1416|      7|      return internalSetter(
 1417|      7|          selfHandle, runtime, name, desc, valueHandle, opFlags);
 1418|      7|    }
 1419|      7|  }
 1420|       |
 1421|       |  // The property does not exist as an conventional own property on
 1422|       |  // this object.
 1423|       |
 1424|  3.76k|  MutableHandle<JSObject> receiverHandle{runtime, *selfHandle};
 1425|  3.76k|  MutableHandle<SymbolID> tmpSymbolStorage{runtime};
 1426|  3.76k|  if (selfHandle.getHermesValue().getRaw() != receiver->getRaw() ||
  ------------------
  |  Branch (1426:7): [True: 0, False: 3.76k]
  |  Branch (1426:7): [True: 0, False: 3.76k]
  ------------------
 1427|  3.76k|      receiverHandle->isHostObject() || receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1427:7): [True: 0, False: 3.76k]
  |  Branch (1427:41): [True: 0, False: 3.76k]
  ------------------
 1428|      0|    if (selfHandle.getHermesValue().getRaw() != receiver->getRaw()) {
  ------------------
  |  Branch (1428:9): [True: 0, False: 0]
  ------------------
 1429|      0|      receiverHandle = dyn_vmcast<JSObject>(*receiver);
 1430|      0|    }
 1431|      0|    if (!receiverHandle) {
  ------------------
  |  Branch (1431:9): [True: 0, False: 0]
  ------------------
 1432|      0|      return false;
 1433|      0|    }
 1434|       |
 1435|      0|    if (getOwnNamedDescriptor(receiverHandle, runtime, name, desc)) {
  ------------------
  |  Branch (1435:9): [True: 0, False: 0]
  ------------------
 1436|      0|      if (LLVM_UNLIKELY(desc.flags.accessor || !desc.flags.writable)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1437|      0|        return false;
 1438|      0|      }
 1439|       |
 1440|      0|      assert(
 1441|      0|          !receiverHandle->isHostObject() && !receiverHandle->isProxyObject() &&
 1442|      0|          "getOwnNamedDescriptor never sets hostObject or proxyObject flags");
 1443|      0|      auto shv = SmallHermesValue::encodeHermesValue(*valueHandle, runtime);
 1444|      0|      setNamedSlotValueUnsafe(*receiverHandle, runtime, desc, shv);
 1445|      0|      return true;
 1446|      0|    }
 1447|       |
 1448|       |    // Now deal with host and proxy object cases.  We need to call
 1449|       |    // getOwnComputedPrimitiveDescriptor because it knows how to call
 1450|       |    // the [[getOwnProperty]] Proxy impl if needed.
 1451|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1452|      0|            receiverHandle->isHostObject() ||
 1453|      0|            receiverHandle->isProxyObject())) {
 1454|      0|      if (receiverHandle->isHostObject()) {
  ------------------
  |  Branch (1454:11): [True: 0, False: 0]
  ------------------
 1455|      0|        return vmcast<HostObject>(receiverHandle.get())
 1456|      0|            ->set(name, *valueHandle);
 1457|      0|      }
 1458|      0|      ComputedPropertyDescriptor desc;
 1459|      0|      Handle<> nameValHandle = runtime.makeHandle(name);
 1460|      0|      CallResult<bool> descDefinedRes = getOwnComputedPrimitiveDescriptor(
 1461|      0|          receiverHandle,
 1462|      0|          runtime,
 1463|      0|          nameValHandle,
 1464|      0|          IgnoreProxy::No,
 1465|      0|          tmpSymbolStorage,
 1466|      0|          desc);
 1467|      0|      if (LLVM_UNLIKELY(descDefinedRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1468|      0|        return ExecutionStatus::EXCEPTION;
 1469|      0|      }
 1470|      0|      DefinePropertyFlags dpf;
 1471|      0|      if (*descDefinedRes) {
  ------------------
  |  Branch (1471:11): [True: 0, False: 0]
  ------------------
 1472|      0|        dpf.setValue = 1;
 1473|      0|      } else {
 1474|      0|        dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
 1475|      0|      }
 1476|      0|      return JSProxy::defineOwnProperty(
 1477|      0|          receiverHandle, runtime, nameValHandle, dpf, valueHandle, opFlags);
 1478|      0|    }
 1479|      0|  }
 1480|       |
 1481|       |  // Does the caller require it to exist?
 1482|  3.76k|  if (LLVM_UNLIKELY(opFlags.getMustExist())) {
  ------------------
  |  |  189|  3.76k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.76k]
  |  |  ------------------
  ------------------
 1483|      0|    return runtime.raiseReferenceError(
 1484|      0|        TwineChar16("Property '") +
 1485|      0|        runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 1486|      0|        "' doesn't exist");
 1487|      0|  }
 1488|       |
 1489|       |  // Add a new property.
 1490|       |
 1491|  3.76k|  return addOwnProperty(
 1492|  3.76k|      receiverHandle,
 1493|  3.76k|      runtime,
 1494|  3.76k|      name,
 1495|  3.76k|      DefinePropertyFlags::getDefaultNewPropertyFlags(),
 1496|  3.76k|      valueHandle,
 1497|  3.76k|      opFlags);
 1498|  3.76k|}
_ZN6hermes2vm8JSObject27putComputedWithReceiver_RJSENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEES7_S7_NS0_11PropOpFlagsE:
 1531|     99|    PropOpFlags opFlags) {
 1532|     99|  assert(
 1533|     99|      !opFlags.getMustExist() &&
 1534|     99|      "mustExist flag cannot be used with computed properties");
 1535|       |
 1536|       |  // Try the fast-path first: has "index-like" properties, the "name"
 1537|       |  // already is a valid integer index, selfHandle and receiver are the
 1538|       |  // same, and it is present in storage.
 1539|     99|  if (selfHandle->flags_.fastIndexProperties) {
  ------------------
  |  Branch (1539:7): [True: 0, False: 99]
  ------------------
 1540|      0|    if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (1540:14): [True: 0, False: 0]
  ------------------
 1541|      0|      if (selfHandle.getHermesValue().getRaw() == receiver->getRaw()) {
  ------------------
  |  Branch (1541:11): [True: 0, False: 0]
  ------------------
 1542|      0|        if (haveOwnIndexed(selfHandle.get(), runtime, *arrayIndex)) {
  ------------------
  |  Branch (1542:13): [True: 0, False: 0]
  ------------------
 1543|      0|          auto result =
 1544|      0|              setOwnIndexed(selfHandle, runtime, *arrayIndex, valueHandle);
 1545|      0|          if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1546|      0|            return ExecutionStatus::EXCEPTION;
 1547|      0|          if (LLVM_LIKELY(*result))
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1548|      0|            return true;
 1549|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1549:15): [True: 0, False: 0]
  ------------------
 1550|       |            // TODO: better message.
 1551|      0|            return runtime.raiseTypeError(
 1552|      0|                "Cannot assign to read-only property");
 1553|      0|          }
 1554|      0|          return false;
 1555|      0|        }
 1556|      0|      }
 1557|      0|    }
 1558|      0|  }
 1559|       |
 1560|       |  // If nameValHandle is an object, we should convert it to string now,
 1561|       |  // because toString may have side-effect, and we want to do this only
 1562|       |  // once.
 1563|     99|  auto converted = toPropertyKeyIfObject(runtime, nameValHandle);
 1564|     99|  if (LLVM_UNLIKELY(converted == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1565|      0|    return ExecutionStatus::EXCEPTION;
 1566|      0|  }
 1567|     99|  auto nameValPrimitiveHandle = *converted;
 1568|       |
 1569|     99|  ComputedPropertyDescriptor desc;
 1570|       |
 1571|       |  // Look for the property in this object or along the prototype chain.
 1572|     99|  MutableHandle<JSObject> propObj{runtime};
 1573|     99|  MutableHandle<SymbolID> tmpSymbolStorage{runtime};
 1574|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1575|     99|          getComputedPrimitiveDescriptor(
 1576|     99|              selfHandle,
 1577|     99|              runtime,
 1578|     99|              nameValPrimitiveHandle,
 1579|     99|              propObj,
 1580|     99|              tmpSymbolStorage,
 1581|     99|              desc) == ExecutionStatus::EXCEPTION)) {
 1582|      0|    return ExecutionStatus::EXCEPTION;
 1583|      0|  }
 1584|       |
 1585|       |  // If the property exists (or, we hit a proxy/hostobject on the way
 1586|       |  // up the chain)
 1587|     99|  if (propObj) {
  ------------------
  |  Branch (1587:7): [True: 0, False: 99]
  ------------------
 1588|       |    // Get the simple case out of the way: If the property already
 1589|       |    // exists on selfHandle, is not an accessor, selfHandle and
 1590|       |    // receiver are the same, selfHandle is not a host
 1591|       |    // object/proxy/internal setter, and the property is writable,
 1592|       |    // just write into the same slot.
 1593|       |
 1594|      0|    if (LLVM_LIKELY(
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1595|      0|            selfHandle == propObj &&
 1596|      0|            selfHandle.getHermesValue().getRaw() == receiver->getRaw() &&
 1597|      0|            !desc.flags.accessor && !desc.flags.internalSetter &&
 1598|      0|            !desc.flags.hostObject && !desc.flags.proxyObject &&
 1599|      0|            desc.flags.writable)) {
 1600|      0|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1601|      0|              setComputedSlotValueUnsafe(
 1602|      0|                  selfHandle, runtime, desc, valueHandle) ==
 1603|      0|              ExecutionStatus::EXCEPTION)) {
 1604|      0|        return ExecutionStatus::EXCEPTION;
 1605|      0|      }
 1606|      0|      return true;
 1607|      0|    }
 1608|       |
 1609|       |    // Is it an accessor?
 1610|      0|    if (LLVM_UNLIKELY(desc.flags.accessor)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1611|      0|      auto *accessor = vmcast<PropertyAccessor>(
 1612|      0|          getComputedSlotValueUnsafe(propObj, runtime, desc));
 1613|       |
 1614|       |      // If it is a read-only accessor, fail.
 1615|      0|      if (!accessor->setter) {
  ------------------
  |  Branch (1615:11): [True: 0, False: 0]
  ------------------
 1616|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1616:13): [True: 0, False: 0]
  ------------------
 1617|      0|          return runtime.raiseTypeErrorForValue(
 1618|      0|              "Cannot assign to property ",
 1619|      0|              nameValPrimitiveHandle,
 1620|      0|              " which has only a getter");
 1621|      0|        }
 1622|      0|        return false;
 1623|      0|      }
 1624|       |
 1625|       |      // Execute the accessor on this object.
 1626|      0|      if (accessor->setter.getNonNull(runtime)->executeCall1(
  ------------------
  |  Branch (1626:11): [True: 0, False: 0]
  ------------------
 1627|      0|              runtime.makeHandle(accessor->setter),
 1628|      0|              runtime,
 1629|      0|              receiver,
 1630|      0|              valueHandle.get()) == ExecutionStatus::EXCEPTION) {
 1631|      0|        return ExecutionStatus::EXCEPTION;
 1632|      0|      }
 1633|      0|      return true;
 1634|      0|    }
 1635|       |
 1636|      0|    if (LLVM_UNLIKELY(desc.flags.proxyObject)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1637|      0|      assert(
 1638|      0|          !opFlags.getMustExist() &&
 1639|      0|          "MustExist cannot be used with Proxy objects");
 1640|      0|      CallResult<Handle<>> key = toPropertyKey(runtime, nameValPrimitiveHandle);
 1641|      0|      if (key == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (1641:11): [True: 0, False: 0]
  ------------------
 1642|      0|        return ExecutionStatus::EXCEPTION;
 1643|      0|      CallResult<bool> setRes =
 1644|      0|          JSProxy::setComputed(propObj, runtime, *key, valueHandle, receiver);
 1645|      0|      if (LLVM_UNLIKELY(setRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1646|      0|        return ExecutionStatus::EXCEPTION;
 1647|      0|      }
 1648|      0|      if (!*setRes && opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1648:11): [True: 0, False: 0]
  |  Branch (1648:23): [True: 0, False: 0]
  ------------------
 1649|       |        // TODO: better message.
 1650|      0|        return runtime.raiseTypeError(
 1651|      0|            TwineChar16("Proxy trap returned false for property"));
 1652|      0|      }
 1653|      0|      return setRes;
 1654|      0|    }
 1655|       |
 1656|      0|    if (LLVM_UNLIKELY(!desc.flags.writable)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1657|      0|      if (desc.flags.staticBuiltin) {
  ------------------
  |  Branch (1657:11): [True: 0, False: 0]
  ------------------
 1658|      0|        SymbolID id{};
 1659|      0|        LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1660|      0|        return raiseErrorForOverridingStaticBuiltin(
 1661|      0|            selfHandle, runtime, runtime.makeHandle(id));
 1662|      0|      }
 1663|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1663:11): [True: 0, False: 0]
  ------------------
 1664|      0|        return runtime.raiseTypeErrorForValue(
 1665|      0|            "Cannot assign to read-only property ", nameValPrimitiveHandle, "");
 1666|      0|      }
 1667|      0|      return false;
 1668|      0|    }
 1669|       |
 1670|      0|    if (selfHandle == propObj && desc.flags.internalSetter) {
  ------------------
  |  Branch (1670:9): [True: 0, False: 0]
  |  Branch (1670:34): [True: 0, False: 0]
  ------------------
 1671|      0|      SymbolID id{};
 1672|      0|      LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1673|      0|      return internalSetter(
 1674|      0|          selfHandle,
 1675|      0|          runtime,
 1676|      0|          id,
 1677|      0|          desc.castToNamedPropertyDescriptorRef(),
 1678|      0|          valueHandle,
 1679|      0|          opFlags);
 1680|      0|    }
 1681|      0|  }
 1682|       |
 1683|       |  // The property does not exist as an conventional own property on
 1684|       |  // this object.
 1685|       |
 1686|     99|  MutableHandle<JSObject> receiverHandle{runtime, *selfHandle};
 1687|     99|  if (selfHandle.getHermesValue().getRaw() != receiver->getRaw() ||
  ------------------
  |  Branch (1687:7): [True: 0, False: 99]
  |  Branch (1687:7): [True: 0, False: 99]
  ------------------
 1688|     99|      receiverHandle->isHostObject() || receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1688:7): [True: 0, False: 99]
  |  Branch (1688:41): [True: 0, False: 99]
  ------------------
 1689|      0|    if (selfHandle.getHermesValue().getRaw() != receiver->getRaw()) {
  ------------------
  |  Branch (1689:9): [True: 0, False: 0]
  ------------------
 1690|      0|      receiverHandle = dyn_vmcast<JSObject>(*receiver);
 1691|      0|    }
 1692|      0|    if (!receiverHandle) {
  ------------------
  |  Branch (1692:9): [True: 0, False: 0]
  ------------------
 1693|      0|      return false;
 1694|      0|    }
 1695|      0|    ComputedPropertyDescriptor existingDesc;
 1696|      0|    CallResult<bool> descDefinedRes = getOwnComputedPrimitiveDescriptor(
 1697|      0|        receiverHandle,
 1698|      0|        runtime,
 1699|      0|        nameValPrimitiveHandle,
 1700|      0|        IgnoreProxy::No,
 1701|      0|        tmpSymbolStorage,
 1702|      0|        existingDesc);
 1703|      0|    if (LLVM_UNLIKELY(descDefinedRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1704|      0|      return ExecutionStatus::EXCEPTION;
 1705|      0|    }
 1706|      0|    DefinePropertyFlags dpf;
 1707|      0|    if (*descDefinedRes) {
  ------------------
  |  Branch (1707:9): [True: 0, False: 0]
  ------------------
 1708|      0|      if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1709|      0|              existingDesc.flags.accessor || !existingDesc.flags.writable)) {
 1710|      0|        return false;
 1711|      0|      }
 1712|       |
 1713|      0|      if (LLVM_LIKELY(
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  |  Branch (188:51): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1714|      0|              !existingDesc.flags.internalSetter &&
 1715|      0|              !receiverHandle->isHostObject() &&
 1716|      0|              !receiverHandle->isProxyObject())) {
 1717|      0|        if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1718|      0|                setComputedSlotValueUnsafe(
 1719|      0|                    receiverHandle, runtime, existingDesc, valueHandle) ==
 1720|      0|                ExecutionStatus::EXCEPTION)) {
 1721|      0|          return ExecutionStatus::EXCEPTION;
 1722|      0|        }
 1723|      0|        return true;
 1724|      0|      }
 1725|      0|    }
 1726|       |
 1727|       |    // At this point, either the descriptor exists on the receiver,
 1728|       |    // but it's a corner case; or, there was no descriptor.
 1729|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  |  Branch (189:53): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1730|      0|            existingDesc.flags.internalSetter ||
 1731|      0|            receiverHandle->isHostObject() ||
 1732|      0|            receiverHandle->isProxyObject())) {
 1733|       |      // If putComputed is called on a proxy whose target's prototype
 1734|       |      // is an array with a propname of 'length', then internalSetter
 1735|       |      // will be true, and the receiver will be a proxy.  In that case,
 1736|       |      // proxy wins.
 1737|      0|      if (receiverHandle->isProxyObject()) {
  ------------------
  |  Branch (1737:11): [True: 0, False: 0]
  ------------------
 1738|      0|        if (*descDefinedRes) {
  ------------------
  |  Branch (1738:13): [True: 0, False: 0]
  ------------------
 1739|      0|          dpf.setValue = 1;
 1740|      0|        } else {
 1741|      0|          dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
 1742|      0|        }
 1743|      0|        return JSProxy::defineOwnProperty(
 1744|      0|            receiverHandle,
 1745|      0|            runtime,
 1746|      0|            nameValPrimitiveHandle,
 1747|      0|            dpf,
 1748|      0|            valueHandle,
 1749|      0|            opFlags);
 1750|      0|      }
 1751|      0|      SymbolID id{};
 1752|      0|      LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1753|      0|      if (existingDesc.flags.internalSetter) {
  ------------------
  |  Branch (1753:11): [True: 0, False: 0]
  ------------------
 1754|      0|        return internalSetter(
 1755|      0|            receiverHandle,
 1756|      0|            runtime,
 1757|      0|            id,
 1758|      0|            existingDesc.castToNamedPropertyDescriptorRef(),
 1759|      0|            valueHandle,
 1760|      0|            opFlags);
 1761|      0|      }
 1762|      0|      assert(
 1763|      0|          receiverHandle->isHostObject() && "descriptor flags are impossible");
 1764|      0|      return vmcast<HostObject>(receiverHandle.get())->set(id, *valueHandle);
 1765|      0|    }
 1766|      0|  }
 1767|       |
 1768|       |  /// Can we add more properties?
 1769|     99|  if (LLVM_UNLIKELY(!receiverHandle->isExtensible())) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1770|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1770:9): [True: 0, False: 0]
  ------------------
 1771|      0|      return runtime.raiseTypeError(
 1772|      0|          "cannot add a new property"); // TODO: better message.
 1773|      0|    }
 1774|      0|    return false;
 1775|      0|  }
 1776|       |
 1777|       |  // If we have indexed storage we must check whether the property is an index,
 1778|       |  // and if it is, store it in indexed storage.
 1779|     99|  if (receiverHandle->flags_.indexedStorage) {
  ------------------
  |  Branch (1779:7): [True: 0, False: 99]
  ------------------
 1780|      0|    OptValue<uint32_t> arrayIndex;
 1781|      0|    MutableHandle<StringPrimitive> strPrim{runtime};
 1782|      0|    TO_ARRAY_INDEX(runtime, nameValPrimitiveHandle, strPrim, arrayIndex);
  ------------------
  |  |  642|      0|  do {                                                          \
  |  |  643|      0|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  644|      0|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (644:9): [True: 0, False: 0]
  |  |  |  Branch (644:24): [True: 0, False: 0]
  |  |  ------------------
  |  |  645|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  609|      0|  do {                                                    \
  |  |  |  |  610|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (610:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  611|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  612|      0|      assert(                                             \
  |  |  |  |  613|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  614|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  615|      0|      str = status->get();                                \
  |  |  |  |  616|      0|    }                                                     \
  |  |  |  |  617|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (617:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  647|      0|    }                                                           \
  |  |  648|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (648:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1783|      0|    if (arrayIndex) {
  ------------------
  |  Branch (1783:9): [True: 0, False: 0]
  ------------------
 1784|       |      // Check whether we need to update array's ".length" property.
 1785|      0|      if (auto *array = dyn_vmcast<JSArray>(receiverHandle.get())) {
  ------------------
  |  Branch (1785:17): [True: 0, False: 0]
  ------------------
 1786|      0|        if (LLVM_UNLIKELY(*arrayIndex >= JSArray::getLength(array, runtime))) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1787|      0|          auto cr = putNamed_RJS(
 1788|      0|              receiverHandle,
 1789|      0|              runtime,
 1790|      0|              Predefined::getSymbolID(Predefined::length),
 1791|      0|              runtime.makeHandle(
 1792|      0|                  HermesValue::encodeNumberValue(*arrayIndex + 1)),
 1793|      0|              opFlags);
 1794|      0|          if (LLVM_UNLIKELY(cr == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1795|      0|            return ExecutionStatus::EXCEPTION;
 1796|      0|          if (LLVM_UNLIKELY(!*cr))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1797|      0|            return false;
 1798|      0|        }
 1799|      0|      }
 1800|       |
 1801|      0|      auto result =
 1802|      0|          setOwnIndexed(receiverHandle, runtime, *arrayIndex, valueHandle);
 1803|      0|      if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1804|      0|        return ExecutionStatus::EXCEPTION;
 1805|      0|      if (LLVM_LIKELY(*result))
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1806|      0|        return true;
 1807|       |
 1808|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (1808:11): [True: 0, False: 0]
  ------------------
 1809|       |        // TODO: better message.
 1810|      0|        return runtime.raiseTypeError("Cannot assign to read-only property");
 1811|      0|      }
 1812|      0|      return false;
 1813|      0|    }
 1814|      0|  }
 1815|       |
 1816|     99|  SymbolID id{};
 1817|     99|  LAZY_TO_IDENTIFIER(runtime, nameValPrimitiveHandle, id);
  ------------------
  |  |  624|     99|  do {                                                          \
  |  |  625|     99|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 99, False: 0]
  |  |  ------------------
  |  |  626|     99|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|     99|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|     99|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|     99|      id = **idRes;                                             \
  |  |  632|     99|    }                                                           \
  |  |  633|     99|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 1818|       |
 1819|       |  // Add a new named property.
 1820|     99|  return addOwnProperty(
 1821|     99|      receiverHandle,
 1822|     99|      runtime,
 1823|     99|      id,
 1824|     99|      DefinePropertyFlags::getDefaultNewPropertyFlags(),
 1825|     99|      valueHandle,
 1826|     99|      opFlags);
 1827|     99|}
_ZN6hermes2vm8JSObject25defineOwnPropertyInternalENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2001|  56.3k|    PropOpFlags opFlags) {
 2002|  56.3k|  assert(
 2003|  56.3k|      !opFlags.getMustExist() && "cannot use mustExist with defineOwnProperty");
 2004|      0|  assert(
 2005|  56.3k|      !(dpFlags.setValue && dpFlags.isAccessor()) &&
 2006|  56.3k|      "Cannot set both value and accessor");
 2007|      0|  assert(
 2008|  56.3k|      (dpFlags.setValue || dpFlags.isAccessor() ||
 2009|  56.3k|       valueOrAccessor.get().isUndefined()) &&
 2010|  56.3k|      "value must be undefined when all of setValue/setSetter/setGetter are "
 2011|  56.3k|      "false");
 2012|      0|#ifndef NDEBUG
 2013|  56.3k|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2013:7): [True: 4.18k, False: 52.2k]
  ------------------
 2014|  4.18k|    assert(valueOrAccessor.get().isPointer() && "accessor must be non-empty");
 2015|      0|    assert(
 2016|  4.18k|        !dpFlags.setWritable && !dpFlags.writable &&
 2017|  4.18k|        "writable must not be set with accessors");
 2018|  4.18k|  }
 2019|      0|#endif
 2020|       |
 2021|       |  // Is it an existing property.
 2022|      0|  NamedPropertyDescriptor desc;
 2023|  56.3k|  auto pos = findProperty(selfHandle, runtime, name, desc);
 2024|  56.3k|  if (pos) {
  ------------------
  |  Branch (2024:7): [True: 756, False: 55.6k]
  ------------------
 2025|    756|    return updateOwnProperty(
 2026|    756|        selfHandle,
 2027|    756|        runtime,
 2028|    756|        name,
 2029|    756|        *pos,
 2030|    756|        desc,
 2031|    756|        dpFlags,
 2032|    756|        valueOrAccessor,
 2033|    756|        opFlags);
 2034|    756|  }
 2035|       |
 2036|  55.6k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   111k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 55.6k]
  |  |  |  Branch (189:53): [True: 0, False: 55.6k]
  |  |  |  Branch (189:53): [True: 0, False: 55.6k]
  |  |  ------------------
  ------------------
 2037|  55.6k|          selfHandle->flags_.lazyObject || selfHandle->flags_.proxyObject)) {
 2038|      0|    if (selfHandle->flags_.proxyObject) {
  ------------------
  |  Branch (2038:9): [True: 0, False: 0]
  ------------------
 2039|      0|      return JSProxy::defineOwnProperty(
 2040|      0|          selfHandle,
 2041|      0|          runtime,
 2042|      0|          name.isUniqued() ? runtime.makeHandle(HermesValue::encodeStringValue(
  ------------------
  |  Branch (2042:11): [True: 0, False: 0]
  ------------------
 2043|      0|                                 runtime.getStringPrimFromSymbolID(name)))
 2044|      0|                           : runtime.makeHandle(name),
 2045|      0|          dpFlags,
 2046|      0|          valueOrAccessor,
 2047|      0|          opFlags);
 2048|      0|    }
 2049|      0|    assert(selfHandle->flags_.lazyObject && "descriptor flags are impossible");
 2050|       |    // if the property was not found and the object is lazy we need to
 2051|       |    // initialize it and try again.
 2052|      0|    JSObject::initializeLazyObject(runtime, selfHandle);
 2053|      0|    return defineOwnPropertyInternal(
 2054|      0|        selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 2055|      0|  }
 2056|       |
 2057|  55.6k|  return addOwnProperty(
 2058|  55.6k|      selfHandle, runtime, name, dpFlags, valueOrAccessor, opFlags);
 2059|  55.6k|}
_ZN6hermes2vm8JSObject20defineNewOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsENS2_INS0_11HermesValueEEE:
 2066|   106k|    Handle<> valueOrAccessor) {
 2067|   106k|  assert(
 2068|   106k|      !selfHandle->flags_.proxyObject &&
 2069|   106k|      "definedNewOwnProperty cannot be used with proxy objects");
 2070|      0|  assert(
 2071|   106k|      !(propertyFlags.accessor && !valueOrAccessor.get().isPointer()) &&
 2072|   106k|      "accessor must be non-empty");
 2073|      0|  assert(
 2074|   106k|      !(propertyFlags.accessor && propertyFlags.writable) &&
 2075|   106k|      "writable must not be set with accessors");
 2076|      0|  assert(
 2077|   106k|      !HiddenClass::debugIsPropertyDefined(
 2078|   106k|          selfHandle->clazz_.get(runtime), runtime, name) &&
 2079|   106k|      "new property is already defined");
 2080|       |
 2081|      0|  return addOwnPropertyImpl(
 2082|   106k|      selfHandle, runtime, name, propertyFlags, valueOrAccessor);
 2083|   106k|}
_ZN6hermes2vm8JSObject26defineOwnComputedPrimitiveENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_11HermesValueEEENS0_19DefinePropertyFlagsES7_NS0_11PropOpFlagsE:
 2091|   354k|    PropOpFlags opFlags) {
 2092|   354k|  assert(
 2093|   354k|      !nameValHandle->isObject() &&
 2094|   354k|      "nameValHandle passed to "
 2095|   354k|      "defineOwnComputedPrimitive() cannot be "
 2096|   354k|      "an object");
 2097|      0|  assert(
 2098|   354k|      !opFlags.getMustExist() && "cannot use mustExist with defineOwnProperty");
 2099|      0|  assert(
 2100|   354k|      !(dpFlags.setValue && dpFlags.isAccessor()) &&
 2101|   354k|      "Cannot set both value and accessor");
 2102|      0|  assert(
 2103|   354k|      (dpFlags.setValue || dpFlags.isAccessor() ||
 2104|   354k|       valueOrAccessor.get().isUndefined()) &&
 2105|   354k|      "value must be undefined when all of setValue/setSetter/setGetter are "
 2106|   354k|      "false");
 2107|      0|  assert(
 2108|   354k|      !dpFlags.enableInternalSetter &&
 2109|   354k|      "Cannot set internalSetter on a computed property");
 2110|      0|#ifndef NDEBUG
 2111|   354k|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2111:7): [True: 0, False: 354k]
  ------------------
 2112|      0|    assert(valueOrAccessor.get().isPointer() && "accessor must be non-empty");
 2113|      0|    assert(
 2114|      0|        !dpFlags.setWritable && !dpFlags.writable &&
 2115|      0|        "writable must not be set with accessors");
 2116|      0|  }
 2117|      0|#endif
 2118|       |
 2119|       |  // If the name is a valid integer array index, store it here.
 2120|      0|  OptValue<uint32_t> arrayIndex;
 2121|       |
 2122|       |  // If we have indexed storage, we must attempt to convert the name to array
 2123|       |  // index, even if the conversion is expensive.
 2124|   354k|  if (selfHandle->flags_.indexedStorage) {
  ------------------
  |  Branch (2124:7): [True: 354k, False: 0]
  ------------------
 2125|   354k|    MutableHandle<StringPrimitive> strPrim{runtime};
 2126|   354k|    TO_ARRAY_INDEX(runtime, nameValHandle, strPrim, arrayIndex);
  ------------------
  |  |  642|   354k|  do {                                                          \
  |  |  643|   354k|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  644|   354k|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (644:9): [True: 0, False: 354k]
  |  |  |  Branch (644:24): [True: 0, False: 0]
  |  |  ------------------
  |  |  645|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  609|      0|  do {                                                    \
  |  |  |  |  610|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (610:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  611|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  612|      0|      assert(                                             \
  |  |  |  |  613|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  614|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  615|      0|      str = status->get();                                \
  |  |  |  |  616|      0|    }                                                     \
  |  |  |  |  617|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (617:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  647|      0|    }                                                           \
  |  |  648|   354k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (648:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2127|   354k|  }
 2128|       |
 2129|      0|  SymbolID id{};
 2130|       |
 2131|       |  // If not storing a property with an array index name, or if we don't have
 2132|       |  // indexed storage, just pass to the named routine.
 2133|   354k|  if (!arrayIndex) {
  ------------------
  |  Branch (2133:7): [True: 0, False: 354k]
  ------------------
 2134|       |    // TODO(T125334872): properly handle the case when self is a TypedArray.
 2135|      0|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2136|      0|    return defineOwnPropertyInternal(
 2137|      0|        selfHandle, runtime, id, dpFlags, valueOrAccessor, opFlags);
 2138|      0|  }
 2139|       |
 2140|       |  // At this point we know that we have indexed storage and that the property
 2141|       |  // has an index-like name.
 2142|       |
 2143|       |  // First check if a named property with the same name exists.
 2144|   354k|  if (selfHandle->clazz_.getNonNull(runtime)->getHasIndexLikeProperties()) {
  ------------------
  |  Branch (2144:7): [True: 134k, False: 219k]
  ------------------
 2145|   134k|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  624|   134k|  do {                                                          \
  |  |  625|   134k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 134k, False: 0]
  |  |  ------------------
  |  |  626|   134k|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|   134k|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|   134k|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|   134k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 134k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|   134k|      id = **idRes;                                             \
  |  |  632|   134k|    }                                                           \
  |  |  633|   134k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2146|       |
 2147|   134k|    NamedPropertyDescriptor desc;
 2148|   134k|    auto pos = findProperty(selfHandle, runtime, id, desc);
 2149|       |    // If we found a named property, update it.
 2150|   134k|    if (pos) {
  ------------------
  |  Branch (2150:9): [True: 0, False: 134k]
  ------------------
 2151|      0|      return updateOwnProperty(
 2152|      0|          selfHandle,
 2153|      0|          runtime,
 2154|      0|          id,
 2155|      0|          *pos,
 2156|      0|          desc,
 2157|      0|          dpFlags,
 2158|      0|          valueOrAccessor,
 2159|      0|          opFlags);
 2160|      0|    }
 2161|   134k|  }
 2162|       |
 2163|       |  // Does an indexed property with that index exist?
 2164|   354k|  auto indexedPropPresent =
 2165|   354k|      getOwnIndexedPropertyFlags(selfHandle.get(), runtime, *arrayIndex);
 2166|   354k|  if (indexedPropPresent) {
  ------------------
  |  Branch (2166:7): [True: 0, False: 354k]
  ------------------
 2167|       |    // The current value of the property.
 2168|      0|    Handle<> curValueOrAccessor =
 2169|      0|        runtime.makeHandle(getOwnIndexed(selfHandle, runtime, *arrayIndex));
 2170|       |
 2171|      0|    auto updateStatus = checkPropertyUpdate(
 2172|      0|        runtime,
 2173|      0|        *indexedPropPresent,
 2174|      0|        dpFlags,
 2175|      0|        *curValueOrAccessor,
 2176|      0|        valueOrAccessor,
 2177|      0|        opFlags);
 2178|      0|    if (updateStatus == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2178:9): [True: 0, False: 0]
  ------------------
 2179|      0|      return ExecutionStatus::EXCEPTION;
 2180|      0|    if (updateStatus->first == PropertyUpdateStatus::failed)
  ------------------
  |  Branch (2180:9): [True: 0, False: 0]
  ------------------
 2181|      0|      return false;
 2182|       |
 2183|       |    // The property update is valid, but can the property remain an "indexed"
 2184|       |    // property, or do we need to convert it to a named property?
 2185|       |    // If the property flags didn't change, the property remains indexed.
 2186|      0|    if (updateStatus->second == *indexedPropPresent) {
  ------------------
  |  Branch (2186:9): [True: 0, False: 0]
  ------------------
 2187|       |      // If the value doesn't change, we are done.
 2188|      0|      if (updateStatus->first == PropertyUpdateStatus::done)
  ------------------
  |  Branch (2188:11): [True: 0, False: 0]
  ------------------
 2189|      0|        return true;
 2190|       |
 2191|       |      // If we successfully updated the value, we are done.
 2192|      0|      auto result =
 2193|      0|          setOwnIndexed(selfHandle, runtime, *arrayIndex, valueOrAccessor);
 2194|      0|      if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2195|      0|        return ExecutionStatus::EXCEPTION;
 2196|      0|      if (*result)
  ------------------
  |  Branch (2196:11): [True: 0, False: 0]
  ------------------
 2197|      0|        return true;
 2198|       |
 2199|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2199:11): [True: 0, False: 0]
  ------------------
 2200|       |        // TODO: better error message.
 2201|      0|        return runtime.raiseTypeError("cannot change read-only property value");
 2202|      0|      }
 2203|       |
 2204|      0|      return false;
 2205|      0|    }
 2206|       |
 2207|       |    // OK, we need to convert an indexed property to a named one.
 2208|       |
 2209|       |    // Check whether to use the supplied value, or to reuse the old one, as we
 2210|       |    // are simply reconfiguring it.
 2211|      0|    MutableHandle<> value{runtime};
 2212|      0|    if (dpFlags.setValue || dpFlags.isAccessor()) {
  ------------------
  |  Branch (2212:9): [True: 0, False: 0]
  |  Branch (2212:29): [True: 0, False: 0]
  ------------------
 2213|      0|      value = valueOrAccessor.get();
 2214|      0|    } else {
 2215|      0|      value = *curValueOrAccessor;
 2216|      0|    }
 2217|       |
 2218|       |    // Delete the existing indexed property.
 2219|      0|    if (!deleteOwnIndexed(selfHandle, runtime, *arrayIndex)) {
  ------------------
  |  Branch (2219:9): [True: 0, False: 0]
  ------------------
 2220|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2220:11): [True: 0, False: 0]
  ------------------
 2221|       |        // TODO: better error message.
 2222|      0|        return runtime.raiseTypeError("Cannot define property");
 2223|      0|      }
 2224|      0|      return false;
 2225|      0|    }
 2226|       |
 2227|       |    // Add the new named property. Call addOwnPropertyImpl directly, since the
 2228|       |    // property must be added.
 2229|      0|    LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  624|      0|  do {                                                          \
  |  |  625|      0|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 0, False: 0]
  |  |  ------------------
  |  |  626|      0|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|      0|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|      0|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|      0|      id = **idRes;                                             \
  |  |  632|      0|    }                                                           \
  |  |  633|      0|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2230|      0|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2231|      0|            addOwnPropertyImpl(
 2232|      0|                selfHandle, runtime, id, updateStatus->second, value) ==
 2233|      0|            ExecutionStatus::EXCEPTION))
 2234|      0|      return ExecutionStatus::EXCEPTION;
 2235|      0|    return true;
 2236|      0|  }
 2237|       |
 2238|       |  /// Can we add new properties?
 2239|   354k|  if (!selfHandle->isExtensible()) {
  ------------------
  |  Branch (2239:7): [True: 0, False: 354k]
  ------------------
 2240|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2240:9): [True: 0, False: 0]
  ------------------
 2241|      0|      return runtime.raiseTypeError(
 2242|      0|          "cannot add a new property"); // TODO: better message.
 2243|      0|    }
 2244|      0|    return false;
 2245|      0|  }
 2246|       |
 2247|       |  // This is a new property with an index-like name.
 2248|       |  // Check whether we need to update array's ".length" property.
 2249|   354k|  bool updateLength = false;
 2250|   354k|  if (auto arrayHandle = Handle<JSArray>::dyn_vmcast(selfHandle)) {
  ------------------
  |  Branch (2250:12): [True: 354k, False: 0]
  ------------------
 2251|   354k|    if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   354k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 145k, False: 208k]
  |  |  ------------------
  ------------------
 2252|   354k|            *arrayIndex >= JSArray::getLength(*arrayHandle, runtime))) {
 2253|   145k|      NamedPropertyDescriptor lengthDesc;
 2254|   145k|      bool lengthPresent = getOwnNamedDescriptor(
 2255|   145k|          arrayHandle,
 2256|   145k|          runtime,
 2257|   145k|          Predefined::getSymbolID(Predefined::length),
 2258|   145k|          lengthDesc);
 2259|   145k|      (void)lengthPresent;
 2260|   145k|      assert(lengthPresent && ".length must be present in JSArray");
 2261|       |
 2262|   145k|      if (!lengthDesc.flags.writable) {
  ------------------
  |  Branch (2262:11): [True: 0, False: 145k]
  ------------------
 2263|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2263:13): [True: 0, False: 0]
  ------------------
 2264|      0|          return runtime.raiseTypeError(
 2265|      0|              "Cannot assign to read-only 'length' property of array");
 2266|      0|        }
 2267|      0|        return false;
 2268|      0|      }
 2269|       |
 2270|   145k|      updateLength = true;
 2271|   145k|    }
 2272|   354k|  }
 2273|       |
 2274|   354k|  bool newIsIndexed = canNewPropertyBeIndexed(dpFlags);
 2275|   354k|  if (newIsIndexed) {
  ------------------
  |  Branch (2275:7): [True: 219k, False: 134k]
  ------------------
 2276|   219k|    auto result = setOwnIndexed(
 2277|   219k|        selfHandle,
 2278|   219k|        runtime,
 2279|   219k|        *arrayIndex,
 2280|   219k|        dpFlags.setValue ? valueOrAccessor : Runtime::getUndefinedValue());
  ------------------
  |  Branch (2280:9): [True: 219k, False: 0]
  ------------------
 2281|   219k|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION))
  ------------------
  |  |  189|   219k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 219k]
  |  |  ------------------
  ------------------
 2282|      0|      return ExecutionStatus::EXCEPTION;
 2283|   219k|    if (!*result) {
  ------------------
  |  Branch (2283:9): [True: 0, False: 219k]
  ------------------
 2284|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2284:11): [True: 0, False: 0]
  ------------------
 2285|       |        // TODO: better error message.
 2286|      0|        return runtime.raiseTypeError("Cannot define property");
 2287|      0|      }
 2288|      0|      return false;
 2289|      0|    }
 2290|   219k|  }
 2291|       |
 2292|       |  // If this is an array and we need to update ".length", do so.
 2293|   354k|  if (updateLength) {
  ------------------
  |  Branch (2293:7): [True: 145k, False: 208k]
  ------------------
 2294|       |    // This should always succeed since we are simply enlarging the length.
 2295|   145k|    auto res = JSArray::setLength(
 2296|   145k|        Handle<JSArray>::vmcast(selfHandle), runtime, *arrayIndex + 1, opFlags);
 2297|   145k|    (void)res;
 2298|   145k|    assert(
 2299|   145k|        res != ExecutionStatus::EXCEPTION && *res &&
 2300|   145k|        "JSArray::setLength() failed unexpectedly");
 2301|   145k|  }
 2302|       |
 2303|   354k|  if (newIsIndexed)
  ------------------
  |  Branch (2303:7): [True: 219k, False: 134k]
  ------------------
 2304|   219k|    return true;
 2305|       |
 2306|       |  // We are adding a new property with an index-like name.
 2307|       |  // TODO(T125334872): properly handle the case when self is a TypedArray.
 2308|   134k|  LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  624|   134k|  do {                                                          \
  |  |  625|   134k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 138, False: 134k]
  |  |  ------------------
  |  |  626|    138|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|    138|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|    138|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|    138|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 138]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|    138|      id = **idRes;                                             \
  |  |  632|    138|    }                                                           \
  |  |  633|   134k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
 2309|   134k|  return addOwnProperty(
 2310|   134k|      selfHandle, runtime, id, dpFlags, valueOrAccessor, opFlags);
 2311|   134k|}
_ZN6hermes2vm8JSObject17preventExtensionsEPS1_:
 2536|    336|void JSObject::preventExtensions(JSObject *self) {
 2537|    336|  assert(
 2538|    336|      !self->flags_.proxyObject &&
 2539|    336|      "[[Extensible]] slot cannot be set directly on Proxy objects");
 2540|      0|  self->flags_.noExtend = true;
 2541|    336|}
_ZN6hermes2vm8JSObject14addOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2683|   193k|    PropOpFlags opFlags) {
 2684|       |  /// Can we add more properties?
 2685|   193k|  if (!selfHandle->isExtensible() && !opFlags.getInternalForce()) {
  ------------------
  |  Branch (2685:7): [True: 0, False: 193k]
  |  Branch (2685:38): [True: 0, False: 0]
  ------------------
 2686|      0|    if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2686:9): [True: 0, False: 0]
  ------------------
 2687|      0|      return runtime.raiseTypeError(
 2688|      0|          TwineChar16("Cannot add new property '") +
 2689|      0|          runtime.getIdentifierTable().getStringViewForDev(runtime, name) +
 2690|      0|          "'");
 2691|      0|    }
 2692|      0|    return false;
 2693|      0|  }
 2694|       |
 2695|   193k|  PropertyFlags flags{};
 2696|       |
 2697|       |  // Accessors don't set writeable.
 2698|   193k|  if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2698:7): [True: 4.18k, False: 189k]
  ------------------
 2699|  4.18k|    dpFlags.setWritable = 0;
 2700|  4.18k|    flags.accessor = 1;
 2701|  4.18k|  }
 2702|       |
 2703|       |  // Override the default flags if specified.
 2704|   193k|  if (dpFlags.setEnumerable)
  ------------------
  |  Branch (2704:7): [True: 192k, False: 990]
  ------------------
 2705|   192k|    flags.enumerable = dpFlags.enumerable;
 2706|   193k|  if (dpFlags.setWritable)
  ------------------
  |  Branch (2706:7): [True: 188k, False: 5.17k]
  ------------------
 2707|   188k|    flags.writable = dpFlags.writable;
 2708|   193k|  if (dpFlags.setConfigurable)
  ------------------
  |  Branch (2708:7): [True: 192k, False: 990]
  ------------------
 2709|   192k|    flags.configurable = dpFlags.configurable;
 2710|   193k|  flags.internalSetter = dpFlags.enableInternalSetter;
 2711|       |
 2712|   193k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   193k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 193k]
  |  |  ------------------
  ------------------
 2713|   193k|          addOwnPropertyImpl(
 2714|   193k|              selfHandle, runtime, name, flags, valueOrAccessor) ==
 2715|   193k|          ExecutionStatus::EXCEPTION)) {
 2716|      0|    return ExecutionStatus::EXCEPTION;
 2717|      0|  }
 2718|       |
 2719|   193k|  return true;
 2720|   193k|}
_ZN6hermes2vm8JSObject18addOwnPropertyImplENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_13PropertyFlagsENS2_INS0_11HermesValueEEE:
 2727|   300k|    Handle<> valueOrAccessor) {
 2728|   300k|  assert(
 2729|   300k|      !selfHandle->flags_.proxyObject &&
 2730|   300k|      "Internal properties cannot be added to Proxy objects");
 2731|       |  // Add a new property to the class.
 2732|       |  // TODO: if we check for OOM here in the future, we must undo the slot
 2733|       |  // allocation.
 2734|      0|  auto addResult = HiddenClass::addProperty(
 2735|   300k|      runtime.makeHandle(selfHandle->clazz_), runtime, name, propertyFlags);
 2736|   300k|  if (LLVM_UNLIKELY(addResult == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   300k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 300k]
  |  |  ------------------
  ------------------
 2737|      0|    return ExecutionStatus::EXCEPTION;
 2738|      0|  }
 2739|   300k|  selfHandle->clazz_.setNonNull(runtime, *addResult->first, runtime.getHeap());
 2740|       |
 2741|   300k|  allocateNewSlotStorage(
 2742|   300k|      selfHandle, runtime, addResult->second, valueOrAccessor);
 2743|       |
 2744|       |  // If this is an index-like property, we need to clear the fast path flags.
 2745|   300k|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|   300k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 134k, False: 166k]
  |  |  ------------------
  ------------------
 2746|   300k|          selfHandle->clazz_.getNonNull(runtime)->getHasIndexLikeProperties()))
 2747|   134k|    selfHandle->flags_.fastIndexProperties = false;
 2748|       |
 2749|   300k|  return ExecutionStatus::RETURNED;
 2750|   300k|}
_ZN6hermes2vm8JSObject17updateOwnPropertyENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_15DictPropertyMap11PropertyPosENS0_23NamedPropertyDescriptorENS0_19DefinePropertyFlagsENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2760|    756|    PropOpFlags opFlags) {
 2761|    756|  auto updateStatus = checkPropertyUpdate(
 2762|    756|      runtime,
 2763|    756|      desc.flags,
 2764|    756|      dpFlags,
 2765|    756|      getNamedSlotValueUnsafe(selfHandle.get(), runtime, desc)
 2766|    756|          .unboxToHV(runtime),
 2767|    756|      valueOrAccessor,
 2768|    756|      opFlags);
 2769|    756|  if (updateStatus == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (2769:7): [True: 0, False: 756]
  ------------------
 2770|      0|    return ExecutionStatus::EXCEPTION;
 2771|    756|  if (updateStatus->first == PropertyUpdateStatus::failed)
  ------------------
  |  Branch (2771:7): [True: 0, False: 756]
  ------------------
 2772|      0|    return false;
 2773|       |
 2774|       |  // If the property flags changed, update them.
 2775|    756|  if (updateStatus->second != desc.flags) {
  ------------------
  |  Branch (2775:7): [True: 459, False: 297]
  ------------------
 2776|    459|    desc.flags = updateStatus->second;
 2777|    459|    auto newClazz = HiddenClass::updateProperty(
 2778|    459|        runtime.makeHandle(selfHandle->clazz_),
 2779|    459|        runtime,
 2780|    459|        propertyPos,
 2781|    459|        desc.flags);
 2782|    459|    selfHandle->clazz_.setNonNull(runtime, *newClazz, runtime.getHeap());
 2783|    459|  }
 2784|       |
 2785|    756|  if (updateStatus->first == PropertyUpdateStatus::done)
  ------------------
  |  Branch (2785:7): [True: 534, False: 222]
  ------------------
 2786|    534|    return true;
 2787|    222|  assert(
 2788|    222|      updateStatus->first == PropertyUpdateStatus::needSet &&
 2789|    222|      "unexpected PropertyUpdateStatus");
 2790|       |
 2791|    222|  if (dpFlags.setValue) {
  ------------------
  |  Branch (2791:7): [True: 222, False: 0]
  ------------------
 2792|    222|    if (LLVM_LIKELY(!desc.flags.internalSetter)) {
  ------------------
  |  |  188|    222|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 222, False: 0]
  |  |  ------------------
  ------------------
 2793|    222|      auto shv = SmallHermesValue::encodeHermesValue(*valueOrAccessor, runtime);
 2794|    222|      setNamedSlotValueUnsafe(selfHandle.get(), runtime, desc, shv);
 2795|    222|    } else {
 2796|      0|      return internalSetter(
 2797|      0|          selfHandle, runtime, name, desc, valueOrAccessor, opFlags);
 2798|      0|    }
 2799|    222|  } else if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2799:14): [True: 0, False: 0]
  ------------------
 2800|      0|    auto shv = SmallHermesValue::encodeHermesValue(*valueOrAccessor, runtime);
 2801|      0|    setNamedSlotValueUnsafe(selfHandle.get(), runtime, desc, shv);
 2802|      0|  } else {
 2803|       |    // If checkPropertyUpdate() returned needSet, but there is no value or
 2804|       |    // accessor, clear the value.
 2805|      0|    setNamedSlotValueUnsafe(
 2806|      0|        selfHandle.get(),
 2807|      0|        runtime,
 2808|      0|        desc,
 2809|      0|        SmallHermesValue::encodeUndefinedValue());
 2810|      0|  }
 2811|       |
 2812|    222|  return true;
 2813|    222|}
_ZN6hermes2vm8JSObject19checkPropertyUpdateERNS0_7RuntimeENS0_13PropertyFlagsENS0_19DefinePropertyFlagsENS0_11HermesValueENS0_6HandleIS6_EENS0_11PropOpFlagsE:
 2822|    756|    PropOpFlags opFlags) {
 2823|       |  // 8.12.9 [5] Return true, if every field in Desc is absent.
 2824|    756|  if (dpFlags.isEmpty())
  ------------------
  |  Branch (2824:7): [True: 0, False: 756]
  ------------------
 2825|      0|    return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2826|       |
 2827|    756|  assert(
 2828|    756|      (!dpFlags.isAccessor() || (!dpFlags.setWritable && !dpFlags.writable)) &&
 2829|    756|      "can't set both accessor and writable");
 2830|      0|  assert(
 2831|    756|      !dpFlags.enableInternalSetter &&
 2832|    756|      "cannot change the value of internalSetter");
 2833|       |
 2834|       |  // 8.12.9 [6] Return true, if every field in Desc also occurs in current and
 2835|       |  // the value of every field in Desc is the same value as the corresponding
 2836|       |  // field in current when compared using the SameValue algorithm (9.12).
 2837|       |  // TODO: this would probably be much more efficient with bitmasks.
 2838|    756|  if ((!dpFlags.setEnumerable ||
  ------------------
  |  Branch (2838:8): [True: 237, False: 519]
  ------------------
 2839|    756|       dpFlags.enumerable == currentFlags.enumerable) &&
  ------------------
  |  Branch (2839:8): [True: 519, False: 0]
  ------------------
 2840|    756|      (!dpFlags.setConfigurable ||
  ------------------
  |  Branch (2840:8): [True: 0, False: 756]
  ------------------
 2841|    756|       dpFlags.configurable == currentFlags.configurable)) {
  ------------------
  |  Branch (2841:8): [True: 657, False: 99]
  ------------------
 2842|    657|    if (dpFlags.isAccessor()) {
  ------------------
  |  Branch (2842:9): [True: 0, False: 657]
  ------------------
 2843|      0|      if (currentFlags.accessor) {
  ------------------
  |  Branch (2843:11): [True: 0, False: 0]
  ------------------
 2844|      0|        auto *curAccessor = vmcast<PropertyAccessor>(curValueOrAccessor);
 2845|      0|        auto *newAccessor = vmcast<PropertyAccessor>(valueOrAccessor.get());
 2846|       |
 2847|      0|        if ((!dpFlags.setGetter ||
  ------------------
  |  Branch (2847:14): [True: 0, False: 0]
  ------------------
 2848|      0|             curAccessor->getter == newAccessor->getter) &&
  ------------------
  |  Branch (2848:14): [True: 0, False: 0]
  ------------------
 2849|      0|            (!dpFlags.setSetter ||
  ------------------
  |  Branch (2849:14): [True: 0, False: 0]
  ------------------
 2850|      0|             curAccessor->setter == newAccessor->setter)) {
  ------------------
  |  Branch (2850:14): [True: 0, False: 0]
  ------------------
 2851|      0|          return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2852|      0|        }
 2853|      0|      }
 2854|    657|    } else {
 2855|    657|      if (!currentFlags.accessor &&
  ------------------
  |  Branch (2855:11): [True: 633, False: 24]
  ------------------
 2856|    657|          (!dpFlags.setValue ||
  ------------------
  |  Branch (2856:12): [True: 138, False: 495]
  ------------------
 2857|    633|           isSameValue(curValueOrAccessor, valueOrAccessor.get())) &&
  ------------------
  |  Branch (2857:12): [True: 495, False: 0]
  ------------------
 2858|    657|          (!dpFlags.setWritable || dpFlags.writable == currentFlags.writable)) {
  ------------------
  |  Branch (2858:12): [True: 0, False: 633]
  |  Branch (2858:36): [True: 297, False: 336]
  ------------------
 2859|    297|        return std::make_pair(PropertyUpdateStatus::done, currentFlags);
 2860|    297|      }
 2861|    657|    }
 2862|    657|  }
 2863|       |
 2864|       |  // 8.12.9 [7]
 2865|       |  // If the property is not configurable, some aspects are not changeable.
 2866|    459|  if (!currentFlags.configurable) {
  ------------------
  |  Branch (2866:7): [True: 138, False: 321]
  ------------------
 2867|       |    // Trying to change non-configurable to configurable?
 2868|    138|    if (dpFlags.configurable) {
  ------------------
  |  Branch (2868:9): [True: 0, False: 138]
  ------------------
 2869|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2869:11): [True: 0, False: 0]
  ------------------
 2870|      0|        return runtime.raiseTypeError(
 2871|      0|            "property is not configurable"); // TODO: better message.
 2872|      0|      }
 2873|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2874|      0|    }
 2875|       |
 2876|       |    // Trying to change the enumerability of non-configurable property?
 2877|    138|    if (dpFlags.setEnumerable &&
  ------------------
  |  Branch (2877:9): [True: 0, False: 138]
  ------------------
 2878|    138|        dpFlags.enumerable != currentFlags.enumerable) {
  ------------------
  |  Branch (2878:9): [True: 0, False: 0]
  ------------------
 2879|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2879:11): [True: 0, False: 0]
  ------------------
 2880|      0|        return runtime.raiseTypeError(
 2881|      0|            "property is not configurable"); // TODO: better message.
 2882|      0|      }
 2883|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2884|      0|    }
 2885|    138|  }
 2886|       |
 2887|    459|  PropertyFlags newFlags = currentFlags;
 2888|       |
 2889|       |  // 8.12.9 [8] If IsGenericDescriptor(Desc) is true, then no further validation
 2890|       |  // is required.
 2891|    459|  if (!(dpFlags.setValue || dpFlags.setWritable || dpFlags.setGetter ||
  ------------------
  |  Branch (2891:9): [True: 222, False: 237]
  |  Branch (2891:29): [True: 138, False: 99]
  |  Branch (2891:52): [True: 0, False: 99]
  ------------------
 2892|    459|        dpFlags.setSetter)) {
  ------------------
  |  Branch (2892:9): [True: 0, False: 99]
  ------------------
 2893|       |    // Do nothing
 2894|     99|  }
 2895|       |  // 8.12.9 [9]
 2896|       |  // Changing between accessor and data descriptor?
 2897|    360|  else if (currentFlags.accessor != dpFlags.isAccessor()) {
  ------------------
  |  Branch (2897:12): [True: 24, False: 336]
  ------------------
 2898|     24|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2898:9): [True: 0, False: 24]
  ------------------
 2899|      0|      if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2899:11): [True: 0, False: 0]
  ------------------
 2900|      0|        return runtime.raiseTypeError(
 2901|      0|            "property is not configurable"); // TODO: better message.
 2902|      0|      }
 2903|      0|      return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2904|      0|    }
 2905|       |
 2906|       |    // If we change from accessor to data descriptor, Preserve the existing
 2907|       |    // values of the converted property’s [[Configurable]] and [[Enumerable]]
 2908|       |    // attributes and set the rest of the property’s attributes to their default
 2909|       |    // values.
 2910|       |    // If it's the other way around, since the accessor doesn't have the
 2911|       |    // [[Writable]] attribute, do nothing.
 2912|     24|    newFlags.writable = 0;
 2913|       |
 2914|       |    // If we are changing from accessor to non-accessor, we must set a new
 2915|       |    // value.
 2916|     24|    if (!dpFlags.isAccessor())
  ------------------
  |  Branch (2916:9): [True: 24, False: 0]
  ------------------
 2917|     24|      dpFlags.setValue = 1;
 2918|     24|  }
 2919|       |  // 8.12.9 [10] if both are data descriptors.
 2920|    336|  else if (!currentFlags.accessor) {
  ------------------
  |  Branch (2920:12): [True: 336, False: 0]
  ------------------
 2921|    336|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2921:9): [True: 138, False: 198]
  ------------------
 2922|    138|      if (!currentFlags.writable) {
  ------------------
  |  Branch (2922:11): [True: 0, False: 138]
  ------------------
 2923|       |        // If the current property is not writable, but the new one is.
 2924|      0|        if (dpFlags.writable) {
  ------------------
  |  Branch (2924:13): [True: 0, False: 0]
  ------------------
 2925|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2925:15): [True: 0, False: 0]
  ------------------
 2926|      0|            return runtime.raiseTypeError(
 2927|      0|                "property is not configurable"); // TODO: better message.
 2928|      0|          }
 2929|      0|          return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2930|      0|        }
 2931|       |
 2932|       |        // If we are setting a different value.
 2933|      0|        if (dpFlags.setValue &&
  ------------------
  |  Branch (2933:13): [True: 0, False: 0]
  ------------------
 2934|      0|            !isSameValue(curValueOrAccessor, valueOrAccessor.get())) {
  ------------------
  |  Branch (2934:13): [True: 0, False: 0]
  ------------------
 2935|      0|          if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2935:15): [True: 0, False: 0]
  ------------------
 2936|      0|            return runtime.raiseTypeError(
 2937|      0|                "property is not writable"); // TODO: better message.
 2938|      0|          }
 2939|      0|          return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2940|      0|        }
 2941|      0|      }
 2942|    138|    }
 2943|    336|  }
 2944|       |  // 8.12.9 [11] Both are accessors.
 2945|      0|  else {
 2946|      0|    auto *curAccessor = vmcast<PropertyAccessor>(curValueOrAccessor);
 2947|      0|    auto *newAccessor = vmcast<PropertyAccessor>(valueOrAccessor.get());
 2948|       |
 2949|       |    // If not configurable, make sure that nothing is changing.
 2950|      0|    if (!currentFlags.configurable) {
  ------------------
  |  Branch (2950:9): [True: 0, False: 0]
  ------------------
 2951|      0|      if ((dpFlags.setGetter && newAccessor->getter != curAccessor->getter) ||
  ------------------
  |  Branch (2951:12): [True: 0, False: 0]
  |  Branch (2951:33): [True: 0, False: 0]
  ------------------
 2952|      0|          (dpFlags.setSetter && newAccessor->setter != curAccessor->setter)) {
  ------------------
  |  Branch (2952:12): [True: 0, False: 0]
  |  Branch (2952:33): [True: 0, False: 0]
  ------------------
 2953|      0|        if (opFlags.getThrowOnError()) {
  ------------------
  |  Branch (2953:13): [True: 0, False: 0]
  ------------------
 2954|      0|          return runtime.raiseTypeError(
 2955|      0|              "property is not configurable"); // TODO: better message.
 2956|      0|        }
 2957|      0|        return std::make_pair(PropertyUpdateStatus::failed, PropertyFlags{});
 2958|      0|      }
 2959|      0|    }
 2960|       |
 2961|       |    // If not setting the getter or the setter, re-use the current one.
 2962|      0|    if (!dpFlags.setGetter)
  ------------------
  |  Branch (2962:9): [True: 0, False: 0]
  ------------------
 2963|      0|      newAccessor->getter.set(runtime, curAccessor->getter, runtime.getHeap());
 2964|      0|    if (!dpFlags.setSetter)
  ------------------
  |  Branch (2964:9): [True: 0, False: 0]
  ------------------
 2965|      0|      newAccessor->setter.set(runtime, curAccessor->setter, runtime.getHeap());
 2966|      0|  }
 2967|       |
 2968|       |  // 8.12.9 [12] For each attribute field of Desc that is present, set the
 2969|       |  // correspondingly named attribute of the property named P of object O to the
 2970|       |  // value of the field.
 2971|    459|  if (dpFlags.setEnumerable)
  ------------------
  |  Branch (2971:7): [True: 222, False: 237]
  ------------------
 2972|    222|    newFlags.enumerable = dpFlags.enumerable;
 2973|    459|  if (dpFlags.setWritable)
  ------------------
  |  Branch (2973:7): [True: 360, False: 99]
  ------------------
 2974|    360|    newFlags.writable = dpFlags.writable;
 2975|    459|  if (dpFlags.setConfigurable)
  ------------------
  |  Branch (2975:7): [True: 459, False: 0]
  ------------------
 2976|    459|    newFlags.configurable = dpFlags.configurable;
 2977|       |
 2978|    459|  if (dpFlags.setValue)
  ------------------
  |  Branch (2978:7): [True: 222, False: 237]
  ------------------
 2979|    222|    newFlags.accessor = false;
 2980|    237|  else if (dpFlags.isAccessor())
  ------------------
  |  Branch (2980:12): [True: 0, False: 237]
  ------------------
 2981|      0|    newFlags.accessor = true;
 2982|    237|  else
 2983|    237|    return std::make_pair(PropertyUpdateStatus::done, newFlags);
 2984|       |
 2985|    222|  return std::make_pair(PropertyUpdateStatus::needSet, newFlags);
 2986|    459|}
_ZN6hermes2vm8JSObject14internalSetterENS0_6HandleIS1_EERNS0_7RuntimeENS0_8SymbolIDENS0_23NamedPropertyDescriptorENS2_INS0_11HermesValueEEENS0_11PropOpFlagsE:
 2994|      7|    PropOpFlags opFlags) {
 2995|      7|  if (vmisa<JSArray>(selfHandle.get())) {
  ------------------
  |  Branch (2995:7): [True: 7, False: 0]
  ------------------
 2996|      7|    if (name == Predefined::getSymbolID(Predefined::length)) {
  ------------------
  |  Branch (2996:9): [True: 7, False: 0]
  ------------------
 2997|      7|      return JSArray::setLength(
 2998|      7|          Handle<JSArray>::vmcast(selfHandle), runtime, value, opFlags);
 2999|      7|    }
 3000|      7|  }
 3001|       |
 3002|      0|  llvm_unreachable("unhandled property in Object::internalSetter()");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 3003|      7|}
JSObject.cpp:_ZN6hermes2vm12_GLOBAL__N_137getOwnComputedPrimitiveDescriptorImplENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeENS2_INS0_11HermesValueEEENS3_11IgnoreProxyERNS0_8SymbolIDERNS0_13MutableHandleISA_EERNS0_26ComputedPropertyDescriptorE:
  697|  68.7k|    ComputedPropertyDescriptor &desc) {
  698|  68.7k|  assert(
  699|  68.7k|      !nameValHandle->isObject() &&
  700|  68.7k|      "nameValHandle passed to "
  701|  68.7k|      "getOwnComputedPrimitiveDescriptor "
  702|  68.7k|      "cannot be an object");
  703|       |
  704|       |  // Try the fast paths first if we have "fast" index properties and the
  705|       |  // property name is an obvious index.
  706|  68.7k|  if (auto arrayIndex = toArrayIndexFastPath(*nameValHandle)) {
  ------------------
  |  Branch (706:12): [True: 67.2k, False: 1.52k]
  ------------------
  707|  67.2k|    if (JSObject::Helper::flags(*selfHandle).fastIndexProperties) {
  ------------------
  |  Branch (707:9): [True: 0, False: 67.2k]
  ------------------
  708|      0|      auto res = JSObject::Helper::getOwnIndexedPropertyFlags(
  709|      0|          selfHandle.get(), runtime, *arrayIndex);
  710|      0|      if (res) {
  ------------------
  |  Branch (710:11): [True: 0, False: 0]
  ------------------
  711|       |        // This a valid array index, residing in our indexed storage.
  712|      0|        desc.flags = *res;
  713|      0|        desc.flags.indexed = 1;
  714|      0|        desc.slot = *arrayIndex;
  715|      0|        return true;
  716|      0|      }
  717|       |
  718|       |      // This a valid array index, but we don't have it in our indexed storage,
  719|       |      // and we don't have index-like named properties.
  720|      0|      return false;
  721|      0|    }
  722|       |
  723|  67.2k|    if (!selfHandle->getClass(runtime)->getHasIndexLikeProperties() &&
  ------------------
  |  Branch (723:9): [True: 0, False: 67.2k]
  ------------------
  724|  67.2k|        !selfHandle->isHostObject() && !selfHandle->isLazy() &&
  ------------------
  |  Branch (724:9): [True: 0, False: 0]
  |  Branch (724:40): [True: 0, False: 0]
  ------------------
  725|  67.2k|        !selfHandle->isProxyObject()) {
  ------------------
  |  Branch (725:9): [True: 0, False: 0]
  ------------------
  726|       |      // Early return to handle the case where an object definitely has no
  727|       |      // index-like properties. This avoids allocating a new StringPrimitive and
  728|       |      // uniquing it below.
  729|      0|      return false;
  730|      0|    }
  731|  67.2k|  }
  732|       |
  733|       |  // Convert the string to a SymbolID
  734|  68.7k|  LAZY_TO_IDENTIFIER(runtime, nameValHandle, id);
  ------------------
  |  |  624|  68.7k|  do {                                                          \
  |  |  625|  68.7k|    if (id.isInvalid()) {                                       \
  |  |  ------------------
  |  |  |  Branch (625:9): [True: 67.8k, False: 955]
  |  |  ------------------
  |  |  626|  67.8k|      CallResult<Handle<SymbolID>> idRes =                      \
  |  |  627|  67.8k|          valueToSymbolID(runtime, nameValHandle);              \
  |  |  628|  67.8k|      if (LLVM_UNLIKELY(idRes == ExecutionStatus::EXCEPTION)) { \
  |  |  ------------------
  |  |  |  |  189|  67.8k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (189:29): [True: 0, False: 67.8k]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  629|      0|        return ExecutionStatus::EXCEPTION;                      \
  |  |  630|      0|      }                                                         \
  |  |  631|  67.8k|      id = **idRes;                                             \
  |  |  632|  67.8k|    }                                                           \
  |  |  633|  68.7k|  } while (0)
  |  |  ------------------
  |  |  |  Branch (633:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  735|       |
  736|       |  // Look for a named property with this name.
  737|  68.7k|  if (JSObject::getOwnNamedDescriptor(
  ------------------
  |  Branch (737:7): [True: 67.3k, False: 1.46k]
  ------------------
  738|  68.7k|          selfHandle,
  739|  68.7k|          runtime,
  740|  68.7k|          id,
  741|  68.7k|          JSObject::Helper::castToNamedPropertyDescriptorRef(desc))) {
  742|  67.3k|    return true;
  743|  67.3k|  }
  744|       |
  745|  1.46k|  if (LLVM_LIKELY(
  ------------------
  |  |  188|  5.24k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.15k, False: 312]
  |  |  |  Branch (188:51): [True: 1.15k, False: 312]
  |  |  |  Branch (188:51): [True: 1.15k, False: 0]
  |  |  |  Branch (188:51): [True: 1.15k, False: 0]
  |  |  ------------------
  ------------------
  746|  1.46k|          !JSObject::Helper::flags(*selfHandle).indexedStorage &&
  747|  1.46k|          !selfHandle->isLazy() && !selfHandle->isProxyObject())) {
  748|  1.15k|    return false;
  749|  1.15k|  }
  750|    312|  MutableHandle<StringPrimitive> strPrim{runtime};
  751|       |
  752|       |  // If we have indexed storage, perform potentially expensive conversions
  753|       |  // to array index and check it.
  754|    312|  if (JSObject::Helper::flags(*selfHandle).indexedStorage) {
  ------------------
  |  Branch (754:7): [True: 312, False: 0]
  ------------------
  755|       |    // If the name is a valid integer array index, store it here.
  756|    312|    OptValue<uint32_t> arrayIndex;
  757|       |
  758|       |    // Try to convert the property name to an array index.
  759|    312|    TO_ARRAY_INDEX(runtime, nameValHandle, strPrim, arrayIndex);
  ------------------
  |  |  642|    312|  do {                                                          \
  |  |  643|    312|    arrayIndex = toArrayIndexFastPath(*nameValHandle);          \
  |  |  644|    312|    if (!arrayIndex && !nameValHandle->isSymbol()) {            \
  |  |  ------------------
  |  |  |  Branch (644:9): [True: 312, False: 0]
  |  |  |  Branch (644:24): [True: 0, False: 312]
  |  |  ------------------
  |  |  645|      0|      LAZY_TO_STRING(runtime, nameValHandle, str);              \
  |  |  ------------------
  |  |  |  |  609|      0|  do {                                                    \
  |  |  |  |  610|      0|    if (!str) {                                           \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (610:9): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |  611|      0|      auto status = toString_RJS(runtime, nameValHandle); \
  |  |  |  |  612|      0|      assert(                                             \
  |  |  |  |  613|      0|          status != ExecutionStatus::EXCEPTION &&         \
  |  |  |  |  614|      0|          "toString() of primitive cannot fail");         \
  |  |  |  |  615|      0|      str = status->get();                                \
  |  |  |  |  616|      0|    }                                                     \
  |  |  |  |  617|      0|  } while (0)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (617:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  |  |  646|      0|      arrayIndex = toArrayIndex(runtime, str);                  \
  |  |  647|      0|    }                                                           \
  |  |  648|    312|  } while (0)
  |  |  ------------------
  |  |  |  Branch (648:12): [Folded - Ignored]
  |  |  ------------------
  ------------------
  760|       |
  761|    312|    if (arrayIndex) {
  ------------------
  |  Branch (761:9): [True: 0, False: 312]
  ------------------
  762|      0|      auto res = JSObject::Helper::getOwnIndexedPropertyFlags(
  763|      0|          selfHandle.get(), runtime, *arrayIndex);
  764|      0|      if (res) {
  ------------------
  |  Branch (764:11): [True: 0, False: 0]
  ------------------
  765|      0|        desc.flags = *res;
  766|      0|        desc.flags.indexed = 1;
  767|      0|        desc.slot = *arrayIndex;
  768|      0|        return true;
  769|      0|      }
  770|      0|    }
  771|    312|    return false;
  772|    312|  }
  773|       |
  774|      0|  if (selfHandle->isLazy()) {
  ------------------
  |  Branch (774:7): [True: 0, False: 0]
  ------------------
  775|      0|    JSObject::initializeLazyObject(runtime, selfHandle);
  776|      0|    return JSObject::getOwnComputedPrimitiveDescriptor(
  777|      0|        selfHandle,
  778|      0|        runtime,
  779|      0|        nameValHandle,
  780|      0|        ignoreProxy,
  781|      0|        tmpSymbolStorage,
  782|      0|        desc);
  783|      0|  }
  784|       |
  785|      0|  assert(selfHandle->isProxyObject() && "descriptor flags are impossible");
  786|      0|  if (ignoreProxy == JSObject::IgnoreProxy::Yes) {
  ------------------
  |  Branch (786:7): [True: 0, False: 0]
  ------------------
  787|      0|    return false;
  788|      0|  }
  789|      0|  return JSProxy::getOwnProperty(
  790|      0|      selfHandle, runtime, nameValHandle, desc, nullptr);
  791|      0|}
_ZN6hermes2vm8JSObject6Helper5flagsEPS1_:
  662|  69.0k|  static ObjectFlags &flags(JSObject *self) {
  663|  69.0k|    return self->flags_;
  664|  69.0k|  }
_ZN6hermes2vm8JSObject6Helper32castToNamedPropertyDescriptorRefERNS0_26ComputedPropertyDescriptorE:
  674|  68.7k|      ComputedPropertyDescriptor &desc) {
  675|  68.7k|    return desc.castToNamedPropertyDescriptorRef();
  676|  68.7k|  }
JSObject.cpp:_ZN6hermes2vmL23canNewPropertyBeIndexedENS0_19DefinePropertyFlagsE:
  653|   354k|static bool canNewPropertyBeIndexed(DefinePropertyFlags dpf) {
  654|   354k|  return dpf.setEnumerable && dpf.enumerable && dpf.setWritable &&
  ------------------
  |  Branch (654:10): [True: 354k, False: 0]
  |  Branch (654:31): [True: 354k, False: 0]
  |  Branch (654:49): [True: 354k, False: 0]
  ------------------
  655|   354k|      dpf.writable && dpf.setConfigurable && dpf.configurable &&
  ------------------
  |  Branch (655:7): [True: 219k, False: 134k]
  |  Branch (655:23): [True: 219k, False: 0]
  |  Branch (655:46): [True: 219k, False: 0]
  ------------------
  656|   354k|      !dpf.setSetter && !dpf.setGetter;
  ------------------
  |  Branch (656:7): [True: 219k, False: 0]
  |  Branch (656:25): [True: 219k, False: 0]
  ------------------
  657|   354k|}

_ZN6hermes2vm16JSProxyBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   89|      1|void JSProxyBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   90|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSProxy>());
   91|      1|  JSObjectBuildMeta(cell, mb);
   92|      1|  const auto *self = static_cast<const JSProxy *>(cell);
   93|      1|  mb.setVTable(&JSProxy::vt);
   94|      1|  mb.addField("@target", &self->slots_.target);
   95|      1|  mb.addField("@handler", &self->slots_.handler);
   96|      1|}

_ZN6hermes2vm17JSRegExpBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   58|      1|void JSRegExpBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   59|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSRegExp>());
   60|      1|  JSObjectBuildMeta(cell, mb);
   61|      1|  const auto *self = static_cast<const JSRegExp *>(cell);
   62|      1|  mb.setVTable(&JSRegExp::vt);
   63|      1|  mb.addField(&self->pattern_);
   64|      1|  mb.addField(&self->groupNameMappings_);
   65|      1|}
_ZN6hermes2vm8JSRegExp6createERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEE:
   69|    242|    Handle<JSObject> parentHandle) {
   70|    242|  auto *cell = runtime.makeAFixed<JSRegExp, HasFinalizer::Yes>(
   71|    242|      runtime,
   72|    242|      parentHandle,
   73|    242|      runtime.getHiddenClassForPrototype(
   74|    242|          *parentHandle, numOverlapSlots<JSRegExp>()));
   75|    242|  return JSObjectInit::initToPseudoHandle(runtime, cell);
   76|    242|}
_ZN6hermes2vm8JSRegExp16createMatchClassERNS0_7RuntimeENS0_6HandleINS0_11HiddenClassEEE:
   80|     99|    Handle<HiddenClass> arrayClass) {
   81|       |  // Adds the property \p name to matchClass which, upon return, will point to
   82|       |  // the newly created hidden class.
   83|     99|  auto addProperty = [&](Handle<HiddenClass> clazz, Predefined::Str name) {
   84|     99|    auto added = HiddenClass::addProperty(
   85|     99|        clazz,
   86|     99|        runtime,
   87|     99|        Predefined::getSymbolID(name),
   88|     99|        PropertyFlags::defaultNewNamedPropertyFlags());
   89|     99|    assert(
   90|     99|        added != ExecutionStatus::EXCEPTION &&
   91|     99|        "Adding the first properties shouldn't cause overflow");
   92|     99|    return added->first;
   93|     99|  };
   94|       |
   95|     99|  Handle<HiddenClass> addIndex = addProperty(arrayClass, Predefined::index);
   96|     99|  Handle<HiddenClass> addInput = addProperty(addIndex, Predefined::input);
   97|     99|  return addProperty(addInput, Predefined::groups);
   98|     99|}
_ZN6hermes2vm8JSRegExp10initializeENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_15StringPrimitiveEEES7_N4llvh8ArrayRefIhEE:
  105|    242|    llvh::ArrayRef<uint8_t> bytecode) {
  106|    242|  assert(
  107|    242|      pattern && flags &&
  108|    242|      "Null pattern and/or flags passed to JSRegExp::initialize");
  109|      0|  selfHandle->pattern_.set(runtime, *pattern, runtime.getHeap());
  110|       |
  111|    242|  DefinePropertyFlags dpf = DefinePropertyFlags::getDefaultNewPropertyFlags();
  112|    242|  dpf.enumerable = 0;
  113|    242|  dpf.configurable = 0;
  114|       |
  115|    242|  auto res = JSObject::defineOwnProperty(
  116|    242|      selfHandle,
  117|    242|      runtime,
  118|    242|      Predefined::getSymbolID(Predefined::lastIndex),
  119|    242|      dpf,
  120|    242|      HandleRootOwner::getZeroValue());
  121|    242|  (void)res;
  122|    242|  assert(
  123|    242|      res != ExecutionStatus::EXCEPTION && *res &&
  124|    242|      "defineOwnProperty() failed");
  125|       |
  126|      0|  selfHandle->initializeBytecode(bytecode);
  127|    242|}
_ZN6hermes2vm8JSRegExp20getGroupNameMappingsERNS0_7RuntimeE:
  232|   404k|Handle<JSObject> JSRegExp::getGroupNameMappings(Runtime &runtime) {
  233|   404k|  if (auto *ptr = vmcast_or_null<JSObject>(groupNameMappings_.get(runtime)))
  ------------------
  |  Branch (233:13): [True: 0, False: 404k]
  ------------------
  234|      0|    return runtime.makeHandle(ptr);
  235|   404k|  return Runtime::makeNullHandle<JSObject>();
  236|   404k|}
_ZN6hermes2vm8JSRegExp18initializeBytecodeEN4llvh8ArrayRefIhEE:
  242|    242|void JSRegExp::initializeBytecode(llvh::ArrayRef<uint8_t> bytecode) {
  243|    242|  size_t sz = bytecode.size();
  244|    242|  assert(
  245|    242|      sz <= std::numeric_limits<uint32_t>::max() &&
  246|    242|      "Bytecode size cannot exceed 32 bits");
  247|      0|  auto header =
  248|    242|      reinterpret_cast<const regex::RegexBytecodeHeader *>(bytecode.data());
  249|    242|  syntaxFlags_ = regex::SyntaxFlags::fromByte(header->syntaxFlags);
  250|    242|  bytecodeSize_ = sz;
  251|    242|  bytecode_ = (uint8_t *)checkedMalloc(sz);
  252|    242|  memcpy(bytecode_, bytecode.data(), sz);
  253|    242|}
_ZN6hermes2vm8JSRegExp10getPatternEPS1_RNS0_11PointerBaseE:
  257|    234|    PointerBase &base) {
  258|    234|  return createPseudoHandle(self->pattern_.get(base));
  259|    234|}
_ZN6hermes2vm8JSRegExp6searchENS0_6HandleIS1_EERNS0_7RuntimeENS2_INS0_15StringPrimitiveEEEj:
  305|   404k|    uint32_t searchStartOffset) {
  306|   404k|  assert(selfHandle->bytecode_ && "Missing bytecode");
  307|      0|  auto input = StringPrimitive::createStringView(runtime, strHandle);
  308|       |
  309|       |  // Note we may still have a match if searchStartOffset == str.size(),
  310|       |  // if the regexp can match an empty string
  311|   404k|  if (searchStartOffset > input.length()) {
  ------------------
  |  Branch (311:7): [True: 0, False: 404k]
  ------------------
  312|      0|    return RegExpMatch{}; // no match possible
  313|      0|  }
  314|       |
  315|   404k|  auto matchFlags = regex::constants::matchDefault;
  316|       |
  317|       |  // Respect the sticky flag, which forces us to match only at the given
  318|       |  // location.
  319|   404k|  if (selfHandle->syntaxFlags_.sticky) {
  ------------------
  |  Branch (319:7): [True: 0, False: 404k]
  ------------------
  320|      0|    matchFlags |= regex::constants::matchOnlyAtStart;
  321|      0|  }
  322|       |
  323|   404k|  CallResult<RegExpMatch> matchResult = RegExpMatch{};
  324|   404k|  if (input.isASCII()) {
  ------------------
  |  Branch (324:7): [True: 48.9k, False: 355k]
  ------------------
  325|  48.9k|    matchFlags |= regex::constants::matchInputAllAscii;
  326|  48.9k|    matchResult = performSearch<char, regex::ASCIIRegexTraits>(
  327|  48.9k|        runtime,
  328|  48.9k|        llvh::makeArrayRef(selfHandle->bytecode_, selfHandle->bytecodeSize_),
  329|  48.9k|        input.castToCharPtr(),
  330|  48.9k|        input.length(),
  331|  48.9k|        searchStartOffset,
  332|  48.9k|        matchFlags);
  333|   355k|  } else {
  334|   355k|    matchResult = performSearch<char16_t, regex::UTF16RegexTraits>(
  335|   355k|        runtime,
  336|   355k|        llvh::makeArrayRef(selfHandle->bytecode_, selfHandle->bytecodeSize_),
  337|   355k|        input.castToChar16Ptr(),
  338|   355k|        input.length(),
  339|   355k|        searchStartOffset,
  340|   355k|        matchFlags);
  341|   355k|  }
  342|       |
  343|       |  // Only update on successful match.
  344|   404k|  if (LLVM_UNLIKELY(matchResult == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   404k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 404k]
  |  |  ------------------
  ------------------
  345|      0|    return ExecutionStatus::EXCEPTION;
  346|   404k|  } else if (!matchResult->empty()) {
  ------------------
  |  Branch (346:14): [True: 404k, False: 4]
  ------------------
  347|   404k|    runtime.regExpLastInput = strHandle.getHermesValue();
  348|   404k|    runtime.regExpLastRegExp = selfHandle.getHermesValue();
  349|   404k|    runtime.regExpLastMatch = *matchResult;
  350|   404k|  }
  351|   404k|  return matchResult;
  352|   404k|}
_ZN6hermes2vm8JSRegExpD2Ev:
  354|    242|JSRegExp::~JSRegExp() {
  355|    242|  free(bytecode_);
  356|    242|}
_ZN6hermes2vm8JSRegExp13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  358|    242|void JSRegExp::_finalizeImpl(GCCell *cell, GC &gc) {
  359|    242|  JSRegExp *self = vmcast<JSRegExp>(cell);
  360|    242|  if (self->bytecode_) {
  ------------------
  |  Branch (360:7): [True: 242, False: 0]
  ------------------
  361|    242|    gc.getIDTracker().untrackNative(self->bytecode_);
  362|    242|  }
  363|    242|  self->~JSRegExp();
  364|    242|}
_ZN6hermes2vm8JSRegExp13escapePatternENS0_6HandleINS0_15StringPrimitiveEEERNS0_7RuntimeE:
  415|    234|    Runtime &runtime) {
  416|    234|  SmallU16String<32> result;
  417|    234|  result.reserve(pattern->getStringLength());
  418|    234|  auto patternView = StringPrimitive::createStringView(runtime, pattern);
  419|    234|  bool isBackslashed = false;
  420|   871k|  for (char16_t c : patternView) {
  ------------------
  |  Branch (420:19): [True: 871k, False: 234]
  ------------------
  421|   871k|    switch (c) {
  422|      0|      case u'/':
  ------------------
  |  Branch (422:7): [True: 0, False: 871k]
  ------------------
  423|       |        // Avoid premature end of regex.
  424|       |        // TODO nice to have: don't do this if we are in square brackets.
  425|       |        // /[/]/ is valid and the middle / does not need to be escaped.
  426|       |        // However /[\/]/ is also valid and means the same thing
  427|       |        // (CharacterEscape production from regexp grammar). Still it would be
  428|       |        // nice to not unnecessarily mangle the user's supplied pattern.
  429|      0|        result.append(isBackslashed ? "/" : "\\/");
  ------------------
  |  Branch (429:23): [True: 0, False: 0]
  ------------------
  430|      0|        break;
  431|       |
  432|       |        // Escape line terminators. See ES5.1 7.3.
  433|      0|      case u'\n':
  ------------------
  |  Branch (433:7): [True: 0, False: 871k]
  ------------------
  434|      0|        result.append(isBackslashed ? "n" : "\\n");
  ------------------
  |  Branch (434:23): [True: 0, False: 0]
  ------------------
  435|      0|        break;
  436|       |
  437|      0|      case u'\r':
  ------------------
  |  Branch (437:7): [True: 0, False: 871k]
  ------------------
  438|      0|        result.append(isBackslashed ? "r" : "\\r");
  ------------------
  |  Branch (438:23): [True: 0, False: 0]
  ------------------
  439|      0|        break;
  440|       |
  441|      0|      case 0x2028:
  ------------------
  |  Branch (441:7): [True: 0, False: 871k]
  ------------------
  442|      0|        result.append(isBackslashed ? "u2028" : "\\u2028");
  ------------------
  |  Branch (442:23): [True: 0, False: 0]
  ------------------
  443|      0|        break;
  444|       |
  445|      0|      case 0x2029:
  ------------------
  |  Branch (445:7): [True: 0, False: 871k]
  ------------------
  446|      0|        result.append(isBackslashed ? "u2029" : "\\u2029");
  ------------------
  |  Branch (446:23): [True: 0, False: 0]
  ------------------
  447|      0|        break;
  448|       |
  449|   871k|      default:
  ------------------
  |  Branch (449:7): [True: 871k, False: 0]
  ------------------
  450|   871k|        result.append(c);
  451|   871k|        break;
  452|   871k|    }
  453|   871k|    isBackslashed = (c == u'\\') && !isBackslashed;
  ------------------
  |  Branch (453:21): [True: 0, False: 871k]
  |  Branch (453:37): [True: 0, False: 0]
  ------------------
  454|   871k|  }
  455|       |  // "If P is the empty String, this specification can be met by letting S be
  456|       |  // '(?:)'."
  457|    234|  if (result.empty()) {
  ------------------
  |  Branch (457:7): [True: 0, False: 234]
  ------------------
  458|      0|    result = u"(?:)";
  459|      0|  }
  460|       |
  461|       |  // Avoid unnecessary allocation in the likely event the source and pattern
  462|       |  // match.
  463|    234|  if (patternView.equals(result.arrayRef())) {
  ------------------
  |  Branch (463:7): [True: 234, False: 0]
  ------------------
  464|    234|    return pattern.getHermesValue();
  465|    234|  }
  466|      0|  return StringPrimitive::create(runtime, result);
  467|    234|}
JSRegExp.cpp:_ZZN6hermes2vm8JSRegExp16createMatchClassERNS0_7RuntimeENS0_6HandleINS0_11HiddenClassEEEENK3$_0clES6_NS0_10Predefined3StrE:
   83|    297|  auto addProperty = [&](Handle<HiddenClass> clazz, Predefined::Str name) {
   84|    297|    auto added = HiddenClass::addProperty(
   85|    297|        clazz,
   86|    297|        runtime,
   87|    297|        Predefined::getSymbolID(name),
   88|    297|        PropertyFlags::defaultNewNamedPropertyFlags());
   89|    297|    assert(
   90|    297|        added != ExecutionStatus::EXCEPTION &&
   91|    297|        "Adding the first properties shouldn't cause overflow");
   92|      0|    return added->first;
   93|    297|  };
_ZN6hermes2vm13performSearchIcNS_5regex16ASCIIRegexTraitsEEENS0_10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeENS5_8ArrayRefIhEEPKT_jjNS2_9constants13MatchFlagTypeE:
  268|  48.9k|    regex::constants::MatchFlagType matchFlags) {
  269|  48.9k|  std::vector<regex::CapturedRange> nativeMatchRanges;
  270|  48.9k|  auto matchResult = regex::searchWithBytecode(
  271|  48.9k|      bytecode,
  272|  48.9k|      start,
  273|  48.9k|      searchStartOffset,
  274|  48.9k|      stringLength,
  275|  48.9k|      &nativeMatchRanges,
  276|  48.9k|      matchFlags);
  277|  48.9k|  if (matchResult == regex::MatchRuntimeResult::StackOverflow) {
  ------------------
  |  Branch (277:7): [True: 0, False: 48.9k]
  ------------------
  278|      0|    return runtime.raiseRangeError("Maximum regex stack depth reached");
  279|  48.9k|  } else if (matchResult == regex::MatchRuntimeResult::NoMatch) {
  ------------------
  |  Branch (279:14): [True: 1, False: 48.9k]
  ------------------
  280|      1|    return RegExpMatch{}; // not found.
  281|      1|  }
  282|  48.9k|  size_t matchRangeCount = nativeMatchRanges.size();
  283|  48.9k|  assert(matchRangeCount > 0);
  284|      0|  RegExpMatch match;
  285|  48.9k|  match.reserve(matchRangeCount);
  286|  97.8k|  for (size_t i = 0; i < matchRangeCount; i++) {
  ------------------
  |  Branch (286:22): [True: 48.9k, False: 48.9k]
  ------------------
  287|  48.9k|    const auto &submatch = nativeMatchRanges[i];
  288|  48.9k|    if (!submatch.matched()) {
  ------------------
  |  Branch (288:9): [True: 0, False: 48.9k]
  ------------------
  289|      0|      assert(i > 0 && "match_result[0] should always match");
  290|      0|      match.push_back(llvh::None);
  291|  48.9k|    } else {
  292|  48.9k|      uint32_t pos = submatch.start;
  293|  48.9k|      uint32_t length = submatch.end - submatch.start;
  294|  48.9k|      match.push_back(RegExpMatchRange{pos, length});
  295|  48.9k|    }
  296|  48.9k|  }
  297|  48.9k|  assert(!match.empty() && "Unexpected empty match");
  298|      0|  return match;
  299|  48.9k|}
_ZN6hermes2vm13performSearchIDsNS_5regex16UTF16RegexTraitsEEENS0_10CallResultIN4llvh11SmallVectorINS_8OptValueINS0_16RegExpMatchRangeEEELj4EEELNS0_6detail20CallResultSpecializeE0EEERNS0_7RuntimeENS5_8ArrayRefIhEEPKT_jjNS2_9constants13MatchFlagTypeE:
  268|   355k|    regex::constants::MatchFlagType matchFlags) {
  269|   355k|  std::vector<regex::CapturedRange> nativeMatchRanges;
  270|   355k|  auto matchResult = regex::searchWithBytecode(
  271|   355k|      bytecode,
  272|   355k|      start,
  273|   355k|      searchStartOffset,
  274|   355k|      stringLength,
  275|   355k|      &nativeMatchRanges,
  276|   355k|      matchFlags);
  277|   355k|  if (matchResult == regex::MatchRuntimeResult::StackOverflow) {
  ------------------
  |  Branch (277:7): [True: 0, False: 355k]
  ------------------
  278|      0|    return runtime.raiseRangeError("Maximum regex stack depth reached");
  279|   355k|  } else if (matchResult == regex::MatchRuntimeResult::NoMatch) {
  ------------------
  |  Branch (279:14): [True: 3, False: 355k]
  ------------------
  280|      3|    return RegExpMatch{}; // not found.
  281|      3|  }
  282|   355k|  size_t matchRangeCount = nativeMatchRanges.size();
  283|   355k|  assert(matchRangeCount > 0);
  284|      0|  RegExpMatch match;
  285|   355k|  match.reserve(matchRangeCount);
  286|   711k|  for (size_t i = 0; i < matchRangeCount; i++) {
  ------------------
  |  Branch (286:22): [True: 355k, False: 355k]
  ------------------
  287|   355k|    const auto &submatch = nativeMatchRanges[i];
  288|   355k|    if (!submatch.matched()) {
  ------------------
  |  Branch (288:9): [True: 0, False: 355k]
  ------------------
  289|      0|      assert(i > 0 && "match_result[0] should always match");
  290|      0|      match.push_back(llvh::None);
  291|   355k|    } else {
  292|   355k|      uint32_t pos = submatch.start;
  293|   355k|      uint32_t length = submatch.end - submatch.start;
  294|   355k|      match.push_back(RegExpMatchRange{pos, length});
  295|   355k|    }
  296|   355k|  }
  297|   355k|  assert(!match.empty() && "Unexpected empty match");
  298|      0|  return match;
  299|   355k|}

_ZN6hermes2vm31JSRegExpStringIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   36|      1|    Metadata::Builder &mb) {
   37|      1|  mb.addJSObjectOverlapSlots(
   38|      1|      JSObject::numOverlapSlots<JSRegExpStringIterator>());
   39|      1|  JSObjectBuildMeta(cell, mb);
   40|      1|  const auto *self = static_cast<const JSRegExpStringIterator *>(cell);
   41|      1|  mb.setVTable(&JSRegExpStringIterator::vt);
   42|      1|  mb.addField("iteratedRegExp", &self->iteratedRegExp_);
   43|      1|  mb.addField("iteratedString", &self->iteratedString_);
   44|      1|}

_ZN6hermes2vm23TypedArrayBaseBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   36|     11|void TypedArrayBaseBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   37|     11|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSTypedArrayBase>());
   38|     11|  JSObjectBuildMeta(cell, mb);
   39|     11|  const auto *self = static_cast<const JSTypedArrayBase *>(cell);
   40|     11|  mb.addField("buffer", &self->buffer_);
   41|     11|}
_ZN6hermes2vm18Int8ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm19Int16ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm19Int32ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm19Uint8ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm26Uint8ClampedArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm20Uint16ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm20Uint32ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm21Float32ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm21Float64ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm22BigInt64ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm23BigUint64ArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  333|      1|  void name##ArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) { \
  334|      1|    TypedArrayBaseBuildMeta(cell, mb);                                   \
  335|      1|    mb.setVTable(&name##Array::vt);                                      \
  336|      1|  }
_ZN6hermes2vm12JSTypedArrayIaLNS0_8CellKindE35EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIsLNS0_8CellKindE36EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIiLNS0_8CellKindE37EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE38EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE39EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayItLNS0_8CellKindE40EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIjLNS0_8CellKindE41EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIfLNS0_8CellKindE42EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIdLNS0_8CellKindE43EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIlLNS0_8CellKindE44EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayImLNS0_8CellKindE45EE7getNameERNS0_7RuntimeE:
  402|     99|      Runtime &runtime) {                                          \
  403|     99|    return Predefined::getSymbolID(Predefined::name##Array);       \
  404|     99|  }
_ZN6hermes2vm12JSTypedArrayIaLNS0_8CellKindE35EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIsLNS0_8CellKindE36EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIiLNS0_8CellKindE37EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE38EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIhLNS0_8CellKindE39EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayItLNS0_8CellKindE40EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIjLNS0_8CellKindE41EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIfLNS0_8CellKindE42EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIdLNS0_8CellKindE43EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayIlLNS0_8CellKindE44EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }
_ZN6hermes2vm12JSTypedArrayImLNS0_8CellKindE45EE12getPrototypeERKNS0_7RuntimeE:
  411|     99|      const Runtime &runtime) {                                     \
  412|     99|    return Handle<JSObject>::vmcast(&runtime.name##ArrayPrototype); \
  413|     99|  }

_ZN6hermes2vm13JSWeakMapImplILNS0_8CellKindE51EE21WeakMapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  314|      1|    Metadata::Builder &mb) {
  315|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImpl<C>>());
  316|      1|  WeakMapImplBaseBuildMeta(cell, mb);
  317|      1|}
_ZN6hermes2vm13JSWeakMapImplILNS0_8CellKindE52EE21WeakMapOrSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  314|      1|    Metadata::Builder &mb) {
  315|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImpl<C>>());
  316|      1|  WeakMapImplBaseBuildMeta(cell, mb);
  317|      1|}
_ZN6hermes2vm17JSWeakMapImplBase24WeakMapImplBaseBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   22|      2|    Metadata::Builder &mb) {
   23|      2|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakMapImplBase>());
   24|      2|  JSObjectBuildMeta(cell, mb);
   25|      2|  const auto *self = static_cast<const JSWeakMapImplBase *>(cell);
   26|      2|  mb.addField("valueStorage", &self->valueStorage_);
   27|      2|}
_ZN6hermes2vm18JSWeakMapBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  319|      1|void JSWeakMapBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  320|      1|  JSWeakMap::WeakMapOrSetBuildMeta(cell, mb);
  321|      1|  mb.setVTable(&JSWeakMap::vt);
  322|      1|}
_ZN6hermes2vm18JSWeakSetBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  324|      1|void JSWeakSetBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  325|      1|  JSWeakSet::WeakMapOrSetBuildMeta(cell, mb);
  326|      1|  mb.setVTable(&JSWeakSet::vt);
  327|      1|}

_ZN6hermes2vm18JSWeakRefBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   31|      1|void JSWeakRefBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   32|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSWeakRef>());
   33|      1|  JSObjectBuildMeta(cell, mb);
   34|      1|  mb.setVTable(&JSWeakRef::vt);
   35|      1|}

_ZN6hermes2vm8MetadataC2EONS1_7BuilderE:
   21|     79|Metadata::Metadata(Builder &&mb) : vtp(mb.vtp_) {
   22|     79|  offsets.array = mb.array_;
   23|     79|  size_t i = 0;
   24|       |
   25|     79|#define SLOT_TYPE(type)                   \
   26|     79|  for (const auto &p : mb.map##type##_) { \
   27|     79|    offsets.fields[i] = p.first;          \
   28|     79|    names[i] = p.second;                  \
   29|     79|    i++;                                  \
   30|     79|  }                                       \
   31|     79|  offsets.end##type = i;
   32|     79|#include "hermes/VM/SlotKinds.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |// This file lists the types of slots that the GC needs to visit.
  |  |    9|       |
  |  |   10|     79|SLOT_TYPE(GCPointerBase)
  |  |  ------------------
  |  |  |  |   26|    224|  for (const auto &p : mb.map##type##_) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (26:22): [True: 224, False: 79]
  |  |  |  |  ------------------
  |  |  |  |   27|    224|    offsets.fields[i] = p.first;          \
  |  |  |  |   28|    224|    names[i] = p.second;                  \
  |  |  |  |   29|    224|    i++;                                  \
  |  |  |  |   30|    224|  }                                       \
  |  |  |  |   31|     79|  offsets.end##type = i;
  |  |  ------------------
  |  |   11|     79|SLOT_TYPE(GCHermesValue)
  |  |  ------------------
  |  |  |  |   26|     79|  for (const auto &p : mb.map##type##_) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (26:22): [True: 10, False: 79]
  |  |  |  |  ------------------
  |  |  |  |   27|     10|    offsets.fields[i] = p.first;          \
  |  |  |  |   28|     10|    names[i] = p.second;                  \
  |  |  |  |   29|     10|    i++;                                  \
  |  |  |  |   30|     10|  }                                       \
  |  |  |  |   31|     79|  offsets.end##type = i;
  |  |  ------------------
  |  |   12|     79|SLOT_TYPE(GCSmallHermesValue)
  |  |  ------------------
  |  |  |  |   26|     99|  for (const auto &p : mb.map##type##_) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (26:22): [True: 99, False: 79]
  |  |  |  |  ------------------
  |  |  |  |   27|     99|    offsets.fields[i] = p.first;          \
  |  |  |  |   28|     99|    names[i] = p.second;                  \
  |  |  |  |   29|     99|    i++;                                  \
  |  |  |  |   30|     99|  }                                       \
  |  |  |  |   31|     79|  offsets.end##type = i;
  |  |  ------------------
  |  |   13|     79|SLOT_TYPE(GCSymbolID)
  |  |  ------------------
  |  |  |  |   26|     79|  for (const auto &p : mb.map##type##_) { \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (26:22): [True: 2, False: 79]
  |  |  |  |  ------------------
  |  |  |  |   27|      2|    offsets.fields[i] = p.first;          \
  |  |  |  |   28|      2|    names[i] = p.second;                  \
  |  |  |  |   29|      2|    i++;                                  \
  |  |  |  |   30|      2|  }                                       \
  |  |  |  |   31|     79|  offsets.end##type = i;
  |  |  ------------------
  ------------------
   33|     79|#undef SLOT_TYPE
   34|       |
   35|     79|  assert(i <= kMaxNumFields && "Number of fields exceeds max.");
   36|      0|  assert(vtp->isValid() && "Must initialize VTable pointer for metadata.");
   37|     79|}
_ZN6hermes2vm8Metadata7BuilderC2EPKv:
   40|     79|    : base_(reinterpret_cast<const char *>(base)) {}
_ZN6hermes2vm8Metadata7Builder9getOffsetEPKv:
   42|    351|Metadata::offset_t Metadata::Builder::getOffset(const void *fieldLocation) {
   43|    351|  const size_t offset = reinterpret_cast<const char *>(fieldLocation) - base_;
   44|    351|  const offset_t ret = offset;
   45|    351|  assert(ret == offset && "Offset overflowed.");
   46|      0|  return ret;
   47|    351|}
_ZN6hermes2vm8Metadata7Builder8addFieldEPKNS0_13GCPointerBaseE:
   50|      6|  void Metadata::Builder::addField(const type *fieldLocation) { \
   51|      6|    addField(nullptr, fieldLocation);                           \
   52|      6|  }
_ZN6hermes2vm8Metadata7Builder8addFieldEPKNS0_10GCSymbolIDE:
   50|      1|  void Metadata::Builder::addField(const type *fieldLocation) { \
   51|      1|    addField(nullptr, fieldLocation);                           \
   52|      1|  }
_ZN6hermes2vm8Metadata7Builder8addFieldEPKcPKNS0_13GCPointerBaseE:
   58|    224|      const char *name, const type *fieldLocation) {                           \
   59|    224|    offset_t offset = getOffset(fieldLocation);                                \
   60|    224|    assert(                                                                    \
   61|    224|        !fieldConflicts(offset, sizeof(type)) && "fields should not overlap"); \
   62|    224|    map##type##_[offset] = name;                                               \
   63|    224|  }
_ZN6hermes2vm8Metadata7Builder8addFieldEPKcPKNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
   58|     10|      const char *name, const type *fieldLocation) {                           \
   59|     10|    offset_t offset = getOffset(fieldLocation);                                \
   60|     10|    assert(                                                                    \
   61|     10|        !fieldConflicts(offset, sizeof(type)) && "fields should not overlap"); \
   62|     10|    map##type##_[offset] = name;                                               \
   63|     10|  }
_ZN6hermes2vm8Metadata7Builder8addFieldEPKcPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
   58|     99|      const char *name, const type *fieldLocation) {                           \
   59|     99|    offset_t offset = getOffset(fieldLocation);                                \
   60|     99|    assert(                                                                    \
   61|     99|        !fieldConflicts(offset, sizeof(type)) && "fields should not overlap"); \
   62|     99|    map##type##_[offset] = name;                                               \
   63|     99|  }
_ZN6hermes2vm8Metadata7Builder8addFieldEPKcPKNS0_10GCSymbolIDE:
   58|      2|      const char *name, const type *fieldLocation) {                           \
   59|      2|    offset_t offset = getOffset(fieldLocation);                                \
   60|      2|    assert(                                                                    \
   61|      2|        !fieldConflicts(offset, sizeof(type)) && "fields should not overlap"); \
   62|      2|    map##type##_[offset] = name;                                               \
   63|      2|  }
_ZN6hermes2vm8Metadata7Builder8addArrayEPKcNS1_9ArrayData9ArrayTypeEPKvPKNSt3__16atomicIjEEm:
   72|      8|    std::size_t stride) {
   73|      8|  const uint8_t stride8 = stride;
   74|      8|  assert(stride8 == stride && "Stride overflowed");
   75|      0|  array_ = ArrayData(
   76|      8|      type, getOffset(startLocation), getOffset(lengthLocation), stride8);
   77|      8|}
_ZN6hermes2vm8Metadata7Builder5buildEv:
   79|     79|Metadata Metadata::Builder::build() {
   80|     79|  return Metadata(std::move(*this));
   81|     79|}
_ZN6hermes2vm8Metadata7Builder14fieldConflictsEhm:
   84|    335|bool Metadata::Builder::fieldConflicts(offset_t offset, size_t size) {
   85|    335|  size_t end = offset + size;
   86|    335|  coveredOffsets_.resize(std::max(coveredOffsets_.size(), end));
   87|  1.71k|  for (offset_t i = offset; i < end; ++i) {
  ------------------
  |  Branch (87:29): [True: 1.38k, False: 335]
  ------------------
   88|  1.38k|    if (coveredOffsets_[i])
  ------------------
  |  Branch (88:9): [True: 0, False: 1.38k]
  ------------------
   89|      0|      return true;
   90|  1.38k|    coveredOffsets_[i] = true;
   91|  1.38k|  }
   92|    335|  return false;
   93|    335|}

_ZN6hermes2vm20NativeStateBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   21|      1|void NativeStateBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   22|      1|  mb.setVTable(&NativeState::vt);
   23|      1|}

_ZN6hermes2vm16stringToSymbolIDERNS0_7RuntimeENS0_12PseudoHandleINS0_15StringPrimitiveEEE:
   39|   201k|    PseudoHandle<StringPrimitive> strPrim) {
   40|       |  // Unique the string.
   41|   201k|  return runtime.getIdentifierTable().getSymbolHandleFromPrimitive(
   42|   201k|      runtime, std::move(strPrim));
   43|   201k|}
_ZN6hermes2vm15valueToSymbolIDERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
   47|   202k|    Handle<> nameValHnd) {
   48|   202k|  if (nameValHnd->isSymbol()) {
  ------------------
  |  Branch (48:7): [True: 418, False: 201k]
  ------------------
   49|    418|    return Handle<SymbolID>::vmcast(nameValHnd);
   50|    418|  }
   51|       |  // Convert the value to a string.
   52|   201k|  auto res = toString_RJS(runtime, nameValHnd);
   53|   201k|  if (res == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (53:7): [True: 0, False: 201k]
  ------------------
   54|      0|    return ExecutionStatus::EXCEPTION;
   55|       |
   56|       |  // Unique the string.
   57|   201k|  return stringToSymbolID(runtime, std::move(*res));
   58|   201k|}
_ZN6hermes2vm6typeOfERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
   60|  1.18k|HermesValue typeOf(Runtime &runtime, Handle<> valueHandle) {
   61|  1.18k|  switch (valueHandle->getETag()) {
   62|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (62:5): [True: 0, False: 1.18k]
  ------------------
   63|      0|      return HermesValue::encodeStringValue(
   64|      0|          runtime.getPredefinedString(Predefined::undefined));
   65|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (65:5): [True: 0, False: 1.18k]
  ------------------
   66|      0|      return HermesValue::encodeStringValue(
   67|      0|          runtime.getPredefinedString(Predefined::object));
   68|      0|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (68:5): [True: 0, False: 1.18k]
  ------------------
   69|      0|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (69:5): [True: 0, False: 1.18k]
  ------------------
   70|      0|      return HermesValue::encodeStringValue(
   71|      0|          runtime.getPredefinedString(Predefined::string));
   72|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (72:5): [True: 0, False: 1.18k]
  ------------------
   73|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (73:5): [True: 0, False: 1.18k]
  ------------------
   74|      0|      return HermesValue::encodeStringValue(
   75|      0|          runtime.getPredefinedString(Predefined::bigint));
   76|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (76:5): [True: 0, False: 1.18k]
  ------------------
   77|      0|      return HermesValue::encodeStringValue(
   78|      0|          runtime.getPredefinedString(Predefined::boolean));
   79|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (79:5): [True: 0, False: 1.18k]
  ------------------
   80|      0|      return HermesValue::encodeStringValue(
   81|      0|          runtime.getPredefinedString(Predefined::symbol));
   82|  1.18k|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (82:5): [True: 1.18k, False: 0]
  ------------------
   83|  1.18k|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (83:5): [True: 0, False: 1.18k]
  ------------------
   84|  1.18k|      if (vmisa<Callable>(*valueHandle))
  ------------------
  |  Branch (84:11): [True: 594, False: 594]
  ------------------
   85|    594|        return HermesValue::encodeStringValue(
   86|    594|            runtime.getPredefinedString(Predefined::function));
   87|    594|      return HermesValue::encodeStringValue(
   88|    594|          runtime.getPredefinedString(Predefined::object));
   89|      0|    default:
  ------------------
  |  Branch (89:5): [True: 0, False: 1.18k]
  ------------------
   90|      0|      assert(valueHandle->isNumber() && "Invalid type.");
   91|      0|      return HermesValue::encodeStringValue(
   92|      0|          runtime.getPredefinedString(Predefined::number));
   93|  1.18k|  }
   94|  1.18k|}
_ZN6hermes2vm12toArrayIndexENS0_10StringViewE:
  103|   246k|OptValue<uint32_t> toArrayIndex(StringView str) {
  104|   246k|  auto len = str.length();
  105|   246k|  if (str.isASCII()) {
  ------------------
  |  Branch (105:7): [True: 246k, False: 222]
  ------------------
  106|   246k|    const char *ptr = str.castToCharPtr();
  107|   246k|    return hermes::toArrayIndex(ptr, ptr + len);
  108|   246k|  }
  109|    222|  const char16_t *ptr = str.castToChar16Ptr();
  110|    222|  return hermes::toArrayIndex(ptr, ptr + len);
  111|   246k|}
_ZN6hermes2vm11isSameValueENS0_11HermesValueES1_:
  113|    495|bool isSameValue(HermesValue x, HermesValue y) {
  114|    495|  if (x.getTag() != y.getTag()) {
  ------------------
  |  Branch (114:7): [True: 0, False: 495]
  ------------------
  115|       |    // If the tags are different, they must be different.
  116|      0|    return false;
  117|      0|  }
  118|    495|  assert(
  119|    495|      !x.isEmpty() && !x.isNativeValue() &&
  120|    495|      "Empty and Native Value cannot be compared");
  121|       |
  122|       |  // Strings require deep comparison.
  123|    495|  if (x.isString()) {
  ------------------
  |  Branch (123:7): [True: 0, False: 495]
  ------------------
  124|       |    // For strings, we compare each character in sequence.
  125|      0|    return x.getString()->equals(y.getString());
  126|      0|  }
  127|       |
  128|       |  // Bigints also require deep comparison.
  129|    495|  if (x.isBigInt()) {
  ------------------
  |  Branch (129:7): [True: 0, False: 495]
  ------------------
  130|       |    // For bigints, perform the numerical comparison.
  131|      0|    return x.getBigInt()->compare(y.getBigInt()) == 0;
  132|      0|  }
  133|       |
  134|       |  // Otherwise they are identical if the raw bits are the same.
  135|    495|  return x.getRaw() == y.getRaw();
  136|    495|}
_ZN6hermes2vm11isPrimitiveENS0_11HermesValueE:
  146|    653|bool isPrimitive(HermesValue val) {
  147|    653|  assert(!val.isEmpty() && "empty value encountered");
  148|      0|  assert(!val.isNativeValue() && "native value encountered");
  149|      0|  return !val.isObject();
  150|    653|}
_ZN6hermes2vm19ordinaryToPrimitiveENS0_6HandleINS0_8JSObjectEEERNS0_7RuntimeENS0_13PreferredTypeE:
  155|    411|    PreferredType preferredType) {
  156|    411|  GCScope gcScope{runtime};
  157|    411|  assert(
  158|    411|      preferredType != PreferredType::NONE &&
  159|    411|      "OrdinaryToPrimitive requires a type hint");
  160|       |
  161|    653|  for (int i = 0; i < 2; ++i) {
  ------------------
  |  Branch (161:19): [True: 653, False: 0]
  ------------------
  162|    653|    if (preferredType == PreferredType::STRING) {
  ------------------
  |  Branch (162:9): [True: 411, False: 242]
  ------------------
  163|    411|      auto propRes = JSObject::getNamed_RJS(
  164|    411|          selfHandle, runtime, Predefined::getSymbolID(Predefined::toString));
  165|    411|      if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (165:11): [True: 0, False: 411]
  ------------------
  166|      0|        return ExecutionStatus::EXCEPTION;
  167|    411|      if (auto funcHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (167:16): [True: 411, False: 0]
  ------------------
  168|    411|              runtime.makeHandle(std::move(*propRes)))) {
  169|    411|        auto callRes =
  170|    411|            funcHandle->executeCall0(funcHandle, runtime, selfHandle);
  171|    411|        if (callRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (171:13): [True: 0, False: 411]
  ------------------
  172|      0|          return ExecutionStatus::EXCEPTION;
  173|    411|        if (isPrimitive(callRes->get()))
  ------------------
  |  Branch (173:13): [True: 411, False: 0]
  ------------------
  174|    411|          return callRes.toCallResultHermesValue();
  175|    411|      }
  176|       |
  177|       |      // This method failed. Try the other one.
  178|      0|      preferredType = PreferredType::NUMBER;
  179|    242|    } else {
  180|    242|      auto propRes = JSObject::getNamed_RJS(
  181|    242|          selfHandle, runtime, Predefined::getSymbolID(Predefined::valueOf));
  182|    242|      if (propRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (182:11): [True: 0, False: 242]
  ------------------
  183|      0|        return ExecutionStatus::EXCEPTION;
  184|    242|      if (auto funcHandle = Handle<Callable>::dyn_vmcast(
  ------------------
  |  Branch (184:16): [True: 242, False: 0]
  ------------------
  185|    242|              runtime.makeHandle(std::move(*propRes)))) {
  186|    242|        auto callRes =
  187|    242|            funcHandle->executeCall0(funcHandle, runtime, selfHandle);
  188|    242|        if (callRes == ExecutionStatus::EXCEPTION)
  ------------------
  |  Branch (188:13): [True: 0, False: 242]
  ------------------
  189|      0|          return ExecutionStatus::EXCEPTION;
  190|    242|        if (isPrimitive(callRes->get()))
  ------------------
  |  Branch (190:13): [True: 0, False: 242]
  ------------------
  191|      0|          return callRes.toCallResultHermesValue();
  192|    242|      }
  193|       |
  194|       |      // This method failed. Try the other one.
  195|    242|      preferredType = PreferredType::STRING;
  196|    242|    }
  197|    653|  }
  198|       |
  199|       |  // Nothing succeeded, time to give up.
  200|      0|  return runtime.raiseTypeError("Cannot determine default value of object");
  201|    411|}
_ZN6hermes2vm15toPrimitive_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEENS0_13PreferredTypeE:
  205|  2.65k|toPrimitive_RJS(Runtime &runtime, Handle<> valueHandle, PreferredType hint) {
  206|  2.65k|  assert(!valueHandle->isEmpty() && "empty value is not allowed");
  207|      0|  assert(!valueHandle->isNativeValue() && "native value is not allowed");
  208|       |
  209|  2.65k|  if (!valueHandle->isObject())
  ------------------
  |  Branch (209:7): [True: 2.24k, False: 411]
  ------------------
  210|  2.24k|    return *valueHandle;
  211|       |
  212|       |  // 4. Let exoticToPrim be GetMethod(input, @@toPrimitive).
  213|    411|  auto exoticToPrim = getMethod(
  214|    411|      runtime,
  215|    411|      valueHandle,
  216|    411|      runtime.makeHandle(
  217|    411|          Predefined::getSymbolID(Predefined::SymbolToPrimitive)));
  218|    411|  if (LLVM_UNLIKELY(exoticToPrim == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    411|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 411]
  |  |  ------------------
  ------------------
  219|      0|    return ExecutionStatus::EXCEPTION;
  220|      0|  }
  221|       |  // 6. If exoticToPrim is not undefined, then
  222|    411|  if (vmisa<Callable>(exoticToPrim->getHermesValue())) {
  ------------------
  |  Branch (222:7): [True: 0, False: 411]
  ------------------
  223|      0|    auto callable = runtime.makeHandle<Callable>(
  224|      0|        dyn_vmcast<Callable>(exoticToPrim->getHermesValue()));
  225|      0|    CallResult<PseudoHandle<>> resultRes = Callable::executeCall1(
  226|      0|        callable,
  227|      0|        runtime,
  228|      0|        valueHandle,
  229|      0|        HermesValue::encodeStringValue(runtime.getPredefinedString(
  230|      0|            hint == PreferredType::NONE         ? Predefined::defaultStr
  ------------------
  |  Branch (230:13): [True: 0, False: 0]
  ------------------
  231|      0|                : hint == PreferredType::STRING ? Predefined::string
  ------------------
  |  Branch (231:19): [True: 0, False: 0]
  ------------------
  232|      0|                                                : Predefined::number)));
  233|      0|    if (LLVM_UNLIKELY(resultRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  234|      0|      return ExecutionStatus::EXCEPTION;
  235|      0|    }
  236|      0|    PseudoHandle<> result = std::move(*resultRes);
  237|      0|    if (!result->isObject()) {
  ------------------
  |  Branch (237:9): [True: 0, False: 0]
  ------------------
  238|      0|      return result.getHermesValue();
  239|      0|    }
  240|      0|    return runtime.raiseTypeError(
  241|      0|        "Symbol.toPrimitive function must return a primitive");
  242|      0|  }
  243|       |
  244|       |  // 7. If hint is "default", let hint be "number".
  245|       |  // 8. Return OrdinaryToPrimitive(input,hint).
  246|    411|  return ordinaryToPrimitive(
  247|    411|      Handle<JSObject>::vmcast(valueHandle),
  248|    411|      runtime,
  249|    411|      hint == PreferredType::NONE ? PreferredType::NUMBER : hint);
  ------------------
  |  Branch (249:7): [True: 3, False: 408]
  ------------------
  250|    411|}
_ZN6hermes2vm9toBooleanENS0_11HermesValueE:
  252|  1.62k|bool toBoolean(HermesValue value) {
  253|  1.62k|  switch (value.getETag()) {
  254|      0|#ifdef HERMES_SLOW_DEBUG
  255|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (255:5): [True: 0, False: 1.62k]
  ------------------
  256|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  257|      0|#endif // HERMES_SLOW_DEBUG
  258|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (258:5): [True: 0, False: 1.62k]
  ------------------
  259|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  260|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (260:5): [True: 0, False: 1.62k]
  ------------------
  261|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (261:5): [True: 0, False: 1.62k]
  ------------------
  262|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  263|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (263:5): [True: 0, False: 1.62k]
  ------------------
  264|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (264:5): [True: 0, False: 1.62k]
  ------------------
  265|      0|      return false;
  266|  1.61k|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (266:5): [True: 1.61k, False: 15]
  ------------------
  267|  1.61k|      return value.getBool();
  268|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (268:5): [True: 0, False: 1.62k]
  ------------------
  269|      0|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (269:5): [True: 0, False: 1.62k]
  ------------------
  270|      0|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (270:5): [True: 0, False: 1.62k]
  ------------------
  271|      0|      return true;
  272|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (272:5): [True: 0, False: 1.62k]
  ------------------
  273|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (273:5): [True: 0, False: 1.62k]
  ------------------
  274|      0|      return value.getBigInt()->compare(0) != 0;
  275|      0|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (275:5): [True: 0, False: 1.62k]
  ------------------
  276|      0|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (276:5): [True: 0, False: 1.62k]
  ------------------
  277|      0|      return value.getString()->getStringLength() != 0;
  278|     15|    default: {
  ------------------
  |  Branch (278:5): [True: 15, False: 1.61k]
  ------------------
  279|     15|      auto m = value.getNumber();
  280|     15|      return !(m == 0 || std::isnan(m));
  ------------------
  |  Branch (280:16): [True: 9, False: 6]
  |  Branch (280:26): [True: 0, False: 6]
  ------------------
  281|      0|    }
  282|  1.62k|  }
  283|  1.62k|}
_ZN6hermes2vm12toString_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  338|  1.20M|    Handle<> valueHandle) {
  339|  1.20M|  HermesValue value = valueHandle.get();
  340|  1.20M|  StringPrimitive *result;
  341|  1.20M|  switch (value.getETag()) {
  342|      0|#ifdef HERMES_SLOW_DEBUG
  343|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (343:5): [True: 0, False: 1.20M]
  ------------------
  344|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  345|      0|#endif // HERMES_SLOW_DEBUG
  346|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (346:5): [True: 0, False: 1.20M]
  ------------------
  347|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  348|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (348:5): [True: 0, False: 1.20M]
  ------------------
  349|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (349:5): [True: 0, False: 1.20M]
  ------------------
  350|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  351|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (351:5): [True: 0, False: 1.20M]
  ------------------
  352|      0|    case HermesValue::ETag::BigInt2: {
  ------------------
  |  Branch (352:5): [True: 0, False: 1.20M]
  ------------------
  353|      0|      const uint8_t kDefaultRadix = 10;
  354|      0|      auto res = BigIntPrimitive::toString(
  355|      0|          runtime, Handle<BigIntPrimitive>::vmcast(valueHandle), kDefaultRadix);
  356|      0|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  357|      0|        return ExecutionStatus::EXCEPTION;
  358|      0|      }
  359|      0|      result = res->getString();
  360|      0|      break;
  361|      0|    }
  362|   934k|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (362:5): [True: 934k, False: 268k]
  ------------------
  363|   934k|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (363:5): [True: 0, False: 1.20M]
  ------------------
  364|   934k|      result = vmcast<StringPrimitive>(value);
  365|   934k|      break;
  366|    135|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (366:5): [True: 135, False: 1.20M]
  ------------------
  367|    135|      result = runtime.getPredefinedString(Predefined::undefined);
  368|    135|      break;
  369|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (369:5): [True: 0, False: 1.20M]
  ------------------
  370|      0|      result = runtime.getPredefinedString(Predefined::null);
  371|      0|      break;
  372|     13|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (372:5): [True: 13, False: 1.20M]
  ------------------
  373|     13|      result = value.getBool()
  ------------------
  |  Branch (373:16): [True: 5, False: 8]
  ------------------
  374|     13|          ? runtime.getPredefinedString(Predefined::trueStr)
  375|     13|          : runtime.getPredefinedString(Predefined::falseStr);
  376|     13|      break;
  377|    169|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (377:5): [True: 169, False: 1.20M]
  ------------------
  378|    169|    case HermesValue::ETag::Object2: {
  ------------------
  |  Branch (378:5): [True: 0, False: 1.20M]
  ------------------
  379|    169|      auto res = toPrimitive_RJS(runtime, valueHandle, PreferredType::STRING);
  380|    169|      if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (380:11): [True: 0, False: 169]
  ------------------
  381|      0|        return ExecutionStatus::EXCEPTION;
  382|      0|      }
  383|    169|      return toString_RJS(runtime, runtime.makeHandle(res.getValue()));
  384|    169|    }
  385|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (385:5): [True: 0, False: 1.20M]
  ------------------
  386|      0|      return runtime.raiseTypeError("Cannot convert Symbol to string");
  387|   268k|    default:
  ------------------
  |  Branch (387:5): [True: 268k, False: 934k]
  ------------------
  388|   268k|      return numberToString(runtime, value.getNumber());
  389|  1.20M|  }
  390|       |
  391|   934k|  return createPseudoHandle(result);
  392|  1.20M|}
_ZN6hermes2vm12toNumber_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  506|   405k|CallResult<HermesValue> toNumber_RJS(Runtime &runtime, Handle<> valueHandle) {
  507|   405k|  auto value = valueHandle.get();
  508|   405k|  double result;
  509|   405k|  switch (value.getETag()) {
  510|      0|#ifdef HERMES_SLOW_DEBUG
  511|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (511:5): [True: 0, False: 405k]
  ------------------
  512|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  513|      0|#endif // HERMES_SLOW_DEBUG
  514|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (514:5): [True: 0, False: 405k]
  ------------------
  515|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  516|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (516:5): [True: 0, False: 405k]
  ------------------
  517|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (517:5): [True: 0, False: 405k]
  ------------------
  518|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  519|    227|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (519:5): [True: 227, False: 405k]
  ------------------
  520|    227|    case HermesValue::ETag::Object2: {
  ------------------
  |  Branch (520:5): [True: 0, False: 405k]
  ------------------
  521|    227|      auto res = toPrimitive_RJS(runtime, valueHandle, PreferredType::NUMBER);
  522|    227|      if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (522:11): [True: 0, False: 227]
  ------------------
  523|      0|        return ExecutionStatus::EXCEPTION;
  524|      0|      }
  525|    227|      return toNumber_RJS(runtime, runtime.makeHandle(res.getValue()));
  526|    227|    }
  527|    244|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (527:5): [True: 244, False: 405k]
  ------------------
  528|    244|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (528:5): [True: 0, False: 405k]
  ------------------
  529|    244|      result =
  530|    244|          stringToNumber(runtime, Handle<StringPrimitive>::vmcast(valueHandle));
  531|    244|      break;
  532|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (532:5): [True: 0, False: 405k]
  ------------------
  533|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (533:5): [True: 0, False: 405k]
  ------------------
  534|      0|      return runtime.raiseTypeError("Cannot convert BigInt to number");
  535|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (535:5): [True: 0, False: 405k]
  ------------------
  536|      0|      result = std::numeric_limits<double>::quiet_NaN();
  537|      0|      break;
  538|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (538:5): [True: 0, False: 405k]
  ------------------
  539|      0|      result = +0.0;
  540|      0|      break;
  541|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (541:5): [True: 0, False: 405k]
  ------------------
  542|      0|      result = value.getBool();
  543|      0|      break;
  544|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (544:5): [True: 0, False: 405k]
  ------------------
  545|      0|      return runtime.raiseTypeError("Cannot convert Symbol to number");
  546|   404k|    default:
  ------------------
  |  Branch (546:5): [True: 404k, False: 471]
  ------------------
  547|       |      // Already have a number, just return it.
  548|   404k|      return value;
  549|   405k|  }
  550|    244|  return HermesValue::encodeDoubleValue(result);
  551|   405k|}
_ZN6hermes2vm13toNumeric_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  553|      3|CallResult<HermesValue> toNumeric_RJS(Runtime &runtime, Handle<> valueHandle) {
  554|      3|  GCScopeMarkerRAII marker{runtime};
  555|      3|  auto primValue = toPrimitive_RJS(runtime, valueHandle, PreferredType::NUMBER);
  556|       |
  557|      3|  if (LLVM_UNLIKELY(primValue == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      3|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3]
  |  |  ------------------
  ------------------
  558|      0|    return ExecutionStatus::EXCEPTION;
  559|      0|  }
  560|       |
  561|      3|  if (primValue->isBigInt()) {
  ------------------
  |  Branch (561:7): [True: 0, False: 3]
  ------------------
  562|      0|    return *primValue;
  563|      0|  }
  564|       |
  565|      3|  return toNumber_RJS(runtime, runtime.makeHandle(*primValue));
  566|      3|}
_ZN6hermes2vm11toLengthU64ERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  583|   404k|CallResult<uint64_t> toLengthU64(Runtime &runtime, Handle<> valueHandle) {
  584|   404k|  constexpr double highestIntegralDouble =
  585|   404k|      ((uint64_t)1 << std::numeric_limits<double>::digits) - 1;
  586|   404k|  auto res = toIntegerOrInfinity(runtime, valueHandle);
  587|   404k|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (587:7): [True: 0, False: 404k]
  ------------------
  588|      0|    return ExecutionStatus::EXCEPTION;
  589|      0|  }
  590|   404k|  auto len = res->getNumber();
  591|   404k|  if (len <= 0) {
  ------------------
  |  Branch (591:7): [True: 4, False: 404k]
  ------------------
  592|      4|    len = 0;
  593|   404k|  } else if (len > highestIntegralDouble) {
  ------------------
  |  Branch (593:14): [True: 0, False: 404k]
  ------------------
  594|      0|    len = highestIntegralDouble;
  595|      0|  }
  596|   404k|  return len;
  597|   404k|}
_ZN6hermes2vm19toIntegerOrInfinityERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  627|   404k|    Handle<> valueHandle) {
  628|   404k|  auto res = toNumber_RJS(runtime, valueHandle);
  629|   404k|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (629:7): [True: 0, False: 404k]
  ------------------
  630|      0|    return ExecutionStatus::EXCEPTION;
  631|      0|  }
  632|   404k|  double num = res->getNumber();
  633|       |
  634|   404k|  double result;
  635|   404k|  if (std::isnan(num)) {
  ------------------
  |  Branch (635:7): [True: 0, False: 404k]
  ------------------
  636|      0|    result = 0;
  637|   404k|  } else {
  638|   404k|    result = std::trunc(num);
  639|   404k|  }
  640|       |
  641|   404k|  return HermesValue::encodeDoubleValue(result);
  642|   404k|}
_ZN6hermes2vm11toInt32_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  666|    444|CallResult<HermesValue> toInt32_RJS(Runtime &runtime, Handle<> valueHandle) {
  667|    444|  return toInt<int32_t>(runtime, valueHandle);
  668|    444|}
_ZN6hermes2vm21getPrimitivePrototypeERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  725|     14|    Handle<> base) {
  726|     14|  switch (base->getETag()) {
  727|      0|#ifdef HERMES_SLOW_DEBUG
  728|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (728:5): [True: 0, False: 14]
  ------------------
  729|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  730|      0|#endif // HERMES_SLOW_DEBUG
  731|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (731:5): [True: 0, False: 14]
  ------------------
  732|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  733|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (733:5): [True: 0, False: 14]
  ------------------
  734|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (734:5): [True: 0, False: 14]
  ------------------
  735|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  736|      0|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (736:5): [True: 0, False: 14]
  ------------------
  737|      0|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (737:5): [True: 0, False: 14]
  ------------------
  738|      0|      llvm_unreachable("object value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  739|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (739:5): [True: 0, False: 14]
  ------------------
  740|      0|      return runtime.raiseTypeError("Cannot convert undefined value to object");
  741|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (741:5): [True: 0, False: 14]
  ------------------
  742|      0|      return runtime.raiseTypeError("Cannot convert null value to object");
  743|     14|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (743:5): [True: 14, False: 0]
  ------------------
  744|     14|    case HermesValue::ETag::Str2:
  ------------------
  |  Branch (744:5): [True: 0, False: 14]
  ------------------
  745|     14|      return Handle<JSObject>::vmcast(&runtime.stringPrototype);
  746|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (746:5): [True: 0, False: 14]
  ------------------
  747|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (747:5): [True: 0, False: 14]
  ------------------
  748|      0|      return Handle<JSObject>::vmcast(&runtime.bigintPrototype);
  749|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (749:5): [True: 0, False: 14]
  ------------------
  750|      0|      return Handle<JSObject>::vmcast(&runtime.booleanPrototype);
  751|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (751:5): [True: 0, False: 14]
  ------------------
  752|      0|      return Handle<JSObject>::vmcast(&runtime.symbolPrototype);
  753|      0|    default:
  ------------------
  |  Branch (753:5): [True: 0, False: 14]
  ------------------
  754|      0|      assert(base->isNumber() && "Unknown tag in getPrimitivePrototype.");
  755|      0|      return Handle<JSObject>::vmcast(&runtime.numberPrototype);
  756|     14|  }
  757|     14|}
_ZN6hermes2vm8toObjectERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEE:
  759|    966|CallResult<HermesValue> toObject(Runtime &runtime, Handle<> valueHandle) {
  760|    966|  auto value = valueHandle.get();
  761|    966|  switch (value.getETag()) {
  762|      0|#ifdef HERMES_SLOW_DEBUG
  763|      0|    case HermesValue::ETag::Invalid:
  ------------------
  |  Branch (763:5): [True: 0, False: 966]
  ------------------
  764|      0|      llvm_unreachable("invalid value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  765|      0|#endif // HERMES_SLOW_DEBUG
  766|      0|    case HermesValue::ETag::Empty:
  ------------------
  |  Branch (766:5): [True: 0, False: 966]
  ------------------
  767|      0|      llvm_unreachable("empty value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  768|      0|    case HermesValue::ETag::Native1:
  ------------------
  |  Branch (768:5): [True: 0, False: 966]
  ------------------
  769|      0|    case HermesValue::ETag::Native2:
  ------------------
  |  Branch (769:5): [True: 0, False: 966]
  ------------------
  770|      0|      llvm_unreachable("native value");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
  771|      0|    case HermesValue::ETag::Undefined:
  ------------------
  |  Branch (771:5): [True: 0, False: 966]
  ------------------
  772|      0|      return runtime.raiseTypeError("Cannot convert undefined value to object");
  773|      0|    case HermesValue::ETag::Null:
  ------------------
  |  Branch (773:5): [True: 0, False: 966]
  ------------------
  774|      0|      return runtime.raiseTypeError("Cannot convert null value to object");
  775|    966|    case HermesValue::ETag::Object1:
  ------------------
  |  Branch (775:5): [True: 966, False: 0]
  ------------------
  776|    966|    case HermesValue::ETag::Object2:
  ------------------
  |  Branch (776:5): [True: 0, False: 966]
  ------------------
  777|    966|      return value;
  778|      0|    case HermesValue::ETag::Bool:
  ------------------
  |  Branch (778:5): [True: 0, False: 966]
  ------------------
  779|      0|      return JSBoolean::create(
  780|      0|                 runtime,
  781|      0|                 value.getBool(),
  782|      0|                 Handle<JSObject>::vmcast(&runtime.booleanPrototype))
  783|      0|          .getHermesValue();
  784|      0|    case HermesValue::ETag::BigInt1:
  ------------------
  |  Branch (784:5): [True: 0, False: 966]
  ------------------
  785|      0|    case HermesValue::ETag::BigInt2:
  ------------------
  |  Branch (785:5): [True: 0, False: 966]
  ------------------
  786|      0|      return JSBigInt::create(
  787|      0|                 runtime,
  788|      0|                 Handle<BigIntPrimitive>::vmcast(valueHandle),
  789|      0|                 Handle<JSObject>::vmcast(&runtime.bigintPrototype))
  790|      0|          .getHermesValue();
  791|      0|    case HermesValue::ETag::Str1:
  ------------------
  |  Branch (791:5): [True: 0, False: 966]
  ------------------
  792|      0|    case HermesValue::ETag::Str2: {
  ------------------
  |  Branch (792:5): [True: 0, False: 966]
  ------------------
  793|      0|      auto res = JSString::create(
  794|      0|          runtime,
  795|      0|          Handle<StringPrimitive>::vmcast(valueHandle),
  796|      0|          Handle<JSObject>::vmcast(&runtime.stringPrototype));
  797|      0|      if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  798|      0|        return ExecutionStatus::EXCEPTION;
  799|      0|      }
  800|      0|      return res->getHermesValue();
  801|      0|    }
  802|      0|    case HermesValue::ETag::Symbol:
  ------------------
  |  Branch (802:5): [True: 0, False: 966]
  ------------------
  803|      0|      return JSSymbol::create(
  804|      0|                 runtime,
  805|      0|                 *Handle<SymbolID>::vmcast(valueHandle),
  806|      0|                 Handle<JSObject>::vmcast(&runtime.symbolPrototype))
  807|      0|          .getHermesValue();
  808|      0|    default:
  ------------------
  |  Branch (808:5): [True: 0, False: 966]
  ------------------
  809|      0|      assert(valueHandle->isNumber() && "Unknown tag in toObject.");
  810|      0|      return JSNumber::create(
  811|      0|                 runtime,
  812|      0|                 value.getNumber(),
  813|      0|                 Handle<JSObject>::vmcast(&runtime.numberPrototype))
  814|      0|          .getHermesValue();
  815|    966|  }
  816|    966|}
_ZN6hermes2vm24abstractEqualityTest_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
  997|    594|abstractEqualityTest_RJS(Runtime &runtime, Handle<> xHandle, Handle<> yHandle) {
  998|    594|  MutableHandle<> x{runtime, xHandle.get()};
  999|    594|  MutableHandle<> y{runtime, yHandle.get()};
 1000|       |
 1001|    594|  while (true) {
  ------------------
  |  Branch (1001:10): [Folded - Ignored]
  ------------------
 1002|       |    // Combine tags for use in the switch statement. Use NativeValueTag as a
 1003|       |    // placeholder for numbers.
 1004|    594|    assert(
 1005|    594|        !x->isNativeValue() && !x->isEmpty() && "invalid value for comparison");
 1006|      0|    assert(
 1007|    594|        !y->isNativeValue() && !y->isEmpty() && "invalid value for comparison");
 1008|       |
 1009|       |    // The following macros are used to generate the switch cases using
 1010|       |    // HermesValue::combineETags; an S in the name means it is a single ETag
 1011|       |    // (e.g., ETag::Bool), while M means it is a multi ETag (e.g., ETag::Object1
 1012|       |    // and ETag::Object2).
 1013|      0|#define CASE_S_S(typeA, typeB)    \
 1014|      0|  case HermesValue::combineETags( \
 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
 1016|       |
 1017|      0|#define CASE_S_M(typeA, typeB) \
 1018|      0|  CASE_S_S(typeA, typeB##1)    \
 1019|      0|  CASE_S_S(typeA, typeB##2)
 1020|       |
 1021|      0|#define CASE_M_S(typeA, typeB) \
 1022|      0|  CASE_S_S(typeA##1, typeB)    \
 1023|      0|  CASE_S_S(typeA##2, typeB)
 1024|       |
 1025|      0|#define CASE_M_M(typeA, typeB) \
 1026|      0|  CASE_M_S(typeA, typeB##1)    \
 1027|      0|  CASE_M_S(typeA, typeB##2)
 1028|       |
 1029|       |// NUMBER_TAG is a "virtual" ETag member that is used to tag numbers (which
 1030|       |// don't have a tag assigned to them). It reuses ETag::Native1 there will
 1031|       |// never be any native values in this part of the code.
 1032|      0|#define NUMBER_TAG Native1
 1033|       |
 1034|       |    // Tag numbers as with the "virtual" ETag member NUMBER_TAG, and use default
 1035|       |    // tag values for everything else.
 1036|      0|    HermesValue::ETag xType =
 1037|    594|        x->isNumber() ? HermesValue::ETag::NUMBER_TAG : x->getETag();
  ------------------
  |  | 1032|      0|#define NUMBER_TAG Native1
  ------------------
  |  Branch (1037:9): [True: 0, False: 594]
  ------------------
 1038|    594|    HermesValue::ETag yType =
 1039|    594|        y->isNumber() ? HermesValue::ETag::NUMBER_TAG : y->getETag();
  ------------------
  |  | 1032|      0|#define NUMBER_TAG Native1
  ------------------
  |  Branch (1039:9): [True: 0, False: 594]
  ------------------
 1040|       |
 1041|    594|    switch (HermesValue::combineETags(xType, yType)) {
 1042|       |      // 1. If Type(x) is the same as Type(y), then
 1043|       |      // a. Return the result of performing Strict Equality Comparison x === y.
 1044|      0|      CASE_S_S(Undefined, Undefined)
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1045|      0|      CASE_S_S(Null, Null) {
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1046|      0|        return true;
 1047|      0|      }
 1048|      0|      CASE_S_S(NUMBER_TAG, NUMBER_TAG) {
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1049|      0|        return x->getNumber() == y->getNumber();
 1050|      0|      }
 1051|      0|      CASE_M_M(Str, Str) {
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1052|      0|        return x->getString()->equals(y->getString());
 1053|      0|      }
 1054|      0|      CASE_M_M(BigInt, BigInt) {
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1055|      0|        return x->getBigInt()->compare(y->getBigInt()) == 0;
 1056|      0|      }
 1057|      0|      CASE_S_S(Bool, Bool)
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1058|      0|      CASE_S_S(Symbol, Symbol)
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1059|      0|      CASE_M_M(Object, Object) {
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1060|      0|        return x->getRaw() == y->getRaw();
 1061|      0|      }
 1062|       |      // 2. If x is null and y is undefined, return true.
 1063|       |      // 3. If x is undefined and y is null, return true.
 1064|      0|      CASE_S_S(Undefined, Null)
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1065|      0|      CASE_S_S(Null, Undefined) {
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1066|      0|        return true;
 1067|      0|      }
 1068|       |      // 4. If Type(x) is Number and Type(y) is String, return the result of the
 1069|       |      // comparison x == ! ToNumber(y).
 1070|      0|      CASE_S_M(NUMBER_TAG, Str) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1071|      0|        return x->getNumber() ==
 1072|      0|            stringToNumber(runtime, Handle<StringPrimitive>::vmcast(y));
 1073|      0|      }
 1074|       |      // 5. If Type(x) is String and Type(y) is Number, return the result of the
 1075|       |      // comparison ! ToNumber(x) == y.
 1076|      0|      CASE_M_S(Str, NUMBER_TAG) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1077|      0|        return stringToNumber(runtime, Handle<StringPrimitive>::vmcast(x)) ==
 1078|      0|            y->getNumber();
 1079|      0|      }
 1080|       |      // 6. If Type(x) is BigInt and Type(y) is String, then
 1081|      0|      CASE_M_M(BigInt, Str) {
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1082|       |        // a. Let n be ! StringToBigInt(y).
 1083|      0|        auto n = stringToBigInt(runtime, y);
 1084|      0|        if (LLVM_UNLIKELY(n == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1085|      0|          return ExecutionStatus::EXCEPTION;
 1086|      0|        }
 1087|       |        // b. If n is NaN, return false.
 1088|       |        // N.B.: this has been amended in ES2023 to read
 1089|       |        //       If n is undefined, return false.
 1090|      0|        if (n->isUndefined()) {
  ------------------
  |  Branch (1090:13): [True: 0, False: 0]
  ------------------
 1091|      0|          return false;
 1092|      0|        }
 1093|       |        // c. Return the result of the comparison x == n.
 1094|      0|        y = n.getValue();
 1095|      0|        break;
 1096|      0|      }
 1097|       |      // 7. If Type(x) is String and Type(y) is BigInt, return the result of the
 1098|       |      // comparison y == x.
 1099|      0|      CASE_M_M(Str, BigInt) {
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1100|      0|        std::swap(x, y);
 1101|      0|        break;
 1102|      0|      }
 1103|       |      // 8. If Type(x) is Boolean, return the result of the comparison !
 1104|       |      // ToNumber(x) == y.
 1105|      0|      CASE_S_S(Bool, NUMBER_TAG) {
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1106|       |        // Do both conversions and check numerical equality.
 1107|      0|        return static_cast<double>(x->getBool()) == y->getNumber();
 1108|      0|      }
 1109|      0|      CASE_S_M(Bool, Str) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1110|       |        // Do string parsing and check double equality.
 1111|      0|        return static_cast<double>(x->getBool()) ==
 1112|      0|            stringToNumber(runtime, Handle<StringPrimitive>::vmcast(y));
 1113|      0|      }
 1114|      0|      CASE_S_M(Bool, BigInt) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1115|      0|        return y->getBigInt()->compare(static_cast<int32_t>(x->getBool())) == 0;
 1116|      0|      }
 1117|      0|      CASE_S_M(Bool, Object) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1118|      0|        x = HermesValue::encodeDoubleValue(x->getBool());
 1119|      0|        break;
 1120|      0|      }
 1121|       |      // 9. If Type(y) is Boolean, return the result of the comparison x == !
 1122|       |      // ToNumber(y).
 1123|      0|      CASE_S_S(NUMBER_TAG, Bool) {
  ------------------
  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  ------------------
  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  ------------------
  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  ------------------
 1124|      0|        return x->getNumber() == static_cast<double>(y->getBool());
 1125|      0|      }
 1126|      0|      CASE_M_S(Str, Bool) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1127|      0|        return stringToNumber(runtime, Handle<StringPrimitive>::vmcast(x)) ==
 1128|      0|            static_cast<double>(y->getBool());
 1129|      0|      }
 1130|      0|      CASE_M_S(BigInt, Bool) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1131|      0|        return x->getBigInt()->compare(static_cast<int32_t>(y->getBool())) == 0;
 1132|      0|      }
 1133|      0|      CASE_M_S(Object, Bool) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1134|      0|        y = HermesValue::encodeDoubleValue(y->getBool());
 1135|      0|        break;
 1136|      0|      }
 1137|       |      // 10. If Type(x) is either String, Number, BigInt, or Symbol and Type(y)
 1138|       |      // is Object, return the result of the comparison x == ToPrimitive(y).
 1139|      0|      CASE_M_M(Str, Object)
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1140|      0|      CASE_M_M(BigInt, Object)
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1141|      0|      CASE_S_M(Symbol, Object)
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1142|      0|      CASE_S_M(NUMBER_TAG, Object) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1143|      0|        auto status = toPrimitive_RJS(runtime, y, PreferredType::NONE);
 1144|      0|        if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1144:13): [True: 0, False: 0]
  ------------------
 1145|      0|          return ExecutionStatus::EXCEPTION;
 1146|      0|        }
 1147|      0|        y = status.getValue();
 1148|      0|        break;
 1149|      0|      }
 1150|       |      // 11. If Type(x) is Object and Type(y) is either String, Number, BigInt,
 1151|       |      // or Symbol, return the result of the comparison ToPrimitive(x) == y.
 1152|      0|      CASE_M_M(Object, Str)
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1153|      0|      CASE_M_M(Object, BigInt)
  ------------------
  |  | 1026|      0|  CASE_M_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  |  | 1027|      0|  CASE_M_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  |  |  ------------------
  |  |  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1154|      0|      CASE_M_S(Object, Symbol)
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1155|      0|      CASE_M_S(Object, NUMBER_TAG) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1156|      0|        auto status = toPrimitive_RJS(runtime, x, PreferredType::NONE);
 1157|      0|        if (status == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1157:13): [True: 0, False: 0]
  ------------------
 1158|      0|          return ExecutionStatus::EXCEPTION;
 1159|      0|        }
 1160|      0|        x = status.getValue();
 1161|      0|        break;
 1162|      0|      }
 1163|       |      // 12. If Type(x) is BigInt and Type(y) is Number, or if Type(x) is
 1164|       |      // Number and Type(y) is BigInt, then a. If x or y are any of NaN, +∞,
 1165|       |      // or -∞, return false. b. If the mathematical value of x is equal to
 1166|       |      // the mathematical value of y, return true; otherwise return false.
 1167|      0|      CASE_M_S(BigInt, NUMBER_TAG) {
  ------------------
  |  | 1022|      0|  CASE_S_S(typeA##1, typeB)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1023|      0|  CASE_S_S(typeA##2, typeB)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1168|      0|        std::swap(x, y);
 1169|      0|        LLVM_FALLTHROUGH;
  ------------------
  |  |  245|      0|#define LLVM_FALLTHROUGH [[fallthrough]]
  ------------------
 1170|      0|      }
 1171|      0|      CASE_S_M(NUMBER_TAG, BigInt) {
  ------------------
  |  | 1018|      0|  CASE_S_S(typeA, typeB##1)    \
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  |  | 1019|      0|  CASE_S_S(typeA, typeB##2)
  |  |  ------------------
  |  |  |  | 1014|      0|  case HermesValue::combineETags( \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (1014:3): [True: 0, False: 594]
  |  |  |  |  ------------------
  |  |  |  | 1015|      0|      HermesValue::ETag::typeA, HermesValue::ETag::typeB):
  |  |  ------------------
  ------------------
 1172|      0|        if (!isIntegralNumber(x->getNumber())) {
  ------------------
  |  Branch (1172:13): [True: 0, False: 0]
  ------------------
 1173|      0|          return false;
 1174|      0|        }
 1175|       |
 1176|      0|        auto xAsBigInt = BigIntPrimitive::fromDouble(runtime, x->getNumber());
 1177|      0|        if (LLVM_UNLIKELY(xAsBigInt == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1178|      0|          return ExecutionStatus::EXCEPTION;
 1179|      0|        }
 1180|      0|        return xAsBigInt->getBigInt()->compare(y->getBigInt()) == 0;
 1181|      0|      }
 1182|       |
 1183|       |      // 13. Return false.
 1184|    594|      default:
  ------------------
  |  Branch (1184:7): [True: 594, False: 0]
  ------------------
 1185|    594|        return false;
 1186|    594|    }
 1187|       |
 1188|    594|#undef CASE_S_S
 1189|    594|#undef CASE_S_M
 1190|    594|#undef CASE_M_S
 1191|    594|#undef CASE_M_M
 1192|    594|#undef NUMBER_TAG
 1193|    594|  }
 1194|    594|}
_ZN6hermes2vm18strictEqualityTestENS0_11HermesValueES1_:
 1196|  1.78k|bool strictEqualityTest(HermesValue x, HermesValue y) {
 1197|       |  // Numbers are special because they can have different tags and they don't
 1198|       |  // obey bit-exact equality (because of NaN).
 1199|  1.78k|  if (x.isNumber())
  ------------------
  |  Branch (1199:7): [True: 0, False: 1.78k]
  ------------------
 1200|      0|    return y.isNumber() && x.getNumber() == y.getNumber();
  ------------------
  |  Branch (1200:12): [True: 0, False: 0]
  |  Branch (1200:28): [True: 0, False: 0]
  ------------------
 1201|       |  // If they are not numbers and are bit exact, they must be the same.
 1202|  1.78k|  if (x.getRaw() == y.getRaw())
  ------------------
  |  Branch (1202:7): [True: 1.78k, False: 0]
  ------------------
 1203|  1.78k|    return true;
 1204|       |  // All the rest of the cases need to have the same tags.
 1205|      0|  if (x.getTag() != y.getTag())
  ------------------
  |  Branch (1205:7): [True: 0, False: 0]
  ------------------
 1206|      0|    return false;
 1207|       |  // Strings need deep comparison.
 1208|      0|  if (x.isString())
  ------------------
  |  Branch (1208:7): [True: 0, False: 0]
  ------------------
 1209|      0|    return x.getString()->equals(y.getString());
 1210|       |
 1211|       |  // The only remaining case is bigint, which also needs a deep comparison.
 1212|      0|  return x.isBigInt() && x.getBigInt()->compare(y.getBigInt()) == 0;
  ------------------
  |  Branch (1212:10): [True: 0, False: 0]
  |  Branch (1212:26): [True: 0, False: 0]
  ------------------
 1213|      0|}
_ZN6hermes2vm9addOp_RJSERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
 1216|  1.01k|addOp_RJS(Runtime &runtime, Handle<> xHandle, Handle<> yHandle) {
 1217|  1.01k|  auto resX = toPrimitive_RJS(runtime, xHandle, PreferredType::NONE);
 1218|  1.01k|  if (resX == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1218:7): [True: 0, False: 1.01k]
  ------------------
 1219|      0|    return ExecutionStatus::EXCEPTION;
 1220|      0|  }
 1221|  1.01k|  auto xPrim = runtime.makeHandle(resX.getValue());
 1222|       |
 1223|  1.01k|  auto resY = toPrimitive_RJS(runtime, yHandle, PreferredType::NONE);
 1224|  1.01k|  if (resY == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1224:7): [True: 0, False: 1.01k]
  ------------------
 1225|      0|    return ExecutionStatus::EXCEPTION;
 1226|      0|  }
 1227|  1.01k|  auto yPrim = runtime.makeHandle(resY.getValue());
 1228|       |
 1229|       |  // If one of the values is a string, concatenate as strings.
 1230|  1.01k|  if (xPrim->isString() || yPrim->isString()) {
  ------------------
  |  Branch (1230:7): [True: 1.01k, False: 5]
  |  Branch (1230:28): [True: 5, False: 0]
  ------------------
 1231|  1.01k|    auto resX = toString_RJS(runtime, xPrim);
 1232|  1.01k|    if (resX == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1232:9): [True: 0, False: 1.01k]
  ------------------
 1233|      0|      return ExecutionStatus::EXCEPTION;
 1234|      0|    }
 1235|  1.01k|    auto xStr = runtime.makeHandle(std::move(*resX));
 1236|       |
 1237|  1.01k|    auto resY = toString_RJS(runtime, yPrim);
 1238|  1.01k|    if (resY == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1238:9): [True: 0, False: 1.01k]
  ------------------
 1239|      0|      return ExecutionStatus::EXCEPTION;
 1240|      0|    }
 1241|  1.01k|    auto yStr = runtime.makeHandle(std::move(*resY));
 1242|       |
 1243|  1.01k|    return StringPrimitive::concat(runtime, xStr, yStr);
 1244|  1.01k|  }
 1245|       |
 1246|       |  // xPrim and yPrim are primitives; hence, they are already bigints, or they
 1247|       |  // will never be bigints.
 1248|      0|  if (LLVM_LIKELY(!xPrim->isBigInt())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1249|       |    // xPrim is not a bigint; thus this is Number + Number.
 1250|      0|    auto res = toNumber_RJS(runtime, xPrim);
 1251|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1252|      0|      return ExecutionStatus::EXCEPTION;
 1253|      0|    }
 1254|      0|    const double xNum = res->getNumber();
 1255|       |    // N.B.: toNumber(yPrim) will raise an TypeError if yPrim is bigint, which
 1256|       |    // is the correct exception to be raised when trying to perform
 1257|       |    // Number + BigInt. This avoids the need to check if yPrim is a bigint.
 1258|      0|    res = toNumber_RJS(runtime, yPrim);
 1259|      0|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      0|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 1260|      0|      return ExecutionStatus::EXCEPTION;
 1261|      0|    }
 1262|      0|    const double yNum = res->getNumber();
 1263|      0|    return HermesValue::encodeDoubleValue(xNum + yNum);
 1264|      0|  }
 1265|       |
 1266|       |  // yPrim is a primitive; therefore it is already a BigInt, or it will never be
 1267|       |  // one.
 1268|      0|  if (!yPrim->isBigInt()) {
  ------------------
  |  Branch (1268:7): [True: 0, False: 0]
  ------------------
 1269|      0|    return runtime.raiseTypeErrorForValue(
 1270|      0|        "Cannot convert ", yHandle, " to BigInt");
 1271|      0|  }
 1272|       |
 1273|      0|  return BigIntPrimitive::add(
 1274|      0|      runtime,
 1275|      0|      runtime.makeHandle(xPrim->getBigInt()),
 1276|      0|      runtime.makeHandle(yPrim->getBigInt()));
 1277|      0|}
_ZN6hermes2vm9getMethodERNS0_7RuntimeENS0_6HandleINS0_11HermesValueEEES5_:
 1432|    418|getMethod(Runtime &runtime, Handle<> O, Handle<> key) {
 1433|    418|  GCScopeMarkerRAII gcScope{runtime};
 1434|    418|  auto objRes = toObject(runtime, O);
 1435|    418|  if (LLVM_UNLIKELY(objRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    418|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 418]
  |  |  ------------------
  ------------------
 1436|      0|    return ExecutionStatus::EXCEPTION;
 1437|      0|  }
 1438|    418|  auto obj = runtime.makeHandle<JSObject>(*objRes);
 1439|    418|  auto funcRes = JSObject::getComputed_RJS(obj, runtime, key);
 1440|    418|  if (LLVM_UNLIKELY(funcRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    418|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 418]
  |  |  ------------------
  ------------------
 1441|      0|    return ExecutionStatus::EXCEPTION;
 1442|      0|  }
 1443|    418|  if ((*funcRes)->isUndefined() || (*funcRes)->isNull()) {
  ------------------
  |  Branch (1443:7): [True: 414, False: 4]
  |  Branch (1443:36): [True: 0, False: 4]
  ------------------
 1444|    414|    return PseudoHandle<>::create(HermesValue::encodeUndefinedValue());
 1445|    414|  }
 1446|      4|  if (!vmisa<Callable>(funcRes->get())) {
  ------------------
  |  Branch (1446:7): [True: 0, False: 4]
  ------------------
 1447|      0|    return runtime.raiseTypeError("Could not get callable method from object");
 1448|      0|  }
 1449|      4|  return funcRes;
 1450|      4|}
Operations.cpp:_ZN6hermes2vmL14numberToStringERNS0_7RuntimeEd:
  292|   268k|    double m) {
  293|   268k|  char buf8[hermes::NUMBER_TO_STRING_BUF_SIZE];
  294|       |
  295|       |  // Optimization: Fast-case for positive integers < 2^31
  296|   268k|  int32_t n = static_cast<int32_t>(m);
  297|   268k|  if (m == static_cast<double>(n) && n > 0) {
  ------------------
  |  Branch (297:7): [True: 264k, False: 3.97k]
  |  Branch (297:38): [True: 240k, False: 23.9k]
  ------------------
  298|       |    // Write base 10 digits in reverse from end of buf8.
  299|   240k|    char *p = buf8 + sizeof(buf8);
  300|   910k|    do {
  301|   910k|      *--p = '0' + (n % 10);
  302|   910k|      n /= 10;
  303|   910k|    } while (n);
  ------------------
  |  Branch (303:14): [True: 670k, False: 240k]
  ------------------
  304|   240k|    size_t len = buf8 + sizeof(buf8) - p;
  305|       |    // Temporarily stop the propagation of removing.
  306|   240k|    auto result = StringPrimitive::create(runtime, ASCIIRef(p, len));
  307|   240k|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|   240k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 240k]
  |  |  ------------------
  ------------------
  308|      0|      return ExecutionStatus::EXCEPTION;
  309|      0|    }
  310|   240k|    return createPseudoHandle(vmcast<StringPrimitive>(*result));
  311|   240k|  }
  312|       |
  313|  27.9k|  auto getPredefined = [&runtime](Predefined::Str predefinedID) {
  314|  27.9k|    return createPseudoHandle(runtime.getPredefinedString(predefinedID));
  315|  27.9k|  };
  316|       |
  317|  27.9k|  if (std::isnan(m))
  ------------------
  |  Branch (317:7): [True: 2, False: 27.9k]
  ------------------
  318|      2|    return getPredefined(Predefined::NaN);
  319|  27.9k|  if (m == 0)
  ------------------
  |  Branch (319:7): [True: 23.9k, False: 3.99k]
  ------------------
  320|  23.9k|    return getPredefined(Predefined::zero);
  321|  3.99k|  if (m == std::numeric_limits<double>::infinity())
  ------------------
  |  Branch (321:7): [True: 0, False: 3.99k]
  ------------------
  322|      0|    return getPredefined(Predefined::Infinity);
  323|  3.99k|  if (m == -std::numeric_limits<double>::infinity())
  ------------------
  |  Branch (323:7): [True: 0, False: 3.99k]
  ------------------
  324|      0|    return getPredefined(Predefined::NegativeInfinity);
  325|       |
  326|       |  // After special cases, run the generic routine to convert.
  327|  3.99k|  size_t len = hermes::numberToString(m, buf8, sizeof(buf8));
  328|       |
  329|  3.99k|  auto result = StringPrimitive::create(runtime, ASCIIRef(buf8, len));
  330|  3.99k|  if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|  3.99k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 3.99k]
  |  |  ------------------
  ------------------
  331|      0|    return ExecutionStatus::EXCEPTION;
  332|      0|  }
  333|  3.99k|  return createPseudoHandle(vmcast<StringPrimitive>(*result));
  334|  3.99k|}
Operations.cpp:_ZZN6hermes2vmL14numberToStringERNS0_7RuntimeEdENK4$_16clENS0_10Predefined3StrE:
  313|  23.9k|  auto getPredefined = [&runtime](Predefined::Str predefinedID) {
  314|  23.9k|    return createPseudoHandle(runtime.getPredefinedString(predefinedID));
  315|  23.9k|  };
Operations.cpp:_ZN6hermes2vmL14stringToNumberERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEE:
  403|    244|    Handle<StringPrimitive> strPrim) {
  404|    244|  auto &idTable = runtime.getIdentifierTable();
  405|       |
  406|       |  // Fast check for special values (no extraneous whitespace).
  407|    244|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (407:7): [True: 0, False: 244]
  ------------------
  408|    244|          Predefined::getSymbolID(Predefined::Infinity), *strPrim)) {
  409|      0|    return std::numeric_limits<double>::infinity();
  410|      0|  }
  411|    244|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (411:7): [True: 0, False: 244]
  ------------------
  412|    244|          Predefined::getSymbolID(Predefined::PositiveInfinity), *strPrim)) {
  413|      0|    return std::numeric_limits<double>::infinity();
  414|      0|  }
  415|    244|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (415:7): [True: 0, False: 244]
  ------------------
  416|    244|          Predefined::getSymbolID(Predefined::NegativeInfinity), *strPrim)) {
  417|      0|  }
  418|    244|  if (runtime.symbolEqualsToStringPrim(
  ------------------
  |  Branch (418:7): [True: 0, False: 244]
  ------------------
  419|    244|          Predefined::getSymbolID(Predefined::NaN), *strPrim)) {
  420|      0|    return std::numeric_limits<double>::quiet_NaN();
  421|      0|  }
  422|       |
  423|       |  // Trim string to the interval [begin, end).
  424|    244|  auto orig = StringPrimitive::createStringView(runtime, strPrim);
  425|    244|  auto begin = orig.begin();
  426|    244|  auto end = orig.end();
  427|       |
  428|       |  // Move begin and end to ignore whitespace.
  429|    244|  while (begin != end &&
  ------------------
  |  Branch (429:10): [True: 244, False: 0]
  ------------------
  430|    244|         (isWhiteSpaceChar(*begin) || isLineTerminatorChar(*begin))) {
  ------------------
  |  Branch (430:11): [True: 0, False: 244]
  |  Branch (430:39): [True: 0, False: 244]
  ------------------
  431|      0|    ++begin;
  432|      0|  }
  433|    244|  while (begin != end &&
  ------------------
  |  Branch (433:10): [True: 244, False: 0]
  |  Branch (433:10): [True: 0, False: 244]
  ------------------
  434|    244|         (isWhiteSpaceChar(*(end - 1)) || isLineTerminatorChar(*(end - 1)))) {
  ------------------
  |  Branch (434:11): [True: 0, False: 244]
  |  Branch (434:43): [True: 0, False: 244]
  ------------------
  435|      0|    --end;
  436|      0|  }
  437|       |  // Early return for empty strings (strings only containing whitespace).
  438|    244|  if (begin == end) {
  ------------------
  |  Branch (438:7): [True: 0, False: 244]
  ------------------
  439|      0|    return 0;
  440|      0|  }
  441|       |
  442|       |  // Trim the string.
  443|    244|  StringView str16 = orig.slice(begin, end);
  444|       |
  445|       |  // Slow check for special values.
  446|       |  // This should only run if user created a string with extra whitespace,
  447|       |  // since normal uses would get caught by the initial check.
  448|    244|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|    244|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 244]
  |  |  ------------------
  ------------------
  449|    244|          runtime, Predefined::getSymbolID(Predefined::Infinity))))) {
  450|      0|    return std::numeric_limits<double>::infinity();
  451|      0|  }
  452|    244|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|    244|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 244]
  |  |  ------------------
  ------------------
  453|    244|          runtime, Predefined::getSymbolID(Predefined::PositiveInfinity))))) {
  454|      0|    return std::numeric_limits<double>::infinity();
  455|      0|  }
  456|    244|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|    244|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 244]
  |  |  ------------------
  ------------------
  457|    244|          runtime, Predefined::getSymbolID(Predefined::NegativeInfinity))))) {
  458|      0|    return -std::numeric_limits<double>::infinity();
  459|      0|  }
  460|    244|  if (LLVM_UNLIKELY(str16.equals(idTable.getStringView(
  ------------------
  |  |  189|    244|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 244]
  |  |  ------------------
  ------------------
  461|    244|          runtime, Predefined::getSymbolID(Predefined::NaN))))) {
  462|      0|    return std::numeric_limits<double>::quiet_NaN();
  463|      0|  }
  464|       |
  465|    244|  auto len = str16.length();
  466|       |
  467|       |  // Parse hex codes, since dtoa doesn't do it.
  468|       |  // FIXME: May be inaccurate for some hex values.
  469|       |  // We need to check other sources first.
  470|    244|  if (len > 2) {
  ------------------
  |  Branch (470:7): [True: 242, False: 2]
  ------------------
  471|    242|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'x') {
  ------------------
  |  Branch (471:9): [True: 0, False: 242]
  |  Branch (471:29): [True: 0, False: 0]
  ------------------
  472|      0|      return parseIntWithRadix(str16.slice(2), 16);
  473|      0|    }
  474|    242|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'o') {
  ------------------
  |  Branch (474:9): [True: 0, False: 242]
  |  Branch (474:29): [True: 0, False: 0]
  ------------------
  475|      0|      return parseIntWithRadix(str16.slice(2), 8);
  476|      0|    }
  477|    242|    if (str16[0] == u'0' && letterToLower(str16[1]) == u'b') {
  ------------------
  |  Branch (477:9): [True: 0, False: 242]
  |  Branch (477:29): [True: 0, False: 0]
  ------------------
  478|      0|      return parseIntWithRadix(str16.slice(2), 2);
  479|      0|    }
  480|    242|  }
  481|       |
  482|       |  // Finally, copy 16 bit chars into 8 bit chars and call dtoa.
  483|    244|  llvh::SmallVector<char, 32> str8(len + 1);
  484|    244|  uint32_t i = 0;
  485|    264|  for (auto c16 : str16) {
  ------------------
  |  Branch (485:17): [True: 264, False: 5]
  ------------------
  486|       |    // Check to ensure we only have valid number characters now.
  487|    264|    if ((u'0' <= c16 && c16 <= u'9') || c16 == u'.' ||
  ------------------
  |  Branch (487:10): [True: 27, False: 237]
  |  Branch (487:25): [True: 25, False: 2]
  |  Branch (487:41): [True: 0, False: 239]
  ------------------
  488|    264|        letterToLower(c16) == u'e' || c16 == u'+' || c16 == u'-') {
  ------------------
  |  Branch (488:9): [True: 0, False: 239]
  |  Branch (488:39): [True: 0, False: 239]
  |  Branch (488:54): [True: 0, False: 239]
  ------------------
  489|     25|      str8[i] = static_cast<char>(c16);
  490|    239|    } else {
  491|    239|      return std::numeric_limits<double>::quiet_NaN();
  492|    239|    }
  493|     25|    ++i;
  494|     25|  }
  495|      5|  str8[len] = '\0';
  496|      5|  char *endPtr;
  497|      5|  double result = ::hermes_g_strtod(str8.data(), &endPtr);
  498|      5|  if (endPtr == str8.data() + len) {
  ------------------
  |  Branch (498:7): [True: 5, False: 0]
  ------------------
  499|      5|    return result;
  500|      5|  }
  501|       |
  502|       |  // If everything failed, return NaN.
  503|      0|  return std::numeric_limits<double>::quiet_NaN();
  504|      5|}
Operations.cpp:_ZN6hermes2vmL5toIntIiEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeENS0_6HandleIS3_EE:
  648|    444|    Handle<> valueHandle) {
  649|    444|  auto res = toNumber_RJS(runtime, valueHandle);
  650|    444|  if (res == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (650:7): [True: 0, False: 444]
  ------------------
  651|      0|    return ExecutionStatus::EXCEPTION;
  652|      0|  }
  653|    444|  double num = res->getNumber();
  654|    444|  T result = static_cast<T>(hermes::truncateToInt32(num));
  655|    444|  return HermesValue::encodeNumberValue(result);
  656|    444|}

_ZN6hermes2vm21HashMapEntryBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   24|      1|void HashMapEntryBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   25|      1|  const auto *self = static_cast<const HashMapEntry *>(cell);
   26|      1|  mb.setVTable(&HashMapEntry::vt);
   27|      1|  mb.addField("key", &self->key);
   28|      1|  mb.addField("value", &self->value);
   29|      1|  mb.addField("prevIterationEntry", &self->prevIterationEntry);
   30|      1|  mb.addField("nextIterationEntry", &self->nextIterationEntry);
   31|      1|  mb.addField("nextEntryInBucket", &self->nextEntryInBucket);
   32|      1|}
_ZN6hermes2vm23OrderedHashMapBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   45|      1|void OrderedHashMapBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   46|      1|  const auto *self = static_cast<const OrderedHashMap *>(cell);
   47|      1|  mb.setVTable(&OrderedHashMap::vt);
   48|      1|  mb.addField("hashTable", &self->hashTable_);
   49|      1|  mb.addField("firstIterationEntry", &self->firstIterationEntry_);
   50|      1|  mb.addField("lastIterationEntry", &self->lastIterationEntry_);
   51|      1|}
_ZN6hermes2vm14OrderedHashMapC2ERNS0_7RuntimeENS0_6HandleINS0_16ArrayStorageBaseINS0_13HermesValue32EEEEE:
   56|     99|    : hashTable_(runtime, hashTableStorage.get(), runtime.getHeap()) {}
_ZN6hermes2vm14OrderedHashMap6createERNS0_7RuntimeE:
   59|     99|    Runtime &runtime) {
   60|     99|  auto arrRes =
   61|     99|      ArrayStorageSmall::create(runtime, INITIAL_CAPACITY, INITIAL_CAPACITY);
   62|     99|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   63|      0|    return ExecutionStatus::EXCEPTION;
   64|      0|  }
   65|     99|  auto hashTableStorage = runtime.makeHandle<ArrayStorageSmall>(*arrRes);
   66|       |
   67|     99|  return createPseudoHandle(
   68|     99|      runtime.makeAFixed<OrderedHashMap>(runtime, hashTableStorage));
   69|     99|}

_ZN6hermes2vm17JSStringBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   32|      1|void JSStringBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   33|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSString>());
   34|      1|  JSObjectBuildMeta(cell, mb);
   35|      1|  const auto *self = static_cast<const JSString *>(cell);
   36|      1|  mb.setVTable(&JSString::vt);
   37|      1|  mb.addField(&self->primitiveValue_);
   38|      1|}
_ZN6hermes2vm8JSString6createERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEENS4_INS0_8JSObjectEEE:
   43|     99|    Handle<JSObject> parentHandle) {
   44|     99|  auto clazzHandle = runtime.getHiddenClassForPrototype(
   45|     99|      *parentHandle, numOverlapSlots<JSString>());
   46|     99|  auto obj =
   47|     99|      runtime.makeAFixed<JSString>(runtime, value, parentHandle, clazzHandle);
   48|       |
   49|     99|  auto selfHandle = JSObjectInit::initToHandle(runtime, obj);
   50|       |
   51|     99|  PropertyFlags pf;
   52|     99|  pf.writable = 0;
   53|     99|  pf.enumerable = 0;
   54|     99|  pf.configurable = 0;
   55|       |
   56|     99|  if (LLVM_UNLIKELY(
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
   57|     99|          JSObject::defineNewOwnProperty(
   58|     99|              selfHandle,
   59|     99|              runtime,
   60|     99|              Predefined::getSymbolID(Predefined::length),
   61|     99|              pf,
   62|     99|              runtime.makeHandle(HermesValue::encodeDoubleValue(
   63|     99|                  value->getStringLength()))) == ExecutionStatus::EXCEPTION)) {
   64|      0|    return ExecutionStatus::EXCEPTION;
   65|      0|  }
   66|       |
   67|     99|  return selfHandle;
   68|     99|}
_ZN6hermes2vm25JSStringIteratorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  190|      1|void JSStringIteratorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  191|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSStringIterator>());
  192|      1|  JSObjectBuildMeta(cell, mb);
  193|      1|  const auto *self = static_cast<const JSStringIterator *>(cell);
  194|      1|  mb.setVTable(&JSStringIterator::vt);
  195|      1|  mb.addField("iteratedString", &self->iteratedString_);
  196|      1|}
_ZN6hermes2vm17JSBigIntBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  286|      1|void JSBigIntBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  287|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSBigInt>());
  288|      1|  JSObjectBuildMeta(cell, mb);
  289|      1|  const auto *self = static_cast<const JSBigInt *>(cell);
  290|      1|  mb.setVTable(&JSBigInt::vt);
  291|      1|  mb.addField(&self->primitiveValue_);
  292|      1|}
_ZN6hermes2vm17JSNumberBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  320|      1|void JSNumberBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  321|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSNumber>());
  322|      1|  JSObjectBuildMeta(cell, mb);
  323|      1|  mb.setVTable(&JSNumber::vt);
  324|      1|}
_ZN6hermes2vm8JSNumber6createERNS0_7RuntimeEdNS0_6HandleINS0_8JSObjectEEE:
  329|     99|    Handle<JSObject> parentHandle) {
  330|     99|  auto clazzHandle = runtime.getHiddenClassForPrototype(
  331|     99|      *parentHandle, numOverlapSlots<JSNumber>());
  332|     99|  auto obj =
  333|     99|      runtime.makeAFixed<JSNumber>(runtime, value, parentHandle, clazzHandle);
  334|     99|  return JSObjectInit::initToPseudoHandle(runtime, obj);
  335|     99|}
_ZN6hermes2vm18JSBooleanBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  351|      1|void JSBooleanBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  352|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSBoolean>());
  353|      1|  JSObjectBuildMeta(cell, mb);
  354|      1|  mb.setVTable(&JSBoolean::vt);
  355|      1|}
_ZN6hermes2vm9JSBoolean6createERNS0_7RuntimeEbNS0_6HandleINS0_8JSObjectEEE:
  358|     99|JSBoolean::create(Runtime &runtime, bool value, Handle<JSObject> parentHandle) {
  359|     99|  auto clazzHandle = runtime.getHiddenClassForPrototype(
  360|     99|      *parentHandle, numOverlapSlots<JSBoolean>());
  361|     99|  auto obj =
  362|     99|      runtime.makeAFixed<JSBoolean>(runtime, value, parentHandle, clazzHandle);
  363|     99|  return JSObjectInit::initToPseudoHandle(runtime, obj);
  364|     99|}
_ZN6hermes2vm17JSSymbolBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  380|      1|void JSSymbolBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  381|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSSymbol>());
  382|      1|  JSObjectBuildMeta(cell, mb);
  383|      1|  const auto *self = static_cast<const JSSymbol *>(cell);
  384|      1|  mb.setVTable(&JSSymbol::vt);
  385|      1|  mb.addField(&self->primitiveValue_);
  386|      1|}

_ZN6hermes2vm20CodeCoverageProfiler12allProfilersEv:
   21|    198|    &CodeCoverageProfiler::allProfilers() {
   22|    198|  static auto *const allProfilers =
   23|    198|      new std::unordered_set<CodeCoverageProfiler *>();
   24|    198|  return *allProfilers;
   25|    198|}
_ZN6hermes2vm20CodeCoverageProfiler11globalMutexEv:
   26|    198|/* static */ std::mutex &CodeCoverageProfiler::globalMutex() {
   27|    198|  static auto *const globalMutex = new std::mutex();
   28|    198|  return *globalMutex;
   29|    198|}
_ZN6hermes2vm20CodeCoverageProfiler9markRootsERNS0_12RootAcceptorE:
   31|  1.18k|void CodeCoverageProfiler::markRoots(RootAcceptor &acceptor) {
   32|  1.18k|  for (Domain *&domain : domains_) {
  ------------------
  |  Branch (32:24): [True: 0, False: 1.18k]
  ------------------
   33|      0|    acceptor.acceptPtr(domain);
   34|      0|  }
   35|  1.18k|}

_ZN6hermes2vm25PropertyAccessorBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   17|      1|void PropertyAccessorBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   18|      1|  const auto *self = static_cast<const PropertyAccessor *>(cell);
   19|      1|  mb.setVTable(&PropertyAccessor::vt);
   20|      1|  mb.addField("getter", &self->getter);
   21|      1|  mb.addField("setter", &self->setter);
   22|      1|}
_ZN6hermes2vm16PropertyAccessor6createERNS0_7RuntimeENS0_6HandleINS0_8CallableEEES6_:
   27|  4.28k|    Handle<Callable> setter) {
   28|  4.28k|  auto *cell = runtime.makeAFixed<PropertyAccessor>(runtime, getter, setter);
   29|  4.28k|  return HermesValue::encodeObjectValue(cell);
   30|  4.28k|}

_ZN6hermes2vm7Runtime6createERKNS0_13RuntimeConfigE:
  131|     99|std::shared_ptr<Runtime> Runtime::create(const RuntimeConfig &runtimeConfig) {
  132|     99|#if defined(HERMESVM_CONTIGUOUS_HEAP)
  133|     99|  uint64_t maxHeapSize = runtimeConfig.getGCConfig().getMaxHeapSize();
  134|       |  // Allow some extra segments for the runtime, and as a buffer for the GC.
  135|     99|  uint64_t providerSize =
  136|     99|      std::min<uint64_t>(1ULL << 32, maxHeapSize + AlignedStorage::size() * 4);
  137|     99|  std::shared_ptr<StorageProvider> sp =
  138|     99|      StorageProvider::contiguousVAProvider(providerSize);
  139|     99|  auto rt = HeapRuntime<Runtime>::create(sp);
  140|     99|  new (rt.get()) Runtime(std::move(sp), runtimeConfig);
  141|     99|  return rt;
  142|       |#elif defined(HERMES_FACEBOOK_BUILD) && !defined(HERMES_FBCODE_BUILD)
  143|       |  // TODO (T84179835): Disable this once it is no longer useful for debugging.
  144|       |  return StackRuntime::create(runtimeConfig);
  145|       |#else
  146|       |  return std::shared_ptr<Runtime>{
  147|       |      new Runtime(StorageProvider::mmapProvider(), runtimeConfig)};
  148|       |#endif
  149|     99|}
_ZN6hermes2vm7Runtime8getNamedENS0_6HandleINS0_8JSObjectEEENS0_11PropCacheIDE:
  153|   404k|    PropCacheID id) {
  154|   404k|  CompressedPointer clazzPtr{obj->getClassGCPtr()};
  155|   404k|  auto *cacheEntry = &fixedPropCache_[static_cast<int>(id)];
  156|   404k|  if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|   404k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 404k, False: 0]
  |  |  ------------------
  ------------------
  157|       |    // The slot is cached, so it is safe to use the Internal function.
  158|   404k|    return createPseudoHandle(
  159|   404k|        JSObject::getNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
  160|   404k|            *obj, *this, cacheEntry->slot)
  161|   404k|            .unboxToHV(*this));
  162|   404k|  }
  163|      0|  auto sym = Predefined::getSymbolID(fixedPropCacheNames[static_cast<int>(id)]);
  164|      0|  NamedPropertyDescriptor desc;
  165|       |  // Check writable and internalSetter flags since the cache slot is shared for
  166|       |  // get/put.
  167|      0|  if (LLVM_LIKELY(
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (167:7): [True: 0, False: 0]
  ------------------
  168|      0|          JSObject::tryGetOwnNamedDescriptorFast(*obj, *this, sym, desc)) &&
  169|      0|      !desc.flags.accessor && desc.flags.writable &&
  ------------------
  |  Branch (169:7): [True: 0, False: 0]
  |  Branch (169:31): [True: 0, False: 0]
  ------------------
  170|      0|      !desc.flags.internalSetter) {
  ------------------
  |  Branch (170:7): [True: 0, False: 0]
  ------------------
  171|      0|    HiddenClass *clazz = vmcast<HiddenClass>(clazzPtr.getNonNull(*this));
  172|      0|    if (LLVM_LIKELY(!clazz->isDictionary())) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
  173|       |      // Cache the class, id and property slot.
  174|      0|      cacheEntry->clazz = clazzPtr;
  175|      0|      cacheEntry->slot = desc.slot;
  176|      0|    }
  177|      0|    return JSObject::getNamedSlotValue(createPseudoHandle(*obj), *this, desc);
  178|      0|  }
  179|      0|  return JSObject::getNamed_RJS(obj, *this, sym);
  180|      0|}
_ZN6hermes2vm7Runtime20putNamedThrowOnErrorENS0_6HandleINS0_8JSObjectEEENS0_11PropCacheIDENS0_13HermesValue32E:
  185|   404k|    SmallHermesValue shv) {
  186|   404k|  CompressedPointer clazzPtr{obj->getClassGCPtr()};
  187|   404k|  auto *cacheEntry = &fixedPropCache_[static_cast<int>(id)];
  188|   404k|  if (LLVM_LIKELY(cacheEntry->clazz == clazzPtr)) {
  ------------------
  |  |  188|   404k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 404k, False: 4]
  |  |  ------------------
  ------------------
  189|   404k|    JSObject::setNamedSlotValueUnsafe<PropStorage::Inline::Yes>(
  190|   404k|        *obj, *this, cacheEntry->slot, shv);
  191|   404k|    return ExecutionStatus::RETURNED;
  192|   404k|  }
  193|      4|  auto sym = Predefined::getSymbolID(fixedPropCacheNames[static_cast<int>(id)]);
  194|      4|  NamedPropertyDescriptor desc;
  195|      4|  if (LLVM_LIKELY(
  ------------------
  |  |  188|      8|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  |  Branch (195:7): [True: 4, False: 0]
  ------------------
  196|      4|          JSObject::tryGetOwnNamedDescriptorFast(*obj, *this, sym, desc)) &&
  197|      4|      !desc.flags.accessor && desc.flags.writable &&
  ------------------
  |  Branch (197:7): [True: 4, False: 0]
  |  Branch (197:31): [True: 4, False: 0]
  ------------------
  198|      4|      !desc.flags.internalSetter) {
  ------------------
  |  Branch (198:7): [True: 4, False: 0]
  ------------------
  199|      4|    HiddenClass *clazz = vmcast<HiddenClass>(clazzPtr.getNonNull(*this));
  200|      4|    if (LLVM_LIKELY(!clazz->isDictionary())) {
  ------------------
  |  |  188|      4|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 4, False: 0]
  |  |  ------------------
  ------------------
  201|       |      // Cache the class and property slot.
  202|      4|      cacheEntry->clazz = clazzPtr;
  203|      4|      cacheEntry->slot = desc.slot;
  204|      4|    }
  205|      4|    JSObject::setNamedSlotValueUnsafe(*obj, *this, desc.slot, shv);
  206|      4|    return ExecutionStatus::RETURNED;
  207|      4|  }
  208|      0|  Handle<> value = makeHandle(shv.unboxToHV(*this));
  209|      0|  return JSObject::putNamed_RJS(
  210|      0|             obj, *this, sym, value, PropOpFlags().plusThrowOnError())
  211|      0|      .getStatus();
  212|      4|}
_ZN6hermes2vm7RuntimeC2ENSt3__110shared_ptrINS0_15StorageProviderEEERKNS0_13RuntimeConfigE:
  245|     99|      gcEventCallback_(runtimeConfig.getGCConfig().getCallback()) {
  246|     99|  assert(
  247|     99|      (void *)this == (void *)(HandleRootOwner *)this &&
  248|     99|      "cast to HandleRootOwner should be no-op");
  249|       |#ifdef HERMES_FACEBOOK_BUILD
  250|       |  const bool isSnapshot = std::strstr(__FILE__, "hermes-snapshot");
  251|       |  crashMgr_->setCustomData("HermesIsSnapshot", isSnapshot ? "true" : "false");
  252|       |#endif
  253|      0|  crashMgr_->registerMemory(this, sizeof(Runtime));
  254|     99|  auto maxNumRegisters = runtimeConfig.getMaxNumRegisters();
  255|     99|  if (LLVM_UNLIKELY(maxNumRegisters > kMaxSupportedNumRegisters)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
  256|      0|    hermes_fatal("RuntimeConfig maxNumRegisters too big");
  257|      0|  }
  258|     99|  registerStackStart_ = runtimeConfig.getRegisterStack();
  259|     99|  if (!registerStackStart_) {
  ------------------
  |  Branch (259:7): [True: 99, False: 0]
  ------------------
  260|       |    // registerStackAllocation_ should not be allocated with new, because then
  261|       |    // default constructors would run for the whole stack space.
  262|       |    // Round up to page size as required by vm_allocate.
  263|     99|    const uint32_t numBytesForRegisters = llvh::alignTo(
  264|     99|        sizeof(PinnedHermesValue) * maxNumRegisters, oscompat::page_size());
  265|     99|    auto result = oscompat::vm_allocate(numBytesForRegisters);
  266|     99|    if (!result) {
  ------------------
  |  Branch (266:9): [True: 0, False: 99]
  ------------------
  267|      0|      hermes_fatal("Failed to allocate register stack", result.getError());
  268|      0|    }
  269|     99|    registerStackStart_ = static_cast<PinnedHermesValue *>(result.get());
  270|     99|    registerStackAllocation_ = {registerStackStart_, numBytesForRegisters};
  271|     99|    crashMgr_->registerMemory(registerStackStart_, numBytesForRegisters);
  272|     99|  }
  273|       |
  274|     99|  registerStackEnd_ = registerStackStart_ + maxNumRegisters;
  275|     99|  if (shouldRandomizeMemoryLayout_) {
  ------------------
  |  Branch (275:7): [True: 0, False: 99]
  ------------------
  276|      0|    const unsigned bytesOff = std::random_device()() % oscompat::page_size();
  277|      0|    registerStackStart_ += bytesOff / sizeof(PinnedHermesValue);
  278|      0|    assert(
  279|      0|        registerStackEnd_ >= registerStackStart_ && "register stack too small");
  280|      0|  }
  281|      0|  stackPointer_ = registerStackStart_;
  282|       |
  283|       |  // Setup the "root" stack frame.
  284|     99|  setCurrentFrameToTopOfStack();
  285|       |  // Allocate the "reserved" registers in the root frame.
  286|     99|  allocStack(
  287|     99|      StackFrameLayout::CalleeExtraRegistersAtStart,
  288|     99|      HermesValue::encodeUndefinedValue());
  289|       |
  290|       |  // Initialize Predefined Strings.
  291|       |  // This function does not do any allocations.
  292|     99|  initPredefinedStrings();
  293|       |  // Initialize special code blocks pointing to their own runtime module.
  294|       |  // specialCodeBlockRuntimeModule_ will be owned by runtimeModuleList_.
  295|     99|  RuntimeModuleFlags flags;
  296|     99|  flags.hidesEpilogue = true;
  297|     99|  specialCodeBlockDomain_ = Domain::create(*this).getHermesValue();
  298|     99|  specialCodeBlockRuntimeModule_ = RuntimeModule::createUninitialized(
  299|     99|      *this, Handle<Domain>::vmcast(&specialCodeBlockDomain_), flags);
  300|     99|  assert(
  301|     99|      &runtimeModuleList_.back() == specialCodeBlockRuntimeModule_ &&
  302|     99|      "specialCodeBlockRuntimeModule_ not added to runtimeModuleList_");
  303|       |
  304|       |  // At this point, allocations can begin, as all the roots are markable.
  305|       |
  306|       |  // Initialize the pre-allocated character strings.
  307|      0|  initCharacterStrings();
  308|       |
  309|     99|  GCScope scope(*this);
  310|       |
  311|       |  // Explicitly initialize the specialCodeBlockRuntimeModule_ without CJS
  312|       |  // modules.
  313|     99|  specialCodeBlockRuntimeModule_->initializeWithoutCJSModulesMayAllocate(
  314|     99|      hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
  315|     99|          generateSpecialRuntimeBytecode())
  316|     99|          .first);
  317|     99|  emptyCodeBlock_ = specialCodeBlockRuntimeModule_->getCodeBlockMayAllocate(0);
  318|     99|  returnThisCodeBlock_ =
  319|     99|      specialCodeBlockRuntimeModule_->getCodeBlockMayAllocate(1);
  320|       |
  321|       |  // Initialize the root hidden class and its variants.
  322|     99|  {
  323|     99|    MutableHandle<HiddenClass> clazz(
  324|     99|        *this,
  325|     99|        vmcast<HiddenClass>(
  326|     99|            ignoreAllocationFailure(HiddenClass::createRoot(*this))));
  327|     99|    rootClazzes_[0] = clazz.getHermesValue();
  328|    792|    for (unsigned i = 1; i <= InternalProperty::NumAnonymousInternalProperties;
  ------------------
  |  Branch (328:26): [True: 693, False: 99]
  ------------------
  329|    693|         ++i) {
  330|    693|      auto addResult = HiddenClass::reserveSlot(clazz, *this);
  331|    693|      assert(
  332|    693|          addResult != ExecutionStatus::EXCEPTION &&
  333|    693|          "Could not possibly grow larger than the limit");
  334|      0|      clazz = *addResult->first;
  335|    693|      rootClazzes_[i] = clazz.getHermesValue();
  336|    693|    }
  337|     99|  }
  338|       |
  339|     99|  global_ =
  340|     99|      JSObject::create(*this, makeNullHandle<JSObject>()).getHermesValue();
  341|       |
  342|     99|  JSLibFlags jsLibFlags{};
  343|     99|  jsLibFlags.enableHermesInternal = runtimeConfig.getEnableHermesInternal();
  344|     99|  jsLibFlags.enableHermesInternalTestMethods =
  345|     99|      runtimeConfig.getEnableHermesInternalTestMethods();
  346|     99|  initGlobalObject(*this, jsLibFlags);
  347|       |
  348|       |  // Once the global object has been initialized, populate native builtins to
  349|       |  // the builtins table.
  350|     99|  initNativeBuiltins();
  351|       |
  352|       |  // Set the prototype of the global object to the standard object prototype,
  353|       |  // which has now been defined.
  354|     99|  ignoreAllocationFailure(JSObject::setParent(
  355|     99|      vmcast<JSObject>(global_),
  356|     99|      *this,
  357|     99|      vmcast<JSObject>(objectPrototype),
  358|     99|      PropOpFlags().plusThrowOnError()));
  359|       |
  360|     99|  symbolRegistry_.init(*this);
  361|       |
  362|       |  // BB Profiler need to be ready before running internal bytecode.
  363|       |#ifdef HERMESVM_PROFILER_BB
  364|       |  inlineCacheProfiler_.setHiddenClassArray(
  365|       |      ignoreAllocationFailure(JSArray::create(*this, 4, 4)).get());
  366|       |#endif
  367|       |
  368|     99|  codeCoverageProfiler_->disable();
  369|       |  // Execute our internal bytecode.
  370|     99|  auto jsBuiltinsObj = runInternalBytecode();
  371|     99|  codeCoverageProfiler_->restore();
  372|       |
  373|       |  // Populate JS builtins returned from internal bytecode to the builtins table.
  374|     99|  initJSBuiltins(builtins_, jsBuiltinsObj);
  375|       |
  376|     99|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  377|     99|  if (runtimeConfig.getEnableSampleProfiling())
  ------------------
  |  Branch (377:7): [True: 0, False: 99]
  ------------------
  378|      0|    samplingProfiler = SamplingProfiler::create(*this);
  379|     99|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
  380|       |
  381|     99|  LLVM_DEBUG(llvh::dbgs() << "Runtime initialized\n");
  ------------------
  |  |  123|     99|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     99|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 99]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     99|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
  382|     99|}
_ZN6hermes2vm7RuntimeD2Ev:
  384|     99|Runtime::~Runtime() {
  385|     99|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  386|     99|  samplingProfiler.reset();
  387|     99|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
  388|       |
  389|     99|  getHeap().finalizeAll();
  390|       |  // Now that all objects are finalized, there shouldn't be any native memory
  391|       |  // keys left in the ID tracker for memory profiling. Assert that the only IDs
  392|       |  // left are JS heap pointers.
  393|     99|  assert(
  394|     99|      !getHeap().getIDTracker().hasNativeIDs() &&
  395|     99|      "A pointer is left in the ID tracker that is from non-JS memory. "
  396|     99|      "Was untrackNative called?");
  397|      0|  crashMgr_->unregisterCallback(crashCallbackKey_);
  398|     99|  if (!registerStackAllocation_.empty()) {
  ------------------
  |  Branch (398:7): [True: 99, False: 0]
  ------------------
  399|     99|    crashMgr_->unregisterMemory(registerStackAllocation_.data());
  400|     99|    oscompat::vm_free(
  401|     99|        registerStackAllocation_.data(), registerStackAllocation_.size());
  402|     99|  }
  403|       |  // Remove inter-module dependencies so we can delete them in any order.
  404|     99|  for (auto &module : runtimeModuleList_) {
  ------------------
  |  Branch (404:21): [True: 0, False: 99]
  ------------------
  405|      0|    module.prepareForRuntimeShutdown();
  406|      0|  }
  407|       |
  408|     99|  assert(
  409|     99|      !formattingStackTrace_ &&
  410|     99|      "Runtime is being destroyed while exception is being formatted");
  411|       |
  412|     99|  while (!runtimeModuleList_.empty()) {
  ------------------
  |  Branch (412:10): [True: 0, False: 99]
  ------------------
  413|       |    // Calling delete will automatically remove it from the list.
  414|      0|    delete &runtimeModuleList_.back();
  415|      0|  }
  416|       |
  417|       |  // Unwatch the runtime from the time limit monitor in case the latter still
  418|       |  // has any references to this.
  419|     99|  if (timeLimitMonitor) {
  ------------------
  |  Branch (419:7): [True: 99, False: 0]
  ------------------
  420|     99|    timeLimitMonitor->unwatchRuntime(*this);
  421|     99|  }
  422|       |
  423|     99|  crashMgr_->unregisterMemory(this);
  424|     99|}
_ZN6hermes2vm7Runtime9markRootsERNS0_28RootAndSlotAcceptorWithNamesEb:
  459|  1.18k|    bool markLongLived) {
  460|       |  // The body of markRoots should be sequence of blocks, each of which starts
  461|       |  // with the declaration of an appropriate RootSection instance.
  462|  1.18k|  {
  463|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Registers);
  464|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::Registers);
  465|  78.1k|    for (auto *p = registerStackStart_, *e = stackPointer_; p != e; ++p)
  ------------------
  |  Branch (465:61): [True: 76.9k, False: 1.18k]
  ------------------
  466|  76.9k|      acceptor.accept(*p);
  467|  1.18k|    acceptor.endRootSection();
  468|  1.18k|  }
  469|       |
  470|  1.18k|  {
  471|  1.18k|    MarkRootsPhaseTimer timer(
  472|  1.18k|        *this, RootAcceptor::Section::RuntimeInstanceVars);
  473|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::RuntimeInstanceVars);
  474|  1.18k|    for (auto &clazz : rootClazzes_)
  ------------------
  |  Branch (474:22): [True: 9.51k, False: 1.18k]
  ------------------
  475|  9.51k|      acceptor.accept(clazz, "rootClass");
  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  477|  1.18k|#include "hermes/VM/RuntimeHermesValueFields.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|  1.18k|#ifndef RUNTIME_HV_FIELD_PROTOTYPE
  |  |    9|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name)
  |  |   10|  1.18k|#endif
  |  |   11|       |
  |  |   12|       |#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|       |#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|       |#endif
  |  |   15|       |
  |  |   16|  1.18k|#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|  1.18k|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|  1.18k|#endif
  |  |   19|       |
  |  |   20|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |   21|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |   22|       |
  |  |   23|       |/// JSError.prototype, and prototype of all native error types.
  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |   25|  1.18k|#include "hermes/VM/NativeErrorTypes.def"
  |  |   26|  1.18k|#undef ALL_ERROR_TYPE
  |  |   27|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |   28|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |   29|       |
  |  |   30|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |   31|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |   32|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |   33|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |   34|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |   35|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |   36|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |   37|       |
  |  |   38|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |   39|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |   40|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |   41|       |
  |  |   42|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   43|  1.18k|#define TYPED_ARRAY(name, type)                    \
  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   46|  1.18k|#include "hermes/VM/TypedArrays.def"
  |  |   47|  1.18k|#undef TYPED_ARRAY
  |  |   48|       |
  |  |   49|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |   50|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |   51|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |   52|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |   53|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |   54|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |   55|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |   56|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |   57|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |   58|       |
  |  |   59|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |   60|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |   61|       |
  |  |   62|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |   63|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |   64|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |   65|       |
  |  |   66|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |   67|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |   68|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |   69|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |   70|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |   71|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |   72|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |   73|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |   74|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |   75|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |   76|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |   77|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |   78|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |   79|       |
  |  |   80|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   81|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   82|       |// revisit this in stage 2
  |  |   83|  1.18k|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |   84|       |
  |  |   85|  1.18k|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |  ------------------
  |  |  |  |  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   86|  1.18k|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |  ------------------
  |  |  |  |  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   87|  1.18k|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |  ------------------
  |  |  |  |  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   88|  1.18k|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   89|  1.18k|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |  ------------------
  |  |  |  |  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |   90|  1.18k|#endif // HERMES_ENABLE_DEBUGGER
  |  |   91|       |
  |  |   92|       |#ifdef HERMES_ENABLE_INTL
  |  |   93|       |// TODO T65916424: move these out of Runtime
  |  |   94|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |   95|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |   96|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |   97|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |   98|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |   99|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  100|       |#endif
  |  |  101|       |
  |  |  102|  1.18k|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  ------------------
  |  |  |  |  476|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name) acceptor.accept((name), #name);
  |  |  ------------------
  |  |  103|       |
  |  |  104|  1.18k|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  105|  1.18k|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  106|  1.18k|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  107|  1.18k|#undef RUNTIME_HV_FIELD
  ------------------
  478|  1.18k|#undef RUNTIME_HV_FIELD_INSTANCE
  479|  1.18k|    acceptor.endRootSection();
  480|  1.18k|  }
  481|       |
  482|  1.18k|  {
  483|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::RuntimeModules);
  484|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::RuntimeModules);
  485|  1.18k|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name) acceptor.accept(name);
  486|  1.18k|#include "hermes/VM/RuntimeHermesValueFields.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|  1.18k|#ifndef RUNTIME_HV_FIELD_PROTOTYPE
  |  |    9|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name)
  |  |   10|  1.18k|#endif
  |  |   11|       |
  |  |   12|  1.18k|#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|  1.18k|#endif
  |  |   15|       |
  |  |   16|       |#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|       |#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|       |#endif
  |  |   19|       |
  |  |   20|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |   21|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |   22|       |
  |  |   23|       |/// JSError.prototype, and prototype of all native error types.
  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |   25|  1.18k|#include "hermes/VM/NativeErrorTypes.def"
  |  |   26|  1.18k|#undef ALL_ERROR_TYPE
  |  |   27|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |   28|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |   29|       |
  |  |   30|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |   31|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |   32|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |   33|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |   34|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |   35|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |   36|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |   37|       |
  |  |   38|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |   39|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |   40|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |   41|       |
  |  |   42|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   43|  1.18k|#define TYPED_ARRAY(name, type)                    \
  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   46|  1.18k|#include "hermes/VM/TypedArrays.def"
  |  |   47|  1.18k|#undef TYPED_ARRAY
  |  |   48|       |
  |  |   49|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |   50|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |   51|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |   52|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |   53|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |   54|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |   55|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |   56|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |   57|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |   58|       |
  |  |   59|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |   60|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |   61|       |
  |  |   62|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |   63|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |   64|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |   65|       |
  |  |   66|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |   67|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |   68|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |   69|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |   70|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |   71|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |   72|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |   73|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |   74|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |   75|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |   76|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |   77|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |   78|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |   79|       |
  |  |   80|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   81|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   82|       |// revisit this in stage 2
  |  |   83|  1.18k|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |  ------------------
  |  |  |  |  485|  1.18k|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name) acceptor.accept(name);
  |  |  ------------------
  |  |   84|       |
  |  |   85|  1.18k|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |   86|  1.18k|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |   87|  1.18k|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |   88|  1.18k|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   89|  1.18k|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |   90|  1.18k|#endif // HERMES_ENABLE_DEBUGGER
  |  |   91|       |
  |  |   92|       |#ifdef HERMES_ENABLE_INTL
  |  |   93|       |// TODO T65916424: move these out of Runtime
  |  |   94|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |   95|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |   96|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |   97|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |   98|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |   99|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  100|       |#endif
  |  |  101|       |
  |  |  102|  1.18k|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  103|       |
  |  |  104|  1.18k|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  105|  1.18k|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  106|  1.18k|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  107|  1.18k|#undef RUNTIME_HV_FIELD
  ------------------
  487|  1.18k|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  488|  1.18k|    for (auto &rm : runtimeModuleList_)
  ------------------
  |  Branch (488:19): [True: 17.0k, False: 1.18k]
  ------------------
  489|  17.0k|      rm.markRoots(acceptor, markLongLived);
  490|  1.18k|    acceptor.endRootSection();
  491|  1.18k|  }
  492|       |
  493|  1.18k|  {
  494|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::CharStrings);
  495|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::CharStrings);
  496|  1.18k|    if (markLongLived) {
  ------------------
  |  Branch (496:9): [True: 888, False: 301]
  ------------------
  497|    888|      for (auto &hv : charStrings_)
  ------------------
  |  Branch (497:21): [True: 227k, False: 888]
  ------------------
  498|   227k|        acceptor.accept(hv);
  499|    888|    }
  500|  1.18k|    acceptor.endRootSection();
  501|  1.18k|  }
  502|       |
  503|  1.18k|  {
  504|  1.18k|    MarkRootsPhaseTimer timer(
  505|  1.18k|        *this, RootAcceptor::Section::StringCycleCheckVisited);
  506|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::StringCycleCheckVisited);
  507|  1.18k|    for (auto *&ptr : stringCycleCheckVisited_)
  ------------------
  |  Branch (507:21): [True: 0, False: 1.18k]
  ------------------
  508|      0|      acceptor.acceptPtr(ptr);
  509|  1.18k|    acceptor.endRootSection();
  510|  1.18k|  }
  511|       |
  512|  1.18k|  {
  513|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Builtins);
  514|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::Builtins);
  515|  1.18k|    for (Callable *&f : builtins_)
  ------------------
  |  Branch (515:23): [True: 61.8k, False: 1.18k]
  ------------------
  516|  61.8k|      acceptor.acceptPtr(f);
  517|  1.18k|    acceptor.endRootSection();
  518|  1.18k|  }
  519|       |
  520|  1.18k|  {
  521|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Jobs);
  522|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::Jobs);
  523|  1.18k|    for (Callable *&f : jobQueue_)
  ------------------
  |  Branch (523:23): [True: 0, False: 1.18k]
  ------------------
  524|      0|      acceptor.acceptPtr(f);
  525|  1.18k|    acceptor.endRootSection();
  526|  1.18k|  }
  527|       |
  528|       |#ifdef MARK
  529|       |#error "Shouldn't have defined mark already"
  530|       |#endif
  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  532|  1.18k|  {
  533|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Prototypes);
  534|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::Prototypes);
  535|       |    // Prototypes.
  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  537|  1.18k|#include "hermes/VM/RuntimeHermesValueFields.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef RUNTIME_HV_FIELD_PROTOTYPE
  |  |    9|       |#define RUNTIME_HV_FIELD_PROTOTYPE(name)
  |  |   10|       |#endif
  |  |   11|       |
  |  |   12|  1.18k|#ifndef RUNTIME_HV_FIELD_INSTANCE
  |  |   13|  1.18k|#define RUNTIME_HV_FIELD_INSTANCE(name)
  |  |   14|  1.18k|#endif
  |  |   15|       |
  |  |   16|  1.18k|#ifndef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |   17|  1.18k|#define RUNTIME_HV_FIELD_RUNTIMEMODULE(name)
  |  |   18|  1.18k|#endif
  |  |   19|       |
  |  |   20|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(objectPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   21|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(errorConstructor)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   22|       |
  |  |   23|       |/// JSError.prototype, and prototype of all native error types.
  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |   25|  1.18k|#include "hermes/VM/NativeErrorTypes.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// If ALL_ERROR_TYPE is defined, it will #define both
  |  |  |  |    9|       |// NATIVE_ERROR_TYPE and AGGREGATE_ERROR_TYPE.
  |  |  |  |   10|       |
  |  |  |  |   11|  1.18k|#ifdef ALL_ERROR_TYPE
  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   13|  1.18k|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   14|       |#else
  |  |  |  |   15|       |#define ALL_ERROR_TYPE(name)
  |  |  |  |   16|       |#endif // ALL_ERROR_TYPE
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef NATIVE_ERROR_TYPE
  |  |  |  |   19|       |#define NATIVE_ERROR_TYPE(name)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|       |#ifndef AGGREGATE_ERROR_TYPE
  |  |  |  |   23|       |#define AGGREGATE_ERROR_TYPE(name)
  |  |  |  |   24|       |#endif
  |  |  |  |   25|       |
  |  |  |  |   26|       |// The Error object, and all native error objects defined in ES5.1 15.11.
  |  |  |  |   27|       |// Use ALL_ERROR_TYPE to include Error; use NATIVE_ERROR_TYPE to exclude Error.
  |  |  |  |   28|       |// We need the macros to avoid rewriting the same code for each of them.
  |  |  |  |   29|       |
  |  |  |  |   30|  1.18k|ALL_ERROR_TYPE(Error)
  |  |  |  |  ------------------
  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   31|  1.18k|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   13|  1.18k|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   32|  1.18k|NATIVE_ERROR_TYPE(EvalError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   33|  1.18k|NATIVE_ERROR_TYPE(RangeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   34|  1.18k|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   35|  1.18k|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|  1.18k|NATIVE_ERROR_TYPE(TypeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   37|  1.18k|NATIVE_ERROR_TYPE(URIError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   38|  1.18k|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   39|  1.18k|NATIVE_ERROR_TYPE(QuitError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|  1.18k|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   24|  1.18k|#define ALL_ERROR_TYPE(name) RUNTIME_HV_FIELD_PROTOTYPE(name##Prototype)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   40|       |
  |  |  |  |   41|  1.18k|#undef AGGREGATE_ERROR_TYPE
  |  |  |  |   42|  1.18k|#undef NATIVE_ERROR_TYPE
  |  |  |  |   43|  1.18k|#undef ALL_ERROR_TYPE
  |  |  ------------------
  |  |   26|  1.18k|#undef ALL_ERROR_TYPE
  |  |   27|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   28|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(functionConstructor)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   29|       |
  |  |   30|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   31|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(bigintPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   32|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(numberPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   33|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(booleanPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   34|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(symbolPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   35|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(datePrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   36|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   37|       |
  |  |   38|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayBufferPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   39|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(dataViewPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   40|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBasePrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   41|       |
  |  |   42|       |/// %TypedArray%.prototype and constructor for each typed array.
  |  |   43|  1.18k|#define TYPED_ARRAY(name, type)                    \
  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |   46|  1.18k|#include "hermes/VM/TypedArrays.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |    9|       |
  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |   12|       |#endif
  |  |  |  |   13|       |
  |  |  |  |   14|  1.18k|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|  1.18k|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|  1.18k|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|  1.18k|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|  1.18k|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|  1.18k|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|  1.18k|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|  1.18k|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|  1.18k|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|  1.18k|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|  1.18k|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|  1.18k|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |   44|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayPrototype) \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   45|  1.18k|  RUNTIME_HV_FIELD_PROTOTYPE(name##ArrayConstructor)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|  1.18k|#undef TYPED_ARRAY
  |  |  ------------------
  |  |   47|  1.18k|#undef TYPED_ARRAY
  |  |   48|       |
  |  |   49|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   50|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(setIteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   51|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   52|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(mapIteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   53|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakMapPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   54|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakSetPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   55|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(weakRefPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   56|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   57|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(typedArrayBaseConstructor)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   58|       |
  |  |   59|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastInput)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   60|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpLastRegExp)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   61|       |
  |  |   62|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(throwTypeErrorAccessor)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   63|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayClass)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   64|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpMatchClass)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   65|       |
  |  |   66|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(iteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   67|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayIteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   68|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(arrayPrototypeValues)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   69|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(asyncFunctionPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   70|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(stringIteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   71|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(regExpStringIteratorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   72|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   73|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(generatorFunctionPrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   74|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseIntFunction)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   75|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(parseFloatFunction)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   76|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(requireFunction)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   77|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(jsErrorStackAccessor)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   78|  1.18k|RUNTIME_HV_FIELD_PROTOTYPE(callSitePrototype)
  |  |  ------------------
  |  |  |  |  536|  1.18k|#define RUNTIME_HV_FIELD_PROTOTYPE(name) MARK(name);
  |  |  |  |  ------------------
  |  |  |  |  |  |  531|  1.18k|#define MARK(field) acceptor.accept((field), #field)
  |  |  |  |  ------------------
  |  |  ------------------
  |  |   79|       |
  |  |   80|       |// TODO: for Serialization/Deserialization  after global object initialization
  |  |   81|       |// we record specialCodeBlockDomain_ and create runtimemodule later need to
  |  |   82|       |// revisit this in stage 2
  |  |   83|  1.18k|RUNTIME_HV_FIELD_RUNTIMEMODULE(specialCodeBlockDomain_)
  |  |   84|       |
  |  |   85|  1.18k|RUNTIME_HV_FIELD_INSTANCE(global_)
  |  |   86|  1.18k|RUNTIME_HV_FIELD_INSTANCE(thrownValue_)
  |  |   87|  1.18k|RUNTIME_HV_FIELD_INSTANCE(keptObjects_)
  |  |   88|  1.18k|#ifdef HERMES_ENABLE_DEBUGGER
  |  |   89|  1.18k|RUNTIME_HV_FIELD_INSTANCE(debuggerInternalObject_)
  |  |   90|  1.18k|#endif // HERMES_ENABLE_DEBUGGER
  |  |   91|       |
  |  |   92|       |#ifdef HERMES_ENABLE_INTL
  |  |   93|       |// TODO T65916424: move these out of Runtime
  |  |   94|       |RUNTIME_HV_FIELD_INSTANCE(intlCollator)
  |  |   95|       |RUNTIME_HV_FIELD_PROTOTYPE(intlCollatorPrototype)
  |  |   96|       |RUNTIME_HV_FIELD_INSTANCE(intlDateTimeFormat)
  |  |   97|       |RUNTIME_HV_FIELD_PROTOTYPE(intlDateTimeFormatPrototype)
  |  |   98|       |RUNTIME_HV_FIELD_INSTANCE(intlNumberFormat)
  |  |   99|       |RUNTIME_HV_FIELD_PROTOTYPE(intlNumberFormatPrototype)
  |  |  100|       |#endif
  |  |  101|       |
  |  |  102|  1.18k|RUNTIME_HV_FIELD_INSTANCE(promiseRejectionTrackingHook_)
  |  |  103|       |
  |  |  104|  1.18k|#undef RUNTIME_HV_FIELD_PROTOTYPE
  |  |  105|  1.18k|#undef RUNTIME_HV_FIELD_INSTANCE
  |  |  106|  1.18k|#undef RUNTIME_HV_FIELD_RUNTIMEMODULE
  |  |  107|  1.18k|#undef RUNTIME_HV_FIELD
  ------------------
  538|  1.18k|#undef RUNTIME_HV_FIELD_PROTOTYPE
  539|  1.18k|    acceptor.acceptPtr(objectPrototypeRawPtr, "objectPrototype");
  540|  1.18k|    acceptor.acceptPtr(functionPrototypeRawPtr, "functionPrototype");
  541|  1.18k|#undef MARK
  542|  1.18k|    acceptor.endRootSection();
  543|  1.18k|  }
  544|       |
  545|  1.18k|  {
  546|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::IdentifierTable);
  547|  1.18k|    if (markLongLived) {
  ------------------
  |  Branch (547:9): [True: 888, False: 301]
  ------------------
  548|    888|#ifdef HERMES_MEMORY_INSTRUMENTATION
  549|       |      // Need to add nodes before the root section, and edges during the root
  550|       |      // section.
  551|    888|      acceptor.provideSnapshot([this](HeapSnapshot &snap) {
  552|    888|        identifierTable_.snapshotAddNodes(snap);
  553|    888|      });
  554|    888|#endif
  555|    888|      acceptor.beginRootSection(RootAcceptor::Section::IdentifierTable);
  556|    888|      identifierTable_.markIdentifiers(acceptor, getHeap());
  557|    888|#ifdef HERMES_MEMORY_INSTRUMENTATION
  558|    888|      acceptor.provideSnapshot([this](HeapSnapshot &snap) {
  559|    888|        identifierTable_.snapshotAddEdges(snap);
  560|    888|      });
  561|    888|#endif
  562|    888|      acceptor.endRootSection();
  563|    888|    }
  564|  1.18k|  }
  565|       |
  566|  1.18k|  {
  567|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::GCScopes);
  568|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::GCScopes);
  569|  1.18k|    markGCScopes(acceptor);
  570|  1.18k|    acceptor.endRootSection();
  571|  1.18k|  }
  572|       |
  573|  1.18k|  {
  574|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::SymbolRegistry);
  575|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::SymbolRegistry);
  576|  1.18k|    symbolRegistry_.markRoots(acceptor);
  577|  1.18k|    acceptor.endRootSection();
  578|  1.18k|  }
  579|  1.18k|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  580|  1.18k|  {
  581|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::SamplingProfiler);
  582|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::SamplingProfiler);
  583|  1.18k|    if (samplingProfiler) {
  ------------------
  |  Branch (583:9): [True: 0, False: 1.18k]
  ------------------
  584|      0|      samplingProfiler->markRoots(acceptor);
  585|      0|    }
  586|  1.18k|    acceptor.endRootSection();
  587|  1.18k|  }
  588|  1.18k|#endif
  589|       |
  590|  1.18k|  {
  591|  1.18k|    MarkRootsPhaseTimer timer(
  592|  1.18k|        *this, RootAcceptor::Section::CodeCoverageProfiler);
  593|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::CodeCoverageProfiler);
  594|  1.18k|    if (codeCoverageProfiler_) {
  ------------------
  |  Branch (594:9): [True: 1.18k, False: 0]
  ------------------
  595|  1.18k|      codeCoverageProfiler_->markRoots(acceptor);
  596|  1.18k|    }
  597|       |#ifdef HERMESVM_PROFILER_BB
  598|       |    auto *&hiddenClassArray = inlineCacheProfiler_.getHiddenClassArray();
  599|       |    if (hiddenClassArray) {
  600|       |      acceptor.acceptPtr(hiddenClassArray);
  601|       |    }
  602|       |#endif
  603|  1.18k|    acceptor.endRootSection();
  604|  1.18k|  }
  605|       |
  606|  1.18k|  {
  607|  1.18k|    MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::Custom);
  608|       |    // Define nodes before the root section starts.
  609|  1.18k|    for (auto &fn : customSnapshotNodeFuncs_) {
  ------------------
  |  Branch (609:19): [True: 1.18k, False: 1.18k]
  ------------------
  610|  1.18k|      acceptor.provideSnapshot(fn);
  611|  1.18k|    }
  612|  1.18k|    acceptor.beginRootSection(RootAcceptor::Section::Custom);
  613|  1.18k|    for (auto &fn : customMarkRootFuncs_)
  ------------------
  |  Branch (613:19): [True: 1.18k, False: 1.18k]
  ------------------
  614|  1.18k|      fn(&getHeap(), acceptor);
  615|       |    // Define edges while inside the root section.
  616|  1.18k|    for (auto &fn : customSnapshotEdgeFuncs_) {
  ------------------
  |  Branch (616:19): [True: 1.18k, False: 1.18k]
  ------------------
  617|  1.18k|      acceptor.provideSnapshot(fn);
  618|  1.18k|    }
  619|  1.18k|    acceptor.endRootSection();
  620|  1.18k|  }
  621|  1.18k|}
_ZN6hermes2vm7Runtime13markWeakRootsERNS0_16WeakRootAcceptorEb:
  623|  1.18k|void Runtime::markWeakRoots(WeakRootAcceptor &acceptor, bool markLongLived) {
  624|  1.18k|  MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::WeakRefs);
  625|  1.18k|  acceptor.beginRootSection(RootAcceptor::Section::WeakRefs);
  626|  1.18k|  if (markLongLived) {
  ------------------
  |  Branch (626:7): [True: 886, False: 301]
  ------------------
  627|    886|    for (auto &entry : fixedPropCache_) {
  ------------------
  |  Branch (627:22): [True: 886, False: 886]
  ------------------
  628|    886|      acceptor.acceptWeak(entry.clazz);
  629|    886|    }
  630|    886|    for (auto &rm : runtimeModuleList_)
  ------------------
  |  Branch (630:19): [True: 12.0k, False: 886]
  ------------------
  631|  12.0k|      rm.markLongLivedWeakRoots(acceptor);
  632|    886|  }
  633|  1.18k|  for (auto &rm : runtimeModuleList_)
  ------------------
  |  Branch (633:17): [True: 17.0k, False: 1.18k]
  ------------------
  634|  17.0k|    rm.markDomainRef(acceptor);
  635|  1.18k|  for (auto &fn : customMarkWeakRootFuncs_)
  ------------------
  |  Branch (635:17): [True: 1.18k, False: 1.18k]
  ------------------
  636|  1.18k|    fn(&getHeap(), acceptor);
  637|  1.18k|  acceptor.endRootSection();
  638|  1.18k|}
_ZN6hermes2vm7Runtime27markRootsForCompleteMarkingERNS0_28RootAndSlotAcceptorWithNamesE:
  641|    141|    RootAndSlotAcceptorWithNames &acceptor) {
  642|    141|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
  643|    141|  MarkRootsPhaseTimer timer(*this, RootAcceptor::Section::SamplingProfiler);
  644|    141|  acceptor.beginRootSection(RootAcceptor::Section::SamplingProfiler);
  645|    141|  if (samplingProfiler) {
  ------------------
  |  Branch (645:7): [True: 0, False: 141]
  ------------------
  646|      0|    samplingProfiler->markRootsForCompleteMarking(acceptor);
  647|      0|  }
  648|    141|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
  649|    141|  acceptor.endRootSection();
  650|    141|}
_ZN6hermes2vm7Runtime19removeRuntimeModuleEPNS0_13RuntimeModuleE:
  709|    928|void Runtime::removeRuntimeModule(RuntimeModule *rm) {
  710|    928|#ifdef HERMES_ENABLE_DEBUGGER
  711|    928|  debugger_.willUnloadModule(rm);
  712|    928|#endif
  713|    928|  runtimeModuleList_.remove(*rm);
  714|    928|}
_ZNK6hermes2vm7Runtime13getSymbolsEndEv:
  842|    286|unsigned Runtime::getSymbolsEnd() const {
  843|    286|  return identifierTable_.getSymbolsEnd();
  844|    286|}
_ZN6hermes2vm7Runtime13unmarkSymbolsEv:
  846|    143|void Runtime::unmarkSymbols() {
  847|    143|  identifierTable_.unmarkSymbols();
  848|    143|}
_ZN6hermes2vm7Runtime11freeSymbolsERKN4llvh9BitVectorE:
  850|    141|void Runtime::freeSymbols(const llvh::BitVector &markedSymbols) {
  851|    141|  identifierTable_.freeUnmarkedSymbols(markedSymbols, getHeap().getIDTracker());
  852|    141|}
_ZN6hermes2vm7Runtime12isSymbolLiveENS0_8SymbolIDE:
  855|  1.05M|bool Runtime::isSymbolLive(SymbolID id) {
  856|  1.05M|  return identifierTable_.isSymbolLive(id);
  857|  1.05M|}
_ZN6hermes2vm7Runtime18getStringForSymbolENS0_8SymbolIDE:
  859|  1.05M|const void *Runtime::getStringForSymbol(SymbolID id) {
  860|  1.05M|  return identifierTable_.getStringForSymbol(id);
  861|  1.05M|}
_ZN6hermes2vm7Runtime11runBytecodeEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefENS0_6HandleINS0_11EnvironmentEEENSB_INS0_11HermesValueEEE:
  955|    155|    Handle<> thisArg) {
  956|    155|  clearThrownValue();
  957|       |
  958|    155|  auto globalFunctionIndex = bytecode->getGlobalFunctionIndex();
  959|       |
  960|    155|  if (bytecode->getBytecodeOptions().staticBuiltins && !builtinsFrozen_) {
  ------------------
  |  Branch (960:7): [True: 0, False: 155]
  |  Branch (960:7): [True: 0, False: 155]
  |  Branch (960:56): [True: 0, False: 0]
  ------------------
  961|      0|    if (assertBuiltinsUnmodified() == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (961:9): [True: 0, False: 0]
  ------------------
  962|      0|      return ExecutionStatus::EXCEPTION;
  963|      0|    }
  964|      0|    freezeBuiltins();
  965|      0|    assert(builtinsFrozen_ && "Builtins must be frozen by now.");
  966|      0|  }
  967|       |
  968|    155|  if (bytecode->getBytecodeOptions().hasAsync && !hasES6Promise_) {
  ------------------
  |  Branch (968:7): [True: 0, False: 155]
  |  Branch (968:7): [True: 0, False: 155]
  |  Branch (968:50): [True: 0, False: 0]
  ------------------
  969|      0|    return raiseTypeError(
  970|      0|        "Cannot execute a bytecode having async functions when Promise is disabled.");
  971|      0|  }
  972|       |
  973|    155|  if (flags.persistent) {
  ------------------
  |  Branch (973:7): [True: 155, False: 0]
  ------------------
  974|    155|    persistentBCProviders_.push_back(bytecode);
  975|    155|    if (bytecodeWarmupPercent_ > 0) {
  ------------------
  |  Branch (975:9): [True: 0, False: 155]
  ------------------
  976|       |      // Start the warmup thread for this bytecode if it's a buffer.
  977|      0|      bytecode->startWarmup(bytecodeWarmupPercent_);
  978|      0|    }
  979|    155|    if (getVMExperimentFlags() & experiments::MAdviseRandom) {
  ------------------
  |  Branch (979:9): [True: 0, False: 155]
  ------------------
  980|      0|      bytecode->madvise(oscompat::MAdvice::Random);
  981|    155|    } else if (getVMExperimentFlags() & experiments::MAdviseSequential) {
  ------------------
  |  Branch (981:16): [True: 0, False: 155]
  ------------------
  982|      0|      bytecode->madvise(oscompat::MAdvice::Sequential);
  983|      0|    }
  984|    155|    if (getVMExperimentFlags() & experiments::VerifyBytecodeChecksum) {
  ------------------
  |  Branch (984:9): [True: 0, False: 155]
  ------------------
  985|      0|      llvh::ArrayRef<uint8_t> buf = bytecode->getRawBuffer();
  986|       |      // buf is empty for non-buffer providers
  987|      0|      if (!buf.empty()) {
  ------------------
  |  Branch (987:11): [True: 0, False: 0]
  ------------------
  988|      0|        if (!hbc::BCProviderFromBuffer::bytecodeHashIsValid(buf)) {
  ------------------
  |  Branch (988:13): [True: 0, False: 0]
  ------------------
  989|      0|          const char *msg = "Bytecode checksum verification failed";
  990|      0|          hermesLog("Hermes", "%s", msg);
  991|      0|          hermes_fatal(msg);
  992|      0|        }
  993|      0|      }
  994|      0|    }
  995|    155|  }
  996|       |  // Only track I/O for buffers > 64 kB (which excludes things like
  997|       |  // Runtime::generateSpecialRuntimeBytecode).
  998|    155|  if (flags.persistent && trackIO_ &&
  ------------------
  |  Branch (998:7): [True: 155, False: 0]
  |  Branch (998:7): [True: 0, False: 155]
  |  Branch (998:27): [True: 0, False: 155]
  ------------------
  999|    155|      bytecode->getRawBuffer().size() > MIN_IO_TRACKING_SIZE) {
  ------------------
  |  Branch (999:7): [True: 0, False: 0]
  ------------------
 1000|      0|    bytecode->startPageAccessTracker();
 1001|      0|    if (!bytecode->getPageAccessTracker()) {
  ------------------
  |  Branch (1001:9): [True: 0, False: 0]
  ------------------
 1002|      0|      hermesLog(
 1003|      0|          "Hermes",
 1004|      0|          "Failed to start bytecode I/O instrumentation, "
 1005|      0|          "maybe not supported on this platform.");
 1006|      0|    }
 1007|      0|  }
 1008|       |
 1009|    155|  GCScope scope(*this);
 1010|       |
 1011|    155|  Handle<Domain> domain = makeHandle(Domain::create(*this));
 1012|       |
 1013|    155|  auto runtimeModuleRes = RuntimeModule::create(
 1014|    155|      *this, domain, nextScriptId_++, std::move(bytecode), flags, sourceURL);
 1015|    155|  if (LLVM_UNLIKELY(runtimeModuleRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    155|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155]
  |  |  ------------------
  ------------------
 1016|      0|    return ExecutionStatus::EXCEPTION;
 1017|      0|  }
 1018|    155|  auto runtimeModule = *runtimeModuleRes;
 1019|    155|  auto globalCode = runtimeModule->getCodeBlockMayAllocate(globalFunctionIndex);
 1020|       |
 1021|    155|#ifdef HERMES_ENABLE_DEBUGGER
 1022|       |  // If the debugger is configured to pause on load, give it a chance to pause.
 1023|    155|  getDebugger().willExecuteModule(runtimeModule, globalCode);
 1024|    155|#endif
 1025|       |
 1026|    155|  if (runtimeModule->hasCJSModules()) {
  ------------------
  |  Branch (1026:7): [True: 0, False: 155]
  ------------------
 1027|      0|    auto requireContext = RequireContext::create(
 1028|      0|        *this, domain, getPredefinedStringHandle(Predefined::dotSlash));
 1029|      0|    return runRequireCall(
 1030|      0|        *this,
 1031|      0|        requireContext,
 1032|      0|        domain,
 1033|      0|        *domain->getCJSModuleOffset(*this, domain->getCJSEntryModuleID()));
 1034|    155|  } else if (runtimeModule->hasCJSModulesStatic()) {
  ------------------
  |  Branch (1034:14): [True: 0, False: 155]
  ------------------
 1035|      0|    return runRequireCall(
 1036|      0|        *this,
 1037|      0|        makeNullHandle<RequireContext>(),
 1038|      0|        domain,
 1039|      0|        *domain->getCJSModuleOffset(*this, domain->getCJSEntryModuleID()));
 1040|    155|  } else {
 1041|       |    // Create a JSFunction which will reference count the runtime module.
 1042|       |    // Note that its handle gets registered in the scope, so we don't need to
 1043|       |    // save it. Also note that environment will often be null here, except if
 1044|       |    // this is local eval.
 1045|    155|    auto func = JSFunction::create(
 1046|    155|        *this,
 1047|    155|        domain,
 1048|    155|        Handle<JSObject>::vmcast(&functionPrototype),
 1049|    155|        environment,
 1050|    155|        globalCode);
 1051|       |
 1052|    155|    ScopedNativeCallFrame newFrame{
 1053|    155|        *this,
 1054|    155|        0,
 1055|    155|        func.getHermesValue(),
 1056|    155|        HermesValue::encodeUndefinedValue(),
 1057|    155|        *thisArg};
 1058|    155|    if (LLVM_UNLIKELY(newFrame.overflowed()))
  ------------------
  |  |  189|    155|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155]
  |  |  ------------------
  ------------------
 1059|      0|      return raiseStackOverflow(StackOverflowKind::NativeStack);
 1060|    155|    return shouldRandomizeMemoryLayout_
  ------------------
  |  Branch (1060:12): [True: 0, False: 155]
  ------------------
 1061|    155|        ? interpretFunctionWithRandomStack(*this, globalCode)
 1062|    155|        : interpretFunction(globalCode);
 1063|    155|  }
 1064|    155|}
_ZN6hermes2vm7Runtime19runInternalBytecodeEv:
 1083|     99|Handle<JSObject> Runtime::runInternalBytecode() {
 1084|     99|  auto module = getInternalBytecode();
 1085|     99|  std::pair<std::unique_ptr<hbc::BCProvider>, std::string> bcResult =
 1086|     99|      hbc::BCProviderFromBuffer::createBCProviderFromBuffer(
 1087|     99|          std::make_unique<Buffer>(module.data(), module.size()));
 1088|     99|  if (LLVM_UNLIKELY(!bcResult.first)) {
  ------------------
  |  |  189|     99|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 99]
  |  |  ------------------
  ------------------
 1089|      0|    hermes_fatal((llvh::Twine("Error running internal bytecode: ") +
 1090|      0|                  bcResult.second.c_str())
 1091|      0|                     .str());
 1092|      0|  }
 1093|       |  // The bytes backing our buffer are immortal, so we can be persistent.
 1094|     99|  RuntimeModuleFlags flags;
 1095|     99|  flags.persistent = true;
 1096|     99|  flags.hidesEpilogue = true;
 1097|     99|  auto res = runBytecode(
 1098|     99|      std::move(bcResult.first),
 1099|     99|      flags,
 1100|     99|      /*sourceURL*/ "InternalBytecode.js",
 1101|     99|      makeNullHandle<Environment>());
 1102|       |  // It is a fatal error for the internal bytecode to throw an exception.
 1103|     99|  assert(
 1104|     99|      res != ExecutionStatus::EXCEPTION && "Internal bytecode threw exception");
 1105|      0|  assert(
 1106|     99|      res->isObject() &&
 1107|     99|      "Completion value of internal bytecode must be an object");
 1108|       |
 1109|      0|  return makeHandle<JSObject>(*res);
 1110|     99|}
_ZN6hermes2vm7Runtime9getGlobalEv:
 1184|  6.73k|Handle<JSObject> Runtime::getGlobal() {
 1185|  6.73k|  return Handle<JSObject>::vmcast(&global_);
 1186|  6.73k|}
_ZN6hermes2vm7Runtime22raiseTypeErrorForValueERKNS0_11TwineChar16ENS0_6HandleINS0_11HermesValueEEES4_:
 1292|      4|    const TwineChar16 &msg2) {
 1293|      4|  switch (value->getTag()) {
 1294|      4|    case HermesValue::Tag::Object:
  ------------------
  |  Branch (1294:5): [True: 4, False: 0]
  ------------------
 1295|      4|      return raiseTypeError(msg1 + "Object" + msg2);
 1296|      0|    case HermesValue::Tag::Str:
  ------------------
  |  Branch (1296:5): [True: 0, False: 4]
  ------------------
 1297|      0|      return raiseTypeError(
 1298|      0|          msg1 + "'" + vmcast<StringPrimitive>(*value) + "'" + msg2);
 1299|      0|    case HermesValue::Tag::BoolSymbol:
  ------------------
  |  Branch (1299:5): [True: 0, False: 4]
  ------------------
 1300|      0|      if (value->isBool()) {
  ------------------
  |  Branch (1300:11): [True: 0, False: 0]
  ------------------
 1301|      0|        if (value->getBool()) {
  ------------------
  |  Branch (1301:13): [True: 0, False: 0]
  ------------------
 1302|      0|          return raiseTypeError(msg1 + "true" + msg2);
 1303|      0|        } else {
 1304|      0|          return raiseTypeError(msg1 + "false" + msg2);
 1305|      0|        }
 1306|      0|      }
 1307|      0|      return raiseTypeError(
 1308|      0|          msg1 + "Symbol(" + getStringPrimFromSymbolID(value->getSymbol()) +
 1309|      0|          ")" + msg2);
 1310|      0|    case HermesValue::Tag::UndefinedNull:
  ------------------
  |  Branch (1310:5): [True: 0, False: 4]
  ------------------
 1311|      0|      if (value->isUndefined())
  ------------------
  |  Branch (1311:11): [True: 0, False: 0]
  ------------------
 1312|      0|        return raiseTypeError(msg1 + "undefined" + msg2);
 1313|      0|      else
 1314|      0|        return raiseTypeError(msg1 + "null" + msg2);
 1315|      0|    default:
  ------------------
  |  Branch (1315:5): [True: 0, False: 4]
  ------------------
 1316|      0|      if (value->isNumber()) {
  ------------------
  |  Branch (1316:11): [True: 0, False: 0]
  ------------------
 1317|      0|        char buf[hermes::NUMBER_TO_STRING_BUF_SIZE];
 1318|      0|        size_t len = hermes::numberToString(
 1319|      0|            value->getNumber(), buf, hermes::NUMBER_TO_STRING_BUF_SIZE);
 1320|      0|        return raiseTypeError(msg1 + llvh::StringRef{buf, len} + msg2);
 1321|      0|      }
 1322|      4|  }
 1323|      0|  return raiseTypeError(msg1 + "Value" + msg2);
 1324|      4|}
_ZN6hermes2vm7Runtime25raiseTypeErrorForCallableENS0_6HandleINS0_11HermesValueEEE:
 1326|      4|ExecutionStatus Runtime::raiseTypeErrorForCallable(Handle<> callable) {
 1327|      4|  if (CodeBlock *curCodeBlock = getCurrentFrame().getCalleeCodeBlock(*this)) {
  ------------------
  |  Branch (1327:18): [True: 4, False: 0]
  ------------------
 1328|      4|    if (OptValue<uint32_t> textifiedCalleeOffset =
  ------------------
  |  Branch (1328:28): [True: 4, False: 0]
  ------------------
 1329|      4|            curCodeBlock->getTextifiedCalleeOffset()) {
 1330|       |      // Look up the textified callee for the current IP in the debug
 1331|       |      // information. If one is available, use that in the error message.
 1332|      4|      OptValue<llvh::StringRef> tCallee =
 1333|      4|          curCodeBlock->getRuntimeModule()
 1334|      4|              ->getBytecode()
 1335|      4|              ->getDebugInfo()
 1336|      4|              ->getTextifiedCalleeUTF8(
 1337|      4|                  *textifiedCalleeOffset,
 1338|      4|                  curCodeBlock->getOffsetOf(getCurrentIP()));
 1339|      4|      if (tCallee.hasValue()) {
  ------------------
  |  Branch (1339:11): [True: 4, False: 0]
  ------------------
 1340|       |        // The textified callee is UTF8, so it may need to be converted to
 1341|       |        // UTF16.
 1342|      4|        if (isAllASCII(tCallee->begin(), tCallee->end())) {
  ------------------
  |  Branch (1342:13): [True: 0, False: 4]
  ------------------
 1343|       |          // All ASCII means no conversion is needed.
 1344|      0|          return raiseTypeErrorForValue(
 1345|      0|              TwineChar16(*tCallee) + " is not a function (it is ",
 1346|      0|              callable,
 1347|      0|              ")");
 1348|      0|        }
 1349|       |
 1350|       |        // Convert UTF8 to UTF16 before creating the Error.
 1351|      4|        llvh::SmallVector<char16_t, 16> tCalleeUTF16;
 1352|      4|        convertUTF8WithSurrogatesToUTF16(
 1353|      4|            std::back_inserter(tCalleeUTF16), tCallee->begin(), tCallee->end());
 1354|      4|        return raiseTypeErrorForValue(
 1355|      4|            TwineChar16(tCalleeUTF16) + " is not a function (it is ",
 1356|      4|            callable,
 1357|      4|            ")");
 1358|      4|      }
 1359|      4|    }
 1360|      4|  }
 1361|       |
 1362|      0|  return raiseTypeErrorForValue(callable, " is not a function");
 1363|      4|}
_ZN6hermes2vm7Runtime14raiseTypeErrorERKNS0_11TwineChar16E:
 1365|      4|ExecutionStatus Runtime::raiseTypeError(const TwineChar16 &msg) {
 1366|      4|  return raisePlaceholder(
 1367|      4|      *this, Handle<JSObject>::vmcast(&TypeErrorPrototype), msg);
 1368|      4|}
_ZN6hermes2vm7Runtime19raiseReferenceErrorERKNS0_11TwineChar16E:
 1380|     20|ExecutionStatus Runtime::raiseReferenceError(const TwineChar16 &msg) {
 1381|     20|  return raisePlaceholder(
 1382|     20|      *this, Handle<JSObject>::vmcast(&ReferenceErrorPrototype), msg);
 1383|     20|}
_ZN6hermes2vm7Runtime19insertVisitedObjectEPNS0_8JSObjectE:
 1440|    153|bool Runtime::insertVisitedObject(JSObject *obj) {
 1441|    153|  if (llvh::find(stringCycleCheckVisited_, obj) !=
  ------------------
  |  Branch (1441:7): [True: 0, False: 153]
  ------------------
 1442|    153|      stringCycleCheckVisited_.end())
 1443|      0|    return true;
 1444|    153|  stringCycleCheckVisited_.push_back(obj);
 1445|    153|  return false;
 1446|    153|}
_ZN6hermes2vm7Runtime19removeVisitedObjectEPNS0_8JSObjectE:
 1448|    153|void Runtime::removeVisitedObject(JSObject *obj) {
 1449|    153|  (void)obj;
 1450|    153|  assert(
 1451|    153|      stringCycleCheckVisited_.back() == obj && "string cycle stack corrupted");
 1452|      0|  stringCycleCheckVisited_.pop_back();
 1453|    153|}
_ZN6hermes2vm7Runtime30generateSpecialRuntimeBytecodeEv:
 1455|     99|std::unique_ptr<Buffer> Runtime::generateSpecialRuntimeBytecode() {
 1456|     99|  hbc::SimpleBytecodeBuilder builder;
 1457|     99|  {
 1458|     99|    hbc::BytecodeInstructionGenerator bcGen;
 1459|     99|    bcGen.emitLoadConstUndefined(0);
 1460|     99|    bcGen.emitRet(0);
 1461|     99|    builder.addFunction(1, 1, bcGen.acquireBytecode());
 1462|     99|  }
 1463|     99|  {
 1464|     99|    hbc::BytecodeInstructionGenerator bcGen;
 1465|     99|    bcGen.emitGetGlobalObject(0);
 1466|     99|    bcGen.emitRet(0);
 1467|     99|    builder.addFunction(1, 1, bcGen.acquireBytecode());
 1468|     99|  }
 1469|     99|  auto buffer = builder.generateBytecodeBuffer();
 1470|     99|  assert(buffer->size() < MIN_IO_TRACKING_SIZE);
 1471|      0|  return buffer;
 1472|     99|}
_ZN6hermes2vm7Runtime21initPredefinedStringsEv:
 1474|     99|void Runtime::initPredefinedStrings() {
 1475|     99|  assert(!getTopGCScope() && "There shouldn't be any handles allocated yet");
 1476|       |
 1477|      0|  auto buffer = predefStringAndSymbolChars;
 1478|     99|  auto propLengths = predefPropertyLengths;
 1479|     99|  auto strLengths = predefStringLengths;
 1480|     99|  auto symLengths = predefSymbolLengths;
 1481|       |
 1482|     99|  static const uint32_t hashes[] = {
 1483|     99|#define STR(name, string) constexprHashString(string),
 1484|     99|#include "hermes/VM/PredefinedStrings.def"
  ------------------
  |  |    1|       |/*
  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |    3|       | *
  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |    6|       | */
  |  |    7|       |
  |  |    8|       |#ifndef STR
  |  |    9|       |#define STR(name, string)
  |  |   10|       |#endif
  |  |   11|       |
  |  |   12|       |/// List of predefined strings.
  |  |   13|       |/// Use STR(name, string) to define new ones.
  |  |   14|       |/// Access is done via Predefined::name after instantiation.
  |  |   15|       |
  |  |   16|     99|STR(emptyString, "")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   17|     99|STR(comma, ",")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   18|     99|STR(space, " ")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   19|     99|STR(anonymous, "anonymous")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   20|       |
  |  |   21|     99|STR(undefined, "undefined")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   22|     99|STR(null, "null")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   23|     99|STR(number, "number")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   24|     99|STR(bigint, "bigint")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   25|     99|STR(string, "string")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   26|     99|STR(defaultStr, "default")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   27|     99|STR(boolean, "boolean")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   28|     99|STR(symbol, "symbol")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   29|     99|STR(object, "object")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   30|     99|STR(function, "function")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   31|     99|STR(toString, "toString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   32|     99|STR(description, "description")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   33|     99|STR(toLocaleString, "toLocaleString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   34|     99|STR(hasOwnProperty, "hasOwnProperty")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   35|     99|STR(hasOwn, "hasOwn")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   36|     99|STR(isPrototypeOf, "isPrototypeOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   37|     99|STR(propertyIsEnumerable, "propertyIsEnumerable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   38|     99|STR(valueOf, "valueOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   39|     99|STR(trueStr, "true")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   40|     99|STR(falseStr, "false")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   41|     99|STR(NaN, "NaN")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   42|     99|STR(zero, "0")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   43|     99|STR(Infinity, "Infinity")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   44|     99|STR(PositiveInfinity, "+Infinity")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   45|     99|STR(NegativeInfinity, "-Infinity")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   46|     99|STR(print, "print")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   47|     99|STR(eval, "eval")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   48|     99|STR(quit, "quit")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   49|     99|STR(parseInt, "parseInt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   50|     99|STR(parseFloat, "parseFloat")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   51|     99|STR(isNaN, "isNaN")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   52|     99|STR(isFinite, "isFinite")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   53|     99|STR(escape, "escape")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   54|     99|STR(unescape, "unescape")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   55|     99|STR(decodeURI, "decodeURI")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   56|     99|STR(decodeURIComponent, "decodeURIComponent")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   57|     99|STR(encodeURI, "encodeURI")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   58|     99|STR(encodeURIComponent, "encodeURIComponent")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   59|     99|STR(prototype, "prototype")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   60|     99|STR(constructor, "constructor")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   61|     99|STR(Object, "Object")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   62|     99|STR(value, "value")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   63|     99|STR(writable, "writable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   64|     99|STR(enumerable, "enumerable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   65|     99|STR(configurable, "configurable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   66|     99|STR(get, "get")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   67|     99|STR(set, "set")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   68|     99|STR(getPrototypeOf, "getPrototypeOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   69|     99|STR(setPrototypeOf, "setPrototypeOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   70|     99|STR(getOwnPropertyDescriptor, "getOwnPropertyDescriptor")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   71|     99|STR(getOwnPropertyDescriptors, "getOwnPropertyDescriptors")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   72|     99|STR(getOwnPropertyNames, "getOwnPropertyNames")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   73|     99|STR(getOwnPropertySymbols, "getOwnPropertySymbols")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   74|     99|STR(seal, "seal")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   75|     99|STR(freeze, "freeze")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   76|     99|STR(fromEntries, "fromEntries")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   77|     99|STR(create, "create")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   78|     99|STR(defineProperty, "defineProperty")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   79|     99|STR(defineProperties, "defineProperties")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   80|     99|STR(preventExtensions, "preventExtensions")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   81|     99|STR(is, "is")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   82|     99|STR(isSealed, "isSealed")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   83|     99|STR(isFrozen, "isFrozen")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   84|     99|STR(isExtensible, "isExtensible")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   85|     99|STR(keys, "keys")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   86|     99|STR(length, "length")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   87|     99|STR(underscore_proto, "__proto__")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   88|     99|STR(__defineGetter__, "__defineGetter__")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   89|     99|STR(__defineSetter__, "__defineSetter__")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   90|     99|STR(__lookupGetter__, "__lookupGetter__")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   91|     99|STR(__lookupSetter__, "__lookupSetter__")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   92|     99|STR(assign, "assign")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   93|     99|STR(raw, "raw")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   94|     99|STR(globalThis, "globalThis")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   95|       |
  |  |   96|     99|STR(BigInt, "BigInt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   97|     99|STR(asIntN, "asIntN")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   98|     99|STR(asUintN, "asUintN")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |   99|       |
  |  |  100|     99|STR(String, "String")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  101|     99|STR(fromCharCode, "fromCharCode")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  102|     99|STR(fromCodePoint, "fromCodePoint")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  103|     99|STR(charAt, "charAt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  104|     99|STR(charCodeAt, "charCodeAt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  105|     99|STR(codePointAt, "codePointAt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  106|     99|STR(concat, "concat")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  107|     99|STR(endsWith, "endsWith")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  108|     99|STR(slice, "slice")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  109|     99|STR(startsWith, "startsWith")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  110|     99|STR(substring, "substring")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  111|     99|STR(toLowerCase, "toLowerCase")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  112|     99|STR(toLocaleLowerCase, "toLocaleLowerCase")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  113|     99|STR(toUpperCase, "toUpperCase")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  114|     99|STR(toLocaleUpperCase, "toLocaleUpperCase")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  115|     99|STR(substr, "substr")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  116|     99|STR(trim, "trim")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  117|     99|STR(trimLeft, "trimLeft")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  118|     99|STR(trimRight, "trimRight")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  119|     99|STR(indexOf, "indexOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  120|     99|STR(lastIndexOf, "lastIndexOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  121|     99|STR(localeCompare, "localeCompare")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  122|     99|STR(match, "match")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  123|     99|STR(matchAll, "matchAll")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  124|     99|STR(normalize, "normalize")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  125|     99|STR(padEnd, "padEnd")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  126|     99|STR(padStart, "padStart")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  127|     99|STR(repeat, "repeat")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  128|     99|STR(replace, "replace")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  129|     99|STR(replaceAll, "replaceAll")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  130|     99|STR(search, "search")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  131|     99|STR(split, "split")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  132|     99|STR(trimStart, "trimStart")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  133|     99|STR(trimEnd, "trimEnd")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  134|       |
  |  |  135|     99|STR(Function, "Function")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  136|     99|STR(callee, "callee")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  137|     99|STR(caller, "caller")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  138|     99|STR(arguments, "arguments")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  139|     99|STR(call, "call")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  140|     99|STR(apply, "apply")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  141|     99|STR(bind, "bind")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  142|     99|STR(gc, "gc")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  143|       |
  |  |  144|     99|STR(name, "name")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  145|     99|STR(displayName, "displayName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  146|     99|STR(message, "message")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  147|     99|STR(cause, "cause")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  148|     99|STR(stack, "stack")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  149|     99|STR(stacktraceTooLong, "Stacktrace too long")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  150|     99|STR(captureStackTrace, "captureStackTrace")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  151|     99|STR(prepareStackTrace, "prepareStackTrace")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  153|     99|#include "hermes/VM/NativeErrorTypes.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// If ALL_ERROR_TYPE is defined, it will #define both
  |  |  |  |    9|       |// NATIVE_ERROR_TYPE and AGGREGATE_ERROR_TYPE.
  |  |  |  |   10|       |
  |  |  |  |   11|     99|#ifdef ALL_ERROR_TYPE
  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   13|     99|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |   14|       |#else
  |  |  |  |   15|       |#define ALL_ERROR_TYPE(name)
  |  |  |  |   16|       |#endif // ALL_ERROR_TYPE
  |  |  |  |   17|       |
  |  |  |  |   18|       |#ifndef NATIVE_ERROR_TYPE
  |  |  |  |   19|       |#define NATIVE_ERROR_TYPE(name)
  |  |  |  |   20|       |#endif
  |  |  |  |   21|       |
  |  |  |  |   22|       |#ifndef AGGREGATE_ERROR_TYPE
  |  |  |  |   23|       |#define AGGREGATE_ERROR_TYPE(name)
  |  |  |  |   24|       |#endif
  |  |  |  |   25|       |
  |  |  |  |   26|       |// The Error object, and all native error objects defined in ES5.1 15.11.
  |  |  |  |   27|       |// Use ALL_ERROR_TYPE to include Error; use NATIVE_ERROR_TYPE to exclude Error.
  |  |  |  |   28|       |// We need the macros to avoid rewriting the same code for each of them.
  |  |  |  |   29|       |
  |  |  |  |   30|     99|ALL_ERROR_TYPE(Error)
  |  |  |  |  ------------------
  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   31|     99|AGGREGATE_ERROR_TYPE(AggregateError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   13|     99|#define AGGREGATE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   32|     99|NATIVE_ERROR_TYPE(EvalError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   33|     99|NATIVE_ERROR_TYPE(RangeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   34|     99|NATIVE_ERROR_TYPE(ReferenceError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   35|     99|NATIVE_ERROR_TYPE(SyntaxError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   36|     99|NATIVE_ERROR_TYPE(TypeError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   37|     99|NATIVE_ERROR_TYPE(URIError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   38|     99|NATIVE_ERROR_TYPE(TimeoutError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   39|     99|NATIVE_ERROR_TYPE(QuitError)
  |  |  |  |  ------------------
  |  |  |  |  |  |   12|     99|#define NATIVE_ERROR_TYPE(name) ALL_ERROR_TYPE(name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  152|     99|#define ALL_ERROR_TYPE(name) STR(name, "" #name)
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   40|       |
  |  |  |  |   41|     99|#undef AGGREGATE_ERROR_TYPE
  |  |  |  |   42|     99|#undef NATIVE_ERROR_TYPE
  |  |  |  |   43|     99|#undef ALL_ERROR_TYPE
  |  |  ------------------
  |  |  154|       |
  |  |  155|     99|STR(errors, "errors")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  156|     99|STR(CallSite, "CallSite")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  157|     99|STR(getColumnNumber, "getColumnNumber")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  158|     99|STR(getBytecodeAddress, "getBytecodeAddress")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  159|     99|STR(getEvalOrigin, "getEvalOrigin")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  160|     99|STR(getFileName, "getFileName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  161|     99|STR(getFunction, "getFunction")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  162|     99|STR(getFunctionName, "getFunctionName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  163|     99|STR(getLineNumber, "getLineNumber")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  164|     99|STR(getMethodName, "getMethodName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  165|     99|STR(getPromiseIndex, "getPromiseIndex")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  166|     99|STR(getThis, "getThis")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  167|     99|STR(getTypeName, "getTypeName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  168|     99|STR(isAsync, "isAsync")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  169|     99|STR(isConstructor, "isConstructor")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  170|     99|STR(isEval, "isEval")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  171|     99|STR(isPromiseAll, "isPromiseAll")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  172|     99|STR(isToplevel, "isToplevel")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  173|       |
  |  |  174|     99|STR(Array, "Array")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  175|     99|STR(ArrayIterator, "Array Iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  176|     99|STR(isArray, "isArray")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  177|     99|STR(at, "at")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  178|     99|STR(join, "join")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  179|     99|STR(push, "push")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  180|     99|STR(pop, "pop")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  181|     99|STR(reverse, "reverse")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  182|     99|STR(shift, "shift")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  183|     99|STR(sort, "sort")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  184|     99|STR(splice, "splice")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  185|     99|STR(unshift, "unshift")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  186|     99|STR(every, "every")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  187|     99|STR(some, "some")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  188|     99|STR(forEach, "forEach")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  189|     99|STR(map, "map")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  190|     99|STR(filter, "filter")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  191|     99|STR(reduce, "reduce")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  192|     99|STR(reduceRight, "reduceRight")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  193|     99|STR(find, "find")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  194|     99|STR(findIndex, "findIndex")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  195|     99|STR(findLast, "findLast")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  196|     99|STR(findLastIndex, "findLastIndex")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  197|     99|STR(includes, "includes")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  198|     99|STR(subarray, "subarray")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  199|     99|STR(flat, "flat")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  200|     99|STR(flatMap, "flatMap")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  201|       |
  |  |  202|     99|STR(ArrayBuffer, "ArrayBuffer")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  203|     99|STR(byteLength, "byteLength")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  204|     99|STR(isView, "isView")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  205|     99|STR(buffer, "buffer")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  206|     99|STR(byteOffset, "byteOffset")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  207|     99|STR(copyWithin, "copyWithin")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  208|     99|STR(entries, "entries")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  209|       |
  |  |  210|     99|STR(TypedArray, "TypedArray")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  211|     99|STR(BYTES_PER_ELEMENT, "BYTES_PER_ELEMENT")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  212|     99|STR(from, "from")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  213|     99|STR(of, "of")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  215|     99|#include "hermes/VM/TypedArrays.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |    9|       |
  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |   12|       |#endif
  |  |  |  |   13|       |
  |  |  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|     99|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|     99|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   20|       |#else
  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|       |#endif
  |  |  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  214|     99|#define TYPED_ARRAY(name, type) STR(name##Array, "" #name "Array")
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|     99|#undef TYPED_ARRAY
  |  |  ------------------
  |  |  216|       |
  |  |  217|     99|STR(DataView, "DataView")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  218|     99|#define TYPED_ARRAY(name, type) \
  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  221|     99|#define TYPED_ARRAY_NO_CLAMP
  |  |  222|     99|#include "hermes/VM/TypedArrays.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |    9|       |
  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |   12|       |#endif
  |  |  |  |   13|       |
  |  |  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   18|       |#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   19|       |TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |   20|       |#else
  |  |  |  |   21|     99|#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |   22|     99|#endif
  |  |  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  ------------------
  |  |  |  |  |  |  219|     99|  STR(get##name, "get" #name)   \
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  220|     99|  STR(set##name, "set" #name)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   29|       |
  |  |  |  |   30|     99|#undef TYPED_ARRAY
  |  |  ------------------
  |  |  223|     99|STR(fill, "fill")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  224|       |
  |  |  225|     99|STR(Set, "Set")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  226|     99|STR(SetIterator, "Set Iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  227|     99|STR(Map, "Map")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  228|     99|STR(MapIterator, "Map Iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  229|     99|STR(add, "add")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  230|     99|STR(clear, "clear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  231|     99|STR(deleteStr, "delete")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  232|     99|STR(has, "has")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  233|     99|STR(size, "size")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  234|     99|STR(values, "values")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  235|     99|STR(next, "next")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  236|     99|STR(done, "done")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  237|     99|STR(returnStr, "return")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  238|       |
  |  |  239|     99|STR(Number, "Number")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  240|     99|STR(MAX_VALUE, "MAX_VALUE")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  241|     99|STR(MIN_VALUE, "MIN_VALUE")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  242|     99|STR(NEGATIVE_INFINITY, "NEGATIVE_INFINITY")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  243|     99|STR(POSITIVE_INFINITY, "POSITIVE_INFINITY")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  244|     99|STR(EPSILON, "EPSILON")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  245|     99|STR(MAX_SAFE_INTEGER, "MAX_SAFE_INTEGER")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  246|     99|STR(MIN_SAFE_INTEGER, "MIN_SAFE_INTEGER")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  247|     99|STR(toFixed, "toFixed")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  248|     99|STR(toExponential, "toExponential")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  249|     99|STR(toPrecision, "toPrecision")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  250|     99|STR(isInteger, "isInteger")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  251|     99|STR(isSafeInteger, "isSafeInteger")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  252|       |
  |  |  253|     99|STR(Boolean, "Boolean")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  254|       |
  |  |  255|     99|STR(StringIterator, "String Iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  256|     99|STR(RegExpStringIterator, "RegExp String Iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  257|       |
  |  |  258|     99|STR(Date, "Date")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  259|     99|STR(UTC, "UTC")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  260|     99|STR(parse, "parse")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  261|     99|STR(now, "now")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  262|     99|STR(toISOString, "toISOString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  263|     99|STR(toUTCString, "toUTCString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  264|     99|STR(toGMTString, "toGMTString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  265|     99|STR(toLocaleDateString, "toLocaleDateString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  266|     99|STR(toLocaleTimeString, "toLocaleTimeString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  267|     99|STR(toJSON, "toJSON")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  268|     99|STR(getTime, "getTime")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  269|     99|STR(getFullYear, "getFullYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  270|     99|STR(getYear, "getYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  271|     99|STR(getMonth, "getMonth")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  272|     99|STR(getDate, "getDate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  273|     99|STR(getDay, "getDay")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  274|     99|STR(getHours, "getHours")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  275|     99|STR(getMinutes, "getMinutes")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  276|     99|STR(getSeconds, "getSeconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  277|     99|STR(getMilliseconds, "getMilliseconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  278|     99|STR(getUTCFullYear, "getUTCFullYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  279|     99|STR(getUTCMonth, "getUTCMonth")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  280|     99|STR(getUTCDate, "getUTCDate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  281|     99|STR(getUTCDay, "getUTCDay")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  282|     99|STR(getUTCHours, "getUTCHours")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  283|     99|STR(getUTCMinutes, "getUTCMinutes")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  284|     99|STR(getUTCSeconds, "getUTCSeconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  285|     99|STR(getUTCMilliseconds, "getUTCMilliseconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  286|     99|STR(getTimezoneOffset, "getTimezoneOffset")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  287|     99|STR(setTime, "setTime")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  288|     99|STR(setFullYear, "setFullYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  289|     99|STR(setYear, "setYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  290|     99|STR(setMonth, "setMonth")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  291|     99|STR(setDate, "setDate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  292|     99|STR(setHours, "setHours")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  293|     99|STR(setMinutes, "setMinutes")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  294|     99|STR(setSeconds, "setSeconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  295|     99|STR(setMilliseconds, "setMilliseconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  296|     99|STR(setUTCFullYear, "setUTCFullYear")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  297|     99|STR(setUTCMonth, "setUTCMonth")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  298|     99|STR(setUTCDate, "setUTCDate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  299|     99|STR(setUTCHours, "setUTCHours")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  300|     99|STR(setUTCMinutes, "setUTCMinutes")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  301|     99|STR(setUTCSeconds, "setUTCSeconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  302|     99|STR(setUTCMilliseconds, "setUTCMilliseconds")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  303|     99|STR(toDateString, "toDateString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  304|     99|STR(toTimeString, "toTimeString")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  305|     99|STR(InvalidDate, "Invalid Date")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  306|       |
  |  |  307|     99|STR(RegExp, "RegExp")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  308|     99|STR(exec, "exec")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  309|     99|STR(test, "test")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  310|     99|STR(index, "index")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  311|     99|STR(input, "input")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  312|     99|STR(flags, "flags")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  313|     99|STR(source, "source")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  314|     99|STR(global, "global")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  315|     99|STR(groups, "groups")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  316|     99|STR(ignoreCase, "ignoreCase")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  317|     99|STR(multiline, "multiline")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  318|     99|STR(unicode, "unicode")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  319|     99|STR(sticky, "sticky")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  320|     99|STR(dotAll, "dotAll")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  321|     99|STR(lastIndex, "lastIndex")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  322|     99|STR(dollar1, "$1")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  323|     99|STR(dollar2, "$2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  324|     99|STR(dollar3, "$3")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  325|     99|STR(dollar4, "$4")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  326|     99|STR(dollar5, "$5")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  327|     99|STR(dollar6, "$6")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  328|     99|STR(dollar7, "$7")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  329|     99|STR(dollar8, "$8")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  330|     99|STR(dollar9, "$9")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  331|     99|STR(dollarBacktick, "$`")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  332|     99|STR(leftContext, "leftContext")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  333|     99|STR(dollarApostrophe, "$'")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  334|     99|STR(rightContext, "rightContext")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  335|     99|STR(dollarUnderscore, "$_")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  336|     99|STR(dollarAmpersand, "$&")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  337|     99|STR(lastMatch, "lastMatch")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  338|     99|STR(dollarPlus, "$+")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  339|     99|STR(lastParen, "lastParen")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  340|       |
  |  |  341|     99|STR(Math, "Math")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  342|       |// Math property names, per ES5.1 15.8.1
  |  |  343|     99|STR(E, "E")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  344|     99|STR(LN10, "LN10")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  345|     99|STR(LN2, "LN2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  346|     99|STR(LOG2E, "LOG2E")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  347|     99|STR(LOG10E, "LOG10E")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  348|     99|STR(PI, "PI")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  349|     99|STR(SQRT1_2, "SQRT1_2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  350|     99|STR(SQRT2, "SQRT2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  351|     99|STR(abs, "abs")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  352|     99|STR(acos, "acos")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  353|     99|STR(acosh, "acosh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  354|     99|STR(asin, "asin")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  355|     99|STR(asinh, "asinh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  356|     99|STR(atan, "atan")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  357|     99|STR(atanh, "atanh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  358|     99|STR(atan2, "atan2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  359|     99|STR(cbrt, "cbrt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  360|     99|STR(ceil, "ceil")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  361|     99|STR(clz32, "clz32")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  362|     99|STR(cos, "cos")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  363|     99|STR(cosh, "cosh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  364|     99|STR(exp, "exp")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  365|     99|STR(expm1, "expm1")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  366|     99|STR(floor, "floor")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  367|     99|STR(hypot, "hypot")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  368|     99|STR(log, "log")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  369|     99|STR(log10, "log10")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  370|     99|STR(log1p, "log1p")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  371|     99|STR(log2, "log2")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  372|     99|STR(trunc, "trunc")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  373|     99|STR(fround, "fround")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  374|     99|STR(max, "max")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  375|     99|STR(min, "min")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  376|     99|STR(imul, "imul")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  377|     99|STR(pow, "pow")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  378|     99|STR(random, "random")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  379|     99|STR(round, "round")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  380|     99|STR(sign, "sign")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  381|     99|STR(sin, "sin")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  382|     99|STR(sinh, "sinh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  383|     99|STR(sqrt, "sqrt")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  384|     99|STR(tan, "tan")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  385|     99|STR(tanh, "tanh")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  386|       |
  |  |  387|     99|STR(JSON, "JSON")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  388|     99|STR(stringify, "stringify")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  389|       |
  |  |  390|     99|STR(WeakMap, "WeakMap")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  391|     99|STR(WeakSet, "WeakSet")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  392|       |
  |  |  393|     99|STR(WeakRef, "WeakRef")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  394|     99|STR(deref, "deref")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  395|       |
  |  |  396|     99|STR(Symbol, "Symbol")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  397|     99|STR(predefinedFor, "for")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  398|     99|STR(keyFor, "keyFor")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  399|     99|STR(hasInstance, "hasInstance")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  400|     99|STR(isConcatSpreadable, "isConcatSpreadable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  401|     99|STR(iterator, "iterator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  402|     99|STR(toPrimitive, "toPrimitive")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  403|     99|STR(toStringTag, "toStringTag")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  404|       |
  |  |  405|     99|STR(Generator, "Generator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  406|     99|STR(throwStr, "throw")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  407|       |
  |  |  408|     99|STR(GeneratorFunction, "GeneratorFunction")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  409|     99|STR(AsyncFunction, "AsyncFunction")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  410|       |
  |  |  411|     99|STR(Proxy, "Proxy")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  412|     99|STR(Reflect, "Reflect")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  413|     99|STR(construct, "construct")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  414|     99|STR(deleteProperty, "deleteProperty")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  415|     99|STR(ownKeys, "ownKeys")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  416|     99|STR(proxy, "proxy")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  417|     99|STR(proxyTrap, "proxy trap")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  418|     99|STR(revocable, "revocable")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  419|     99|STR(revoke, "revoke")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  420|       |
  |  |  421|     99|STR(HermesInternal, "HermesInternal")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  422|     99|STR(detachArrayBuffer, "detachArrayBuffer")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  423|     99|STR(createHeapSnapshot, "createHeapSnapshot")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  424|     99|STR(hasPromise, "hasPromise")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  425|     99|STR(useEngineQueue, "useEngineQueue")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  426|     99|STR(enqueueJob, "enqueueJob")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  427|     99|STR(drainJobs, "drainJobs")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  428|     99|STR(getEpilogues, "getEpilogues")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  429|     99|STR(getWeakSize, "getWeakSize")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  430|     99|STR(silentSetPrototypeOf, "silentSetPrototypeOf")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  431|     99|STR(getInstrumentedStats, "getInstrumentedStats")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  432|     99|STR(getRuntimeProperties, "getRuntimeProperties")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  433|     99|STR(ttiReached, "ttiReached")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  434|     99|STR(ttrcReached, "ttrcReached")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  435|     99|STR(returnThis, "return this")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  436|     99|STR(getTemplateObject, "getTemplateObject")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  437|     99|STR(ensureObject, "ensureObject")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  438|     99|STR(getMethod, "getMethod")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  439|     99|STR(throwTypeError, "throwTypeError")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  440|     99|STR(generatorSetDelegated, "generatorSetDelegated")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  441|     99|STR(copyDataProperties, "copyDataProperties")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  442|     99|STR(copyRestArgs, "copyRestArgs")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  443|     99|STR(arraySpread, "arraySpread")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  444|     99|STR(exportAll, "exportAll")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  445|     99|STR(exponentiationOperator, "exponentiationOperator")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  446|     99|STR(initRegexNamedGroups, "initRegexNamedGroups")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  447|     99|STR(getFunctionLocation, "getFunctionLocation")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  448|     99|STR(isNative, "isNative")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  449|     99|STR(lineNumber, "lineNumber")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  450|     99|STR(columnNumber, "columnNumber")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  451|     99|STR(segmentID, "segmentID")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  452|     99|STR(virtualOffset, "virtualOffset")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  453|     99|STR(fileName, "fileName")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  454|     99|STR(setPromiseRejectionTrackingHook, "setPromiseRejectionTrackingHook")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  455|     99|STR(enablePromiseRejectionTracker, "enablePromiseRejectionTracker")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  456|     99|STR(spawnAsync, "spawnAsync") /* NOLINT */
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  457|       |
  |  |  458|     99|STR(require, "require")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  459|     99|STR(requireFast, "requireFast")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  460|     99|STR(context, "context")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  461|     99|STR(exports, "exports")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  462|     99|STR(dotSlash, "./")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  463|     99|STR(defaultExport, "?default")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  464|       |
  |  |  465|     99|STR(squareObjectUndefined, "[object Undefined]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  466|     99|STR(squareObjectNull, "[object Null]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  467|     99|STR(squareObjectGlobal, "[object global]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  468|     99|STR(squareSymbolHasInstance, "[Symbol.hasInstance]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  469|     99|STR(squareSymbolIterator, "[Symbol.iterator]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  470|     99|STR(squareSymbolToPrimitive, "[Symbol.toPrimitive]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  471|     99|STR(squareSymbolToStringTag, "[Symbol.toStringTag]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  472|     99|STR(squareSymbolMatch, "[Symbol.match]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  473|     99|STR(squareSymbolMatchAll, "[Symbol.matchAll]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  474|     99|STR(squareSymbolSearch, "[Symbol.search]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  475|     99|STR(squareSymbolReplace, "[Symbol.replace]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  476|     99|STR(squareSymbolSplit, "[Symbol.split]")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  477|       |
  |  |  478|       |#ifdef HERMES_ENABLE_INTL
  |  |  479|       |// TODO T65916424: Consider how we can move these out of the
  |  |  480|       |// predefined strings table.
  |  |  481|       |STR(Collator, "Collator")
  |  |  482|       |STR(IntlCollator, "Intl.Collator")
  |  |  483|       |STR(DateTimeFormat, "DateTimeFormat")
  |  |  484|       |STR(IntlDateTimeFormat, "Intl.DateTimeFormat")
  |  |  485|       |STR(NumberFormat, "NumberFormat")
  |  |  486|       |STR(IntlNumberFormat, "Intl.NumberFormat")
  |  |  487|       |STR(Intl, "Intl")
  |  |  488|       |STR(compare, "compare")
  |  |  489|       |STR(format, "format")
  |  |  490|       |STR(formatToParts, "formatToParts")
  |  |  491|       |STR(getCanonicalLocales, "getCanonicalLocales")
  |  |  492|       |STR(resolvedOptions, "resolvedOptions")
  |  |  493|       |STR(supportedLocalesOf, "supportedLocalesOf")
  |  |  494|       |#endif
  |  |  495|       |
  |  |  496|       |// Define strings like "[object Number]" for all classes.
  |  |  497|     99|#define CELL_JS_NAME(name, jsClassName) \
  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  499|     99|#include "hermes/VM/CellKinds.def"
  |  |  ------------------
  |  |  |  |    1|       |/*
  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |    3|       | *
  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |    6|       | */
  |  |  |  |    7|       |
  |  |  |  |    8|       |// This file defines all possible kinds of objects that are known to the
  |  |  |  |    9|       |// garbage collector.
  |  |  |  |   10|       |
  |  |  |  |   11|     99|#ifndef CELL_KIND
  |  |  |  |   12|     99|#define CELL_KIND(name)
  |  |  |  |   13|     99|#endif
  |  |  |  |   14|       |
  |  |  |  |   15|       |#ifndef CELL_JS_NAME
  |  |  |  |   16|       |#define CELL_JS_NAME(name, jsClassName)
  |  |  |  |   17|       |#endif
  |  |  |  |   18|       |
  |  |  |  |   19|     99|#ifndef CELL_RANGE
  |  |  |  |   20|     99|#define CELL_RANGE(rangeName, first, last)
  |  |  |  |   21|     99|#endif
  |  |  |  |   22|       |
  |  |  |  |   23|       |// Helper macro for defining a CellKind which 1:1 corresponds with a JS Class.
  |  |  |  |   24|       |// Defines both the kind and the JS Class name.
  |  |  |  |   25|     99|#define CELL_CLASS(name, jsClassName) \
  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |   28|       |
  |  |  |  |   29|     99|CELL_KIND(Uninitialized)
  |  |  |  |   30|     99|CELL_KIND(FillerCell)
  |  |  |  |   31|     99|#if defined(HERMESVM_GC_HADES) || defined(HERMESVM_GC_RUNTIME)
  |  |  |  |   32|     99|CELL_KIND(Freelist)
  |  |  |  |   33|     99|#endif
  |  |  |  |   34|     99|CELL_KIND(DynamicUTF16StringPrimitive)
  |  |  |  |   35|     99|CELL_KIND(DynamicASCIIStringPrimitive)
  |  |  |  |   36|     99|CELL_KIND(BufferedUTF16StringPrimitive)
  |  |  |  |   37|     99|CELL_KIND(BufferedASCIIStringPrimitive)
  |  |  |  |   38|     99|CELL_KIND(DynamicUniquedUTF16StringPrimitive)
  |  |  |  |   39|     99|CELL_KIND(DynamicUniquedASCIIStringPrimitive)
  |  |  |  |   40|     99|CELL_KIND(ExternalUTF16StringPrimitive)
  |  |  |  |   41|     99|CELL_KIND(ExternalASCIIStringPrimitive)
  |  |  |  |   42|     99|CELL_KIND(DictPropertyMap)
  |  |  |  |   43|     99|CELL_KIND(Domain)
  |  |  |  |   44|     99|CELL_KIND(HiddenClass)
  |  |  |  |   45|     99|CELL_KIND(ArrayStorage)
  |  |  |  |   46|     99|CELL_KIND(ArrayStorageSmall)
  |  |  |  |   47|     99|CELL_KIND(SegmentedArray)
  |  |  |  |   48|     99|CELL_KIND(SegmentedArraySmall)
  |  |  |  |   49|     99|CELL_KIND(Segment)
  |  |  |  |   50|     99|CELL_KIND(SegmentSmall)
  |  |  |  |   51|     99|CELL_KIND(PropertyAccessor)
  |  |  |  |   52|     99|CELL_KIND(Environment)
  |  |  |  |   53|     99|CELL_KIND(HashMapEntry)
  |  |  |  |   54|     99|CELL_KIND(OrderedHashMap)
  |  |  |  |   55|     99|CELL_KIND(BoxedDouble)
  |  |  |  |   56|     99|CELL_KIND(NativeState)
  |  |  |  |   57|       |
  |  |  |  |   58|     99|CELL_CLASS(JSObject, "Object")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   59|     99|CELL_CLASS(DecoratedObject, "DecoratedObject")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   60|     99|CELL_KIND(HostObject)
  |  |  |  |   61|       |
  |  |  |  |   62|     99|CELL_CLASS(JSError, "Error")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   63|     99|CELL_CLASS(JSCallSite, "CallSite")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   64|     99|CELL_CLASS(Arguments, "Arguments")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   65|     99|CELL_CLASS(JSArray, "Array")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   66|     99|CELL_CLASS(JSArrayBuffer, "ArrayBuffer")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   67|     99|CELL_CLASS(JSDataView, "DataView")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |   69|     99|#include "hermes/VM/TypedArrays.def"
  |  |  |  |  ------------------
  |  |  |  |  |  |    1|       |/*
  |  |  |  |  |  |    2|       | * Copyright (c) Meta Platforms, Inc. and affiliates.
  |  |  |  |  |  |    3|       | *
  |  |  |  |  |  |    4|       | * This source code is licensed under the MIT license found in the
  |  |  |  |  |  |    5|       | * LICENSE file in the root directory of this source tree.
  |  |  |  |  |  |    6|       | */
  |  |  |  |  |  |    7|       |
  |  |  |  |  |  |    8|       |// The TypedArray objects, see ES6 22.2 (Table 49)
  |  |  |  |  |  |    9|       |
  |  |  |  |  |  |   10|       |#ifndef TYPED_ARRAY
  |  |  |  |  |  |   11|       |#error "TYPED_ARRAY must exist before including this file"
  |  |  |  |  |  |   12|       |#endif
  |  |  |  |  |  |   13|       |
  |  |  |  |  |  |   14|     99|TYPED_ARRAY(Int8, int8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   15|     99|TYPED_ARRAY(Int16, int16_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   16|     99|TYPED_ARRAY(Int32, int32_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   17|     99|TYPED_ARRAY(Uint8, uint8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   18|     99|#ifndef TYPED_ARRAY_NO_CLAMP
  |  |  |  |  |  |   19|     99|TYPED_ARRAY(Uint8Clamped, uint8_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   20|       |#else
  |  |  |  |  |  |   21|       |#undef TYPED_ARRAY_NO_CLAMP
  |  |  |  |  |  |   22|       |#endif
  |  |  |  |  |  |   23|     99|TYPED_ARRAY(Uint16, uint16_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   24|     99|TYPED_ARRAY(Uint32, uint32_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   25|     99|TYPED_ARRAY(Float32, float)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|TYPED_ARRAY(Float64, double)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   27|     99|TYPED_ARRAY(BigInt64, int64_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   28|     99|TYPED_ARRAY(BigUint64, uint64_t)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |   68|     99|#define TYPED_ARRAY(name, type) CELL_CLASS(name##Array, #name "Array")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |   29|       |
  |  |  |  |  |  |   30|     99|#undef TYPED_ARRAY
  |  |  |  |  ------------------
  |  |  |  |   70|     99|CELL_CLASS(JSArrayIterator, "Array Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   71|     99|CELL_CLASS(JSSet, "Set")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   72|     99|CELL_CLASS(JSMap, "Map")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   73|     99|CELL_CLASS(JSSetIterator, "Set Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   74|     99|CELL_CLASS(JSMapIterator, "Map Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   75|     99|CELL_CLASS(JSWeakMap, "WeakMap")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   76|     99|CELL_CLASS(JSWeakSet, "WeakSet")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   77|     99|CELL_CLASS(JSWeakRef, "WeakRef")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   78|     99|CELL_CLASS(JSBoolean, "Boolean")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   79|     99|CELL_CLASS(JSString, "String")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   80|     99|CELL_CLASS(JSNumber, "Number")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   81|     99|CELL_CLASS(JSSymbol, "Symbol")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   82|     99|CELL_CLASS(JSStringIterator, "String Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   83|     99|CELL_CLASS(JSJSON, "JSON")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   84|     99|CELL_CLASS(JSMath, "Math")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   85|     99|CELL_CLASS(JSDate, "Date")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   86|     99|CELL_CLASS(JSRegExp, "RegExp")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   87|     99|CELL_CLASS(JSRegExpStringIterator, "RegExp String Iterator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   88|     99|CELL_CLASS(RequireContext, "RequireContext")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   89|     99|CELL_CLASS(JSGenerator, "Generator")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   90|     99|CELL_CLASS(JSProxy, "Proxy")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   91|     99|CELL_CLASS(JSBigInt, "BigInt")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   92|       |
  |  |  |  |   93|     99|CELL_KIND(BoundFunction)
  |  |  |  |   94|     99|CELL_KIND(NativeFunction)
  |  |  |  |   95|     99|CELL_KIND(NativeConstructor)
  |  |  |  |   96|     99|CELL_CLASS(JSCallableProxy, "CallableProxy")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |   97|     99|CELL_KIND(FinalizableNativeFunction)
  |  |  |  |   98|     99|CELL_KIND(JSGeneratorFunction)
  |  |  |  |   99|     99|CELL_KIND(GeneratorInnerFunction)
  |  |  |  |  100|     99|CELL_KIND(JSAsyncFunction)
  |  |  |  |  101|     99|CELL_CLASS(JSFunction, "Function")
  |  |  |  |  ------------------
  |  |  |  |  |  |   26|     99|  CELL_KIND(name)                     \
  |  |  |  |  |  |   27|     99|  CELL_JS_NAME(name, jsClassName)
  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  498|     99|  STR(squareObject_##name, "[object " jsClassName "]")
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  |  |  |  |  |  |  ------------------
  |  |  |  |  |  |  ------------------
  |  |  |  |  ------------------
  |  |  |  |  102|       |
  |  |  |  |  103|     99|CELL_KIND(BigIntPrimitive)
  |  |  |  |  104|       |
  |  |  |  |  105|       |// Dummy object used only in tests.
  |  |  |  |  106|     99|CELL_KIND(DummyObject)
  |  |  |  |  107|       |
  |  |  |  |  108|       |// Update AllCells, below, if new CellKinds are added.
  |  |  |  |  109|       |// (AllCells is useful for checking that a CellKind is valid.)
  |  |  |  |  110|       |
  |  |  |  |  111|       |// Define inheritance ranges.
  |  |  |  |  112|     99|CELL_RANGE(AllCells, Uninitialized, DummyObject)
  |  |  |  |  113|     99|CELL_RANGE(Object, JSObject, JSFunction)
  |  |  |  |  114|     99|CELL_RANGE(DecoratedObject, DecoratedObject, HostObject)
  |  |  |  |  115|     99|CELL_RANGE(ArrayImpl, Arguments, JSArray)
  |  |  |  |  116|     99|CELL_RANGE(Callable, BoundFunction, JSFunction)
  |  |  |  |  117|     99|CELL_RANGE(CodeBlockFunction, JSGeneratorFunction, JSFunction)
  |  |  |  |  118|     99|CELL_RANGE(NativeFunction, NativeFunction, FinalizableNativeFunction)
  |  |  |  |  119|     99|CELL_RANGE(TypedArrayBase, Int8Array, BigUint64Array)
  |  |  |  |  120|     99|CELL_RANGE(WeakMapImplBase, JSWeakMap, JSWeakSet)
  |  |  |  |  121|     99|CELL_RANGE(
  |  |  |  |  122|     99|    StringPrimitive,
  |  |  |  |  123|     99|    DynamicUTF16StringPrimitive,
  |  |  |  |  124|     99|    ExternalASCIIStringPrimitive)
  |  |  |  |  125|       |
  |  |  |  |  126|     99|#undef CELL_KIND
  |  |  |  |  127|     99|#undef CELL_JS_NAME
  |  |  |  |  128|     99|#undef CELL_RANGE
  |  |  |  |  129|     99|#undef CELL_CLASS
  |  |  ------------------
  |  |  500|       |
  |  |  501|       |// These strings are the same ones that RN adds to the Runtime before
  |  |  502|       |// executing bytecode. They are added here because it may provide
  |  |  503|       |// a performance benefit.
  |  |  504|     99|STR(__rnReserved00, "nativePerformanceNow")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  505|     99|STR(__rnReserved01, "nativeLoggingHook")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  506|     99|STR(__rnReserved02, "nativeQPLMarkerPoint")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  507|     99|STR(__rnReserved03, "jsEngine")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  508|     99|STR(__rnReserved04, "nativeCallSyncHook")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  509|     99|STR(__rnReserved05, "nativeFlushQueueImmediate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  510|     99|STR(__rnReserved06, "nativeTraceBeginSection")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  511|     99|STR(__rnReserved07, "nativeTraceEndSection")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  512|     99|STR(__rnReserved08, "nativeTraceBeginAsyncSection")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  513|     99|STR(__rnReserved09, "nativeTraceEndAsyncSection")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  514|     99|STR(__rnReserved10, "nativeTraceCounter")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  515|     99|STR(__rnReserved11, "nativeModuleProxy")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  516|     99|STR(__rnReserved12, "nativeGetThreadCpuTimeMillis")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  517|     99|STR(__rnReserved13, "nativeQPLTimestamp")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  518|     99|STR(__rnReserved14, "nativeQPLMarkerStart")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  519|     99|STR(__rnReserved15, "nativeQPLMarkerEnd")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  520|     99|STR(__rnReserved16, "nativeQPLMarkerNote")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  521|     99|STR(__rnReserved17, "nativeQPLMarkerTag")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  522|     99|STR(__rnReserved18, "nativeQPLMarkerAnnotate")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  523|     99|STR(__rnReserved20, "nativeGetThreadMajorPageFaults")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  524|     99|STR(__rnReserved21, "__jsiExecutorDescription")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  525|     99|STR(__rnReserved22, "nativeTraceIsTracing")
  |  |  ------------------
  |  |  |  | 1483|     99|#define STR(name, string) constexprHashString(string),
  |  |  ------------------
  |  |  526|       |
  |  |  527|       |#ifdef HERMES_ENABLE_FUZZILLI
  |  |  528|       |STR(fuzzilli, "fuzzilli")
  |  |  529|       |#endif
  |  |  530|       |
  |  |  531|       |
  |  |  532|     99|#undef STR
  ------------------
 1485|     99|  };
 1486|       |
 1487|     99|  uint32_t offset = 0;
 1488|     99|  uint32_t registered = 0;
 1489|     99|  (void)registered;
 1490|     99|  const uint32_t strCount = Predefined::NumStrings;
 1491|     99|  const uint32_t symCount = Predefined::NumSymbols;
 1492|     99|  identifierTable_.reserve(Predefined::_IPROP_AFTER_LAST + strCount + symCount);
 1493|       |
 1494|  1.28k|  for (uint32_t idx = 0; idx < Predefined::_IPROP_AFTER_LAST; ++idx) {
  ------------------
  |  Branch (1494:26): [True: 1.18k, False: 99]
  ------------------
 1495|  1.18k|    SymbolID sym = identifierTable_.createNotUniquedLazySymbol(
 1496|  1.18k|        ASCIIRef{&buffer[offset], propLengths[idx]});
 1497|       |
 1498|  1.18k|    assert(sym == Predefined::getSymbolID((Predefined::IProp)registered++));
 1499|      0|    (void)sym;
 1500|       |
 1501|  1.18k|    offset += propLengths[idx];
 1502|  1.18k|  }
 1503|       |
 1504|     99|  assert(
 1505|     99|      strCount == sizeof hashes / sizeof hashes[0] &&
 1506|     99|      "Arrays should have same length");
 1507|  52.5k|  for (uint32_t idx = 0; idx < strCount; idx++) {
  ------------------
  |  Branch (1507:26): [True: 52.4k, False: 99]
  ------------------
 1508|  52.4k|    SymbolID sym = identifierTable_.registerLazyIdentifier(
 1509|  52.4k|        ASCIIRef{&buffer[offset], strLengths[idx]}, hashes[idx]);
 1510|       |
 1511|  52.4k|    assert(sym == Predefined::getSymbolID((Predefined::Str)registered++));
 1512|      0|    (void)sym;
 1513|       |
 1514|  52.4k|    offset += strLengths[idx];
 1515|  52.4k|  }
 1516|       |
 1517|  1.08k|  for (uint32_t idx = 0; idx < symCount; ++idx) {
  ------------------
  |  Branch (1517:26): [True: 990, False: 99]
  ------------------
 1518|    990|    SymbolID sym = identifierTable_.createNotUniquedLazySymbol(
 1519|    990|        ASCIIRef{&buffer[offset], symLengths[idx]});
 1520|       |
 1521|    990|    assert(sym == Predefined::getSymbolID((Predefined::Sym)registered++));
 1522|      0|    (void)sym;
 1523|       |
 1524|    990|    offset += symLengths[idx];
 1525|    990|  }
 1526|       |
 1527|     99|  assert(
 1528|     99|      !getTopGCScope() &&
 1529|     99|      "There shouldn't be any handles allocated during initializing the predefined strings");
 1530|     99|}
_ZN6hermes2vm7Runtime20initCharacterStringsEv:
 1532|     99|void Runtime::initCharacterStrings() {
 1533|     99|  GCScope gc(*this);
 1534|     99|  auto marker = gc.createMarker();
 1535|     99|  charStrings_.reserve(256);
 1536|  25.4k|  for (char16_t ch = 0; ch < 256; ++ch) {
  ------------------
  |  Branch (1536:25): [True: 25.3k, False: 99]
  ------------------
 1537|  25.3k|    gc.flushToMarker(marker);
 1538|  25.3k|    charStrings_.push_back(allocateCharacterString(ch).getHermesValue());
 1539|  25.3k|  }
 1540|     99|}
_ZN6hermes2vm7Runtime23allocateCharacterStringEDs:
 1542|  25.3k|Handle<StringPrimitive> Runtime::allocateCharacterString(char16_t ch) {
 1543|       |  // This can in theory throw when called out of initialization phase.
 1544|       |  // However there is only that many character strings and in practice this
 1545|       |  // is not a problem.  Note that we allocate these as "long-lived" objects,
 1546|       |  // so we don't have to scan the charStrings_ array in
 1547|       |  // young-generation collections.
 1548|       |
 1549|  25.3k|  PinnedHermesValue strRes;
 1550|  25.3k|  if (LLVM_LIKELY(ch < 128)) {
  ------------------
  |  |  188|  25.3k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 12.6k, False: 12.6k]
  |  |  ------------------
  ------------------
 1551|  12.6k|    strRes = ignoreAllocationFailure(
 1552|  12.6k|        StringPrimitive::createLongLived(*this, ASCIIRef(ch)));
 1553|  12.6k|  } else {
 1554|  12.6k|    strRes = ignoreAllocationFailure(
 1555|  12.6k|        StringPrimitive::createLongLived(*this, UTF16Ref(ch)));
 1556|  12.6k|  }
 1557|  25.3k|  return makeHandle<StringPrimitive>(strRes);
 1558|  25.3k|}
_ZN6hermes2vm7Runtime18getCharacterStringEDs:
 1560|     99|Handle<StringPrimitive> Runtime::getCharacterString(char16_t ch) {
 1561|     99|  if (LLVM_LIKELY(ch < 256))
  ------------------
  |  |  188|     99|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 99, False: 0]
  |  |  ------------------
  ------------------
 1562|     99|    return Handle<StringPrimitive>::vmcast(&charStrings_[ch]);
 1563|       |
 1564|      0|  return makeHandle<StringPrimitive>(
 1565|      0|      ignoreAllocationFailure(StringPrimitive::create(*this, UTF16Ref(ch))));
 1566|     99|}
_ZN6hermes2vm7Runtime26forEachPublicNativeBuiltinERKNSt3__18functionIFNS0_15ExecutionStatusEjNS0_10Predefined3StrERNS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDEEEE:
 1597|     99|        SymbolID methodID)> &callback) {
 1598|     99|  MutableHandle<JSObject> lastObject{*this};
 1599|     99|  Predefined::Str lastObjectName = Predefined::_STRING_AFTER_LAST;
 1600|       |
 1601|  3.76k|  for (unsigned methodIndex = 0; methodIndex < BuiltinMethod::_firstPrivate;
  ------------------
  |  Branch (1601:34): [True: 3.66k, False: 99]
  ------------------
 1602|  3.66k|       ++methodIndex) {
 1603|  3.66k|    GCScopeMarkerRAII marker{*this};
 1604|  3.66k|    LLVM_DEBUG(llvh::dbgs() << publicNativeBuiltins[methodIndex].name << "\n");
  ------------------
  |  |  123|  3.66k|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|  3.66k|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 3.66k]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|  3.66k|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1605|       |    // Find the object first, if it changed.
 1606|  3.66k|    auto objectName = (Predefined::Str)publicNativeBuiltins[methodIndex].object;
 1607|  3.66k|    if (objectName != lastObjectName) {
  ------------------
  |  Branch (1607:9): [True: 594, False: 3.06k]
  ------------------
 1608|    594|      auto objectID = Predefined::getSymbolID(objectName);
 1609|    594|      auto cr = JSObject::getNamed_RJS(getGlobal(), *this, objectID);
 1610|    594|      assert(
 1611|    594|          cr.getStatus() != ExecutionStatus::EXCEPTION &&
 1612|    594|          "getNamed() of builtin object failed");
 1613|      0|      assert(
 1614|    594|          vmisa<JSObject>(cr->get()) &&
 1615|    594|          "getNamed() of builtin object must be an object");
 1616|       |
 1617|      0|      lastObject = vmcast<JSObject>(cr->get());
 1618|    594|      lastObjectName = objectName;
 1619|    594|    }
 1620|       |
 1621|       |    // Find the method.
 1622|      0|    auto methodName = (Predefined::Str)publicNativeBuiltins[methodIndex].method;
 1623|  3.66k|    auto methodID = Predefined::getSymbolID(methodName);
 1624|       |
 1625|  3.66k|    ExecutionStatus status =
 1626|  3.66k|        callback(methodIndex, objectName, lastObject, methodID);
 1627|  3.66k|    if (status != ExecutionStatus::RETURNED) {
  ------------------
  |  Branch (1627:9): [True: 0, False: 3.66k]
  ------------------
 1628|      0|      return ExecutionStatus::EXCEPTION;
 1629|      0|    }
 1630|  3.66k|  }
 1631|     99|  return ExecutionStatus::RETURNED;
 1632|     99|}
_ZN6hermes2vm7Runtime18initNativeBuiltinsEv:
 1634|     99|void Runtime::initNativeBuiltins() {
 1635|     99|  GCScopeMarkerRAII gcScope{*this};
 1636|       |
 1637|     99|  builtins_.resize(BuiltinMethod::_count);
 1638|       |
 1639|     99|  (void)forEachPublicNativeBuiltin([this](
 1640|     99|                                       unsigned methodIndex,
 1641|     99|                                       Predefined::Str /* objectName */,
 1642|     99|                                       Handle<JSObject> &currentObject,
 1643|     99|                                       SymbolID methodID) {
 1644|     99|    auto cr = JSObject::getNamed_RJS(currentObject, *this, methodID);
 1645|     99|    assert(
 1646|     99|        cr.getStatus() != ExecutionStatus::EXCEPTION &&
 1647|     99|        "getNamed() of builtin method failed");
 1648|     99|    assert(
 1649|     99|        vmisa<NativeFunction>(cr->get()) &&
 1650|     99|        "getNamed() of builtin method must be a NativeFunction");
 1651|     99|    builtins_[methodIndex] = vmcast<NativeFunction>(cr->get());
 1652|     99|    return ExecutionStatus::RETURNED;
 1653|     99|  });
 1654|       |
 1655|       |  // Now add the private native builtins.
 1656|     99|  createHermesBuiltins(*this, builtins_);
 1657|     99|#ifndef NDEBUG
 1658|       |  // Make sure native builtins are all defined.
 1659|  5.14k|  for (unsigned i = 0; i < BuiltinMethod::_firstJS; ++i) {
  ------------------
  |  Branch (1659:24): [True: 5.04k, False: 99]
  ------------------
 1660|  5.04k|    assert(builtins_[i] && "native builtin not initialized");
 1661|  5.04k|  }
 1662|     99|#endif
 1663|     99|}
_ZN6hermes2vm7Runtime14initJSBuiltinsEN4llvh15MutableArrayRefIPNS0_8CallableEEENS0_6HandleINS0_8JSObjectEEE:
 1680|     99|    Handle<JSObject> jsBuiltinsObj) {
 1681|     99|  for (const JSBuiltin &jsBuiltin : jsBuiltins) {
  ------------------
  |  Branch (1681:35): [True: 99, False: 99]
  ------------------
 1682|     99|    auto symID = jsBuiltin.symID;
 1683|     99|    auto builtinIndex = jsBuiltin.builtinIndex;
 1684|       |
 1685|       |    // Try to get the JS function from jsBuiltinsObj.
 1686|     99|    auto getRes = JSObject::getNamed_RJS(
 1687|     99|        jsBuiltinsObj, *this, Predefined::getSymbolID((Predefined::Str)symID));
 1688|     99|    assert(getRes == ExecutionStatus::RETURNED && "Failed to get JS builtin.");
 1689|      0|    JSFunction *jsFunc = vmcast<JSFunction>(getRes->getHermesValue());
 1690|       |
 1691|     99|    builtins[builtinIndex] = jsFunc;
 1692|     99|  }
 1693|     99|}
_ZN6hermes2vm7Runtime24symbolEqualsToStringPrimENS0_8SymbolIDEPNS0_15StringPrimitiveE:
 1845|    976|bool Runtime::symbolEqualsToStringPrim(SymbolID id, StringPrimitive *strPrim) {
 1846|    976|  auto view = identifierTable_.getStringView(*this, id);
 1847|    976|  return strPrim->equals(view);
 1848|    976|}
_ZN6hermes2vm7Runtime10allocStackEjNS0_11HermesValueE:
 1851|   409k|void Runtime::allocStack(uint32_t count, HermesValue initValue) {
 1852|       |  // Note: it is important that allocStack be defined out-of-line. If inline,
 1853|       |  // constants are propagated into initValue, which enables clang to use
 1854|       |  // memset_pattern_16. This ends up being a significant loss as it is an
 1855|       |  // indirect call.
 1856|   409k|  auto *oldStackPointer = stackPointer_;
 1857|   409k|  allocUninitializedStack(count);
 1858|       |  // Initialize the new registers.
 1859|   409k|  std::uninitialized_fill_n(oldStackPointer, count, initValue);
 1860|   409k|}
_ZN6hermes2vm7Runtime9onGCEventENS0_11GCEventKindERKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
 2024|    868|void Runtime::onGCEvent(GCEventKind kind, const std::string &extraInfo) {
 2025|    868|#if HERMESVM_SAMPLING_PROFILER_AVAILABLE
 2026|    868|  if (samplingProfiler) {
  ------------------
  |  Branch (2026:7): [True: 0, False: 868]
  ------------------
 2027|      0|    switch (kind) {
 2028|      0|      case GCEventKind::CollectionStart:
  ------------------
  |  Branch (2028:7): [True: 0, False: 0]
  ------------------
 2029|      0|        samplingProfiler->suspend(extraInfo);
 2030|      0|        break;
 2031|      0|      case GCEventKind::CollectionEnd:
  ------------------
  |  Branch (2031:7): [True: 0, False: 0]
  ------------------
 2032|      0|        samplingProfiler->resume();
 2033|      0|        break;
 2034|      0|      default:
  ------------------
  |  Branch (2034:7): [True: 0, False: 0]
  ------------------
 2035|      0|        llvm_unreachable("unknown GCEventKind");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 2036|      0|    }
 2037|      0|  }
 2038|    868|#endif // HERMESVM_SAMPLING_PROFILER_AVAILABLE
 2039|    868|  if (gcEventCallback_) {
  ------------------
  |  Branch (2039:7): [True: 0, False: 868]
  ------------------
 2040|      0|    gcEventCallback_(kind, extraInfo.c_str());
 2041|      0|  }
 2042|    868|}
_ZN6hermes2vm7Runtime19MarkRootsPhaseTimerC2ERS1_NS0_19RootSectionAcceptor7SectionE:
  432|  17.9k|      : rt_(rt), section_(section), start_(std::chrono::steady_clock::now()) {
  433|  17.9k|    if (static_cast<unsigned>(section) == 0) {
  ------------------
  |  Branch (433:9): [True: 1.18k, False: 16.7k]
  ------------------
  434|       |      // The first phase; record the start as the start of markRoots.
  435|  1.18k|      rt_.startOfMarkRoots_ = start_;
  436|  1.18k|    }
  437|  17.9k|  }
_ZN6hermes2vm7Runtime19MarkRootsPhaseTimerD2Ev:
  438|  17.9k|  ~MarkRootsPhaseTimer() {
  439|  17.9k|    auto tp = std::chrono::steady_clock::now();
  440|  17.9k|    std::chrono::duration<double> elapsed = (tp - start_);
  441|  17.9k|    start_ = tp;
  442|  17.9k|    unsigned index = static_cast<unsigned>(section_);
  443|  17.9k|    rt_.markRootsPhaseTimes_[index] += elapsed.count();
  444|  17.9k|    if (index + 1 ==
  ------------------
  |  Branch (444:9): [True: 1.18k, False: 16.7k]
  ------------------
  445|  17.9k|        static_cast<unsigned>(RootAcceptor::Section::NumSections)) {
  446|  1.18k|      std::chrono::duration<double> totalElapsed = (tp - rt_.startOfMarkRoots_);
  447|  1.18k|      rt_.totalMarkRootsTime_ += totalElapsed.count();
  448|  1.18k|    }
  449|  17.9k|  }
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEERKNS0_11TwineChar16E:
 1259|     24|    const TwineChar16 &msg) {
 1260|       |  // Since this happens unexpectedly and rarely, don't rely on the parent
 1261|       |  // GCScope.
 1262|     24|  GCScope gcScope{runtime};
 1263|       |
 1264|     24|  SmallU16String<64> buf;
 1265|     24|  msg.toVector(buf);
 1266|       |
 1267|     24|  auto strRes = StringPrimitive::create(runtime, buf);
 1268|     24|  if (strRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (1268:7): [True: 0, False: 24]
  ------------------
 1269|      0|    return ExecutionStatus::EXCEPTION;
 1270|      0|  }
 1271|     24|  auto str = runtime.makeHandle<StringPrimitive>(*strRes);
 1272|     24|  LLVM_DEBUG(llvh::errs() << buf.arrayRef() << "\n");
  ------------------
  |  |  123|     24|#define LLVM_DEBUG(X) DEBUG_WITH_TYPE(DEBUG_TYPE, X)
  |  |  ------------------
  |  |  |  |   66|     24|  do { if (::llvh::DebugFlag && ::llvh::isCurrentDebugType(TYPE)) { X; } \
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (66:12): [True: 0, False: 24]
  |  |  |  |  |  Branch (66:33): [True: 0, False: 0]
  |  |  |  |  ------------------
  |  |  |  |   67|     24|  } while (false)
  |  |  |  |  ------------------
  |  |  |  |  |  Branch (67:12): [Folded - Ignored]
  |  |  |  |  ------------------
  |  |  ------------------
  ------------------
 1273|     24|  return raisePlaceholder(runtime, prototype, str);
 1274|     24|}
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_8JSObjectEEENS3_INS0_11HermesValueEEE:
 1245|     24|    Handle<> message) {
 1246|     24|  GCScopeMarkerRAII gcScope{runtime};
 1247|       |
 1248|       |  // Create the error object, initialize stack property and set message.
 1249|     24|  auto errorObj = runtime.makeHandle(JSError::create(runtime, prototype));
 1250|     24|  return raisePlaceholder(runtime, errorObj, message);
 1251|     24|}
Runtime.cpp:_ZN6hermes2vmL16raisePlaceholderERNS0_7RuntimeENS0_6HandleINS0_7JSErrorEEENS3_INS0_11HermesValueEEE:
 1233|     24|raisePlaceholder(Runtime &runtime, Handle<JSError> errorObj, Handle<> message) {
 1234|     24|  JSError::recordStackTrace(errorObj, runtime);
 1235|     24|  JSError::setupStack(errorObj, runtime);
 1236|     24|  JSError::setMessage(errorObj, runtime, message);
 1237|     24|  return runtime.setThrownValue(errorObj.getHermesValue());
 1238|     24|}
Runtime.cpp:_ZZN6hermes2vm7Runtime18initNativeBuiltinsEvENK4$_10clEjNS0_10Predefined3StrERNS0_6HandleINS0_8JSObjectEEENS0_8SymbolIDE:
 1643|  3.66k|                                       SymbolID methodID) {
 1644|  3.66k|    auto cr = JSObject::getNamed_RJS(currentObject, *this, methodID);
 1645|  3.66k|    assert(
 1646|  3.66k|        cr.getStatus() != ExecutionStatus::EXCEPTION &&
 1647|  3.66k|        "getNamed() of builtin method failed");
 1648|      0|    assert(
 1649|  3.66k|        vmisa<NativeFunction>(cr->get()) &&
 1650|  3.66k|        "getNamed() of builtin method must be a NativeFunction");
 1651|      0|    builtins_[methodIndex] = vmcast<NativeFunction>(cr->get());
 1652|  3.66k|    return ExecutionStatus::RETURNED;
 1653|  3.66k|  });

_ZN6hermes2vm13RuntimeModuleC2ERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefEj:
   34|    928|      scriptID_(scriptID) {
   35|    928|  runtime_.addRuntimeModule(this);
   36|    928|  Domain::addRuntimeModule(domain, runtime, this);
   37|    928|#ifndef HERMESVM_LEAN
   38|    928|  lazyRoot_ = this;
   39|    928|#endif
   40|    928|}
_ZN6hermes2vm13RuntimeModule35createSymbolFromStringIDMayAllocateEjRKNS_16StringTableEntryENS_8OptValueIjEE:
   45|  8.21k|    OptValue<uint32_t> mhash) {
   46|       |  // Use manual pointer arithmetic to avoid out of bounds errors on empty
   47|       |  // string accesses.
   48|  8.21k|  auto strStorage = bcProvider_->getStringStorage();
   49|  8.21k|  if (entry.isUTF16()) {
  ------------------
  |  Branch (49:7): [True: 273, False: 7.93k]
  ------------------
   50|    273|    const char16_t *s =
   51|    273|        (const char16_t *)(strStorage.begin() + entry.getOffset());
   52|    273|    UTF16Ref str{s, entry.getLength()};
   53|    273|    uint32_t hash = mhash ? *mhash : hashString(str);
  ------------------
  |  Branch (53:21): [True: 227, False: 46]
  ------------------
   54|    273|    return mapStringMayAllocate(str, stringID, hash);
   55|  7.93k|  } else {
   56|       |    // ASCII.
   57|  7.93k|    const char *s = (const char *)strStorage.begin() + entry.getOffset();
   58|  7.93k|    ASCIIRef str{s, entry.getLength()};
   59|  7.93k|    uint32_t hash = mhash ? *mhash : hashString(str);
  ------------------
  |  Branch (59:21): [True: 7.42k, False: 519]
  ------------------
   60|  7.93k|    return mapStringMayAllocate(str, stringID, hash);
   61|  7.93k|  }
   62|  8.21k|}
_ZN6hermes2vm13RuntimeModuleD2Ev:
   64|    928|RuntimeModule::~RuntimeModule() {
   65|    928|  if (bcProvider_ && !bcProvider_->getRawBuffer().empty())
  ------------------
  |  Branch (65:7): [True: 928, False: 0]
  |  Branch (65:7): [True: 198, False: 730]
  |  Branch (65:22): [True: 198, False: 730]
  ------------------
   66|    198|    runtime_.getCrashManager().unregisterMemory(bcProvider_.get());
   67|    928|  runtime_.getCrashManager().unregisterMemory(this);
   68|    928|  runtime_.removeRuntimeModule(this);
   69|       |
   70|       |  // We may reference other CodeBlocks through lazy compilation, but we only
   71|       |  // own the ones that reference us.
   72|   122k|  for (auto *block : functionMap_) {
  ------------------
  |  Branch (72:20): [True: 122k, False: 928]
  ------------------
   73|   122k|    if (block != nullptr && block->getRuntimeModule() == this) {
  ------------------
  |  Branch (73:9): [True: 5.37k, False: 117k]
  |  Branch (73:29): [True: 4.69k, False: 674]
  ------------------
   74|  4.69k|      runtime_.getHeap().getIDTracker().untrackNative(block);
   75|  4.69k|      delete block;
   76|  4.69k|    }
   77|   122k|  }
   78|    928|  runtime_.getHeap().getIDTracker().untrackNative(&functionMap_);
   79|    928|}
_ZN6hermes2vm13RuntimeModule6createERNS0_7RuntimeENS0_6HandleINS0_6DomainEEEjONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEENS0_18RuntimeModuleFlagsEN4llvh9StringRefE:
   96|    155|    llvh::StringRef sourceURL) {
   97|    155|  RuntimeModule *result;
   98|    155|  {
   99|    155|    WeakRefLock lk{runtime.getHeap().weakRefMutex()};
  100|    155|    result = new RuntimeModule(runtime, domain, flags, sourceURL, scriptID);
  101|    155|  }
  102|    155|  runtime.getCrashManager().registerMemory(result, sizeof(*result));
  103|    155|  if (bytecode) {
  ------------------
  |  Branch (103:7): [True: 155, False: 0]
  ------------------
  104|    155|    if (result->initializeMayAllocate(std::move(bytecode)) ==
  ------------------
  |  Branch (104:9): [True: 0, False: 155]
  ------------------
  105|    155|        ExecutionStatus::EXCEPTION) {
  106|      0|      return ExecutionStatus::EXCEPTION;
  107|      0|    }
  108|       |    // If the BC provider is backed by a buffer, register the BC provider struct
  109|       |    // (but not the buffer contents, since that might be too large).
  110|    155|    if (result->bcProvider_ && !result->bcProvider_->getRawBuffer().empty())
  ------------------
  |  Branch (110:9): [True: 155, False: 0]
  |  Branch (110:9): [True: 99, False: 56]
  |  Branch (110:32): [True: 99, False: 56]
  ------------------
  111|     99|      runtime.getCrashManager().registerMemory(
  112|     99|          result->bcProvider_.get(), sizeof(hbc::BCProviderFromBuffer));
  113|    155|  }
  114|    155|  return result;
  115|    155|}
_ZN6hermes2vm13RuntimeModule19createUninitializedERNS0_7RuntimeENS0_6HandleINS0_6DomainEEENS0_18RuntimeModuleFlagsEj:
  121|    773|    facebook::hermes::debugger::ScriptID scriptID) {
  122|    773|  WeakRefLock lk{runtime.getHeap().weakRefMutex()};
  123|    773|  return new RuntimeModule(runtime, domain, flags, "", scriptID);
  124|    773|}
_ZN6hermes2vm13RuntimeModule38initializeWithoutCJSModulesMayAllocateEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEE:
  127|    254|    std::shared_ptr<hbc::BCProvider> &&bytecode) {
  128|    254|  assert(!bcProvider_ && "RuntimeModule already initialized");
  129|      0|  bcProvider_ = std::move(bytecode);
  130|    254|  importStringIDMapMayAllocate();
  131|    254|  initializeFunctionMap();
  132|    254|}
_ZN6hermes2vm13RuntimeModule21initializeMayAllocateEONSt3__110shared_ptrINS_3hbc14BCProviderBaseEEE:
  135|    155|    std::shared_ptr<hbc::BCProvider> &&bytecode) {
  136|    155|  initializeWithoutCJSModulesMayAllocate(std::move(bytecode));
  137|    155|  if (LLVM_UNLIKELY(importCJSModuleTable() == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    155|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 155]
  |  |  ------------------
  ------------------
  138|      0|    return ExecutionStatus::EXCEPTION;
  139|      0|  }
  140|    155|  return ExecutionStatus::RETURNED;
  141|    155|}
_ZN6hermes2vm13RuntimeModule20getCodeBlockSlowPathEj:
  143|  4.69k|CodeBlock *RuntimeModule::getCodeBlockSlowPath(unsigned index) {
  144|  4.69k|#ifndef HERMESVM_LEAN
  145|  4.69k|  if (bcProvider_->isFunctionLazy(index)) {
  ------------------
  |  Branch (145:7): [True: 674, False: 4.02k]
  ------------------
  146|    674|    auto *lazyModule = RuntimeModule::createLazyModule(
  147|    674|        runtime_, getDomain(runtime_), this, index);
  148|    674|    functionMap_[index] = lazyModule->getOnlyLazyCodeBlock();
  149|    674|    return functionMap_[index];
  150|    674|  }
  151|  4.02k|#endif
  152|  4.02k|  functionMap_[index] = CodeBlock::createCodeBlock(
  153|  4.02k|      this,
  154|  4.02k|      bcProvider_->getFunctionHeader(index),
  155|  4.02k|      bcProvider_->getBytecode(index),
  156|  4.02k|      index);
  157|  4.02k|  return functionMap_[index];
  158|  4.69k|}
_ZN6hermes2vm13RuntimeModule16createLazyModuleERNS0_7RuntimeENS0_6HandleINS0_6DomainEEEPS1_j:
  165|    674|    uint32_t functionID) {
  166|    674|  auto RM = createUninitialized(runtime, domain);
  167|    674|  RM->lazyRoot_ = parent->lazyRoot_;
  168|       |  // Copy the lazy root's script ID for lazy modules.
  169|    674|  RM->scriptID_ = RM->lazyRoot_->scriptID_;
  170|       |
  171|       |  // Set the bcProvider's BytecodeModule to point to the parent's.
  172|    674|  assert(parent->isInitialized() && "Parent module must have been initialized");
  173|       |
  174|      0|  auto *bcFunction = &((hbc::BCProviderFromSrc *)parent->getBytecode())
  175|    674|                          ->getBytecodeModule()
  176|    674|                          ->getFunction(functionID);
  177|       |
  178|    674|  RM->bcProvider_ = hbc::BCProviderLazy::createBCProviderLazy(bcFunction);
  179|       |
  180|       |  // We don't know which function index this block will eventually represent,
  181|       |  // so just add it as 0 to ensure ownership. We'll move it later in
  182|       |  // `initializeLazy`.
  183|    674|  RM->functionMap_.emplace_back(CodeBlock::createCodeBlock(
  184|    674|      RM, RM->bcProvider_->getFunctionHeader(functionID), {}, functionID));
  185|       |
  186|       |  // The module doesn't have a string table until we've compiled the block,
  187|       |  // so just add the string name as 0 in the mean time for f.name to work via
  188|       |  // getLazyName(). Since it's in the stringIDMap_, it'll be correctly GC'd.
  189|    674|  RM->stringIDMap_.emplace_back(parent->getSymbolIDFromStringIDMayAllocate(
  190|    674|      bcFunction->getHeader().functionName));
  191|       |
  192|    674|  return RM;
  193|    674|}
_ZN6hermes2vm13RuntimeModule28importStringIDMapMayAllocateEv:
  229|    254|void RuntimeModule::importStringIDMapMayAllocate() {
  230|    254|  assert(bcProvider_ && "Uninitialized RuntimeModule");
  231|      0|  PerfSection perf("Import String ID Map");
  232|    254|  GCScope scope(runtime_);
  233|       |
  234|    254|  auto strTableSize = bcProvider_->getStringCount();
  235|       |
  236|    254|  stringIDMap_.clear();
  237|       |
  238|       |  // Populate the string ID map with empty identifiers.
  239|    254|  stringIDMap_.resize(strTableSize, RootSymbolID(SymbolID::empty()));
  240|       |
  241|    254|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsSequential) {
  ------------------
  |  Branch (241:7): [True: 0, False: 254]
  ------------------
  242|      0|    bcProvider_->adviseStringTableSequential();
  243|      0|  }
  244|       |
  245|    254|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsWillNeed) {
  ------------------
  |  Branch (245:7): [True: 0, False: 254]
  ------------------
  246|      0|    bcProvider_->willNeedStringTable();
  247|      0|  }
  248|       |
  249|       |  // Get the array of pre-computed hashes from identifiers in the bytecode
  250|       |  // to their runtime representation as SymbolIDs.
  251|    254|  auto kinds = bcProvider_->getStringKinds();
  252|    254|  auto hashes = bcProvider_->getIdentifierHashes();
  253|    254|  assert(
  254|    254|      hashes.size() <= strTableSize &&
  255|    254|      "Should not have more strings than identifiers");
  256|       |
  257|       |  // Preallocate enough space to store all identifiers to prevent
  258|       |  // unnecessary allocations. NOTE: If this module is not the first module,
  259|       |  // then this is an underestimate.
  260|      0|  runtime_.getIdentifierTable().reserve(hashes.size());
  261|    254|  {
  262|    254|    StringID strID = 0;
  263|    254|    uint32_t hashID = 0;
  264|       |
  265|    292|    for (auto entry : kinds) {
  ------------------
  |  Branch (265:21): [True: 292, False: 254]
  ------------------
  266|    292|      switch (entry.kind()) {
  ------------------
  |  Branch (266:15): [True: 0, False: 292]
  ------------------
  267|    155|        case StringKind::String:
  ------------------
  |  Branch (267:9): [True: 155, False: 137]
  ------------------
  268|    155|          strID += entry.count();
  269|    155|          break;
  270|       |
  271|    137|        case StringKind::Identifier:
  ------------------
  |  Branch (271:9): [True: 137, False: 155]
  ------------------
  272|  7.78k|          for (uint32_t i = 0; i < entry.count(); ++i, ++strID, ++hashID) {
  ------------------
  |  Branch (272:32): [True: 7.64k, False: 137]
  ------------------
  273|  7.64k|            createSymbolFromStringIDMayAllocate(
  274|  7.64k|                strID, bcProvider_->getStringTableEntry(strID), hashes[hashID]);
  275|  7.64k|          }
  276|    137|          break;
  277|    292|      }
  278|    292|    }
  279|       |
  280|    254|    assert(strID == strTableSize && "Should map every string in the bytecode.");
  281|      0|    assert(hashID == hashes.size() && "Should hash all identifiers.");
  282|    254|  }
  283|       |
  284|    254|  if (runtime_.getVMExperimentFlags() & experiments::MAdviseStringsRandom) {
  ------------------
  |  Branch (284:7): [True: 0, False: 254]
  ------------------
  285|      0|    bcProvider_->adviseStringTableRandom();
  286|      0|  }
  287|       |
  288|    254|  if (strTableSize == 0) {
  ------------------
  |  Branch (288:7): [True: 99, False: 155]
  ------------------
  289|       |    // If the string table turns out to be empty,
  290|       |    // we always add one empty string to it.
  291|       |    // Note that this can only happen when we are creating the RuntimeModule
  292|       |    // in a non-standard way, either in unit tests or the special
  293|       |    // emptyCodeBlockRuntimeModule_ in Runtime where the creation happens
  294|       |    // manually instead of going through bytecode module generation.
  295|       |    // In those cases, functions will be created with a default nameID=0
  296|       |    // without adding the name string into the string table. Hence here
  297|       |    // we need to add it manually and it will have index 0.
  298|     99|    ASCIIRef s;
  299|     99|    stringIDMap_.push_back({});
  300|     99|    mapStringMayAllocate(s, 0, hashString(s));
  301|     99|  }
  302|    254|}
_ZN6hermes2vm13RuntimeModule21initializeFunctionMapEv:
  304|    254|void RuntimeModule::initializeFunctionMap() {
  305|    254|  assert(bcProvider_ && "Uninitialized RuntimeModule");
  306|      0|  assert(
  307|    254|      bcProvider_->getFunctionCount() >= functionMap_.size() &&
  308|    254|      "Unexpected size reduction. Lazy module missing functions?");
  309|      0|  functionMap_.resize(bcProvider_->getFunctionCount());
  310|    254|}
_ZN6hermes2vm13RuntimeModule20importCJSModuleTableEv:
  312|    155|ExecutionStatus RuntimeModule::importCJSModuleTable() {
  313|    155|  PerfSection perf("Import CJS Module Table");
  314|    155|  return Domain::importCJSModuleTable(getDomain(runtime_), runtime_, this);
  315|    155|}
_ZN6hermes2vm13RuntimeModule36getStringPrimFromStringIDMayAllocateEj:
  318|  1.98k|    StringID stringID) {
  319|  1.98k|  return runtime_.getStringPrimFromSymbolID(
  320|  1.98k|      getSymbolIDFromStringIDMayAllocate(stringID));
  321|  1.98k|}
_ZNK6hermes2vm13RuntimeModule29getRegExpBytecodeFromRegExpIDEj:
  348|    242|    uint32_t regExpId) const {
  349|    242|  assert(
  350|    242|      regExpId < bcProvider_->getRegExpTable().size() && "Invalid regexp id");
  351|      0|  RegExpTableEntry entry = bcProvider_->getRegExpTable()[regExpId];
  352|    242|  return bcProvider_->getRegExpStorage().slice(entry.offset, entry.length);
  353|    242|}
_ZN6hermes2vm13RuntimeModule9markRootsERNS0_12RootAcceptorEb:
  381|  17.0k|void RuntimeModule::markRoots(RootAcceptor &acceptor, bool markLongLived) {
  382|  17.0k|  for (auto &it : templateMap_) {
  ------------------
  |  Branch (382:17): [True: 12.3k, False: 17.0k]
  ------------------
  383|  12.3k|    acceptor.acceptPtr(it.second);
  384|  12.3k|  }
  385|       |
  386|  17.0k|  if (markLongLived) {
  ------------------
  |  Branch (386:7): [True: 12.1k, False: 4.94k]
  ------------------
  387|   135k|    for (auto symbol : stringIDMap_) {
  ------------------
  |  Branch (387:22): [True: 135k, False: 12.1k]
  ------------------
  388|   135k|      if (symbol.isValid()) {
  ------------------
  |  Branch (388:11): [True: 96.5k, False: 38.8k]
  ------------------
  389|  96.5k|        acceptor.accept(symbol);
  390|  96.5k|      }
  391|   135k|    }
  392|  12.1k|  }
  393|  17.0k|}
_ZN6hermes2vm13RuntimeModule22markLongLivedWeakRootsERNS0_16WeakRootAcceptorE:
  395|  12.0k|void RuntimeModule::markLongLivedWeakRoots(WeakRootAcceptor &acceptor) {
  396|  86.6k|  for (auto &cbPtr : functionMap_) {
  ------------------
  |  Branch (396:20): [True: 86.6k, False: 12.0k]
  ------------------
  397|       |    // Only mark a CodeBlock is its non-null, and has not been scanned
  398|       |    // previously in this top-level markRoots invocation.
  399|  86.6k|    if (cbPtr != nullptr && cbPtr->getRuntimeModule() == this) {
  ------------------
  |  Branch (399:9): [True: 55.6k, False: 31.0k]
  |  Branch (399:29): [True: 46.1k, False: 9.43k]
  ------------------
  400|  46.1k|      cbPtr->markCachedHiddenClasses(runtime_, acceptor);
  401|  46.1k|    }
  402|  86.6k|  }
  403|  12.0k|  for (auto &entry : objectLiteralHiddenClasses_) {
  ------------------
  |  Branch (403:20): [True: 0, False: 12.0k]
  ------------------
  404|      0|    if (entry.second) {
  ------------------
  |  Branch (404:9): [True: 0, False: 0]
  ------------------
  405|      0|      acceptor.acceptWeak(entry.second);
  406|      0|    }
  407|      0|  }
  408|  12.0k|}
_ZNK6hermes2vm13RuntimeModule28findCachedLiteralHiddenClassERNS0_7RuntimeEjj:
  413|  1.10k|    unsigned numLiterals) const {
  414|  1.10k|  if (canGenerateLiteralHiddenClassCacheKey(keyBufferIndex, numLiterals)) {
  ------------------
  |  Branch (414:7): [True: 1.10k, False: 0]
  ------------------
  415|  1.10k|    const auto cachedHiddenClassIter = objectLiteralHiddenClasses_.find(
  416|  1.10k|        getLiteralHiddenClassCacheHashKey(keyBufferIndex, numLiterals));
  417|  1.10k|    if (cachedHiddenClassIter != objectLiteralHiddenClasses_.end()) {
  ------------------
  |  Branch (417:9): [True: 645, False: 464]
  ------------------
  418|    645|      if (HiddenClass *const cachedHiddenClass =
  ------------------
  |  Branch (418:30): [True: 645, False: 0]
  ------------------
  419|    645|              cachedHiddenClassIter->second.get(runtime, runtime.getHeap())) {
  420|    645|        return runtime_.makeHandle(cachedHiddenClass);
  421|    645|      }
  422|    645|    }
  423|  1.10k|  }
  424|    464|  return llvh::None;
  425|  1.10k|}
_ZN6hermes2vm13RuntimeModule26tryCacheLiteralHiddenClassERNS0_7RuntimeEjPNS0_11HiddenClassE:
  430|    232|    HiddenClass *clazz) {
  431|    232|  auto numLiterals = clazz->getNumProperties();
  432|    232|  if (canGenerateLiteralHiddenClassCacheKey(keyBufferIndex, numLiterals)) {
  ------------------
  |  Branch (432:7): [True: 232, False: 0]
  ------------------
  433|    232|    assert(
  434|    232|        !findCachedLiteralHiddenClass(runtime, keyBufferIndex, numLiterals)
  435|    232|             .hasValue() &&
  436|    232|        "Why are we caching an item already cached?");
  437|      0|    objectLiteralHiddenClasses_[getLiteralHiddenClassCacheHashKey(
  438|    232|                                    keyBufferIndex, numLiterals)]
  439|    232|        .set(runtime, clazz);
  440|    232|  }
  441|    232|}
_ZN6hermes2vm13RuntimeModule20mapStringMayAllocateIDsEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEjj:
  359|    273|    uint32_t hash) {
  360|       |  // Create a SymbolID for a given string. In general a SymbolID holds onto an
  361|       |  // intern'd StringPrimitive. As an optimization, if this RuntimeModule is
  362|       |  // persistent, then it will not be deallocated before the Runtime, and we can
  363|       |  // have the SymbolID hold a raw pointer into the storage and produce the
  364|       |  // StringPrimitive when it is first required.
  365|    273|  SymbolID id;
  366|    273|  if (flags_.persistent) {
  ------------------
  |  Branch (366:7): [True: 273, False: 0]
  ------------------
  367|       |    // Registering a lazy identifier does not allocate, so we do not need a
  368|       |    // GC scope.
  369|    273|    id = runtime_.getIdentifierTable().registerLazyIdentifier(str, hash);
  370|    273|  } else {
  371|       |    // Accessing a symbol non-lazily may allocate in the GC heap, so add a scope
  372|       |    // marker.
  373|      0|    GCScopeMarkerRAII scopeMarker{runtime_};
  374|      0|    id = *runtime_.ignoreAllocationFailure(
  375|      0|        runtime_.getIdentifierTable().getSymbolHandle(runtime_, str, hash));
  376|      0|  }
  377|    273|  stringIDMap_[stringID] = RootSymbolID(id);
  378|    273|  return id;
  379|    273|}
_ZN6hermes2vm13RuntimeModule20mapStringMayAllocateIcEENS0_8SymbolIDEN4llvh8ArrayRefIT_EEjj:
  359|  8.03k|    uint32_t hash) {
  360|       |  // Create a SymbolID for a given string. In general a SymbolID holds onto an
  361|       |  // intern'd StringPrimitive. As an optimization, if this RuntimeModule is
  362|       |  // persistent, then it will not be deallocated before the Runtime, and we can
  363|       |  // have the SymbolID hold a raw pointer into the storage and produce the
  364|       |  // StringPrimitive when it is first required.
  365|  8.03k|  SymbolID id;
  366|  8.03k|  if (flags_.persistent) {
  ------------------
  |  Branch (366:7): [True: 7.93k, False: 99]
  ------------------
  367|       |    // Registering a lazy identifier does not allocate, so we do not need a
  368|       |    // GC scope.
  369|  7.93k|    id = runtime_.getIdentifierTable().registerLazyIdentifier(str, hash);
  370|  7.93k|  } else {
  371|       |    // Accessing a symbol non-lazily may allocate in the GC heap, so add a scope
  372|       |    // marker.
  373|     99|    GCScopeMarkerRAII scopeMarker{runtime_};
  374|     99|    id = *runtime_.ignoreAllocationFailure(
  375|     99|        runtime_.getIdentifierTable().getSymbolHandle(runtime_, str, hash));
  376|     99|  }
  377|  8.03k|  stringIDMap_[stringID] = RootSymbolID(id);
  378|  8.03k|  return id;
  379|  8.03k|}

_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment6createERNS0_7RuntimeE:
   45|  1.09k|SegmentedArrayBase<HVType>::Segment::create(Runtime &runtime) {
   46|       |  // NOTE: This needs to live in the cpp file instead of the header because it
   47|       |  // uses PseudoHandle, which requires a specialization of IsGCObject for the
   48|       |  // type it constructs.
   49|  1.09k|  return createPseudoHandle(runtime.makeAFixed<Segment>());
   50|  1.09k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE7Segment9setLengthERNS0_7RuntimeEj:
   55|   532k|    uint32_t newLength) {
   56|   532k|  const auto len = length();
   57|   532k|  if (newLength > len) {
  ------------------
  |  Branch (57:7): [True: 532k, False: 514]
  ------------------
   58|       |    // Length is increasing, fill with emptys.
   59|   532k|    GCHVType::uninitialized_fill(
   60|   532k|        data_ + len,
   61|   532k|        data_ + newLength,
   62|   532k|        HVType::encodeEmptyValue(),
   63|   532k|        runtime.getHeap());
   64|   532k|    length_.store(newLength, std::memory_order_release);
   65|   532k|  } else if (newLength < len) {
  ------------------
  |  Branch (65:14): [True: 0, False: 514]
  ------------------
   66|       |    // If length is decreasing a write barrier needs to be done.
   67|      0|    GCHVType::rangeUnreachableWriteBarrier(
   68|      0|        data_ + newLength, data_ + len, runtime.getHeap());
   69|      0|    length_.store(newLength, std::memory_order_release);
   70|      0|  }
   71|   532k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEj:
  111|   415k|SegmentedArrayBase<HVType>::create(Runtime &runtime, size_type capacity) {
  112|   415k|  if (LLVM_UNLIKELY(capacity > maxElements())) {
  ------------------
  |  |  189|   415k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 415k]
  |  |  ------------------
  ------------------
  113|      0|    return throwExcessiveCapacityError(runtime, capacity);
  114|      0|  }
  115|       |  // Leave the segments as null. Whenever the size is changed, the segments
  116|       |  // will be allocated. Note that this means the capacity argument won't be
  117|       |  // reflected in capacity() if it is larger than the inline storage space.
  118|       |  // That is in order to avoid having an extra field to track, and the upper
  119|       |  // bound of "size" can be used instead.
  120|   415k|  const auto allocSize = allocationSizeForCapacity(capacity);
  121|   415k|  return createPseudoHandle(
  122|   415k|      runtime.makeAVariable<SegmentedArrayBase>(allocSize));
  123|   415k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6createERNS0_7RuntimeEjj:
  142|      7|    HVType>::create(Runtime &runtime, size_type capacity, size_type size) {
  143|      7|  auto arrRes = create(runtime, capacity);
  144|      7|  if (LLVM_UNLIKELY(arrRes == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|      7|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 7]
  |  |  ------------------
  ------------------
  145|      0|    return ExecutionStatus::EXCEPTION;
  146|      0|  }
  147|      7|  PseudoHandle<SegmentedArrayBase> self = std::move(*arrRes);
  148|       |  // TODO T25663446: This is potentially optimizable to iterate over the
  149|       |  // inline storage and the segments separately.
  150|      7|  self = increaseSize(runtime, std::move(self), size);
  151|      7|  return self;
  152|      7|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE8capacityEv:
  156|  3.06M|SegmentedArrayBase<HVType>::capacity() const {
  157|  3.06M|  const auto numSlotsUsed = numSlotsUsed_.load(std::memory_order_relaxed);
  158|  3.06M|  if (numSlotsUsed <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (158:7): [True: 1.46M, False: 1.59M]
  ------------------
  159|       |    // In the case where the size is less than the number of inline elements,
  160|       |    // the capacity is at most slotCapacity, or the segment threshold if slot
  161|       |    // capacity goes beyond that.
  162|  1.46M|    return std::min(slotCapacity(), size_type{kValueToSegmentThreshold});
  163|  1.59M|  } else {
  164|       |    // Any slot after numSlotsUsed_ is guaranteed to be null.
  165|  1.59M|    return kValueToSegmentThreshold +
  166|  1.59M|        (numSlotsUsed - kValueToSegmentThreshold) * Segment::kMaxLength;
  167|  1.59M|  }
  168|  3.06M|}
_ZNK6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20totalCapacityOfSpineEv:
  172|    615|SegmentedArrayBase<HVType>::totalCapacityOfSpine() const {
  173|    615|  const auto slotCap = slotCapacity();
  174|    615|  if (slotCap <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (174:7): [True: 77, False: 538]
  ------------------
  175|     77|    return slotCap;
  176|    538|  } else {
  177|    538|    return kValueToSegmentThreshold +
  178|    538|        (slotCap - kValueToSegmentThreshold) * Segment::kMaxLength;
  179|    538|  }
  180|    615|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE6resizeERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  201|    615|    size_type newSize) {
  202|    615|  if (newSize > self->size(runtime)) {
  ------------------
  |  Branch (202:7): [True: 615, False: 0]
  ------------------
  203|    615|    return growRight(self, runtime, newSize - self->size(runtime));
  204|    615|  } else if (newSize < self->size(runtime)) {
  ------------------
  |  Branch (204:14): [True: 0, False: 0]
  ------------------
  205|      0|    self->shrinkRight(runtime, self->size(runtime) - newSize);
  206|      0|  }
  207|      0|  return ExecutionStatus::RETURNED;
  208|    615|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE20resizeWithinCapacityEPS3_RNS0_7RuntimeEj:
  229|  1.02M|    size_type newSize) {
  230|  1.02M|  const size_type currSize = self->size(runtime);
  231|  1.02M|  assert(
  232|  1.02M|      newSize <= self->capacity() &&
  233|  1.02M|      "Cannot resizeWithinCapacity to a size not within capacity");
  234|  1.02M|  if (newSize > currSize) {
  ------------------
  |  Branch (234:7): [True: 1.02M, False: 0]
  ------------------
  235|  1.02M|    self->increaseSizeWithinCapacity(runtime, newSize - currSize);
  236|  1.02M|  } else if (newSize < currSize) {
  ------------------
  |  Branch (236:14): [True: 0, False: 0]
  ------------------
  237|      0|    self->shrinkRight(runtime, currSize - newSize);
  238|      0|  }
  239|  1.02M|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE15allocateSegmentERNS0_7RuntimeENS0_6HandleIS3_EEj:
  258|  1.09k|    SegmentNumber segment) {
  259|  1.09k|  assert(
  260|  1.09k|      self->segmentAtPossiblyUnallocated(segment)->isEmpty() &&
  261|  1.09k|      "Allocating into a non-empty segment");
  262|      0|  PseudoHandle<Segment> c = Segment::create(runtime);
  263|  1.09k|  self->segmentAtPossiblyUnallocated(segment)->set(
  264|  1.09k|      HVType::encodeObjectValue(c.get(), runtime), runtime.getHeap());
  265|  1.09k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE9growRightERNS0_13MutableHandleIS3_EERNS0_7RuntimeEj:
  271|    615|    size_type amount) {
  272|    615|  if (self->size(runtime) + amount <= self->totalCapacityOfSpine()) {
  ------------------
  |  Branch (272:7): [True: 508, False: 107]
  ------------------
  273|    508|    increaseSize(runtime, self, amount);
  274|    508|    return ExecutionStatus::RETURNED;
  275|    508|  }
  276|    107|  const auto newSize = self->size(runtime) + amount;
  277|       |  // Allocate a new SegmentedArray according to the resize policy.
  278|    107|  auto arrRes =
  279|    107|      create(runtime, calculateNewCapacity(self->size(runtime), newSize));
  280|    107|  if (arrRes == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (280:7): [True: 0, False: 107]
  ------------------
  281|      0|    return ExecutionStatus::EXCEPTION;
  282|      0|  }
  283|    107|  PseudoHandle<SegmentedArrayBase> newSegmentedArray = std::move(*arrRes);
  284|       |  // Copy inline storage and segments over.
  285|       |  // Do this with raw pointers so that the range write barrier occurs.
  286|    107|  const auto numSlotsUsed = self->numSlotsUsed_.load(std::memory_order_relaxed);
  287|    107|  GCHVType::uninitialized_copy(
  288|    107|      self->inlineStorage(),
  289|    107|      self->inlineStorage() + numSlotsUsed,
  290|    107|      newSegmentedArray->inlineStorage(),
  291|    107|      runtime.getHeap());
  292|       |  // Set the size of the new array to be the same as the old array's size.
  293|    107|  newSegmentedArray->numSlotsUsed_.store(
  294|    107|      numSlotsUsed, std::memory_order_release);
  295|    107|  newSegmentedArray =
  296|    107|      increaseSize(runtime, std::move(newSegmentedArray), amount);
  297|       |  // Assign back to self.
  298|    107|  self = newSegmentedArray.get();
  299|    107|  return ExecutionStatus::RETURNED;
  300|    107|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE26increaseSizeWithinCapacityERNS0_7RuntimeEj:
  376|  1.02M|    size_type amount) {
  377|       |  // This function has the same logic as increaseSize, but removes some
  378|       |  // complexity from avoiding dealing with alllocations.
  379|  1.02M|  const auto currSize = size(runtime);
  380|  1.02M|  const auto finalSize = currSize + amount;
  381|  1.02M|  assert(
  382|  1.02M|      finalSize <= capacity() &&
  383|  1.02M|      "Cannot use increaseSizeWithinCapacity without checking for capacity first");
  384|       |
  385|  1.02M|  if (finalSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (385:7): [True: 489k, False: 530k]
  ------------------
  386|       |    // currSize and finalSize are inside inline storage, bump and fill.
  387|   489k|    GCHVType::uninitialized_fill(
  388|   489k|        inlineStorage() + currSize,
  389|   489k|        inlineStorage() + finalSize,
  390|   489k|        HVType::encodeEmptyValue(),
  391|   489k|        runtime.getHeap());
  392|       |    // Set the final size.
  393|   489k|    numSlotsUsed_.store(finalSize, std::memory_order_release);
  394|   489k|    return;
  395|   489k|  }
  396|       |  // Since this change is within capacity, it is at most filling up a single
  397|       |  // segment.
  398|   530k|  const SegmentNumber segment = toSegment(finalSize - 1);
  399|   530k|  const auto segmentLength = toInterior(finalSize - 1) + 1;
  400|       |  // Fill the inline slots if necessary, and the single segment.
  401|   530k|  if (currSize < kValueToSegmentThreshold) {
  ------------------
  |  Branch (401:7): [True: 0, False: 530k]
  ------------------
  402|      0|    GCHVType::uninitialized_fill(
  403|      0|        inlineStorage() + currSize,
  404|      0|        inlineStorage() + kValueToSegmentThreshold,
  405|      0|        HVType::encodeEmptyValue(),
  406|      0|        runtime.getHeap());
  407|      0|  }
  408|   530k|  segmentAt(runtime, segment)->setLength(runtime, segmentLength);
  409|   530k|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE12increaseSizeERNS0_7RuntimeENS0_12PseudoHandleIS3_EEj:
  416|    622|    size_type amount) {
  417|    622|  const auto currSize = self->size(runtime);
  418|    622|  const auto finalSize = currSize + amount;
  419|       |
  420|    622|  if (finalSize <= self->capacity()) {
  ------------------
  |  Branch (420:7): [True: 77, False: 545]
  ------------------
  421|     77|    self->increaseSizeWithinCapacity(runtime, amount);
  422|     77|    return self;
  423|     77|  }
  424|       |
  425|       |  // Inline slots must be reserved by the caller. Since finalSize is greater
  426|       |  // than the capacity, we know that it must require adding segments.
  427|    545|  assert(finalSize > kValueToSegmentThreshold);
  428|       |
  429|       |  // currSize might be in inline storage, but finalSize is definitely in
  430|       |  // segments.
  431|       |  // Allocate missing segments after filling inline storage.
  432|    545|  if (currSize <= kValueToSegmentThreshold) {
  ------------------
  |  Branch (432:7): [True: 25, False: 520]
  ------------------
  433|       |    // Segments will need to be allocated, if the old size didn't have the
  434|       |    // inline storage filled up, fill it up now.
  435|     25|    GCHVType::uninitialized_fill(
  436|     25|        self->inlineStorage() + currSize,
  437|     25|        self->inlineStorage() + kValueToSegmentThreshold,
  438|     25|        HVType::encodeEmptyValue(),
  439|     25|        runtime.getHeap());
  440|       |    // Set the size to the inline storage threshold.
  441|     25|    self->numSlotsUsed_.store(
  442|     25|        kValueToSegmentThreshold, std::memory_order_release);
  443|     25|  }
  444|       |
  445|       |  // NOTE: during this function, allocations can happen.
  446|       |  // If one of these allocations triggers a full compacting GC, then the array
  447|       |  // currently being increased might have its capacity shrunk to match its
  448|       |  // numSlotsUsed. So, increase numSlotsUsed immediately to its final value
  449|       |  // before the allocations happen so it isn't shrunk, and also fill with
  450|       |  // empty values so that any mark passes don't fail. The segments should all
  451|       |  // have length 0 until allocations are finished, so that uninitialized
  452|       |  // memory is not scanned inside the segments. Once allocations are finished,
  453|       |  // go back and fixup the lengths.
  454|    545|  const SegmentNumber startSegment =
  455|    545|      currSize <= kValueToSegmentThreshold ? 0 : toSegment(currSize - 1);
  ------------------
  |  Branch (455:7): [True: 25, False: 520]
  ------------------
  456|    545|  const SegmentNumber lastSegment = toSegment(finalSize - 1);
  457|    545|  const auto newNumSlotsUsed = numSlotsForCapacity(finalSize);
  458|       |  // Put empty values into all of the added slots so that the memory is not
  459|       |  // uninitialized during marking.
  460|    545|  GCHVType::uninitialized_fill(
  461|    545|      self->inlineStorage() +
  462|    545|          self->numSlotsUsed_.load(std::memory_order_relaxed),
  463|    545|      self->inlineStorage() + newNumSlotsUsed,
  464|    545|      HVType::encodeEmptyValue(),
  465|    545|      runtime.getHeap());
  466|    545|  self->numSlotsUsed_.store(newNumSlotsUsed, std::memory_order_release);
  467|       |
  468|       |  // Allocate a handle to track the current array.
  469|    545|  auto selfHandle = runtime.makeHandle(std::move(self));
  470|       |  // Allocate each segment.
  471|    545|  if (startSegment <= lastSegment &&
  ------------------
  |  Branch (471:7): [True: 545, False: 0]
  ------------------
  472|    545|      selfHandle->segmentAtPossiblyUnallocated(startSegment)->isEmpty()) {
  ------------------
  |  Branch (472:7): [True: 25, False: 520]
  ------------------
  473|       |    // The start segment might already be allocated if it was half full when
  474|       |    // we increase the size.
  475|     25|    allocateSegment(runtime, selfHandle, startSegment);
  476|     25|  }
  477|  1.61k|  for (auto i = startSegment + 1; i <= lastSegment; ++i) {
  ------------------
  |  Branch (477:35): [True: 1.06k, False: 545]
  ------------------
  478|       |    // All segments except the start need to become allocated.
  479|  1.06k|    allocateSegment(runtime, selfHandle, i);
  480|  1.06k|  }
  481|       |
  482|       |  // Now that all allocations have occurred, set the lengths inside each
  483|       |  // segment, and optionally fill.
  484|  2.15k|  for (auto i = startSegment; i <= lastSegment; ++i) {
  ------------------
  |  Branch (484:31): [True: 1.61k, False: 545]
  ------------------
  485|       |    // If its the last chunk, set to the length required by any leftover
  486|       |    // elements.
  487|  1.61k|    const auto segmentLength =
  488|  1.61k|        i == lastSegment ? toInterior(finalSize - 1) + 1 : Segment::kMaxLength;
  ------------------
  |  Branch (488:9): [True: 545, False: 1.06k]
  ------------------
  489|  1.61k|    selfHandle->segmentAt(runtime, i)->setLength(runtime, segmentLength);
  490|  1.61k|  }
  491|    545|  self = selfHandle;
  492|    545|  return self;
  493|    622|}
_ZN6hermes2vm18SegmentedArrayBaseINS0_13HermesValue32EE17_trimSizeCallbackEPKNS0_6GCCellE:
  522|  3.00k|gcheapsize_t SegmentedArrayBase<HVType>::_trimSizeCallback(const GCCell *cell) {
  523|  3.00k|  const auto *self = reinterpret_cast<const SegmentedArrayBase *>(cell);
  524|       |  // This array will shrink so that it has the same slot capacity as the slot
  525|       |  // size.
  526|  3.00k|  return allocationSizeForSlots(
  527|  3.00k|      self->numSlotsUsed_.load(std::memory_order_relaxed));
  528|  3.00k|}
_ZN6hermes2vm16SegmentBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   32|      1|void SegmentBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   33|      1|  const auto *self = static_cast<const SegmentedArray::Segment *>(cell);
   34|      1|  mb.setVTable(&SegmentedArray::Segment::vt);
   35|      1|  mb.addArray("data", self->data_, &self->length_, sizeof(GCHermesValue));
   36|      1|}
_ZN6hermes2vm21SegmentSmallBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   37|      1|void SegmentSmallBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   38|      1|  const auto *self = static_cast<const SegmentedArraySmall::Segment *>(cell);
   39|      1|  mb.setVTable(&SegmentedArraySmall::Segment::vt);
   40|      1|  mb.addArray("data", self->data_, &self->length_, sizeof(GCSmallHermesValue));
   41|      1|}
_ZN6hermes2vm23SegmentedArrayBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   89|      1|void SegmentedArrayBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   90|      1|  const auto *self = static_cast<const SegmentedArray *>(cell);
   91|      1|  mb.setVTable(&SegmentedArray::vt);
   92|      1|  mb.addArray(
   93|      1|      "slots",
   94|      1|      self->inlineStorage(),
   95|      1|      &self->numSlotsUsed_,
   96|      1|      sizeof(GCHermesValue));
   97|      1|}
_ZN6hermes2vm28SegmentedArraySmallBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   99|      1|void SegmentedArraySmallBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
  100|      1|  const auto *self = static_cast<const SegmentedArraySmall *>(cell);
  101|      1|  mb.setVTable(&SegmentedArraySmall::vt);
  102|      1|  mb.addArray(
  103|      1|      "slots",
  104|      1|      self->inlineStorage(),
  105|      1|      &self->numSlotsUsed_,
  106|      1|      sizeof(GCSmallHermesValue));
  107|      1|}

_ZN6hermes2vm23SerializedLiteralParser3getERNS0_7RuntimeE:
   21|   461k|HermesValue SerializedLiteralParser::get(Runtime &) {
   22|   461k|  assert(hasNext() && "Object buffer doesn't have any more values");
   23|       |
   24|   461k|  if (leftInSeq_ == 0)
  ------------------
  |  Branch (24:7): [True: 13.0k, False: 448k]
  ------------------
   25|  13.0k|    parseTagAndSeqLength();
   26|   461k|  leftInSeq_--;
   27|   461k|  elemsLeft_--;
   28|       |
   29|       |  // Passing the nullptr instead of a RuntimeModule signifies that
   30|       |  // the generator is generating object key values, and that it should
   31|       |  // just return the StringID rather than find a String Primitive.
   32|   461k|  switch (lastTag_) {
  ------------------
  |  Branch (32:11): [True: 0, False: 461k]
  ------------------
   33|  2.29k|    case SLG::ByteStringTag: {
  ------------------
  |  Branch (33:5): [True: 2.29k, False: 458k]
  ------------------
   34|  2.29k|      uint8_t val = llvh::support::endian::read<uint8_t, 1>(
   35|  2.29k|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   36|  2.29k|      currIdx_ += 1;
   37|  2.29k|      return runtimeModule_ == nullptr
  ------------------
  |  Branch (37:14): [True: 2.29k, False: 0]
  ------------------
   38|  2.29k|          ? HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(val))
   39|  2.29k|          : HermesValue::encodeStringValue(
   40|      0|                runtimeModule_->getStringPrimFromStringIDMayAllocate(val));
   41|      0|    }
   42|      0|    case SLG::ShortStringTag: {
  ------------------
  |  Branch (42:5): [True: 0, False: 461k]
  ------------------
   43|      0|      uint16_t val = llvh::support::endian::read<uint16_t, 1>(
   44|      0|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   45|      0|      currIdx_ += 2;
   46|      0|      return runtimeModule_ == nullptr
  ------------------
  |  Branch (46:14): [True: 0, False: 0]
  ------------------
   47|      0|          ? HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(val))
   48|      0|          : HermesValue::encodeStringValue(
   49|      0|                runtimeModule_->getStringPrimFromStringIDMayAllocate(val));
   50|      0|    }
   51|      0|    case SLG::LongStringTag: {
  ------------------
  |  Branch (51:5): [True: 0, False: 461k]
  ------------------
   52|      0|      uint32_t val = llvh::support::endian::read<uint32_t, 1>(
   53|      0|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   54|      0|      currIdx_ += 4;
   55|      0|      return runtimeModule_ == nullptr
  ------------------
  |  Branch (55:14): [True: 0, False: 0]
  ------------------
   56|      0|          ? HermesValue::encodeSymbolValue(SymbolID::unsafeCreate(val))
   57|      0|          : HermesValue::encodeStringValue(
   58|      0|                runtimeModule_->getStringPrimFromStringIDMayAllocate(val));
   59|      0|    }
   60|      1|    case SLG::NumberTag: {
  ------------------
  |  Branch (60:5): [True: 1, False: 461k]
  ------------------
   61|      1|      double val = llvh::support::endian::read<double, 1>(
   62|      1|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   63|      1|      currIdx_ += 8;
   64|      1|      return HermesValue::encodeNumberValue(val);
   65|      0|    }
   66|   457k|    case SLG::IntegerTag: {
  ------------------
  |  Branch (66:5): [True: 457k, False: 4.15k]
  ------------------
   67|   457k|      int32_t val = llvh::support::endian::read<int32_t, 1>(
   68|   457k|          buffer_.data() + currIdx_, llvh::support::endianness::little);
   69|   457k|      currIdx_ += 4;
   70|   457k|      return HermesValue::encodeNumberValue(val);
   71|      0|    }
   72|      0|    case SLG::NullTag:
  ------------------
  |  Branch (72:5): [True: 0, False: 461k]
  ------------------
   73|      0|      return HermesValue::encodeNullValue();
   74|      0|    case SLG::TrueTag:
  ------------------
  |  Branch (74:5): [True: 0, False: 461k]
  ------------------
   75|      0|      return HermesValue::encodeBoolValue(true);
   76|  1.86k|    case SLG::FalseTag:
  ------------------
  |  Branch (76:5): [True: 1.86k, False: 459k]
  ------------------
   77|  1.86k|      return HermesValue::encodeBoolValue(false);
   78|   461k|  }
   79|      0|  llvm_unreachable("No other valid tag");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
   80|   461k|}

_ZN6hermes2vm15JSMathBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   13|      1|void JSMathBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   14|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSMath>());
   15|      1|  JSObjectBuildMeta(cell, mb);
   16|      1|  mb.setVTable(&JSMath::vt);
   17|      1|}
_ZN6hermes2vm15JSJSONBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   19|      1|void JSJSONBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   20|      1|  mb.addJSObjectOverlapSlots(JSObject::numOverlapSlots<JSJSON>());
   21|      1|  JSObjectBuildMeta(cell, mb);
   22|      1|  mb.setVTable(&JSJSON::vt);
   23|      1|}

_ZN6hermes2vm15StorageProviderD2Ev:
  169|     99|StorageProvider::~StorageProvider() {
  170|     99|  assert(numLiveAllocs() == 0);
  171|     99|}
_ZN6hermes2vm15StorageProvider20contiguousVAProviderEm:
  180|     99|    size_t size) {
  181|     99|  return std::make_unique<ContiguousVAStorageProvider>(size);
  182|     99|}
_ZN6hermes2vm15StorageProvider10newStorageEPKc:
  189|    302|llvh::ErrorOr<void *> StorageProvider::newStorage(const char *name) {
  190|    302|  auto res = newStorageImpl(name);
  191|       |
  192|    302|  if (res) {
  ------------------
  |  Branch (192:7): [True: 302, False: 0]
  ------------------
  193|    302|    numSucceededAllocs_++;
  194|    302|  } else {
  195|      0|    numFailedAllocs_++;
  196|      0|  }
  197|       |
  198|    302|  return res;
  199|    302|}
_ZN6hermes2vm15StorageProvider13deleteStorageEPv:
  201|    302|void StorageProvider::deleteStorage(void *storage) {
  202|    302|  if (!storage) {
  ------------------
  |  Branch (202:7): [True: 0, False: 302]
  ------------------
  203|      0|    return;
  204|      0|  }
  205|       |
  206|    302|  numDeletedAllocs_++;
  207|    302|  deleteStorageImpl(storage);
  208|    302|}
_ZNK6hermes2vm15StorageProvider13numLiveAllocsEv:
  253|     99|size_t StorageProvider::numLiveAllocs() const {
  254|     99|  return numSucceededAllocs_ - numDeletedAllocs_;
  255|     99|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_110alignAllocEPv:
   37|     99|char *alignAlloc(void *p) {
   38|     99|  return reinterpret_cast<char *>(
   39|     99|      llvh::alignTo(reinterpret_cast<uintptr_t>(p), AlignedStorage::size()));
   40|     99|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_111getMmapHintEv:
   42|     99|void *getMmapHint() {
   43|     99|  uintptr_t addr = std::random_device()();
   44|     99|  if constexpr (sizeof(uintptr_t) >= 8) {
  ------------------
  |  Branch (44:17): [Folded - Ignored]
  ------------------
   45|       |    // std::random_device() yields an unsigned int, so combine two.
   46|     99|    addr = (addr << 32) | std::random_device()();
   47|       |    // Don't use the entire address space, to prevent too much fragmentation.
   48|     99|    addr &= std::numeric_limits<uintptr_t>::max() >> 18;
   49|     99|  }
   50|     99|  return alignAlloc(reinterpret_cast<void *>(addr));
   51|     99|}
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProviderC2Em:
   62|     99|      : size_(llvh::alignTo<AlignedStorage::size()>(size)) {
   63|     99|    auto result = oscompat::vm_reserve_aligned(
   64|     99|        size_, AlignedStorage::size(), getMmapHint());
   65|     99|    if (!result)
  ------------------
  |  Branch (65:9): [True: 0, False: 99]
  ------------------
   66|      0|      hermes_fatal("Contiguous storage allocation failed.", result.getError());
   67|     99|    level_ = start_ = static_cast<char *>(*result);
   68|     99|    oscompat::vm_name(start_, size_, kFreeRegionName);
   69|     99|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProviderD2Ev:
   70|     99|  ~ContiguousVAStorageProvider() override {
   71|     99|    oscompat::vm_release_aligned(start_, size_);
   72|     99|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProvider14newStorageImplEPKc:
   74|    302|  llvh::ErrorOr<void *> newStorageImpl(const char *name) override {
   75|    302|    void *storage;
   76|    302|    if (!freelist_.empty()) {
  ------------------
  |  Branch (76:9): [True: 0, False: 302]
  ------------------
   77|      0|      storage = freelist_.back();
   78|      0|      freelist_.pop_back();
   79|    302|    } else if (level_ < start_ + size_) {
  ------------------
  |  Branch (79:16): [True: 302, False: 0]
  ------------------
   80|    302|      storage = std::exchange(level_, level_ + AlignedStorage::size());
   81|    302|    } else {
   82|      0|      return make_error_code(OOMError::MaxStorageReached);
   83|      0|    }
   84|    302|    auto res = oscompat::vm_commit(storage, AlignedStorage::size());
   85|    302|    if (res) {
  ------------------
  |  Branch (85:9): [True: 302, False: 0]
  ------------------
   86|    302|      oscompat::vm_name(storage, AlignedStorage::size(), name);
   87|    302|    }
   88|    302|    return res;
   89|    302|  }
StorageProvider.cpp:_ZN6hermes2vm12_GLOBAL__N_127ContiguousVAStorageProvider17deleteStorageImplEPv:
   91|    302|  void deleteStorageImpl(void *storage) override {
   92|    302|    assert(
   93|    302|        !llvh::alignmentAdjustment(storage, AlignedStorage::size()) &&
   94|    302|        "Storage not aligned");
   95|      0|    assert(storage >= start_ && storage < level_ && "Storage not in region");
   96|      0|    oscompat::vm_name(storage, AlignedStorage::size(), kFreeRegionName);
   97|    302|    oscompat::vm_uncommit(storage, AlignedStorage::size());
   98|    302|    freelist_.push_back(storage);
   99|    302|  }

_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EEC2EN4llvh8ArrayRefIDsEE:
  413|  12.6k|    : DynamicStringPrimitive((uint32_t)src.size()) {
  414|  12.6k|  hermes::uninitializedCopy(
  415|  12.6k|      src.begin(), src.end(), this->template getTrailingObjects<T>());
  416|  12.6k|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE6createERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  421|      8|    Ref str) {
  422|      8|  assert(!isExternalLength(str.size()) && "length should not be external");
  423|      0|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  424|      8|      allocationSize((uint32_t)str.size()), str);
  425|      8|  return HermesValue::encodeStringValue(cell);
  426|      8|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  431|  12.6k|    Ref str) {
  432|  12.6k|  assert(!isExternalLength(str.size()) && "length should not be external");
  433|      0|  auto *obj = runtime.makeAVariable<
  434|  12.6k|      DynamicStringPrimitive<T, Uniqued>,
  435|  12.6k|      HasFinalizer::No,
  436|  12.6k|      LongLived::Yes>(allocationSize((uint32_t)str.size()), str);
  437|  12.6k|  return HermesValue::encodeStringValue(obj);
  438|  12.6k|}
_ZN6hermes2vm22DynamicStringPrimitiveIDsLb0EE6createERNS0_7RuntimeEj:
  443|   410k|    uint32_t length) {
  444|   410k|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  445|   410k|      allocationSize(length), length);
  446|   410k|  return HermesValue::encodeStringValue(cell);
  447|   410k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EEC2EN4llvh8ArrayRefIcEE:
  413|   261k|    : DynamicStringPrimitive((uint32_t)src.size()) {
  414|   261k|  hermes::uninitializedCopy(
  415|   261k|      src.begin(), src.end(), this->template getTrailingObjects<T>());
  416|   261k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE6createERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  421|   249k|    Ref str) {
  422|   249k|  assert(!isExternalLength(str.size()) && "length should not be external");
  423|      0|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  424|   249k|      allocationSize((uint32_t)str.size()), str);
  425|   249k|  return HermesValue::encodeStringValue(cell);
  426|   249k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE15createLongLivedERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  431|  12.6k|    Ref str) {
  432|  12.6k|  assert(!isExternalLength(str.size()) && "length should not be external");
  433|      0|  auto *obj = runtime.makeAVariable<
  434|  12.6k|      DynamicStringPrimitive<T, Uniqued>,
  435|  12.6k|      HasFinalizer::No,
  436|  12.6k|      LongLived::Yes>(allocationSize((uint32_t)str.size()), str);
  437|  12.6k|  return HermesValue::encodeStringValue(obj);
  438|  12.6k|}
_ZN6hermes2vm22DynamicStringPrimitiveIcLb0EE6createERNS0_7RuntimeEj:
  443|  49.4k|    uint32_t length) {
  444|  49.4k|  auto *cell = runtime.makeAVariable<DynamicStringPrimitive<T, Uniqued>>(
  445|  49.4k|      allocationSize(length), length);
  446|  49.4k|  return HermesValue::encodeStringValue(cell);
  447|  49.4k|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE15createLongLivedERNS0_7RuntimeEONSt3__112basic_stringIDsNS5_11char_traitsIDsEENS5_9allocatorIDsEEEE:
  496|     13|    StdString &&str) {
  497|     13|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     13|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  498|      0|    return runtime.raiseRangeError("String length exceeds limit");
  499|     13|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(
  ------------------
  |  |  189|     13|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 13]
  |  |  ------------------
  ------------------
  500|     13|          str.capacity() * sizeof(T)))) {
  501|      0|    return runtime.raiseRangeError(
  502|      0|        "Cannot allocate an external string primitive.");
  503|      0|  }
  504|       |  // Use variable size alloc since ExternalStringPrimitive is derived from
  505|       |  // VariableSizeRuntimeCell.
  506|     13|  auto *extStr = runtime.makeAVariable<
  507|     13|      ExternalStringPrimitive<T>,
  508|     13|      HasFinalizer::Yes,
  509|     13|      LongLived::Yes>(sizeof(ExternalStringPrimitive<T>), std::move(str));
  510|     13|  runtime.getHeap().creditExternalMemory(
  511|     13|      extStr, extStr->calcExternalMemorySize());
  512|     13|  return HermesValue::encodeStringValue(extStr);
  513|     13|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE6createERNS0_7RuntimeEj:
  518|     18|    uint32_t length) {
  519|     18|  assert(isExternalLength(length) && "length should be external");
  520|     18|  if (LLVM_UNLIKELY(length > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  521|      0|    return runtime.raiseRangeError("String length exceeds limit");
  522|     18|  uint32_t allocSize = length * sizeof(T);
  523|     18|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(allocSize))) {
  ------------------
  |  |  189|     18|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 18]
  |  |  ------------------
  ------------------
  524|      0|    return runtime.raiseRangeError(
  525|      0|        "Cannot allocate an external string primitive.");
  526|      0|  }
  527|     18|  return create(runtime, StdString(length, T(0)));
  528|     18|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  531|     61|void ExternalStringPrimitive<T>::_finalizeImpl(GCCell *cell, GC &gc) {
  532|     61|  ExternalStringPrimitive<T> *self = vmcast<ExternalStringPrimitive<T>>(cell);
  533|       |  // Remove the external string from the snapshot tracking system if it's being
  534|       |  // tracked.
  535|     61|  gc.getIDTracker().untrackNative(self->contents_.data());
  536|     61|  gc.debitExternalMemory(self, self->calcExternalMemorySize());
  537|     61|  self->~ExternalStringPrimitive<T>();
  538|     61|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE15createLongLivedERNS0_7RuntimeEONSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
  496|      5|    StdString &&str) {
  497|      5|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  498|      0|    return runtime.raiseRangeError("String length exceeds limit");
  499|      5|  if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(
  ------------------
  |  |  189|      5|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 5]
  |  |  ------------------
  ------------------
  500|      5|          str.capacity() * sizeof(T)))) {
  501|      0|    return runtime.raiseRangeError(
  502|      0|        "Cannot allocate an external string primitive.");
  503|      0|  }
  504|       |  // Use variable size alloc since ExternalStringPrimitive is derived from
  505|       |  // VariableSizeRuntimeCell.
  506|      5|  auto *extStr = runtime.makeAVariable<
  507|      5|      ExternalStringPrimitive<T>,
  508|      5|      HasFinalizer::Yes,
  509|      5|      LongLived::Yes>(sizeof(ExternalStringPrimitive<T>), std::move(str));
  510|      5|  runtime.getHeap().creditExternalMemory(
  511|      5|      extStr, extStr->calcExternalMemorySize());
  512|      5|  return HermesValue::encodeStringValue(extStr);
  513|      5|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE13_finalizeImplEPNS0_6GCCellERNS0_7HadesGCE:
  531|     65|void ExternalStringPrimitive<T>::_finalizeImpl(GCCell *cell, GC &gc) {
  532|     65|  ExternalStringPrimitive<T> *self = vmcast<ExternalStringPrimitive<T>>(cell);
  533|       |  // Remove the external string from the snapshot tracking system if it's being
  534|       |  // tracked.
  535|     65|  gc.getIDTracker().untrackNative(self->contents_.data());
  536|     65|  gc.debitExternalMemory(self, self->calcExternalMemorySize());
  537|     65|  self->~ExternalStringPrimitive<T>();
  538|     65|}
_ZN6hermes2vm23ExternalStringPrimitiveIcE6createINSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeEOT_:
  475|     60|    BasicString &&str) {
  476|     60|  static_assert(
  477|     60|      std::is_same<T, typename BasicString::value_type>::value,
  478|     60|      "ExternalStringPrimitive mismatched char type");
  479|     60|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     60|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 60]
  |  |  ------------------
  ------------------
  480|      0|    return runtime.raiseRangeError("String length exceeds limit");
  481|       |  // We have to use a variable sized alloc here even though the size is already
  482|       |  // known, because ExternalStringPrimitive is derived from
  483|       |  // VariableSizeRuntimeCell
  484|     60|  auto *extStr =
  485|     60|      runtime.makeAVariable<ExternalStringPrimitive<T>, HasFinalizer::Yes>(
  486|     60|          sizeof(ExternalStringPrimitive<T>), std::forward<BasicString>(str));
  487|     60|  runtime.getHeap().creditExternalMemory(
  488|     60|      extStr, extStr->calcExternalMemorySize());
  489|     60|  auto res = HermesValue::encodeStringValue(extStr);
  490|     60|  return res;
  491|     60|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsE6createINSt3__112basic_stringIDsNS4_11char_traitsIDsEENS4_9allocatorIDsEEEEEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeEOT_:
  475|     48|    BasicString &&str) {
  476|     48|  static_assert(
  477|     48|      std::is_same<T, typename BasicString::value_type>::value,
  478|     48|      "ExternalStringPrimitive mismatched char type");
  479|     48|  if (LLVM_UNLIKELY(str.size() > MAX_STRING_LENGTH))
  ------------------
  |  |  189|     48|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 48]
  |  |  ------------------
  ------------------
  480|      0|    return runtime.raiseRangeError("String length exceeds limit");
  481|       |  // We have to use a variable sized alloc here even though the size is already
  482|       |  // known, because ExternalStringPrimitive is derived from
  483|       |  // VariableSizeRuntimeCell
  484|     48|  auto *extStr =
  485|     48|      runtime.makeAVariable<ExternalStringPrimitive<T>, HasFinalizer::Yes>(
  486|     48|          sizeof(ExternalStringPrimitive<T>), std::forward<BasicString>(str));
  487|     48|  runtime.getHeap().creditExternalMemory(
  488|     48|      extStr, extStr->calcExternalMemorySize());
  489|     48|  auto res = HermesValue::encodeStringValue(extStr);
  490|     48|  return res;
  491|     48|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6createERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIDsEEEE:
  608|    162|    Handle<ExternalStringPrimitive<T>> storage) {
  609|       |  // We have to use a variable sized alloc here even though the size is already
  610|       |  // known, because BufferedStringPrimitive is derived from
  611|       |  // VariableSizeRuntimeCell.
  612|    162|  auto *cell = runtime.makeAVariable<BufferedStringPrimitive<T>>(
  613|    162|      sizeof(BufferedStringPrimitive<T>), runtime, length, storage);
  614|    162|  return createPseudoHandle<StringPrimitive>(cell);
  615|    162|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6appendENS0_6HandleIS2_EERNS0_7RuntimeENS3_INS0_15StringPrimitiveEEE:
  682|    152|    Handle<StringPrimitive> rightHnd) {
  683|    152|  NoAllocScope noAlloc{runtime};
  684|    152|  auto *self = selfHnd.get();
  685|    152|  auto *right = rightHnd.get();
  686|    152|  ExternalStringPrimitive<T> *storage = self->getConcatBuffer();
  687|       |
  688|    152|  assertValidLength(self, right);
  689|    152|  assert(
  690|    152|      (std::is_same<T, char16_t>::value || right->isASCII()) &&
  691|    152|      "cannot append UTF16 to ASCII");
  692|       |
  693|       |  // Can't append if this is not the end of the string.
  694|    152|  if (self->getStringLength() != storage->contents_.size()) {
  ------------------
  |  Branch (694:7): [True: 0, False: 152]
  ------------------
  695|      0|    noAlloc.release();
  696|      0|    return BufferedStringPrimitive<T>::create(runtime, selfHnd, rightHnd);
  697|      0|  }
  698|       |
  699|    152|  auto oldExternalMem = storage->calcExternalMemorySize();
  700|    152|  appendToCopyableString(storage->contents_, right);
  701|    152|  runtime.getHeap().creditExternalMemory(
  702|    152|      storage, storage->calcExternalMemorySize() - oldExternalMem);
  703|       |
  704|    152|  noAlloc.release();
  705|    152|  return BufferedStringPrimitive<T>::create(
  706|    152|      runtime, storage->contents_.size(), runtime.makeHandle(storage));
  707|    152|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE6createERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEES7_:
  654|     10|    Handle<StringPrimitive> rightHnd) {
  655|     10|  typename ExternalStringPrimitive<T>::CopyableStdString contents{};
  656|     10|  uint32_t len;
  657|       |
  658|     10|  {
  659|     10|    NoAllocScope noAlloc{runtime};
  660|     10|    auto *left = leftHnd.get();
  661|     10|    auto *right = rightHnd.get();
  662|       |
  663|     10|    assertValidLength(left, right);
  664|     10|    len = left->getStringLength() + right->getStringLength();
  665|       |
  666|     10|    contents.reserve(len);
  667|     10|    appendToCopyableString(contents, left);
  668|     10|    appendToCopyableString(contents, right);
  669|     10|  }
  670|       |
  671|     10|  auto storageHnd = runtime.makeHandle<ExternalStringPrimitive<T>>(
  672|     10|      runtime.ignoreAllocationFailure(
  673|     10|          ExternalStringPrimitive<T>::create(runtime, std::move(contents))));
  674|       |
  675|     10|  return create(runtime, len, storageHnd);
  676|     10|}
_ZN6hermes2vm23BufferedStringPrimitiveIcE6createERNS0_7RuntimeEjNS0_6HandleINS0_23ExternalStringPrimitiveIcEEEE:
  608|    711|    Handle<ExternalStringPrimitive<T>> storage) {
  609|       |  // We have to use a variable sized alloc here even though the size is already
  610|       |  // known, because BufferedStringPrimitive is derived from
  611|       |  // VariableSizeRuntimeCell.
  612|    711|  auto *cell = runtime.makeAVariable<BufferedStringPrimitive<T>>(
  613|    711|      sizeof(BufferedStringPrimitive<T>), runtime, length, storage);
  614|    711|  return createPseudoHandle<StringPrimitive>(cell);
  615|    711|}
_ZN6hermes2vm23BufferedStringPrimitiveIcE6appendENS0_6HandleIS2_EERNS0_7RuntimeENS3_INS0_15StringPrimitiveEEE:
  682|    651|    Handle<StringPrimitive> rightHnd) {
  683|    651|  NoAllocScope noAlloc{runtime};
  684|    651|  auto *self = selfHnd.get();
  685|    651|  auto *right = rightHnd.get();
  686|    651|  ExternalStringPrimitive<T> *storage = self->getConcatBuffer();
  687|       |
  688|    651|  assertValidLength(self, right);
  689|    651|  assert(
  690|    651|      (std::is_same<T, char16_t>::value || right->isASCII()) &&
  691|    651|      "cannot append UTF16 to ASCII");
  692|       |
  693|       |  // Can't append if this is not the end of the string.
  694|    651|  if (self->getStringLength() != storage->contents_.size()) {
  ------------------
  |  Branch (694:7): [True: 0, False: 651]
  ------------------
  695|      0|    noAlloc.release();
  696|      0|    return BufferedStringPrimitive<T>::create(runtime, selfHnd, rightHnd);
  697|      0|  }
  698|       |
  699|    651|  auto oldExternalMem = storage->calcExternalMemorySize();
  700|    651|  appendToCopyableString(storage->contents_, right);
  701|    651|  runtime.getHeap().creditExternalMemory(
  702|    651|      storage, storage->calcExternalMemorySize() - oldExternalMem);
  703|       |
  704|    651|  noAlloc.release();
  705|    651|  return BufferedStringPrimitive<T>::create(
  706|    651|      runtime, storage->contents_.size(), runtime.makeHandle(storage));
  707|    651|}
_ZN6hermes2vm23BufferedStringPrimitiveIcE6createERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEES7_:
  654|     60|    Handle<StringPrimitive> rightHnd) {
  655|     60|  typename ExternalStringPrimitive<T>::CopyableStdString contents{};
  656|     60|  uint32_t len;
  657|       |
  658|     60|  {
  659|     60|    NoAllocScope noAlloc{runtime};
  660|     60|    auto *left = leftHnd.get();
  661|     60|    auto *right = rightHnd.get();
  662|       |
  663|     60|    assertValidLength(left, right);
  664|     60|    len = left->getStringLength() + right->getStringLength();
  665|       |
  666|     60|    contents.reserve(len);
  667|     60|    appendToCopyableString(contents, left);
  668|     60|    appendToCopyableString(contents, right);
  669|     60|  }
  670|       |
  671|     60|  auto storageHnd = runtime.makeHandle<ExternalStringPrimitive<T>>(
  672|     60|      runtime.ignoreAllocationFailure(
  673|     60|          ExternalStringPrimitive<T>::create(runtime, std::move(contents))));
  674|       |
  675|     60|  return create(runtime, len, storageHnd);
  676|     60|}
_ZN6hermes2vm36DynamicASCIIStringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   29|      1|    Metadata::Builder &mb) {
   30|      1|  mb.setVTable(&DynamicASCIIStringPrimitive::vt);
   31|      1|}
_ZN6hermes2vm36DynamicUTF16StringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   34|      1|    Metadata::Builder &mb) {
   35|      1|  mb.setVTable(&DynamicUTF16StringPrimitive::vt);
   36|      1|}
_ZN6hermes2vm43DynamicUniquedASCIIStringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   40|      1|    Metadata::Builder &mb) {
   41|      1|  mb.setVTable(&DynamicUniquedASCIIStringPrimitive::vt);
   42|      1|}
_ZN6hermes2vm43DynamicUniquedUTF16StringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   46|      1|    Metadata::Builder &mb) {
   47|      1|  mb.setVTable(&DynamicUniquedUTF16StringPrimitive::vt);
   48|      1|}
_ZN6hermes2vm37ExternalASCIIStringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   52|      1|    Metadata::Builder &mb) {
   53|      1|  mb.setVTable(&ExternalASCIIStringPrimitive::vt);
   54|      1|}
_ZN6hermes2vm37ExternalUTF16StringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   58|      1|    Metadata::Builder &mb) {
   59|      1|  mb.setVTable(&ExternalUTF16StringPrimitive::vt);
   60|      1|}
_ZN6hermes2vm15StringPrimitive15createEfficientERNS0_7RuntimeEN4llvh8ArrayRefIcEE:
  117|    147|    ASCIIRef str) {
  118|    147|  return createEfficientImpl(runtime, str);
  119|    147|}
_ZN6hermes2vm15StringPrimitive13createDynamicERNS0_7RuntimeEN4llvh8ArrayRefIDsEE:
  204|    399|    UTF16Ref str) {
  205|    399|  return createDynamicWithKnownEncoding(
  206|    399|      runtime, str, isAllASCII(str.begin(), str.end()));
  207|    399|}
_ZN6hermes2vm15StringPrimitive30createDynamicWithKnownEncodingERNS0_7RuntimeEN4llvh8ArrayRefIDsEEb:
  212|    399|    bool isASCII) {
  213|    399|  if (LLVM_LIKELY(isASCII)) {
  ------------------
  |  |  188|    399|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 391, False: 8]
  |  |  ------------------
  ------------------
  214|    391|    auto res = DynamicASCIIStringPrimitive::create(runtime, str.size());
  215|    391|    if (LLVM_UNLIKELY(res == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|    391|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 391]
  |  |  ------------------
  ------------------
  216|      0|      return ExecutionStatus::EXCEPTION;
  217|      0|    }
  218|       |    // Copy directly into the StringPrimitive storage.
  219|       |#ifdef _MSC_VER
  220|       |#pragma warning(push)
  221|       |#pragma warning(disable : 4244)
  222|       |#endif
  223|    391|    std::copy(
  224|    391|        str.begin(), str.end(), res->getString()->castToASCIIPointerForWrite());
  225|       |#ifdef _MSC_VER
  226|       |#pragma warning(pop)
  227|       |#endif
  228|    391|    return res;
  229|    391|  } else {
  230|      8|    return DynamicUTF16StringPrimitive::create(runtime, str);
  231|      8|  }
  232|    399|}
_ZNK6hermes2vm15StringPrimitive6equalsERKNS0_10StringViewE:
  261|    976|bool StringPrimitive::equals(const StringView &other) const {
  262|    976|  if (isASCII()) {
  ------------------
  |  Branch (262:7): [True: 932, False: 44]
  ------------------
  263|    932|    return other.equals(castToASCIIRef());
  264|    932|  }
  265|     44|  return other.equals(castToUTF16Ref());
  266|    976|}
_ZN6hermes2vm15StringPrimitive6concatERNS0_7RuntimeENS0_6HandleIS1_EES5_:
  284|  1.01k|    Handle<StringPrimitive> yHandle) {
  285|  1.01k|  auto *xPtr = xHandle.get();
  286|  1.01k|  auto *yPtr = yHandle.get();
  287|       |
  288|  1.01k|  auto xLen = xPtr->getStringLength();
  289|  1.01k|  auto yLen = yPtr->getStringLength();
  290|  1.01k|  if (!xLen) {
  ------------------
  |  Branch (290:7): [True: 0, False: 1.01k]
  ------------------
  291|       |    // x is the empty string, just return y.
  292|      0|    return yHandle.getHermesValue();
  293|      0|  }
  294|  1.01k|  if (!yLen) {
  ------------------
  |  Branch (294:7): [True: 2, False: 1.01k]
  ------------------
  295|       |    // y is the empty string, just return x.
  296|      2|    return xHandle.getHermesValue();
  297|      2|  }
  298|       |
  299|  1.01k|  SafeUInt32 xyLen(xLen);
  300|  1.01k|  xyLen.add(yLen);
  301|  1.01k|  if (xyLen.isOverflowed() || xyLen.get() > MAX_STRING_LENGTH) {
  ------------------
  |  Branch (301:7): [True: 0, False: 1.01k]
  |  Branch (301:31): [True: 0, False: 1.01k]
  ------------------
  302|      0|    return runtime.raiseRangeError("String length exceeds limit");
  303|      0|  }
  304|       |
  305|  1.01k|  if (xyLen.get() >= CONCAT_STRING_MIN_SIZE ||
  ------------------
  |  Branch (305:7): [True: 873, False: 141]
  ------------------
  306|  1.01k|      isBufferedStringPrimitive(xPtr)) {
  ------------------
  |  Branch (306:7): [True: 0, False: 141]
  ------------------
  307|    873|    if (LLVM_UNLIKELY(!runtime.getHeap().canAllocExternalMemory(xyLen.get()))) {
  ------------------
  |  |  189|    873|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 873]
  |  |  ------------------
  ------------------
  308|      0|      return runtime.raiseRangeError(
  309|      0|          "Cannot allocate an external string primitive.");
  310|      0|    }
  311|    873|    return internalConcatStringPrimitives(runtime, xHandle, yHandle)
  312|    873|        .getHermesValue();
  313|    873|  }
  314|       |
  315|    141|  auto builder = StringBuilder::createStringBuilder(
  316|    141|      runtime, xyLen, xPtr->isASCII() && yPtr->isASCII());
  ------------------
  |  Branch (316:23): [True: 85, False: 56]
  |  Branch (316:42): [True: 83, False: 2]
  ------------------
  317|    141|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (317:7): [True: 0, False: 141]
  ------------------
  318|      0|    return ExecutionStatus::EXCEPTION;
  319|      0|  }
  320|       |
  321|    141|  builder->appendStringPrim(xHandle);
  322|    141|  builder->appendStringPrim(yHandle);
  323|    141|  return HermesValue::encodeStringValue(*builder->getStringPrimitive());
  324|    141|}
_ZN6hermes2vm15StringPrimitive5sliceERNS0_7RuntimeENS0_6HandleIS1_EEmm:
  330|   459k|    size_t length) {
  331|   459k|  assert(
  332|   459k|      start + length <= str->getStringLength() && "Invalid length for slice");
  333|       |
  334|      0|  SafeUInt32 safeLen(length);
  335|       |
  336|   459k|  auto builder =
  337|   459k|      StringBuilder::createStringBuilder(runtime, safeLen, str->isASCII());
  338|   459k|  if (builder == ExecutionStatus::EXCEPTION) {
  ------------------
  |  Branch (338:7): [True: 0, False: 459k]
  ------------------
  339|      0|    return ExecutionStatus::EXCEPTION;
  340|      0|  }
  341|   459k|  if (str->isASCII()) {
  ------------------
  |  Branch (341:7): [True: 48.9k, False: 410k]
  ------------------
  342|  48.9k|    builder->appendASCIIRef(
  343|  48.9k|        ASCIIRef(str->castToASCIIPointer() + start, length));
  344|   410k|  } else {
  345|   410k|    builder->appendUTF16Ref(
  346|   410k|        UTF16Ref(str->castToUTF16Pointer() + start, length));
  347|   410k|  }
  348|   459k|  return HermesValue::encodeStringValue(*builder->getStringPrimitive());
  349|   459k|}
_ZN6hermes2vm15StringPrimitive16createStringViewERNS0_7RuntimeENS0_6HandleIS1_EE:
  353|   582k|    Handle<StringPrimitive> self) {
  354|   582k|  ensureFlat(runtime, self);
  355|   582k|  return createStringViewMustBeFlat(self);
  356|   582k|}
_ZNK6hermes2vm15StringPrimitive17appendUTF16StringERN4llvh15SmallVectorImplIDsEE:
  359|  71.5k|    llvh::SmallVectorImpl<char16_t> &str) const {
  360|  71.5k|  if (isASCII()) {
  ------------------
  |  Branch (360:7): [True: 71.4k, False: 126]
  ------------------
  361|  71.4k|    const char *ptr = castToASCIIPointer();
  362|  71.4k|    str.append(ptr, ptr + getStringLength());
  363|  71.4k|  } else {
  364|    126|    const char16_t *ptr = castToUTF16Pointer();
  365|    126|    str.append(ptr, ptr + getStringLength());
  366|    126|  }
  367|  71.5k|}
_ZN6hermes2vm15StringPrimitive26createStringViewMustBeFlatENS0_6HandleIS1_EE:
  380|   796k|    Handle<StringPrimitive> self) {
  381|   796k|  return StringView(self);
  382|   796k|}
_ZN6hermes2vm37BufferedASCIIStringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  591|      1|    Metadata::Builder &mb) {
  592|      1|  const auto *self = static_cast<const BufferedASCIIStringPrimitive *>(cell);
  593|      1|  mb.setVTable(&BufferedASCIIStringPrimitive::vt);
  594|      1|  mb.addField("storage", &self->concatBufferHV_);
  595|      1|}
_ZN6hermes2vm37BufferedUTF16StringPrimitiveBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
  598|      1|    Metadata::Builder &mb) {
  599|      1|  const auto *self = static_cast<const BufferedUTF16StringPrimitive *>(cell);
  600|      1|  mb.setVTable(&BufferedUTF16StringPrimitive::vt);
  601|      1|  mb.addField("storage", &self->concatBufferHV_);
  602|      1|}
_ZN6hermes2vm23BufferedStringPrimitiveIcE22appendToCopyableStringERNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEPKNS0_15StringPrimitiveE:
  633|    771|    const StringPrimitive *str) {
  634|    771|  auto it = str->castToASCIIPointer();
  635|    771|  res.append(it, it + str->getStringLength());
  636|    771|}
_ZN6hermes2vm23BufferedStringPrimitiveIDsE22appendToCopyableStringERNSt3__112basic_stringIDsNS3_11char_traitsIDsEENS3_9allocatorIDsEEEEPKNS0_15StringPrimitiveE:
  640|    172|    const StringPrimitive *str) {
  641|    172|  if (str->isASCII()) {
  ------------------
  |  Branch (641:7): [True: 160, False: 12]
  ------------------
  642|    160|    auto it = (const uint8_t *)str->castToASCIIPointer();
  643|    160|    res.append(it, it + str->getStringLength());
  644|    160|  } else {
  645|     12|    auto it = str->castToUTF16Pointer();
  646|     12|    res.append(it, it + str->getStringLength());
  647|     12|  }
  648|    172|}
_ZN6hermes2vm30internalConcatStringPrimitivesERNS0_7RuntimeENS0_6HandleINS0_15StringPrimitiveEEES5_:
  712|    873|    Handle<StringPrimitive> rightHnd) {
  713|    873|  auto *left = leftHnd.get();
  714|    873|  auto *right = rightHnd.get();
  715|       |
  716|    873|  assertValidLength(left, right);
  717|       |
  718|    873|  if (left->isASCII() && right->isASCII()) {
  ------------------
  |  Branch (718:7): [True: 719, False: 154]
  |  Branch (718:26): [True: 711, False: 8]
  ------------------
  719|    711|    if (auto *bufLeft = dyn_vmcast<BufferedASCIIStringPrimitive>(left)) {
  ------------------
  |  Branch (719:15): [True: 651, False: 60]
  ------------------
  720|    651|      if (bufLeft->getStringLength() ==
  ------------------
  |  Branch (720:11): [True: 651, False: 0]
  ------------------
  721|    651|          bufLeft->getConcatBuffer()->contents_.size())
  722|    651|        return BufferedASCIIStringPrimitive::append(
  723|    651|            Handle<BufferedASCIIStringPrimitive>::vmcast(leftHnd),
  724|    651|            runtime,
  725|    651|            rightHnd);
  726|    651|    }
  727|     60|    return BufferedASCIIStringPrimitive::create(runtime, leftHnd, rightHnd);
  728|    711|  } else {
  729|    162|    if (auto *bufLeft = dyn_vmcast<BufferedUTF16StringPrimitive>(left)) {
  ------------------
  |  Branch (729:15): [True: 152, False: 10]
  ------------------
  730|    152|      if (bufLeft->getStringLength() ==
  ------------------
  |  Branch (730:11): [True: 152, False: 0]
  ------------------
  731|    152|          bufLeft->getConcatBuffer()->contents_.size()) {
  732|    152|        return BufferedUTF16StringPrimitive::append(
  733|    152|            Handle<BufferedUTF16StringPrimitive>::vmcast(leftHnd),
  734|    152|            runtime,
  735|    152|            rightHnd);
  736|    152|      }
  737|    152|    }
  738|     10|    return BufferedUTF16StringPrimitive::create(runtime, leftHnd, rightHnd);
  739|    162|  }
  740|    873|}
StringPrimitive.cpp:_ZN6hermes2vmL17assertValidLengthEPNS0_15StringPrimitiveES2_:
  619|  1.74k|static void assertValidLength(StringPrimitive *a, StringPrimitive *b) {
  620|  1.74k|  SafeUInt32 len(a->getStringLength());
  621|  1.74k|  len.add(b->getStringLength());
  622|  1.74k|  assert(
  623|  1.74k|      !len.isOverflowed() && len.get() <= StringPrimitive::MAX_STRING_LENGTH &&
  624|  1.74k|      "length must have been validated");
  625|  1.74k|}
_ZN6hermes2vm15StringPrimitive19createEfficientImplIcEENS0_10CallResultINS0_11HermesValueELNS0_6detail20CallResultSpecializeE2EEERNS0_7RuntimeEN4llvh8ArrayRefIT_EEPNSt3__112basic_stringISC_NSE_11char_traitsISC_EENSE_9allocatorISC_EEEE:
   66|    147|    std::basic_string<T> *optStorage) {
   67|    147|  constexpr bool charIs8Bit = std::is_same<T, char>::value;
   68|    147|  assert(
   69|    147|      (!optStorage ||
   70|    147|       str == llvh::makeArrayRef(optStorage->data(), optStorage->size())) &&
   71|    147|      "If optStorage is provided, it must equal the input string");
   72|      0|  assert(
   73|    147|      (!charIs8Bit || isAllASCII(str.begin(), str.end())) &&
   74|    147|      "8 bit strings must be ASCII");
   75|    147|  if (str.empty()) {
  ------------------
  |  Branch (75:7): [True: 0, False: 147]
  ------------------
   76|      0|    return HermesValue::encodeStringValue(
   77|      0|        runtime.getPredefinedString(Predefined::emptyString));
   78|      0|  }
   79|    147|  if (str.size() == 1) {
  ------------------
  |  Branch (79:7): [True: 99, False: 48]
  ------------------
   80|     99|    return runtime.getCharacterString(str[0]).getHermesValue();
   81|     99|  }
   82|       |
   83|       |  // Check if we should acquire ownership of storage.
   84|     48|  if (optStorage != nullptr &&
  ------------------
  |  Branch (84:7): [True: 0, False: 48]
  ------------------
   85|     48|      str.size() >= StringPrimitive::EXTERNAL_STRING_MIN_SIZE) {
  ------------------
  |  Branch (85:7): [True: 0, False: 0]
  ------------------
   86|      0|    return ExternalStringPrimitive<T>::create(runtime, std::move(*optStorage));
   87|      0|  }
   88|       |
   89|       |  // Check if we fit in ASCII.
   90|       |  // We are ASCII if we are 8 bit, or we are 16 bit and all of our text is
   91|       |  // ASCII.
   92|     48|  bool isAscii = charIs8Bit || isAllASCII(str.begin(), str.end());
  ------------------
  |  Branch (92:18): [Folded - Ignored]
  |  Branch (92:32): [True: 0, False: 0]
  ------------------
   93|     48|  if (isAscii) {
  ------------------
  |  Branch (93:7): [True: 48, False: 0]
  ------------------
   94|     48|    auto result = StringPrimitive::create(runtime, str.size(), isAscii);
   95|     48|    if (LLVM_UNLIKELY(result == ExecutionStatus::EXCEPTION)) {
  ------------------
  |  |  189|     48|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 48]
  |  |  ------------------
  ------------------
   96|      0|      return ExecutionStatus::EXCEPTION;
   97|      0|    }
   98|     48|    auto output = runtime.makeHandle<StringPrimitive>(*result);
   99|       |    // Copy directly into the StringPrimitive storage.
  100|       |#ifdef _MSC_VER
  101|       |#pragma warning(push)
  102|       |#pragma warning(disable : 4244)
  103|       |#endif
  104|       |
  105|     48|    std::copy(str.begin(), str.end(), output->castToASCIIPointerForWrite());
  106|       |#ifdef _MSC_VER
  107|       |#pragma warning(pop)
  108|       |#endif
  109|     48|    return output.getHermesValue();
  110|     48|  }
  111|       |
  112|      0|  return StringPrimitive::create(runtime, str);
  113|     48|}
_ZN6hermes2vm23ExternalStringPrimitiveIDsEC2INSt3__112basic_stringIDsNS4_11char_traitsIDsEENS4_9allocatorIDsEEEEEEOT_:
  460|     61|      contents_(std::forward<BasicString>(contents)) {
  461|     61|  static_assert(
  462|     61|      std::is_same<T, typename BasicString::value_type>::value,
  463|     61|      "ExternalStringPrimitive mismatched char type");
  464|     61|  assert(
  465|     61|      getStringLength() >= EXTERNAL_STRING_MIN_SIZE &&
  466|     61|      "ExternalStringPrimitive length must be at least EXTERNAL_STRING_MIN_SIZE");
  467|     61|}
_ZN6hermes2vm23ExternalStringPrimitiveIcEC2INSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEEEOT_:
  460|     65|      contents_(std::forward<BasicString>(contents)) {
  461|     65|  static_assert(
  462|     65|      std::is_same<T, typename BasicString::value_type>::value,
  463|     65|      "ExternalStringPrimitive mismatched char type");
  464|     65|  assert(
  465|     65|      getStringLength() >= EXTERNAL_STRING_MIN_SIZE &&
  466|     65|      "ExternalStringPrimitive length must be at least EXTERNAL_STRING_MIN_SIZE");
  467|     65|}

_ZN6hermes2vm14createASCIIRefEPKc:
   23|    297|ASCIIRef createASCIIRef(const char *str) {
   24|    297|  return ASCIIRef(str, ascii_traits::length(str));
   25|    297|}
_ZN6hermes2vmlsERN4llvh11raw_ostreamENS1_8ArrayRefIDsEE:
   33|  67.1k|llvh::raw_ostream &operator<<(llvh::raw_ostream &OS, UTF16Ref u16ref) {
   34|       |  // Note this assumes that the desired output encoding is UTF-8, which may
   35|       |  // not be a valid assumption if outputting to a tty.
   36|  67.1k|  std::string narrowStr;
   37|  67.1k|  convertUTF16ToUTF8WithReplacements(narrowStr, u16ref);
   38|  67.1k|  return OS << narrowStr;
   39|  67.1k|}

_ZNK6hermes2vm10StringView11getUTF16RefERN4llvh15SmallVectorImplIDsEEb:
   19|  67.1k|    bool alwaysCopy) const {
   20|  67.1k|  uint32_t existingLen = allocator.size();
   21|  67.1k|  if (isASCII()) {
  ------------------
  |  Branch (21:7): [True: 67.1k, False: 23]
  ------------------
   22|  67.1k|    const char *ptr = castToCharPtr();
   23|  67.1k|    allocator.append(ptr, ptr + length());
   24|  67.1k|    return UTF16Ref(allocator.data() + existingLen, length());
   25|  67.1k|  }
   26|     23|  const char16_t *ptr = castToChar16Ptr();
   27|     23|  if (alwaysCopy) {
  ------------------
  |  Branch (27:7): [True: 0, False: 23]
  ------------------
   28|       |    // If alwaysCopy is true, we always copy even it's already UTF16 string.
   29|      0|    allocator.append(ptr, ptr + length());
   30|      0|    return UTF16Ref(allocator.data() + existingLen, length());
   31|      0|  }
   32|     23|  return UTF16Ref(ptr, length());
   33|     23|}
_ZN6hermes2vmlsERN4llvh11raw_ostreamERKNS0_10StringViewE:
   35|  4.25k|llvh::raw_ostream &operator<<(llvh::raw_ostream &os, const StringView &sv) {
   36|  4.25k|  if (sv.isASCII()) {
  ------------------
  |  Branch (36:7): [True: 4.25k, False: 0]
  ------------------
   37|  4.25k|    return os << llvh::StringRef(sv.castToCharPtr(), sv.length());
   38|  4.25k|  } else {
   39|      0|    return os << UTF16Ref(sv.castToChar16Ptr(), sv.length());
   40|      0|  }
   41|  4.25k|}

_ZN6hermes2vm14SymbolRegistry4initERNS0_7RuntimeE:
   20|     99|void SymbolRegistry::init(Runtime &runtime) {
   21|     99|  stringMap_ = OrderedHashMap::create(runtime)->getHermesValue();
   22|     99|}
_ZN6hermes2vm14SymbolRegistry9markRootsERNS0_12RootAcceptorE:
   25|  1.18k|void SymbolRegistry::markRoots(RootAcceptor &acceptor) {
   26|  1.18k|  acceptor.accept(stringMap_);
   27|       |  // registeredSymbols_ doesn't need to be marked, because its contents are a
   28|       |  // copy of the symbols present in the stringMap_.
   29|  1.18k|}

_ZN6hermes2vm16TimeLimitMonitor11getOrCreateEv:
   18|     99|std::shared_ptr<TimeLimitMonitor> TimeLimitMonitor::getOrCreate() {
   19|       |  /// The singleton payload, intentionally leaked to avoid destruction order
   20|       |  /// fiasco.
   21|     99|  static struct Singleton {
   22|       |    /// Synchronizes access to weakMonitor.
   23|     99|    std::mutex guard;
   24|       |
   25|       |    /// Holds a weak reference to the current TimeLimitMonitor. This ensure that
   26|       |    /// the monitor is destroyed when there are no more shared pointers to it,
   27|       |    /// while still allowing this method to re-use the same singleton for as
   28|       |    /// long as possible.
   29|     99|    std::weak_ptr<TimeLimitMonitor> weakMonitor;
   30|     99|  } *singleton = new Singleton();
   31|       |
   32|     99|  std::lock_guard<std::mutex> singletonGuard{singleton->guard};
   33|     99|  if (auto monitor = singleton->weakMonitor.lock()) {
  ------------------
  |  Branch (33:12): [True: 0, False: 99]
  ------------------
   34|      0|    return monitor;
   35|      0|  }
   36|       |
   37|       |  // Create the new monitor instance while saving a reference in the
   38|       |  // singleton's weakMonitor member.
   39|     99|  auto monitor = std::make_shared<TimeLimitMonitor>();
   40|     99|  singleton->weakMonitor = monitor;
   41|     99|  return monitor;
   42|     99|}
_ZN6hermes2vm16TimeLimitMonitorC2Ev:
   44|     99|TimeLimitMonitor::TimeLimitMonitor() {
   45|       |  // Spawns a new thread that performs the time limit monitoring. This thread
   46|       |  // is joined in the destructor.
   47|     99|  timerThread_ = std::thread(&TimeLimitMonitor::timerLoop, this);
   48|     99|}
_ZN6hermes2vm16TimeLimitMonitorD2Ev:
   50|     99|TimeLimitMonitor::~TimeLimitMonitor() {
   51|     99|  {
   52|     99|    std::unique_lock<std::mutex> lockGuard(lock_);
   53|       |    // Flipping enabled_ to false so the timeLoop thread will stop iterating and
   54|       |    // allow the thread to complete.
   55|     99|    enabled_ = false;
   56|     99|  }
   57|       |
   58|       |  // Tickle the timeLoop thread so it can terminate.
   59|     99|  timerLoopCond_.notify_all();
   60|       |
   61|       |  /// And wait for the helper thread termination.
   62|     99|  timerThread_.join();
   63|     99|}
_ZN6hermes2vm16TimeLimitMonitor12watchRuntimeERNS0_7RuntimeENSt3__16chrono8durationIxNS4_5ratioILl1ELl1000EEEEE:
   67|     99|    std::chrono::milliseconds timeout) {
   68|     99|  {
   69|     99|    std::lock_guard<std::mutex> lockGuard(lock_);
   70|       |    // The execution deadline for runtime.
   71|     99|    auto runtimeDeadline = std::chrono::steady_clock::now() + timeout;
   72|       |
   73|       |    // Set runtime's deadline to runtimeDeadline. This overwrites the current
   74|       |    // deadline (if any).
   75|     99|    watchedRuntimes_[&runtime] = runtimeDeadline;
   76|     99|  }
   77|       |
   78|       |  // Notify the timer loop so it updates the wait timeout in case
   79|       |  // runtimeDeadline is earlier than the current earliest deadline being
   80|       |  // tracked.
   81|     99|  timerLoopCond_.notify_all();
   82|     99|}
_ZN6hermes2vm16TimeLimitMonitor14unwatchRuntimeERNS0_7RuntimeE:
   84|     99|void TimeLimitMonitor::unwatchRuntime(Runtime &runtime) {
   85|     99|  std::lock_guard<std::mutex> lockGuard(lock_);
   86|     99|  watchedRuntimes_.erase(&runtime);
   87|       |
   88|       |  // No need to notify the timer loop, even if runtime had the current earliest
   89|       |  // deadline being watched -- in which case the timerLoop will run once,
   90|       |  // figure out no runtimes timed out, and sleep again.
   91|     99|}
_ZN6hermes2vm16TimeLimitMonitor9timerLoopEv:
   93|     99|void TimeLimitMonitor::timerLoop() {
   94|     99|  oscompat::set_thread_name("time-limit-monitor");
   95|       |
   96|     99|  std::unique_lock<std::mutex> lockGuard(lock_);
   97|       |
   98|       |  // Indicates that there currently is no deadline being "watched" for, so the
   99|       |  // timerLoop should sleep until there's work to be done.
  100|     99|  static constexpr Deadline NoDeadline = Deadline::max();
  101|       |
  102|    198|  while (enabled_) {
  ------------------
  |  Branch (102:10): [True: 99, False: 99]
  ------------------
  103|       |    // Assume there's no deadline in watchedRuntimes_ -- i.e., no Runtimes are
  104|       |    // being watched.
  105|     99|    Deadline nextDeadline = NoDeadline;
  106|     99|    Deadline now = std::chrono::steady_clock::now();
  107|       |
  108|     99|    for (auto it = watchedRuntimes_.begin(), end = watchedRuntimes_.end();
  109|    198|         it != end;) {
  ------------------
  |  Branch (109:10): [True: 99, False: 99]
  ------------------
  110|     99|      auto curr = it++;
  111|       |
  112|     99|      if (curr->second <= now) {
  ------------------
  |  Branch (112:11): [True: 0, False: 99]
  ------------------
  113|       |        // curr's deadline has elapsed; notify the VM.
  114|      0|        curr->first->triggerTimeoutAsyncBreak();
  115|       |
  116|       |        // We're done watching the VM, so remove curr from watchedRuntimes_.
  117|      0|        watchedRuntimes_.erase(curr);
  118|     99|      } else {
  119|       |        // curr's deadline is in the future, but it could be ealier than the
  120|       |        // nextDeadline; Update the latter accordingly.
  121|     99|        nextDeadline = std::min(nextDeadline, curr->second);
  122|     99|      }
  123|     99|    }
  124|       |
  125|     99|    if (nextDeadline != NoDeadline) {
  ------------------
  |  Branch (125:9): [True: 99, False: 0]
  ------------------
  126|       |      // Sleep until the next deadline is reached, or the notification comes in
  127|       |      // (e.g., time limit monitoring has been disabled and the thread needs to
  128|       |      // terminate). Note that spurious wake ups are OK -- it just means that no
  129|       |      // timeouts will have passed, and the thread will go back to waiting.
  130|     99|      timerLoopCond_.wait_until(lockGuard, nextDeadline);
  131|     99|    } else {
  132|       |      // Work around overflow issues in some libstdcxx implementations by using
  133|       |      // wait() when there's no active deadline. The timerLoop will be notified
  134|       |      // by the VM thread when a new Runtime is registered or destroyed.
  135|      0|      timerLoopCond_.wait(lockGuard);
  136|      0|    }
  137|     99|  }
  138|     99|}

_ZNK6hermes2vm11TwineChar168toVectorERN4llvh15SmallVectorImplIDsEE:
  122|     52|void TwineChar16::toVector(llvh::SmallVectorImpl<char16_t> &out) const {
  123|     52|  assert(isValid());
  124|      0|  auto childToVector = [&out](
  125|     52|                           const Node child, const NodeKind kind, size_t size) {
  126|     52|    switch (kind) {
  127|     52|      case TwineChar16::NullKind:
  128|     52|      case TwineChar16::EmptyKind:
  129|     52|        break;
  130|     52|      case TwineChar16::TwineKind:
  131|     52|        child.twine->toVector(out);
  132|     52|        break;
  133|     52|      case TwineChar16::CharStrKind:
  134|     52|        out.append(child.charStr, child.charStr + size);
  135|     52|        break;
  136|     52|      case TwineChar16::Char16StrKind:
  137|     52|        out.append(child.char16Str, child.char16Str + size);
  138|     52|        break;
  139|     52|      case TwineChar16::StringPrimitiveKind:
  140|     52|        child.stringPrimitive->appendUTF16String(out);
  141|     52|        break;
  142|     52|      case TwineChar16::Int32Kind: {
  143|     52|        char buf[32];
  144|     52|        auto len = ::snprintf(buf, sizeof(buf), "%" PRId32, child.int32);
  145|     52|        out.append(buf, buf + len);
  146|     52|        break;
  147|     52|      }
  148|     52|      case TwineChar16::Unsigned32Kind: {
  149|     52|        char buf[32];
  150|     52|        auto len = ::snprintf(buf, sizeof(buf), "%" PRIu32, child.uint32);
  151|     52|        out.append(buf, buf + len);
  152|     52|        break;
  153|     52|      }
  154|     52|      case TwineChar16::DoubleKind: {
  155|     52|        char buf[NUMBER_TO_STRING_BUF_SIZE];
  156|     52|        auto len = numberToString(child.flt, buf, sizeof(buf));
  157|     52|        assert(len < sizeof(buf));
  158|     52|        buf[len] = '\0';
  159|     52|        out.append(buf, buf + len);
  160|     52|        break;
  161|     52|      }
  162|     52|    }
  163|     52|  };
  164|     52|  out.reserve(size());
  165|     52|  childToVector(leftChild_, leftKind_, leftSize_);
  166|     52|  childToVector(rightChild_, rightKind_, rightSize_);
  167|     52|}
TwineChar16.cpp:_ZZNK6hermes2vm11TwineChar168toVectorERN4llvh15SmallVectorImplIDsEEENK3$_2clENS1_4NodeENS1_8NodeKindEm:
  125|    104|                           const Node child, const NodeKind kind, size_t size) {
  126|    104|    switch (kind) {
  ------------------
  |  Branch (126:13): [True: 0, False: 104]
  ------------------
  127|      0|      case TwineChar16::NullKind:
  ------------------
  |  Branch (127:7): [True: 0, False: 104]
  ------------------
  128|      0|      case TwineChar16::EmptyKind:
  ------------------
  |  Branch (128:7): [True: 0, False: 104]
  ------------------
  129|      0|        break;
  130|     28|      case TwineChar16::TwineKind:
  ------------------
  |  Branch (130:7): [True: 28, False: 76]
  ------------------
  131|     28|        child.twine->toVector(out);
  132|     28|        break;
  133|     72|      case TwineChar16::CharStrKind:
  ------------------
  |  Branch (133:7): [True: 72, False: 32]
  ------------------
  134|     72|        out.append(child.charStr, child.charStr + size);
  135|     72|        break;
  136|      4|      case TwineChar16::Char16StrKind:
  ------------------
  |  Branch (136:7): [True: 4, False: 100]
  ------------------
  137|      4|        out.append(child.char16Str, child.char16Str + size);
  138|      4|        break;
  139|      0|      case TwineChar16::StringPrimitiveKind:
  ------------------
  |  Branch (139:7): [True: 0, False: 104]
  ------------------
  140|      0|        child.stringPrimitive->appendUTF16String(out);
  141|      0|        break;
  142|      0|      case TwineChar16::Int32Kind: {
  ------------------
  |  Branch (142:7): [True: 0, False: 104]
  ------------------
  143|      0|        char buf[32];
  144|      0|        auto len = ::snprintf(buf, sizeof(buf), "%" PRId32, child.int32);
  145|      0|        out.append(buf, buf + len);
  146|      0|        break;
  147|      0|      }
  148|      0|      case TwineChar16::Unsigned32Kind: {
  ------------------
  |  Branch (148:7): [True: 0, False: 104]
  ------------------
  149|      0|        char buf[32];
  150|      0|        auto len = ::snprintf(buf, sizeof(buf), "%" PRIu32, child.uint32);
  151|      0|        out.append(buf, buf + len);
  152|      0|        break;
  153|      0|      }
  154|      0|      case TwineChar16::DoubleKind: {
  ------------------
  |  Branch (154:7): [True: 0, False: 104]
  ------------------
  155|      0|        char buf[NUMBER_TO_STRING_BUF_SIZE];
  156|      0|        auto len = numberToString(child.flt, buf, sizeof(buf));
  157|      0|        assert(len < sizeof(buf));
  158|      0|        buf[len] = '\0';
  159|      0|        out.append(buf, buf + len);
  160|      0|        break;
  161|      0|      }
  162|    104|    }
  163|    104|  };

_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIcEEjN4llvh8ArrayRefIT_EEjb:
   23|   382k|    bool mustBeNew) const {
   24|   382k|  assert(identifierTable_ && "identifier table pointer is not initialized");
   25|       |
   26|      0|  auto cap = capacity();
   27|   382k|  assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   28|      0|  assert(size_ < cap && "The hash table can never be full");
   29|       |
   30|      0|#ifdef HERMES_SLOW_DEBUG
   31|      0|  assert(hash == hashString(str) && "invalid hash");
   32|      0|#endif
   33|      0|  uint32_t idx = hash & (cap - 1);
   34|   382k|  uint32_t base = 1;
   35|       |  // deletedIndex tracks the index of a deleted entry found in the conflict
   36|       |  // chain. If we could not find an entry that matches str, we would return
   37|       |  // the deleted slot for insertion to be able to reuse deleted space.
   38|   382k|  OptValue<uint32_t> deletedIndex;
   39|       |  // The loop will always terminate as long as the hash table is not full.
   40|   656k|  while (1) {
  ------------------
  |  Branch (40:10): [Folded - Ignored]
  ------------------
   41|   656k|    if (table_.isEmpty(idx)) {
  ------------------
  |  Branch (41:9): [True: 243k, False: 413k]
  ------------------
   42|       |      // Found an empty entry, meaning that str does not exist in the table.
   43|       |      // If deletedIndex is available, return it, otherwise return idx.
   44|   243k|      return deletedIndex ? *deletedIndex : idx;
  ------------------
  |  Branch (44:14): [True: 0, False: 243k]
  ------------------
   45|   413k|    } else if (table_.isDeleted(idx)) {
  ------------------
  |  Branch (45:16): [True: 7, False: 413k]
  ------------------
   46|      7|      assert(
   47|      7|          !mustBeNew &&
   48|      7|          "mustBeNew should never be set if there are deleted entries");
   49|      0|      deletedIndex = idx;
   50|   413k|    } else if (!mustBeNew) {
  ------------------
  |  Branch (50:16): [True: 381k, False: 32.5k]
  ------------------
   51|       |      // If mustBeNew is set, we know this string does not exist in the table.
   52|       |      // There is no need to compare.
   53|       |
   54|   381k|      auto &lookupTableEntry =
   55|   381k|          identifierTable_->getLookupTableEntry(table_.get(idx));
   56|   381k|      if (lookupTableEntry.getHash() == hash) {
  ------------------
  |  Branch (56:11): [True: 138k, False: 242k]
  ------------------
   57|   138k|        if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (57:13): [True: 137k, False: 1.26k]
  ------------------
   58|   137k|          const StringPrimitive *strPrim = lookupTableEntry.getStringPrim();
   59|   137k|          if (strPrim->isASCII()) {
  ------------------
  |  Branch (59:15): [True: 137k, False: 0]
  ------------------
   60|   137k|            if (stringRefEquals(str, strPrim->castToASCIIRef())) {
  ------------------
  |  Branch (60:17): [True: 137k, False: 12]
  ------------------
   61|   137k|              return idx;
   62|   137k|            }
   63|   137k|          } else {
   64|      0|            if (stringRefEquals(str, strPrim->castToUTF16Ref())) {
  ------------------
  |  Branch (64:17): [True: 0, False: 0]
  ------------------
   65|      0|              return idx;
   66|      0|            }
   67|      0|          }
   68|   137k|        } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (68:20): [True: 1.26k, False: 0]
  ------------------
   69|       |          // Lazy ASCII string.
   70|  1.26k|          if (stringRefEquals(str, lookupTableEntry.getLazyASCIIRef())) {
  ------------------
  |  Branch (70:15): [True: 1.26k, False: 0]
  ------------------
   71|  1.26k|            return idx;
   72|  1.26k|          }
   73|  1.26k|        } else {
   74|       |          // UTF16 string.
   75|      0|          if (stringRefEquals(str, lookupTableEntry.getLazyUTF16Ref())) {
  ------------------
  |  Branch (75:15): [True: 0, False: 0]
  ------------------
   76|      0|            return idx;
   77|      0|          }
   78|      0|        }
   79|   138k|      }
   80|   381k|    }
   81|       |    /// Use quadratic probing to find next probe index in the hash table.
   82|       |    /// h(k, i) = (h(k) + 1/2 * i + 1/2 * i^2) mod m.
   83|       |    /// This guarantees the values of h(k,i) for i in [0,m-1] are all distinct.
   84|   274k|    idx = (idx + base) & (cap - 1);
   85|   274k|    ++base;
   86|   274k|  }
   87|   382k|}
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringIDsEEjN4llvh8ArrayRefIT_EEjb:
   23|    443|    bool mustBeNew) const {
   24|    443|  assert(identifierTable_ && "identifier table pointer is not initialized");
   25|       |
   26|      0|  auto cap = capacity();
   27|    443|  assert(llvh::isPowerOf2_32(cap) && "capacity must be power of 2");
   28|      0|  assert(size_ < cap && "The hash table can never be full");
   29|       |
   30|      0|#ifdef HERMES_SLOW_DEBUG
   31|      0|  assert(hash == hashString(str) && "invalid hash");
   32|      0|#endif
   33|      0|  uint32_t idx = hash & (cap - 1);
   34|    443|  uint32_t base = 1;
   35|       |  // deletedIndex tracks the index of a deleted entry found in the conflict
   36|       |  // chain. If we could not find an entry that matches str, we would return
   37|       |  // the deleted slot for insertion to be able to reuse deleted space.
   38|    443|  OptValue<uint32_t> deletedIndex;
   39|       |  // The loop will always terminate as long as the hash table is not full.
   40|    573|  while (1) {
  ------------------
  |  Branch (40:10): [Folded - Ignored]
  ------------------
   41|    573|    if (table_.isEmpty(idx)) {
  ------------------
  |  Branch (41:9): [True: 436, False: 137]
  ------------------
   42|       |      // Found an empty entry, meaning that str does not exist in the table.
   43|       |      // If deletedIndex is available, return it, otherwise return idx.
   44|    436|      return deletedIndex ? *deletedIndex : idx;
  ------------------
  |  Branch (44:14): [True: 0, False: 436]
  ------------------
   45|    436|    } else if (table_.isDeleted(idx)) {
  ------------------
  |  Branch (45:16): [True: 0, False: 137]
  ------------------
   46|      0|      assert(
   47|      0|          !mustBeNew &&
   48|      0|          "mustBeNew should never be set if there are deleted entries");
   49|      0|      deletedIndex = idx;
   50|    137|    } else if (!mustBeNew) {
  ------------------
  |  Branch (50:16): [True: 137, False: 0]
  ------------------
   51|       |      // If mustBeNew is set, we know this string does not exist in the table.
   52|       |      // There is no need to compare.
   53|       |
   54|    137|      auto &lookupTableEntry =
   55|    137|          identifierTable_->getLookupTableEntry(table_.get(idx));
   56|    137|      if (lookupTableEntry.getHash() == hash) {
  ------------------
  |  Branch (56:11): [True: 10, False: 127]
  ------------------
   57|     10|        if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (57:13): [True: 7, False: 3]
  ------------------
   58|      7|          const StringPrimitive *strPrim = lookupTableEntry.getStringPrim();
   59|      7|          if (strPrim->isASCII()) {
  ------------------
  |  Branch (59:15): [True: 0, False: 7]
  ------------------
   60|      0|            if (stringRefEquals(str, strPrim->castToASCIIRef())) {
  ------------------
  |  Branch (60:17): [True: 0, False: 0]
  ------------------
   61|      0|              return idx;
   62|      0|            }
   63|      7|          } else {
   64|      7|            if (stringRefEquals(str, strPrim->castToUTF16Ref())) {
  ------------------
  |  Branch (64:17): [True: 7, False: 0]
  ------------------
   65|      7|              return idx;
   66|      7|            }
   67|      7|          }
   68|      7|        } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (68:20): [True: 0, False: 3]
  ------------------
   69|       |          // Lazy ASCII string.
   70|      0|          if (stringRefEquals(str, lookupTableEntry.getLazyASCIIRef())) {
  ------------------
  |  Branch (70:15): [True: 0, False: 0]
  ------------------
   71|      0|            return idx;
   72|      0|          }
   73|      3|        } else {
   74|       |          // UTF16 string.
   75|      3|          if (stringRefEquals(str, lookupTableEntry.getLazyUTF16Ref())) {
  ------------------
  |  Branch (75:15): [True: 0, False: 3]
  ------------------
   76|      0|            return idx;
   77|      0|          }
   78|      3|        }
   79|     10|      }
   80|    137|    }
   81|       |    /// Use quadratic probing to find next probe index in the hash table.
   82|       |    /// h(k, i) = (h(k) + 1/2 * i + 1/2 * i^2) mod m.
   83|       |    /// This guarantees the values of h(k,i) for i in [0,m-1] are all distinct.
   84|    130|    idx = (idx + base) & (cap - 1);
   85|    130|    ++base;
   86|    130|  }
   87|    443|}
_ZNK6hermes2vm6detail19IdentifierHashTable12lookupStringEPKNS0_15StringPrimitiveEjb:
  114|   110k|    bool mustBeNew) const {
  115|   110k|  if (str->isASCII()) {
  ------------------
  |  Branch (115:7): [True: 110k, False: 64]
  ------------------
  116|   110k|    return lookupString(str->castToASCIIRef(), hash, mustBeNew);
  117|   110k|  } else {
  118|     64|    return lookupString(str->castToUTF16Ref(), hash, mustBeNew);
  119|     64|  }
  120|   110k|}
_ZN6hermes2vm6detail19IdentifierHashTable6insertEjNS0_8SymbolIDE:
  122|   128k|void IdentifierHashTable::insert(uint32_t idx, SymbolID id) {
  123|   128k|  table_.set(idx, id.unsafeGetIndex());
  124|   128k|  ++size_;
  125|   128k|  ++nonEmptyEntryCount_;
  126|       |
  127|   128k|  if (shouldGrow()) {
  ------------------
  |  Branch (127:7): [True: 20, False: 128k]
  ------------------
  128|     20|    growAndRehash(capacity() * 2);
  129|     20|  }
  130|   128k|}
_ZN6hermes2vm6detail19IdentifierHashTable6removeEPKNS0_15StringPrimitiveE:
  132|    273|void IdentifierHashTable::remove(const StringPrimitive *str) {
  133|    273|  if (str->isASCII()) {
  ------------------
  |  Branch (133:7): [True: 266, False: 7]
  ------------------
  134|    266|    remove(str->castToASCIIRef());
  135|    266|  } else {
  136|      7|    remove(str->castToUTF16Ref());
  137|      7|  }
  138|    273|}
_ZN6hermes2vm6detail19IdentifierHashTable13growAndRehashEj:
  140|    119|void IdentifierHashTable::growAndRehash(uint32_t newCapacity) {
  141|       |  // Guard against potential overflow in the calculation of new capacity.
  142|    119|  if (LLVM_UNLIKELY(newCapacity <= capacity())) {
  ------------------
  |  |  189|    119|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 0, False: 119]
  |  |  ------------------
  ------------------
  143|      0|    hermes_fatal("too many identifiers created");
  144|      0|  }
  145|    119|  assert(llvh::isPowerOf2_32(newCapacity) && "capacity must be power of 2");
  146|      0|  CompactTable tmpTable(newCapacity, table_.getCurrentScale());
  147|    119|  tmpTable.swap(table_);
  148|   255k|  for (uint32_t oldIdx = 0; oldIdx < tmpTable.size(); ++oldIdx) {
  ------------------
  |  Branch (148:29): [True: 254k, False: 119]
  ------------------
  149|   254k|    if (!tmpTable.isValid(oldIdx)) {
  ------------------
  |  Branch (149:9): [True: 139k, False: 115k]
  ------------------
  150|   139k|      continue;
  151|   139k|    }
  152|       |    // Pass true as second argument as we know this string is not in the table.
  153|   115k|    uint32_t idx = 0;
  154|   115k|    uint32_t oldVal = tmpTable.get(oldIdx);
  155|   115k|    auto &lookupTableEntry = identifierTable_->getLookupTableEntry(oldVal);
  156|   115k|    uint32_t hash = lookupTableEntry.getHash();
  157|   115k|    if (lookupTableEntry.isStringPrim()) {
  ------------------
  |  Branch (157:9): [True: 110k, False: 4.56k]
  ------------------
  158|   110k|      idx = lookupString(lookupTableEntry.getStringPrim(), hash, true);
  159|   110k|    } else if (lookupTableEntry.isLazyASCII()) {
  ------------------
  |  Branch (159:16): [True: 4.56k, False: 0]
  ------------------
  160|  4.56k|      idx = lookupString(lookupTableEntry.getLazyASCIIRef(), hash, true);
  161|  4.56k|    } else if (lookupTableEntry.isLazyUTF16()) {
  ------------------
  |  Branch (161:16): [True: 0, False: 0]
  ------------------
  162|      0|      idx = lookupString(lookupTableEntry.getLazyUTF16Ref(), hash, true);
  163|      0|    }
  164|   115k|    table_.set(idx, oldVal);
  165|   115k|  }
  166|    119|  nonEmptyEntryCount_ = size_;
  167|    119|}

_ZN6hermes2vm18AlignedHeapSegment8setLevelILNS0_12AdviseUnusedE0EEEvPc:
   74|    301|void AlignedHeapSegment::setLevel(char *lvl) {
   75|    301|  assert(dbgContainsLevel(lvl));
   76|    301|  if (lvl < level_) {
  ------------------
  |  Branch (76:7): [True: 168, False: 133]
  ------------------
   77|    168|#ifndef NDEBUG
   78|    168|    clear(lvl, level_);
   79|       |#else
   80|       |    if (MU == AdviseUnused::Yes) {
   81|       |      const size_t PS = oscompat::page_size();
   82|       |      auto nextPageAfter = reinterpret_cast<char *>(
   83|       |          llvh::alignTo(reinterpret_cast<uintptr_t>(lvl), PS));
   84|       |      auto nextPageBefore = reinterpret_cast<char *>(
   85|       |          llvh::alignTo(reinterpret_cast<uintptr_t>(level_), PS));
   86|       |
   87|       |      markUnused(nextPageAfter, nextPageBefore);
   88|       |    }
   89|       |#endif
   90|    168|  }
   91|    301|  level_ = lvl;
   92|    301|}
_ZN6hermes2vm18AlignedHeapSegment10resetLevelILNS0_12AdviseUnusedE0EEEvv:
   99|    301|void AlignedHeapSegment::resetLevel() {
  100|    301|  setLevel<MU>(start());
  101|    301|}
_ZN6hermes2vm18AlignedHeapSegment8Contents16protectGuardPageENS_8oscompat11ProtectModeE:
   26|    406|    oscompat::ProtectMode mode) {
   27|    406|  char *begin = &paddedGuardPage_[kGuardPagePadding];
   28|    406|  size_t size = sizeof(paddedGuardPage_) - kGuardPagePadding;
   29|    406|  size_t PS = oscompat::page_size();
   30|       |  // Only protect if the actual system page size matches expectations.
   31|    406|  if (reinterpret_cast<uintptr_t>(begin) % PS == 0 && PS <= size) {
  ------------------
  |  Branch (31:7): [True: 406, False: 0]
  |  Branch (31:55): [True: 406, False: 0]
  ------------------
   32|    406|    oscompat::vm_protect(begin, PS, mode);
   33|    406|  }
   34|    406|}
_ZN6hermes2vm18AlignedHeapSegmentC2ENS0_14AlignedStorageE:
   37|    203|    : storage_(std::move(storage)) {
   38|       |  // Storage end must be page-aligned so that markUnused below stays in
   39|       |  // segment.
   40|    203|  assert(
   41|    203|      reinterpret_cast<uintptr_t>(hiLim()) % oscompat::page_size() == 0 &&
   42|    203|      "storage end must be page-aligned");
   43|    203|  if (*this) {
  ------------------
  |  Branch (43:7): [True: 203, False: 0]
  ------------------
   44|    203|    new (contents()) Contents();
   45|    203|    contents()->protectGuardPage(oscompat::ProtectMode::None);
   46|    203|#ifndef NDEBUG
   47|    203|    clear();
   48|    203|#endif
   49|    203|  }
   50|    203|}
_ZN6hermes2vm18AlignedHeapSegmentD2Ev:
   52|  1.01k|AlignedHeapSegment::~AlignedHeapSegment() {
   53|  1.01k|  if (lowLim() == nullptr) {
  ------------------
  |  Branch (53:7): [True: 809, False: 203]
  ------------------
   54|    809|    return;
   55|    809|  }
   56|    203|  contents()->protectGuardPage(oscompat::ProtectMode::ReadWrite);
   57|    203|  contents()->~Contents();
   58|    203|  __asan_unpoison_memory_region(start(), end() - start());
   59|    203|}
_ZN6hermes2vm18AlignedHeapSegment15setEffectiveEndEPc:
  107|    978|void AlignedHeapSegment::setEffectiveEnd(char *effectiveEnd) {
  108|    978|  assert(
  109|    978|      start() <= effectiveEnd && effectiveEnd <= end() &&
  110|    978|      "Must be valid end for segment.");
  111|      0|  assert(level() <= effectiveEnd && "Must not set effective end below level");
  112|      0|  effectiveEnd_ = effectiveEnd;
  113|    978|}
_ZN6hermes2vm18AlignedHeapSegment25clearExternalMemoryChargeEv:
  115|    400|void AlignedHeapSegment::clearExternalMemoryCharge() {
  116|    400|  setEffectiveEnd(end());
  117|    400|}
_ZNK6hermes2vm18AlignedHeapSegment16dbgContainsLevelEPKv:
  120|    301|bool AlignedHeapSegment::dbgContainsLevel(const void *lvl) const {
  121|    301|  return contains(lvl) || lvl == hiLim();
  ------------------
  |  Branch (121:10): [True: 301, False: 0]
  |  Branch (121:27): [True: 0, False: 0]
  ------------------
  122|    301|}
_ZN6hermes2vm18AlignedHeapSegment5clearEv:
  129|    203|void AlignedHeapSegment::clear() {
  130|    203|  clear(start(), end());
  131|    203|}
_ZN6hermes2vm18AlignedHeapSegment5clearEPcS2_:
  133|    371|/* static */ void AlignedHeapSegment::clear(char *start, char *end) {
  134|       |#if LLVM_ADDRESS_SANITIZER_BUILD
  135|       |  __asan_poison_memory_region(start, end - start);
  136|       |#else
  137|    371|  std::memset(start, kInvalidHeapValue, end - start);
  138|    371|#endif
  139|    371|}
_ZN6hermes2vm18AlignedHeapSegment14checkUnwrittenEPcS2_:
  141|  2.10M|/* static */ void AlignedHeapSegment::checkUnwritten(char *start, char *end) {
  142|  2.10M|#if !LLVM_ADDRESS_SANITIZER_BUILD && defined(HERMES_SLOW_DEBUG)
  143|       |  // Check that the space was not written into.
  144|  2.10M|  std::for_each(
  145|  2.10M|      start, end, [](char value) { assert(value == kInvalidHeapValue); });
  146|  2.10M|#endif
  147|  2.10M|}
AlignedHeapSegment.cpp:_ZZN6hermes2vm18AlignedHeapSegment14checkUnwrittenEPcS2_ENK3$_0clEc:
  145|   534M|      start, end, [](char value) { assert(value == kInvalidHeapValue); });

_ZN6hermes2vm4swapERNS0_14AlignedStorageES2_:
   19|  1.91k|void swap(AlignedStorage &a, AlignedStorage &b) {
   20|  1.91k|  using std::swap;
   21|       |
   22|  1.91k|  swap(a.lowLim_, b.lowLim_);
   23|  1.91k|  swap(a.provider_, b.provider_);
   24|  1.91k|}
_ZN6hermes2vm14AlignedStorage6createEPNS0_15StorageProviderEPKc:
   33|    203|    const char *name) {
   34|    203|  auto result = provider->newStorage(name);
   35|    203|  if (!result) {
  ------------------
  |  Branch (35:7): [True: 0, False: 203]
  ------------------
   36|      0|    return result.getError();
   37|      0|  }
   38|    203|  return AlignedStorage{provider, *result};
   39|    203|}
_ZN6hermes2vm14AlignedStorageC2EPNS0_15StorageProviderEPv:
   42|    203|    : lowLim_(static_cast<char *>(lowLim)), provider_(provider) {
   43|    203|  assert(
   44|    203|      AlignedStorage::start(lowLim_) == lowLim_ &&
   45|    203|      "The lower limit of this storage must be aligned");
   46|    203|}
_ZN6hermes2vm14AlignedStorageC2EOS1_:
   48|  1.72k|AlignedStorage::AlignedStorage(AlignedStorage &&that) : AlignedStorage() {
   49|  1.72k|  swap(*this, that);
   50|  1.72k|  assert(
   51|  1.72k|      AlignedStorage::start(lowLim_) == lowLim_ &&
   52|  1.72k|      "The lower limit of this storage must be aligned");
   53|  1.72k|}
_ZN6hermes2vm14AlignedStorageaSES1_:
   55|    198|AlignedStorage &AlignedStorage::operator=(AlignedStorage that) {
   56|    198|  swap(*this, that);
   57|    198|  assert(
   58|    198|      AlignedStorage::start(lowLim_) == lowLim_ &&
   59|    198|      "The lower limit of this storage must be aligned");
   60|      0|  return *this;
   61|    198|}
_ZN6hermes2vm14AlignedStorageD2Ev:
   63|  2.02k|AlignedStorage::~AlignedStorage() {
   64|  2.02k|  if (provider_) {
  ------------------
  |  Branch (64:7): [True: 203, False: 1.81k]
  ------------------
   65|    203|    provider_->deleteStorage(lowLim_);
   66|    203|  }
   67|  2.02k|}

_ZNK6hermes2vm9CardTable22findNextCardWithStatusENS1_10CardStatusEmm:
   35|    657|    size_t endIndex) const {
   36|  2.54M|  for (size_t idx = fromIndex; idx < endIndex; idx++)
  ------------------
  |  Branch (36:32): [True: 2.54M, False: 317]
  ------------------
   37|  2.54M|    if (cards_[idx].load(std::memory_order_relaxed) == status)
  ------------------
  |  Branch (37:9): [True: 340, False: 2.54M]
  ------------------
   38|    340|      return idx;
   39|       |
   40|    317|  return llvh::None;
   41|    657|}
_ZN6hermes2vm9CardTable5clearEv:
   43|    313|void CardTable::clear() {
   44|    313|  cleanRange(kFirstUsedIndex, kValidIndices);
   45|    313|}
_ZN6hermes2vm9CardTable10cleanRangeEmm:
   59|    313|void CardTable::cleanRange(size_t from, size_t to) {
   60|    313|  cleanOrDirtyRange(from, to, CardStatus::Clean);
   61|    313|}
_ZN6hermes2vm9CardTable17cleanOrDirtyRangeEmmNS1_10CardStatusE:
   70|    313|    CardStatus cleanOrDirty) {
   71|  2.55M|  for (size_t index = from; index < to; index++) {
  ------------------
  |  Branch (71:29): [True: 2.55M, False: 313]
  ------------------
   72|  2.55M|    cards_[index].store(cleanOrDirty, std::memory_order_relaxed);
   73|  2.55M|  }
   74|    313|}
_ZN6hermes2vm9CardTable16updateBoundariesEPNS1_8BoundaryEPKcS5_:
   79|  76.3k|    const char *end) {
   80|  76.3k|  assert(boundary != nullptr && "Need a boundary cursor");
   81|      0|  assert(
   82|  76.3k|      base() <= start && end <= AlignedStorage::end(base()) &&
   83|  76.3k|      "Precondition: [start, end) must be covered by this table.");
   84|      0|  assert(
   85|  76.3k|      boundary->index() == addressToIndex(boundary->address()) &&
   86|  76.3k|      "Precondition: boundary's index must correspond to its address in this table.");
   87|       |  // We must always have just crossed the boundary of the next card:
   88|      0|  assert(
   89|  76.3k|      start <= boundary->address() && boundary->address() < end &&
   90|  76.3k|      "Precondition: must have crossed boundary.");
   91|       |  // The object may be large, and may cross multiple cards, but first
   92|       |  // handle the first card.
   93|      0|  boundaries_[boundary->index()] =
   94|  76.3k|      (boundary->address() - start) >> LogHeapAlign;
   95|  76.3k|  boundary->bump();
   96|       |
   97|       |  // Now we must fill in the remainder of the card boundaries crossed by the
   98|       |  // allocation.  We use a logarithmic scheme, so we fill in one card
   99|       |  // with -1, 2 with -2, etc., where each negative value k indicates
  100|       |  // that we should go backwards by 2^(-k - 1) cards, and consult the
  101|       |  // table there.
  102|  76.3k|  int8_t currentExp = 0;
  103|  76.3k|  unsigned currentIndexDelta = 1;
  104|  76.3k|  unsigned numWithCurrentExp = 0;
  105|   989k|  while (boundary->address() < end) {
  ------------------
  |  Branch (105:10): [True: 913k, False: 76.3k]
  ------------------
  106|   913k|    boundaries_[boundary->index()] = encodeExp(currentExp);
  107|   913k|    numWithCurrentExp++;
  108|   913k|    if (numWithCurrentExp == currentIndexDelta) {
  ------------------
  |  Branch (108:9): [True: 9.89k, False: 903k]
  ------------------
  109|  9.89k|      numWithCurrentExp = 0;
  110|  9.89k|      currentExp++;
  111|  9.89k|      currentIndexDelta *= 2;
  112|       |      // Note that 7 bits handles object sizes up to 2^128, so we
  113|       |      // don't have to worry about overflow of the int8_t.
  114|  9.89k|    }
  115|   913k|    boundary->bump();
  116|   913k|  }
  117|  76.3k|}
_ZNK6hermes2vm9CardTable15firstObjForCardEj:
  119|  5.11M|GCCell *CardTable::firstObjForCard(unsigned index) const {
  120|  5.11M|  int8_t val = boundaries_[index];
  121|       |
  122|       |  // If val is negative, it means skip backwards some number of cards.
  123|       |  // In general, for an object crossing 2^N cards, a query for one of
  124|       |  // those cards will examine at most N entries in the table.
  125|  33.1M|  while (val < 0) {
  ------------------
  |  Branch (125:10): [True: 28.0M, False: 5.11M]
  ------------------
  126|  28.0M|    index -= 1 << decodeExp(val);
  127|  28.0M|    val = boundaries_[index];
  128|  28.0M|  }
  129|       |
  130|  5.11M|  char *boundary = const_cast<char *>(indexToAddress(index));
  131|  5.11M|  char *resPtr = boundary - (val << LogHeapAlign);
  132|  5.11M|  return reinterpret_cast<GCCell *>(resPtr);
  133|  5.11M|}
_ZNK6hermes2vm9CardTable16verifyBoundariesEPcS2_:
  157|    637|void CardTable::verifyBoundaries(char *start, char *level) const {
  158|       |  // Start should be card-aligned.
  159|    637|  assert(isCardAligned(start));
  160|  5.11M|  for (unsigned index = addressToIndex(start); index < kValidIndices; index++) {
  ------------------
  |  Branch (160:48): [True: 5.11M, False: 637]
  ------------------
  161|  5.11M|    const char *boundary = indexToAddress(index);
  162|  5.11M|    if (level <= boundary) {
  ------------------
  |  Branch (162:9): [True: 0, False: 5.11M]
  ------------------
  163|      0|      break;
  164|      0|    }
  165|  5.11M|    GCCell *cell = firstObjForCard(index);
  166|       |    // Should be a valid cell.
  167|  5.11M|    assert(
  168|  5.11M|        cell->isValid() &&
  169|  5.11M|        "Card object boundary is broken: firstObjForCard yields invalid cell.");
  170|      0|    char *cellPtr = reinterpret_cast<char *>(cell);
  171|       |    // And it should extend across the card boundary.
  172|  5.11M|    assert(
  173|  5.11M|        cellPtr <= boundary &&
  174|  5.11M|        boundary < (cellPtr + cell->getAllocatedSize()) &&
  175|  5.11M|        "Card object boundary is broken: first obj doesn't extend into card");
  176|  5.11M|  }
  177|    637|}

_ZN6hermes2vm22UninitializedBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   17|      1|void UninitializedBuildMeta(const GCCell *, Metadata::Builder &mb) {
   18|      1|  static VTable vt{CellKind::UninitializedKind, 0};
   19|      1|  mb.setVTable(&vt);
   20|      1|}
_ZN6hermes2vm19FillerCellBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   21|      1|void FillerCellBuildMeta(const GCCell *, Metadata::Builder &mb) {
   22|      1|  mb.setVTable(&FillerCell::vt);
   23|      1|}

HadesGC.cpp:_ZN6hermes2vm6GCBase22completeWeakMapMarkingINS0_7HadesGC12MarkAcceptorEPFbPKNS0_6GCCellEEZNS3_22completeWeakMapMarkingERS4_E3$_7ZNS3_22completeWeakMapMarkingESA_E3$_8ZNS3_22completeWeakMapMarkingESA_E3$_9EEjRS3_RT_RNSt3__16vectorIPNS0_13JSWeakMapImplILNS0_8CellKindE51EEENSH_9allocatorISM_EEEET0_T1_T2_T3_:
  105|    141|    CheckMarkStackOverflowFunc checkMarkStackOverflow) {
  106|       |  // If a WeakMap is present as a key in this map, the corresponding list
  107|       |  // is a superset of the unreachable keys in the WeakMap.  (The set last
  108|       |  // found to be unreachable, some of which may now be reachable.)
  109|    141|  llvh::DenseMap<JSWeakMap *, std::vector<detail::WeakRefKey *>>
  110|    141|      unreachableKeys;
  111|       |
  112|       |  /// A specialized acceptor, which does not mark weak refs.  We will
  113|       |  /// revisit the WeakMaps with an acceptor that does, at the end.
  114|    141|  SkipWeakRefsAcceptor<Acceptor> skipWeakAcceptor(gc, &acceptor);
  115|       |
  116|       |  // Must declare this outside the loop, but the initial value doesn't matter:
  117|       |  // we make it false at the start of each loop iteration.
  118|    141|  bool newReachableValueFound = true;
  119|       |
  120|       |  // The set of weak maps that have already been scanned -- we do the
  121|       |  // initial scan of each weak map only once.
  122|    141|  llvh::DenseSet<JSWeakMap *> scannedWeakMaps;
  123|       |
  124|       |  /// The total size of the reachable WeakMaps.
  125|    141|  gcheapsize_t weakMapAllocBytes = 0;
  126|    141|  do {
  127|    141|    newReachableValueFound = false;
  128|       |    // Note that new reachable weak maps may be discovered during the loop, so
  129|       |    // reachableWeakMap.size() may increase during the loop.
  130|    141|    for (unsigned i = 0; i < reachableWeakMaps.size(); i++) {
  ------------------
  |  Branch (130:26): [True: 0, False: 141]
  ------------------
  131|      0|      JSWeakMap *weakMap = reachableWeakMaps[i];
  132|       |
  133|      0|      if (scannedWeakMaps.count(weakMap) == 0) {
  ------------------
  |  Branch (133:11): [True: 0, False: 0]
  ------------------
  134|      0|        weakMapAllocBytes += weakMap->getAllocatedSize();
  135|       |        // We need to scan the weak map here, to ensure that objects
  136|       |        // reachable from it (e.g., hidden class) are marked.  But we
  137|       |        // have to make one exception: the valueStorage field.  The
  138|       |        // whole point of weak map marking is to mark only the value
  139|       |        // fields that correspond to already-reachable keys; if we
  140|       |        // marked and drained, we would mark the value storage
  141|       |        // normally, and thus mark *all* objects reachable from it.
  142|       |        // So we temporarily null out the field, and restore it after.
  143|      0|        auto &valueStorageRef = weakMap->getValueStorageRef(gc);
  144|      0|        CompressedPointer valueStorage = valueStorageRef;
  145|      0|        valueStorageRef.setInGC(CompressedPointer{nullptr});
  146|      0|        gc.markCell(weakMap, skipWeakAcceptor);
  147|      0|        drainMarkStack(acceptor);
  148|      0|        valueStorageRef.setInGC(valueStorage);
  149|      0|        scannedWeakMaps.insert(weakMap);
  150|       |        // This handles an obscure potential bug: if we've already
  151|       |        // determined reachable keys for weak map 0, the scanning
  152|       |        // above of weak map 1 may have made otherwise-unreachable
  153|       |        // keys in weak map 0 reachable.  (Perhaps weak map 1 has a
  154|       |        // property that is also a key in map 0.)  Therefore, to be
  155|       |        // safe, make sure we make another pass through this loop
  156|       |        // whenever we do any scanning.
  157|      0|        newReachableValueFound = true;
  158|      0|      }
  159|       |
  160|      0|      if (markFromReachableWeakMapKeys(
  ------------------
  |  Branch (160:11): [True: 0, False: 0]
  ------------------
  161|      0|              gc,
  162|      0|              weakMap,
  163|      0|              acceptor,
  164|      0|              &unreachableKeys,
  165|      0|              objIsMarked,
  166|      0|              markFromVal)) {
  167|      0|        newReachableValueFound = true;
  168|      0|      }
  169|      0|    }
  170|    141|  } while (newReachableValueFound);
  ------------------
  |  Branch (170:12): [True: 0, False: 141]
  ------------------
  171|       |
  172|       |  // If mark stack overflow occurred, terminate.
  173|    141|  if (checkMarkStackOverflow()) {
  ------------------
  |  Branch (173:7): [Folded - Ignored]
  ------------------
  174|       |    // We return 0 in this case; the reachable WeakMaps will be
  175|       |    // discovered again, and we'll compute their total size in the iteration
  176|       |    // that eventually succeeds.
  177|      0|    return 0;
  178|      0|  }
  179|       |
  180|    141|#ifndef NDEBUG
  181|    141|  const auto numReachableWeakMaps = reachableWeakMaps.size();
  182|    141|#endif
  183|    141|  for (auto *weakMap : reachableWeakMaps) {
  ------------------
  |  Branch (183:22): [True: 0, False: 141]
  ------------------
  184|      0|    clearEntriesWithUnreachableKeys(gc, weakMap, objIsMarked);
  185|       |    // Previously we scanned the weak map while its value storage was
  186|       |    // temporarily nulled out, using an acceptor that skipped weak
  187|       |    // references.  Now scan again, so that we mark both the weak
  188|       |    // references and the value storage, and everything reachable from
  189|       |    // them.  The values in the the value storage corresponding to
  190|       |    // reachable keys have already been marked from, and values
  191|       |    // corresponding to unreachable keys have been cleared.  But it is
  192|       |    // still necessary to mark the value storage: for example, if it
  193|       |    // is a SegmentedArray, we need to mark any reachable array
  194|       |    // segment objects.  Note that we might visit some already-visited
  195|       |    // fields, pointing to already-marked objects; this is why we
  196|       |    // require the acceptor to be idempotent.
  197|      0|    gc.markCell(weakMap, acceptor);
  198|      0|    drainMarkStack(acceptor);
  199|      0|  }
  200|       |  // Because of the limited nature of the marking done above, we can
  201|       |  // assert that overflow did not occur.
  202|    141|  assert(!checkMarkStackOverflow());
  203|       |  // Also ensure that no new WeakMaps were encountered during the final drains.
  204|      0|  assert(
  205|    141|      numReachableWeakMaps == reachableWeakMaps.size() &&
  206|    141|      "A reachable weak map wasn't marked");
  207|       |
  208|      0|  return weakMapAllocBytes;
  209|    141|}

_ZN6hermes2vm17FreelistBuildMetaEPKNS0_6GCCellERNS0_8Metadata7BuilderE:
   46|      1|void FreelistBuildMeta(const GCCell *cell, Metadata::Builder &mb) {
   47|      1|  mb.setVTable(&HadesGC::OldGen::FreelistCell::vt);
   48|      1|}
_ZN6hermes2vm7HadesGC6OldGen11finishAllocEPNS0_6GCCellEj:
   50|   616k|GCCell *HadesGC::OldGen::finishAlloc(GCCell *cell, uint32_t sz) {
   51|       |  // Track the number of allocated bytes in a segment.
   52|   616k|  incrementAllocatedBytes(sz);
   53|       |  // Write a mark bit so this entry doesn't get free'd by the sweeper.
   54|   616k|  HeapSegment::setCellMarkBit(cell);
   55|       |  // Could overwrite the VTable, but the allocator will write a new one in
   56|       |  // anyway.
   57|   616k|  return cell;
   58|   616k|}
_ZN6hermes2vm7HadesGC6OldGen13SegmentBucket13addToFreelistEPS3_:
   60|  1.02k|void HadesGC::OldGen::SegmentBucket::addToFreelist(SegmentBucket *dummyHead) {
   61|  1.02k|  auto *oldHead = dummyHead->next;
   62|  1.02k|  if (oldHead)
  ------------------
  |  Branch (62:7): [True: 0, False: 1.02k]
  ------------------
   63|      0|    oldHead->prev = this;
   64|  1.02k|  prev = dummyHead;
   65|  1.02k|  next = oldHead;
   66|  1.02k|  dummyHead->next = this;
   67|  1.02k|}
_ZNK6hermes2vm7HadesGC6OldGen13SegmentBucket18removeFromFreelistEv:
   69|    903|void HadesGC::OldGen::SegmentBucket::removeFromFreelist() const {
   70|    903|  if (next)
  ------------------
  |  Branch (70:7): [True: 0, False: 903]
  ------------------
   71|      0|    next->prev = prev;
   72|    903|  prev->next = next;
   73|    903|}
_ZN6hermes2vm7HadesGC6OldGen17addCellToFreelistEPvjPNS2_13SegmentBucketE:
   78|    104|    SegmentBucket *segBucket) {
   79|    104|  assert(
   80|    104|      sz >= sizeof(FreelistCell) &&
   81|    104|      "Cannot construct a FreelistCell into an allocation in the OG");
   82|      0|  FreelistCell *newFreeCell = constructCell<FreelistCell>(addr, sz);
   83|    104|  HeapSegment::setCellHead(static_cast<GCCell *>(addr), sz);
   84|    104|  addCellToFreelist(newFreeCell, segBucket);
   85|    104|}
_ZN6hermes2vm7HadesGC6OldGen17addCellToFreelistEPNS2_12FreelistCellEPNS2_13SegmentBucketE:
   89|    469|    SegmentBucket *segBucket) {
   90|    469|  const size_t sz = cell->getAllocatedSize();
   91|       |  // Push onto the size-specific free list for this bucket and segment.
   92|    469|  CompressedPointer oldHead = segBucket->head;
   93|    469|  cell->next_ = oldHead;
   94|    469|  segBucket->head =
   95|    469|      CompressedPointer::encodeNonNull(cell, gc_.getPointerBase());
   96|       |
   97|       |  // If this SegmentBucket was not already in the freelist, add it.
   98|    469|  if (!oldHead) {
  ------------------
  |  Branch (98:7): [True: 433, False: 36]
  ------------------
   99|    433|    uint32_t bucket = getFreelistBucket(sz);
  100|    433|    auto *dummyHead = &buckets_[bucket];
  101|    433|    segBucket->addToFreelist(dummyHead);
  102|       |
  103|       |    // Set a bit indicating that there are now available blocks for this bucket.
  104|    433|    freelistBucketBitArray_.set(bucket, true);
  105|    433|  }
  106|       |
  107|       |  // In ASAN builds, poison the memory outside of the FreelistCell so that
  108|       |  // accesses are flagged as illegal while it is in the freelist.
  109|       |  // Here, and in other places where FreelistCells are poisoned, use +1 on the
  110|       |  // pointer to skip towards the memory region directly after the FreelistCell
  111|       |  // header of a cell. This way the header is always intact and readable, and
  112|       |  // only the contents of the cell are poisoned.
  113|    469|  __asan_poison_memory_region(cell + 1, sz - sizeof(FreelistCell));
  114|    469|}
_ZN6hermes2vm7HadesGC6OldGen26addCellToFreelistFromSweepEPcS3_RNSt3__15arrayINS2_13SegmentBucketELm267EEEb:
  120|  1.29k|    bool setHead) {
  121|  1.29k|  assert(
  122|  1.29k|      gc_.concurrentPhase_ == Phase::Sweep &&
  123|  1.29k|      "addCellToFreelistFromSweep should only be called during sweeping.");
  124|      0|  size_t newCellSize = freeRangeEnd - freeRangeStart;
  125|       |  // While coalescing, sweeping may generate new cells, so make sure the cell
  126|       |  // head is updated.
  127|  1.29k|  if (setHead)
  ------------------
  |  Branch (127:7): [True: 40, False: 1.25k]
  ------------------
  128|     40|    HeapSegment::setCellHead(
  129|     40|        reinterpret_cast<GCCell *>(freeRangeStart), newCellSize);
  130|  1.29k|  auto *newCell = constructCell<FreelistCell>(freeRangeStart, newCellSize);
  131|       |  // Get the size bucket for the cell being added;
  132|  1.29k|  const uint32_t bucket = getFreelistBucket(newCellSize);
  133|       |  // Push onto the size-specific free list for this bucket and segment.
  134|  1.29k|  auto *segBucket = &segBuckets[bucket];
  135|  1.29k|  newCell->next_ = segBucket->head;
  136|  1.29k|  segBucket->head =
  137|  1.29k|      CompressedPointer::encodeNonNull(newCell, gc_.getPointerBase());
  138|  1.29k|  __asan_poison_memory_region(newCell + 1, newCellSize - sizeof(FreelistCell));
  139|  1.29k|}
_ZN6hermes2vm7HadesGC6OldGen22removeCellFromFreelistEmPNS2_13SegmentBucketE:
  143|    171|    SegmentBucket *segBucket) {
  144|    171|  return removeCellFromFreelist(&segBucket->head, bucket, segBucket);
  145|    171|}
_ZN6hermes2vm7HadesGC6OldGen22removeCellFromFreelistEPNS0_27AssignableCompressedPointerEmPNS2_13SegmentBucketE:
  150|    536|    SegmentBucket *segBucket) {
  151|    536|  FreelistCell *cell =
  152|    536|      vmcast<FreelistCell>(prevLoc->getNonNull(gc_.getPointerBase()));
  153|    536|  assert(cell && "Cannot get a null cell from freelist");
  154|       |
  155|       |  // Update whatever was pointing to the cell we are removing.
  156|      0|  *prevLoc = cell->next_;
  157|       |  // Update the bit arrays if the given freelist is now empty.
  158|    536|  if (!segBucket->head) {
  ------------------
  |  Branch (158:7): [True: 495, False: 41]
  ------------------
  159|    495|    segBucket->removeFromFreelist();
  160|       |
  161|       |    // If setting the bit to 0 above made this bucket empty for all segments,
  162|       |    // set the bucket bit to 0 as well.
  163|    495|    freelistBucketBitArray_.set(bucket, buckets_[bucket].next);
  164|    495|  }
  165|       |
  166|       |  // Unpoison the memory so that the mutator can use it.
  167|    536|  __asan_unpoison_memory_region(
  168|    536|      cell + 1, cell->getAllocatedSize() - sizeof(FreelistCell));
  169|    536|  return cell;
  170|    536|}
_ZN6hermes2vm7HadesGC11HeapSegment11setCellHeadEPKNS0_6GCCellEm:
  175|   616k|    const size_t sz) {
  176|   616k|  const char *start = reinterpret_cast<const char *>(cellStart);
  177|   616k|  const char *end = start + sz;
  178|   616k|  CardTable *cards = cardTableCovering(start);
  179|   616k|  auto boundary = cards->nextBoundary(start);
  180|       |  // If this object crosses a card boundary, then update boundaries
  181|       |  // appropriately.
  182|   616k|  if (boundary.address() < end) {
  ------------------
  |  Branch (182:7): [True: 76.3k, False: 540k]
  ------------------
  183|  76.3k|    cards->updateBoundaries(&boundary, start, end);
  184|  76.3k|  }
  185|   616k|}
_ZN6hermes2vm7HadesGC11HeapSegment16getFirstCellHeadEm:
  187|    170|GCCell *HadesGC::HeapSegment::getFirstCellHead(size_t cardIdx) {
  188|    170|  CardTable &cards = cardTable();
  189|    170|  GCCell *cell = cards.firstObjForCard(cardIdx);
  190|    170|  assert(cell->isValid() && "Object head doesn't point to a valid object");
  191|      0|  return cell;
  192|    170|}
_ZN6hermes2vm7HadesGC6OldGen12FreelistCell5carveEj:
  229|   616k|GCCell *HadesGC::OldGen::FreelistCell::carve(uint32_t sz) {
  230|   616k|  const auto origSize = getAllocatedSize();
  231|   616k|  assert(
  232|   616k|      origSize >= sz + minAllocationSize() &&
  233|   616k|      "Can't split if it would leave too small of a second cell");
  234|      0|  const auto finalSize = origSize - sz;
  235|   616k|  char *newCellAddress = reinterpret_cast<char *>(this) + finalSize;
  236|   616k|  GCCell *const newCell = reinterpret_cast<GCCell *>(newCellAddress);
  237|   616k|  setSizeFromGC(finalSize);
  238|   616k|  HeapSegment::setCellHead(newCell, sz);
  239|   616k|  return newCell;
  240|   616k|}
_ZN6hermes2vm7HadesGC6OldGen9sweepNextEb:
 1097|    145|bool HadesGC::OldGen::sweepNext(bool backgroundThread) {
 1098|       |  // Check if there are any more segments to sweep. Note that in the case where
 1099|       |  // OG has zero segments, this also skips updating the stats and survival ratio
 1100|       |  // at the end of this function, since they are not required.
 1101|    145|  if (!sweepIterator_.segNumber)
  ------------------
  |  Branch (1101:7): [True: 0, False: 145]
  ------------------
 1102|      0|    return false;
 1103|    145|  assert(gc_.gcMutex_ && "gcMutex_ must be held while sweeping.");
 1104|       |
 1105|      0|  sweepIterator_.segNumber--;
 1106|       |
 1107|    145|  const bool isTracking = gc_.isTrackingIDs();
 1108|       |  // Re-evaluate this start point each time, as releasing the gcMutex_ allows
 1109|       |  // allocations into the old gen, which might boost the credited memory.
 1110|    145|  const uint64_t externalBytesBefore = externalBytes();
 1111|       |
 1112|    145|  auto &segBuckets = segmentBuckets_[sweepIterator_.segNumber];
 1113|       |
 1114|       |  // Clear the head pointers and remove this segment from the segment level
 1115|       |  // freelists, so that we can construct a new freelist. The
 1116|       |  // freelistBucketBitArray_ will be updated after the segment is swept. The
 1117|       |  // bits will be inconsistent with the actual freelist for the duration of
 1118|       |  // sweeping, but this is fine because gcMutex_ is held during the entire
 1119|       |  // period.
 1120|  38.8k|  for (size_t bucket = 0; bucket < kNumFreelistBuckets; bucket++) {
  ------------------
  |  Branch (1120:27): [True: 38.7k, False: 145]
  ------------------
 1121|  38.7k|    auto *segBucket = &segBuckets[bucket];
 1122|  38.7k|    if (segBucket->head) {
  ------------------
  |  Branch (1122:9): [True: 407, False: 38.3k]
  ------------------
 1123|    407|      segBucket->removeFromFreelist();
 1124|    407|      segBucket->head = nullptr;
 1125|    407|    }
 1126|  38.7k|  }
 1127|       |
 1128|    145|  char *freeRangeStart = nullptr, *freeRangeEnd = nullptr;
 1129|    145|  size_t mergedCells = 0;
 1130|    145|  int32_t segmentSweptBytes = 0;
 1131|   827k|  for (GCCell *cell : segments_[sweepIterator_.segNumber].cells()) {
  ------------------
  |  Branch (1131:21): [True: 827k, False: 145]
  ------------------
 1132|   827k|    assert(cell->isValid() && "Invalid cell in sweeping");
 1133|   827k|    if (HeapSegment::getCellMarkBit(cell)) {
  ------------------
  |  Branch (1133:9): [True: 826k, False: 1.34k]
  ------------------
 1134|       |      // Cannot concurrently trim storage. Technically just checking
 1135|       |      // backgroundThread would suffice, but the kConcurrentGC lets us compile
 1136|       |      // away this check in incremental mode.
 1137|   826k|      if (kConcurrentGC && backgroundThread)
  ------------------
  |  Branch (1137:11): [Folded - Ignored]
  |  Branch (1137:28): [True: 497k, False: 329k]
  ------------------
 1138|   497k|        continue;
 1139|   329k|      const uint32_t cellSize = cell->getAllocatedSize();
 1140|   329k|      const uint32_t trimmedSize =
 1141|   329k|          cell->getVT()->getTrimmedSize(cell, cellSize);
 1142|   329k|      assert(cellSize >= trimmedSize && "Growing objects is not supported.");
 1143|      0|      assert(
 1144|   329k|          trimmedSize >= minAllocationSize() &&
 1145|   329k|          "Trimmed object must still meet minimum size.");
 1146|      0|      assert(
 1147|   329k|          isSizeHeapAligned(trimmedSize) &&
 1148|   329k|          "Trimmed size must also be heap aligned");
 1149|      0|      const uint32_t trimmableBytes = cellSize - trimmedSize;
 1150|       |
 1151|       |      // If this cell has extra space we can trim, trim it.
 1152|   329k|      if (LLVM_UNLIKELY(trimmableBytes >= minAllocationSize())) {
  ------------------
  |  |  189|   329k|#define LLVM_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
  |  |  ------------------
  |  |  |  Branch (189:29): [True: 44, False: 329k]
  |  |  ------------------
  ------------------
 1153|     44|        static_cast<VariableSizeRuntimeCell *>(cell)->setSizeFromGC(
 1154|     44|            trimmedSize);
 1155|     44|        GCCell *newCell = cell->nextCell();
 1156|       |        // Just create a FillerCell, the next iteration will free it.
 1157|     44|        constructCell<FillerCell>(newCell, trimmableBytes);
 1158|     44|        assert(
 1159|     44|            !HeapSegment::getCellMarkBit(newCell) &&
 1160|     44|            "Trimmed space cannot be marked");
 1161|      0|        HeapSegment::setCellHead(newCell, trimmableBytes);
 1162|     44|#ifndef NDEBUG
 1163|     44|        sweepIterator_.trimmedBytes += trimmableBytes;
 1164|     44|#endif
 1165|     44|      }
 1166|      0|      continue;
 1167|   826k|    }
 1168|       |
 1169|  1.34k|    const auto sz = cell->getAllocatedSize();
 1170|  1.34k|    char *const cellCharPtr = reinterpret_cast<char *>(cell);
 1171|       |
 1172|  1.34k|    if (freeRangeEnd != cellCharPtr) {
  ------------------
  |  Branch (1172:9): [True: 1.29k, False: 51]
  ------------------
 1173|  1.29k|      assert(
 1174|  1.29k|          freeRangeEnd < cellCharPtr &&
 1175|  1.29k|          "Should not overshoot the start of an object");
 1176|       |      // We are starting a new free range, flush the previous one.
 1177|  1.29k|      if (LLVM_LIKELY(freeRangeStart))
  ------------------
  |  |  188|  1.29k|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 1.15k, False: 145]
  |  |  ------------------
  ------------------
 1178|  1.15k|        addCellToFreelistFromSweep(
 1179|  1.15k|            freeRangeStart, freeRangeEnd, segBuckets, mergedCells > 1);
 1180|       |
 1181|  1.29k|      mergedCells = 0;
 1182|  1.29k|      freeRangeEnd = freeRangeStart = cellCharPtr;
 1183|  1.29k|    }
 1184|       |    // Expand the current free range to include the current cell.
 1185|      0|    freeRangeEnd += sz;
 1186|  1.34k|    mergedCells++;
 1187|       |
 1188|  1.34k|    if (vmisa<FreelistCell>(cell))
  ------------------
  |  Branch (1188:9): [True: 1.07k, False: 276]
  ------------------
 1189|  1.07k|      continue;
 1190|       |
 1191|    276|    segmentSweptBytes += sz;
 1192|       |    // Cell is dead, run its finalizer first if it has one.
 1193|    276|    cell->getVT()->finalizeIfExists(cell, gc_);
 1194|    276|    if (isTracking && !vmisa<FillerCell>(cell)) {
  ------------------
  |  Branch (1194:9): [True: 0, False: 276]
  |  Branch (1194:23): [True: 0, False: 0]
  ------------------
 1195|      0|      gc_.untrackObject(cell, sz);
 1196|      0|    }
 1197|    276|  }
 1198|       |
 1199|       |  // Flush any free range that was left over.
 1200|    145|  if (freeRangeStart)
  ------------------
  |  Branch (1200:7): [True: 145, False: 0]
  ------------------
 1201|    145|    addCellToFreelistFromSweep(
 1202|    145|        freeRangeStart, freeRangeEnd, segBuckets, mergedCells > 1);
 1203|       |
 1204|       |  // Update the segment level freelists for any buckets that this segment has
 1205|       |  // free cells for.
 1206|  38.8k|  for (size_t bucket = 0; bucket < kNumFreelistBuckets; ++bucket) {
  ------------------
  |  Branch (1206:27): [True: 38.7k, False: 145]
  ------------------
 1207|  38.7k|    auto *segBucket = &segBuckets[bucket];
 1208|  38.7k|    if (segBucket->head)
  ------------------
  |  Branch (1208:9): [True: 592, False: 38.1k]
  ------------------
 1209|    592|      segBucket->addToFreelist(&buckets_[bucket]);
 1210|       |
 1211|       |    // In case sweeping has changed the availability of a bucket, update the
 1212|       |    // overall bit array. Note that this is necessary even if segBucket->head is
 1213|       |    // null, as the bits were not updated when the freelist for this segment was
 1214|       |    // erased prior to sweeping.
 1215|  38.7k|    freelistBucketBitArray_.set(bucket, buckets_[bucket].next);
 1216|  38.7k|  }
 1217|       |
 1218|       |  // Correct the allocated byte count.
 1219|    145|  incrementAllocatedBytes(-segmentSweptBytes);
 1220|    145|  sweepIterator_.sweptBytes += segmentSweptBytes;
 1221|    145|  sweepIterator_.sweptExternalBytes += externalBytesBefore - externalBytes();
 1222|       |
 1223|       |  // There are more iterations to go.
 1224|    145|  if (sweepIterator_.segNumber)
  ------------------
  |  Branch (1224:7): [True: 4, False: 141]
  ------------------
 1225|      4|    return true;
 1226|       |
 1227|       |  // This was the last sweep iteration, finish the collection.
 1228|    141|  auto &stats = *gc_.ogCollectionStats_;
 1229|       |
 1230|    141|  auto sweptBytes = sweepIterator_.sweptBytes;
 1231|    141|  auto preAllocated = stats.beforeAllocatedBytes();
 1232|    141|  if (sweptBytes > preAllocated) {
  ------------------
  |  Branch (1232:7): [True: 0, False: 141]
  ------------------
 1233|       |    // Only trimming can result in freeing more memory than was allocated at the
 1234|       |    // start of the collection, since we may trim cells that were allocated
 1235|       |    // after the collection started.
 1236|      0|    assert(sweepIterator_.trimmedBytes >= (sweptBytes - preAllocated));
 1237|       |    // We can't precisely calculate how much of the trimmed memory came from
 1238|       |    // cells allocated during the collection, so just cap the swept bytes at the
 1239|       |    // number of initially allocated bytes.
 1240|      0|    sweptBytes = preAllocated;
 1241|      0|  }
 1242|      0|  stats.setSweptBytes(sweptBytes);
 1243|    141|  stats.setSweptExternalBytes(sweepIterator_.sweptExternalBytes);
 1244|    141|  const uint64_t targetSizeBytes =
 1245|    141|      (stats.afterAllocatedBytes() + stats.afterExternalBytes()) /
 1246|    141|      gc_.occupancyTarget_;
 1247|       |
 1248|       |  // In a very large heap, use the configured max heap size as a backstop to
 1249|       |  // prevent the target size crossing it (which would delay collection and cause
 1250|       |  // an OOM). This is just an approximation, a precise accounting would subtract
 1251|       |  // segment metadata and YG memory.
 1252|    141|  uint64_t clampedSizeBytes = std::min(targetSizeBytes, gc_.maxHeapSize_);
 1253|    141|  targetSizeBytes_.update(clampedSizeBytes);
 1254|    141|  sweepIterator_ = {};
 1255|    141|  return false;
 1256|    145|}
_ZN6hermes2vm7HadesGC6OldGen15initializeSweepEv:
 1258|    143|void HadesGC::OldGen::initializeSweep() {
 1259|    143|  assert(
 1260|    143|      !sweepIterator_.segNumber && !sweepIterator_.sweptBytes &&
 1261|    143|      !sweepIterator_.sweptExternalBytes && "Sweep is already in progress.");
 1262|      0|  sweepIterator_.segNumber = segments_.size();
 1263|    143|}
_ZN6hermes2vm7HadesGC6OldGenC2ERS1_:
 1278|     99|HadesGC::OldGen::OldGen(HadesGC &gc) : gc_(gc) {}
_ZN6hermes2vm7HadesGCC2ERNS0_6GCBase11GCCallbacksERNS0_11PointerBaseERKNS0_8GCConfigENSt3__110shared_ptrINS0_12CrashManagerEEENSB_INS0_15StorageProviderEEEj:
 1308|     99|              kYGInitialSurvivalRatio} {
 1309|     99|  (void)vmExperimentFlags;
 1310|     99|  std::lock_guard<Mutex> lk(gcMutex_);
 1311|     99|  crashMgr_->setCustomData("HermesGC", getKindAsStr().c_str());
 1312|       |  // createSegment relies on member variables and should not be called until
 1313|       |  // they are initialised.
 1314|     99|  llvh::ErrorOr<HeapSegment> newYoungGen = createSegment();
 1315|     99|  if (!newYoungGen)
  ------------------
  |  Branch (1315:7): [True: 0, False: 99]
  ------------------
 1316|      0|    hermes_fatal("Failed to initialize the young gen", newYoungGen.getError());
 1317|     99|  setYoungGen(std::move(newYoungGen.get()));
 1318|     99|  const size_t initHeapSize = std::max<uint64_t>(
 1319|     99|      {gcConfig.getMinHeapSize(),
 1320|     99|       gcConfig.getInitHeapSize(),
 1321|     99|       HeapSegment::maxSize()});
 1322|     99|  oldGen_.setTargetSizeBytes(initHeapSize - HeapSegment::maxSize());
 1323|     99|}
_ZN6hermes2vm7HadesGCD2Ev:
 1325|     99|HadesGC::~HadesGC() {
 1326|       |  // finalizeAll calls waitForCollectionToFinish, so there should be no ongoing
 1327|       |  // collection.
 1328|     99|  assert(
 1329|     99|      concurrentPhase_ == Phase::None &&
 1330|     99|      "Must call finalizeAll before destructor.");
 1331|     99|}
_ZNK6hermes2vm7HadesGC12getKindAsStrEv:
 1467|    670|std::string HadesGC::getKindAsStr() const {
 1468|    670|  return kGCName;
 1469|    670|}
_ZN6hermes2vm7HadesGC7collectENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb:
 1471|    133|void HadesGC::collect(std::string cause, bool /*canEffectiveOOM*/) {
 1472|    133|  {
 1473|       |    // Wait for any existing collections to finish before starting a new one.
 1474|    133|    std::lock_guard<Mutex> lk{gcMutex_};
 1475|       |    // Disable the YG promotion mode. A forced GC via collect will do a full
 1476|       |    // collection immediately anyway, so there's no need to avoid collecting YG.
 1477|       |    // This is especially important when the forced GC is a memory warning.
 1478|    133|    promoteYGToOG_ = false;
 1479|    133|    waitForCollectionToFinish(cause);
 1480|    133|  }
 1481|       |  // This function should block until a collection finishes.
 1482|       |  // YG needs to be empty in order to do an OG collection.
 1483|    133|  youngGenCollection(cause, /*forceOldGenCollection*/ true);
 1484|    133|  {
 1485|       |    // Wait for the collection to complete.
 1486|    133|    std::lock_guard<Mutex> lk{gcMutex_};
 1487|    133|    waitForCollectionToFinish(cause);
 1488|    133|  }
 1489|       |  // Start a second YG collection to complete any pending compaction.
 1490|       |  // Since YG is empty, this will only be evacuating the compactee.
 1491|       |  // Note that it's possible for this call to start another OG collection if the
 1492|       |  // occupancy target is >= 75%. That doesn't break the contract of this
 1493|       |  // function though, and we don't want to bother with waiting for that
 1494|       |  // collection to complete because it won't find any garbage anyway.
 1495|    133|  youngGenCollection(std::move(cause), /*forceOldGenCollection*/ false);
 1496|    133|}
_ZN6hermes2vm7HadesGC25waitForCollectionToFinishENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEE:
 1498|    266|void HadesGC::waitForCollectionToFinish(std::string cause) {
 1499|    266|  assert(
 1500|    266|      gcMutex_ &&
 1501|    266|      "gcMutex_ must be held before calling waitForCollectionToFinish");
 1502|    266|  if (concurrentPhase_ == Phase::None) {
  ------------------
  |  Branch (1502:7): [True: 133, False: 133]
  ------------------
 1503|    133|    return;
 1504|    133|  }
 1505|    133|  GCCycle cycle{*this, "GC Old Gen (Direct)"};
 1506|       |
 1507|    133|  assert(!ygCollectionStats_ && "Cannot collect OG during a YG collection");
 1508|      0|  CollectionStats waitingStats(*this, std::move(cause), "waiting");
 1509|    133|  waitingStats.beginCPUTimeSection();
 1510|    133|  waitingStats.setBeginTime();
 1511|       |
 1512|  2.66k|  while (concurrentPhase_ != Phase::None)
  ------------------
  |  Branch (1512:10): [True: 2.53k, False: 133]
  ------------------
 1513|  2.53k|    incrementalCollect(false);
 1514|       |
 1515|    133|  waitingStats.endCPUTimeSection();
 1516|    133|  waitingStats.setEndTime();
 1517|    133|  recordGCStats(std::move(waitingStats).getEvent(), true);
 1518|    133|}
_ZN6hermes2vm7HadesGC16oldGenCollectionENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb:
 1520|    143|void HadesGC::oldGenCollection(std::string cause, bool forceCompaction) {
 1521|       |  // Full collection:
 1522|       |  //  * Mark all live objects by iterating through a worklist.
 1523|       |  //  * Sweep dead objects onto the free lists.
 1524|       |  // This function must be called while the gcMutex_ is held.
 1525|    143|  assert(gcMutex_ && "gcMutex_ must be held when starting an OG collection");
 1526|      0|  assert(
 1527|    143|      gcMutex_.depth() == 1 &&
 1528|    143|      "Need ability to release mutex in oldGenCollection.");
 1529|      0|  assert(
 1530|    143|      concurrentPhase_ == Phase::None &&
 1531|    143|      "Starting a second old gen collection");
 1532|       |  // Wait for any lingering background task to finish.
 1533|    143|  if (kConcurrentGC && ogThreadStatus_.valid()) {
  ------------------
  |  Branch (1533:7): [Folded - Ignored]
  |  Branch (1533:24): [True: 136, False: 7]
  ------------------
 1534|       |    // This is just making sure that any leftover work is completed before
 1535|       |    // starting a new collection. Since concurrentPhase_ == None here, there is
 1536|       |    // no collection ongoing. However, the background task may need to acquire
 1537|       |    // the lock in order to observe the value of concurrentPhase_.
 1538|    136|    std::unique_lock<Mutex> lk{gcMutex_, std::adopt_lock};
 1539|    136|    lk.unlock();
 1540|    136|    ogThreadStatus_.get();
 1541|    136|    lk.lock();
 1542|    136|    lk.release();
 1543|    136|  }
 1544|       |  // We know ygCollectionStats_ exists because oldGenCollection is only called
 1545|       |  // by youngGenCollection.
 1546|    143|  ygCollectionStats_->addCollectionType("old gen start");
 1547|    143|#ifdef HERMES_SLOW_DEBUG
 1548|    143|  checkWellFormed();
 1549|    143|#endif
 1550|    143|  ogCollectionStats_ =
 1551|    143|      std::make_unique<CollectionStats>(*this, std::move(cause), "old");
 1552|       |  // NOTE: Leave CPU time as zero if the collection isn't concurrent, as the
 1553|       |  // times aren't useful.
 1554|    143|  if (kConcurrentGC)
  ------------------
  |  Branch (1554:7): [Folded - Ignored]
  ------------------
 1555|    143|    ogCollectionStats_->beginCPUTimeSection();
 1556|    143|  ogCollectionStats_->setBeginTime();
 1557|    143|  ogCollectionStats_->setBeforeSizes(
 1558|    143|      oldGen_.allocatedBytes(), oldGen_.externalBytes(), segmentFootprint());
 1559|       |
 1560|       |  // If we've reached the first OG collection, switch back to YG mode.
 1561|    143|  promoteYGToOG_ = false;
 1562|       |
 1563|       |  // First, clear any mark bits that were set by a previous collection or
 1564|       |  // direct-to-OG allocation, they aren't needed anymore.
 1565|    143|  for (HeapSegment &seg : oldGen_)
  ------------------
  |  Branch (1565:25): [True: 150, False: 143]
  ------------------
 1566|    150|    seg.markBitArray().clear();
 1567|       |
 1568|       |  // Unmark all symbols in the identifier table, as Symbol liveness will be
 1569|       |  // determined during the collection.
 1570|    143|  gcCallbacks_.unmarkSymbols();
 1571|       |
 1572|       |  // Mark phase: discover all pointers that are live.
 1573|       |  // This assignment will reset any leftover memory from the last collection. We
 1574|       |  // leave the last marker alive to avoid a race condition with setting
 1575|       |  // concurrentPhase_, oldGenMarker_ and the write barrier.
 1576|    143|  oldGenMarker_.reset(new MarkAcceptor{*this});
 1577|    143|  {
 1578|       |    // Roots are marked before a marking thread is spun up, so that the root
 1579|       |    // marking is atomic.
 1580|    143|    DroppingAcceptor<MarkAcceptor> nameAcceptor{*oldGenMarker_};
 1581|    143|    markRoots(nameAcceptor, /*markLongLived*/ true);
 1582|       |    // Do not call markWeakRoots here, as weak roots can only be cleared
 1583|       |    // after liveness is known.
 1584|    143|  }
 1585|       |
 1586|    143|  concurrentPhase_ = Phase::Mark;
 1587|       |  // Before the thread starts up, make sure that any write barriers are aware
 1588|       |  // that concurrent marking is happening.
 1589|    143|  ogMarkingBarriers_ = true;
 1590|       |  // prepareCompactee must be called before the new thread is spawned, in order
 1591|       |  // to ensure that write barriers start operating immediately, and that any
 1592|       |  // objects promoted during an intervening YG collection are correctly scanned.
 1593|    143|  prepareCompactee(forceCompaction);
 1594|       |
 1595|       |  // Setup the sweep iterator when collection begins, because the number of
 1596|       |  // segments can change if a YG collection interleaves. There's no need to
 1597|       |  // sweep those extra segments since they are full of newly promoted
 1598|       |  // objects from YG (which have all their mark bits set), thus the sweep
 1599|       |  // iterator doesn't need to be updated. We also don't need to sweep any
 1600|       |  // segments made since the start of the collection, since they won't have
 1601|       |  // any unmarked objects anyway.
 1602|       |  // NOTE: this must be called after prepareCompactee, which may remove segments
 1603|       |  // from the heap.
 1604|    143|  oldGen_.initializeSweep();
 1605|       |
 1606|    143|  if (!kConcurrentGC) {
  ------------------
  |  Branch (1606:7): [Folded - Ignored]
  ------------------
 1607|       |    // 32-bit system: 64-bit HermesValues cannot be updated in one atomic
 1608|       |    // instruction. Have YG collections interleave marking work.
 1609|       |    // In this version of the system, the mark stack will be drained in batches
 1610|       |    // during each YG collection. Once the mark stack is fully drained, the rest
 1611|       |    // of the collection finishes while blocking a YG GC. This allows
 1612|       |    // incremental work without actually using multiple threads.
 1613|       |
 1614|       |    // Initialize the drain rate.
 1615|      0|    oldGenMarker_->setDrainRate(getDrainRate());
 1616|      0|    return;
 1617|      0|  }
 1618|    143|  ogCollectionStats_->endCPUTimeSection();
 1619|       |  // 64-bit system: 64-bit HermesValues can be updated in one atomic
 1620|       |  // instruction. Start up a separate thread for doing marking work.
 1621|       |  // NOTE: Since the "this" value (the HadesGC instance) is copied to the
 1622|       |  // executor, the GC cannot be destructed until the new thread completes. This
 1623|       |  // means that before destroying the GC, waitForCollectionToFinish must be
 1624|       |  // called.
 1625|    143|  collectOGInBackground();
 1626|       |  // Use concurrentPhase_ to be able to tell when the collection finishes.
 1627|    143|}
_ZN6hermes2vm7HadesGC21collectOGInBackgroundEv:
 1629|    151|void HadesGC::collectOGInBackground() {
 1630|    151|  assert(gcMutex_ && "Must hold GC mutex when scheduling background work.");
 1631|      0|  assert(
 1632|    151|      !backgroundTaskActive_ && "Should only have one active task at a time");
 1633|      0|  assert(kConcurrentGC && "Background work can only be done in concurrent GC");
 1634|      0|#ifndef NDEBUG
 1635|      0|  backgroundTaskActive_ = true;
 1636|    151|#endif
 1637|       |
 1638|    151|  ogThreadStatus_ = backgroundExecutor_->add([this]() {
 1639|    151|    std::unique_lock<Mutex> lk(gcMutex_);
 1640|    151|    while (true) {
 1641|       |      // If the mutator has requested the background task to stop and yield
 1642|       |      // gcMutex_, wait on ogPauseCondVar_ until the mutator acquires the mutex
 1643|       |      // and signals that we may resume.
 1644|    151|      ogPauseCondVar_.wait(
 1645|    151|          lk, [this] { return !ogPaused_.load(std::memory_order_relaxed); });
 1646|    151|      assert(
 1647|    151|          backgroundTaskActive_ &&
 1648|    151|          "backgroundTaskActive_ must be true when the background task is in the loop.");
 1649|    151|      incrementalCollect(true);
 1650|    151|      if (concurrentPhase_ == Phase::None ||
 1651|    151|          concurrentPhase_ == Phase::CompleteMarking) {
 1652|    151|#ifndef NDEBUG
 1653|    151|        backgroundTaskActive_ = false;
 1654|    151|#endif
 1655|    151|        break;
 1656|    151|      }
 1657|    151|    }
 1658|    151|  });
 1659|    151|}
_ZN6hermes2vm7HadesGC19pauseBackgroundTaskEv:
 1661|   187k|std::lock_guard<Mutex> HadesGC::pauseBackgroundTask() {
 1662|   187k|  assert(kConcurrentGC && "Should not be called in incremental mode");
 1663|      0|  assert(!calledByBackgroundThread() && "Must be called from mutator");
 1664|       |  // Signal to the background thread that it should stop and wait on
 1665|       |  // ogPauseCondVar_.
 1666|      0|  ogPaused_.store(true, std::memory_order_relaxed);
 1667|       |  // Acquire gcMutex_ as soon as it is released by the background thread.
 1668|   187k|  gcMutex_.lock();
 1669|       |  // Signal to the background thread that it may resume. Note that it will just
 1670|       |  // go to wait on gcMutex_, since it is currently held by this thread.
 1671|   187k|  ogPaused_.store(false, std::memory_order_relaxed);
 1672|   187k|  ogPauseCondVar_.notify_one();
 1673|   187k|  return std::lock_guard(gcMutex_, std::adopt_lock);
 1674|   187k|}
_ZN6hermes2vm7HadesGC18incrementalCollectEb:
 1676|  6.65k|void HadesGC::incrementalCollect(bool backgroundThread) {
 1677|  6.65k|  assert(gcMutex_ && "Must hold the GC mutex when calling incrementalCollect");
 1678|      0|  switch (concurrentPhase_) {
 1679|    134|    case Phase::None:
  ------------------
  |  Branch (1679:5): [True: 134, False: 6.52k]
  ------------------
 1680|    134|      break;
 1681|  6.23k|    case Phase::Mark:
  ------------------
  |  Branch (1681:5): [True: 6.23k, False: 420]
  ------------------
 1682|  6.23k|      if (!kConcurrentGC && ygCollectionStats_)
  ------------------
  |  Branch (1682:11): [Folded - Ignored]
  |  Branch (1682:29): [True: 0, False: 0]
  ------------------
 1683|      0|        ygCollectionStats_->addCollectionType("marking");
 1684|       |      // Drain some work from the mark worklist. If the work has finished
 1685|       |      // completely, move on to CompleteMarking.
 1686|  6.23k|      if (!oldGenMarker_->drainSomeWork())
  ------------------
  |  Branch (1686:11): [True: 142, False: 6.09k]
  ------------------
 1687|    142|        concurrentPhase_ = Phase::CompleteMarking;
 1688|  6.23k|      break;
 1689|    141|    case Phase::CompleteMarking:
  ------------------
  |  Branch (1689:5): [True: 141, False: 6.51k]
  ------------------
 1690|       |      // Background task should exit, the mutator will restart it after the STW
 1691|       |      // pause.
 1692|    141|      if (!backgroundThread) {
  ------------------
  |  Branch (1692:11): [True: 141, False: 0]
  ------------------
 1693|    141|        if (ygCollectionStats_)
  ------------------
  |  Branch (1693:13): [True: 8, False: 133]
  ------------------
 1694|      8|          ygCollectionStats_->addCollectionType("complete marking");
 1695|    141|        completeMarking();
 1696|    141|        concurrentPhase_ = Phase::Sweep;
 1697|    141|      }
 1698|    141|      break;
 1699|    145|    case Phase::Sweep:
  ------------------
  |  Branch (1699:5): [True: 145, False: 6.51k]
  ------------------
 1700|    145|      if (!kConcurrentGC && ygCollectionStats_)
  ------------------
  |  Branch (1700:11): [Folded - Ignored]
  |  Branch (1700:29): [True: 0, False: 0]
  ------------------
 1701|      0|        ygCollectionStats_->addCollectionType("sweeping");
 1702|       |      // Calling oldGen_.sweepNext() will sweep the next segment.
 1703|    145|      if (!oldGen_.sweepNext(backgroundThread)) {
  ------------------
  |  Branch (1703:11): [True: 141, False: 4]
  ------------------
 1704|       |        // Finish any collection bookkeeping.
 1705|    141|        ogCollectionStats_->setEndTime();
 1706|    141|        ogCollectionStats_->setAfterSize(segmentFootprint());
 1707|    141|        compacteeHandleForSweep_.reset();
 1708|    141|        concurrentPhase_ = Phase::None;
 1709|    141|        if (!backgroundThread)
  ------------------
  |  Branch (1709:13): [True: 133, False: 8]
  ------------------
 1710|    133|          checkTripwireAndSubmitStats();
 1711|    141|      }
 1712|    145|      break;
 1713|      0|    default:
  ------------------
  |  Branch (1713:5): [True: 0, False: 6.65k]
  ------------------
 1714|      0|      llvm_unreachable("No other possible state between iterations");
  ------------------
  |  |  137|      0|  ::llvh::llvm_unreachable_internal(msg, __FILE__, __LINE__)
  ------------------
 1715|  6.65k|  }
 1716|  6.65k|}
_ZN6hermes2vm7HadesGC16prepareCompacteeEb:
 1718|    143|void HadesGC::prepareCompactee(bool forceCompaction) {
 1719|    143|  assert(gcMutex_);
 1720|      0|  assert(
 1721|    143|      compactee_.empty() &&
 1722|    143|      "Ongoing compaction at the start of an OG collection.");
 1723|    143|  if (promoteYGToOG_)
  ------------------
  |  Branch (1723:7): [True: 0, False: 143]
  ------------------
 1724|      0|    return;
 1725|       |
 1726|       |#ifdef HERMESVM_SANITIZE_HANDLES
 1727|       |  // Handle-SAN forces a compaction to move some OG objects.
 1728|       |  if (sanitizeRate_)
 1729|       |    forceCompaction = true;
 1730|       |#endif
 1731|       |
 1732|       |  // To avoid compacting too often, keep a buffer of one segment or 5% of the
 1733|       |  // heap (whichever is greater). Since the selected segment will be removed
 1734|       |  // from the heap, we only want to compact if there are at least 2 segments in
 1735|       |  // the OG.
 1736|    143|  uint64_t buffer = std::max<uint64_t>(
 1737|    143|      oldGen_.targetSizeBytes() / 20, HeapSegment::maxSize());
 1738|    143|  uint64_t threshold = oldGen_.targetSizeBytes() + buffer;
 1739|    143|  uint64_t totalBytes = oldGen_.size() + oldGen_.externalBytes();
 1740|    143|  if ((forceCompaction || totalBytes > threshold) &&
  ------------------
  |  Branch (1740:8): [True: 133, False: 10]
  |  Branch (1740:27): [True: 1, False: 9]
  ------------------
 1741|    143|      oldGen_.numSegments() > 1) {
  ------------------
  |  Branch (1741:7): [True: 1, False: 133]
  ------------------
 1742|      1|    compactee_.segment = std::make_shared<HeapSegment>(oldGen_.popSegment());
 1743|      1|    addSegmentExtentToCrashManager(
 1744|      1|        *compactee_.segment, kCompacteeNameForCrashMgr);
 1745|      1|    compactee_.start = compactee_.segment->lowLim();
 1746|      1|    compactee_.startCP = CompressedPointer::encodeNonNull(
 1747|      1|        reinterpret_cast<GCCell *>(compactee_.segment->lowLim()),
 1748|      1|        getPointerBase());
 1749|      1|    compacteeHandleForSweep_ = compactee_.segment;
 1750|      1|  }
 1751|    143|}
_ZN6hermes2vm7HadesGC21updateOldGenThresholdEv:
 1790|    141|void HadesGC::updateOldGenThreshold() {
 1791|    141|  const double markedBytes = oldGenMarker_->markedBytes();
 1792|    141|  const double preAllocated = ogCollectionStats_->beforeAllocatedBytes();
 1793|    141|  assert(markedBytes <= preAllocated && "Cannot mark more than was allocated");
 1794|      0|  const double postAllocated = oldGen_.allocatedBytes();
 1795|    141|  assert(postAllocated >= preAllocated && "Cannot free memory during marking");
 1796|       |
 1797|       |  // Calculate the number of bytes marked for each byte allocated into the old
 1798|       |  // generation. Note that this is skewed heavily by the number of young gen
 1799|       |  // collections that occur during marking, and therefore the size of the heap.
 1800|       |  // 1. In small heaps, this underestimates the true mark rate, because marking
 1801|       |  // may finish shortly after it starts, but we have to wait until the next YG
 1802|       |  // collection is complete. This is desirable, because we need a more
 1803|       |  // conservative margin in small heaps to avoid running over the heap limit.
 1804|       |  // 2. In large heaps, this approaches the true mark rate, because there will
 1805|       |  // be several young gen collections, giving us more accurate and finer grained
 1806|       |  // information on the allocation rate.
 1807|      0|  const auto concurrentMarkRate =
 1808|    141|      markedBytes / std::max(postAllocated - preAllocated, 1.0);
 1809|       |
 1810|       |  // If the heap is completely full and we are running into blocking
 1811|       |  // collections, then it is possible that almost nothing is allocated into the
 1812|       |  // OG during the mark phase. Without correction, can become a self-reinforcing
 1813|       |  // cycle because it will cause the mark rate to be overestimated, making
 1814|       |  // collections start later, further increasing the odds of a blocking
 1815|       |  // collection. Empirically, the mark rate can be much higher than the below
 1816|       |  // limit, but we get diminishing returns with increasing mark rate, since the
 1817|       |  // threshold just asymptotically approaches 1.
 1818|    141|  const auto clampedRate = std::min(concurrentMarkRate, 20.0);
 1819|       |
 1820|       |  // Update the collection threshold using the newly computed mark rate. To add
 1821|       |  // a margin of safety, we assume everything in the heap at the time we hit the
 1822|       |  // threshold needs to be marked. This margin allows for variance in the
 1823|       |  // marking rate, and gives time for sweeping to start. The update is
 1824|       |  // calculated by viewing the threshold as the bytes to mark and the remainder
 1825|       |  // after the threshold as the bytes to fill. We can then solve for it using:
 1826|       |  // MarkRate = Threshold / (1 - Threshold)
 1827|       |  // This has some nice properties:
 1828|       |  // 1. As the threshold increases, the safety margin also increases (since the
 1829|       |  // safety margin is just the difference between the threshold and the
 1830|       |  // occupancy ratio).
 1831|       |  // 2. It neatly fits the range [0, 1) for a mark rate in [0, infinity). There
 1832|       |  // is no risk of division by zero.
 1833|    141|  ogThreshold_.update(clampedRate / (clampedRate + 1));
 1834|    141|}
_ZN6hermes2vm7HadesGC15completeMarkingEv:
 1836|    141|void HadesGC::completeMarking() {
 1837|    141|  assert(inGC() && "inGC_ must be set during the STW pause");
 1838|       |  // Update the collection threshold before marking anything more, so that only
 1839|       |  // the concurrently marked bytes are part of the calculation.
 1840|      0|  updateOldGenThreshold();
 1841|    141|  ogMarkingBarriers_ = false;
 1842|       |  // No locks are needed here because the world is stopped and there is only 1
 1843|       |  // active thread.
 1844|    141|  oldGenMarker_->globalWorklist().flushPushChunk();
 1845|    141|  {
 1846|       |    // Remark any roots that may have changed without executing barriers.
 1847|    141|    DroppingAcceptor<MarkAcceptor> nameAcceptor{*oldGenMarker_};
 1848|    141|    gcCallbacks_.markRootsForCompleteMarking(nameAcceptor);
 1849|    141|  }
 1850|       |  // Drain the marking queue.
 1851|    141|  oldGenMarker_->drainAllWork();
 1852|    141|  assert(
 1853|    141|      oldGenMarker_->globalWorklist().empty() &&
 1854|    141|      "Marking worklist wasn't drained");
 1855|      0|  completeWeakMapMarking(*oldGenMarker_);
 1856|       |  // Update the compactee tracking pointers so that the next YG collection will
 1857|       |  // do a compaction.
 1858|    141|  compactee_.evacStart = compactee_.start;
 1859|    141|  compactee_.evacStartCP = compactee_.startCP;
 1860|    141|  assert(
 1861|    141|      oldGenMarker_->globalWorklist().empty() &&
 1862|    141|      "Marking worklist wasn't drained");
 1863|       |  // Reset weak roots to null after full reachability has been
 1864|       |  // determined.
 1865|      0|  MarkWeakRootsAcceptor acceptor{*this};
 1866|    141|  markWeakRoots(acceptor, /*markLongLived*/ true);
 1867|       |
 1868|       |  // Now free symbols and weak refs.
 1869|    141|  gcCallbacks_.freeSymbols(oldGenMarker_->markedSymbols());
 1870|       |  // NOTE: If sweeping is done concurrently with YG collection, weak references
 1871|       |  // could be handled during the sweep pass instead of the mark pass. The read
 1872|       |  // barrier will need to be updated to handle the case where a WeakRef points
 1873|       |  // to an now-empty cell.
 1874|    141|  updateWeakReferencesForOldGen();
 1875|       |
 1876|       |  // Nothing needs oldGenMarker_ from this point onward.
 1877|    141|  oldGenMarker_.reset();
 1878|    141|}
_ZN6hermes2vm7HadesGC11finalizeAllEv:
 1880|     99|void HadesGC::finalizeAll() {
 1881|     99|  std::lock_guard<Mutex> lk{gcMutex_};
 1882|       |  // Terminate any existing OG collection.
 1883|     99|  concurrentPhase_ = Phase::None;
 1884|     99|  if (ogCollectionStats_)
  ------------------
  |  Branch (1884:7): [True: 6, False: 93]
  ------------------
 1885|      6|    ogCollectionStats_->markUsed();
 1886|       |  // In case of an OOM, we may be in the middle of a YG collection.
 1887|     99|  if (ygCollectionStats_)
  ------------------
  |  Branch (1887:7): [True: 0, False: 99]
  ------------------
 1888|      0|    ygCollectionStats_->markUsed();
 1889|       |  // Now finalize the heap.
 1890|       |  // We might be in the middle of a YG collection, with some objects promoted to
 1891|       |  // the OG, and some not. Only finalize objects that have not been promoted to
 1892|       |  // OG, and let the OG finalize the promoted objects.
 1893|     99|  finalizeYoungGenObjects();
 1894|       |
 1895|       |  // If we are in the middle of a YG collection, some objects may have already
 1896|       |  // been promoted to the OG. Assume that any remaining external memory in the
 1897|       |  // YG belongs to those objects.
 1898|     99|  transferExternalMemoryToOldGen();
 1899|       |
 1900|     99|  const auto finalizeCallback = [this](GCCell *cell) {
 1901|     99|    assert(cell->isValid() && "Invalid cell in finalizeAll");
 1902|     99|    cell->getVT()->finalizeIfExists(cell, *this);
 1903|     99|  };
 1904|     99|  if (compactee_.segment)
  ------------------
  |  Branch (1904:7): [True: 1, False: 98]
  ------------------
 1905|      1|    compactee_.segment->forCompactedObjs(finalizeCallback, getPointerBase());
 1906|       |
 1907|     99|  for (HeapSegment &seg : oldGen_)
  ------------------
  |  Branch (1907:25): [True: 103, False: 99]
  ------------------
 1908|    103|    seg.forAllObjs(finalizeCallback);
 1909|     99|}
_ZN6hermes2vm7HadesGC20creditExternalMemoryEPNS0_6GCCellEj:
 1911|    929|void HadesGC::creditExternalMemory(GCCell *cell, uint32_t sz) {
 1912|    929|  assert(canAllocExternalMemory(sz) && "Precondition");
 1913|    929|  if (inYoungGen(cell)) {
  ------------------
  |  Branch (1913:7): [True: 275, False: 654]
  ------------------
 1914|    275|    size_t newYGExtBytes = getYoungGenExternalBytes() + sz;
 1915|    275|    setYoungGenExternalBytes(newYGExtBytes);
 1916|    275|    auto adj = std::min<size_t>(sz, youngGen_.available());
 1917|    275|    youngGen_.setEffectiveEnd(youngGen_.effectiveEnd() - adj);
 1918|    654|  } else {
 1919|    654|    std::lock_guard<Mutex> lk{gcMutex_};
 1920|    654|    oldGen_.creditExternalMemory(sz);
 1921|    654|    uint64_t totalBytes = oldGen_.allocatedBytes() + oldGen_.externalBytes();
 1922|    654|    if (totalBytes > oldGen_.targetSizeBytes())
  ------------------
  |  Branch (1922:9): [True: 2, False: 652]
  ------------------
 1923|      2|      youngGen_.setEffectiveEnd(youngGen_.level());
 1924|    654|  }
 1925|    929|}
_ZN6hermes2vm7HadesGC19debitExternalMemoryEPNS0_6GCCellEj:
 1927|    126|void HadesGC::debitExternalMemory(GCCell *cell, uint32_t sz) {
 1928|    126|  if (inYoungGen(cell)) {
  ------------------
  |  Branch (1928:7): [True: 29, False: 97]
  ------------------
 1929|     29|    size_t oldYGExtBytes = getYoungGenExternalBytes();
 1930|     29|    assert(
 1931|     29|        oldYGExtBytes >= sz && "Debiting more native memory than was credited");
 1932|      0|    setYoungGenExternalBytes(oldYGExtBytes - sz);
 1933|       |    // Don't modify the effective end here. creditExternalMemory is in charge
 1934|       |    // of tracking this. We don't expect many debits to not be from finalizers
 1935|       |    // anyway.
 1936|     97|  } else {
 1937|     97|    std::lock_guard<Mutex> lk{gcMutex_};
 1938|     97|    oldGen_.debitExternalMemory(sz);
 1939|     97|  }
 1940|    126|}
_ZN6hermes2vm7HadesGC16writeBarrierSlowEPKNS0_17GCHermesValueBaseINS0_13HermesValue32EEES3_:
 1954|   293k|    SmallHermesValue value) {
 1955|   293k|  if (ogMarkingBarriers_) {
  ------------------
  |  Branch (1955:7): [True: 149k, False: 143k]
  ------------------
 1956|   149k|    snapshotWriteBarrierInternal(*loc);
 1957|   149k|  }
 1958|   293k|  if (!value.isPointer()) {
  ------------------
  |  Branch (1958:7): [True: 283k, False: 9.70k]
  ------------------
 1959|   283k|    return;
 1960|   283k|  }
 1961|  9.70k|  relocationWriteBarrier(loc, value.getPointer(getPointerBase()));
 1962|  9.70k|}
_ZN6hermes2vm7HadesGC16writeBarrierSlowEPKNS0_13GCPointerBaseEPKNS0_6GCCellE:
 1964|   258k|void HadesGC::writeBarrierSlow(const GCPointerBase *loc, const GCCell *value) {
 1965|   258k|  if (*loc && ogMarkingBarriers_)
  ------------------
  |  Branch (1965:7): [True: 191k, False: 67.0k]
  |  Branch (1965:15): [True: 157, False: 191k]
  ------------------
 1966|    157|    snapshotWriteBarrierInternal(*loc);
 1967|       |  // Always do the non-snapshot write barrier in order for YG to be able to
 1968|       |  // scan cards.
 1969|   258k|  relocationWriteBarrier(loc, value);
 1970|   258k|}
_ZN6hermes2vm7HadesGC28snapshotWriteBarrierInternalEPNS0_6GCCellE:
 2036|     19|void HadesGC::snapshotWriteBarrierInternal(GCCell *oldValue) {
 2037|     19|  assert(
 2038|     19|      (oldValue->isValid()) &&
 2039|     19|      "Invalid cell encountered in snapshotWriteBarrier");
 2040|     19|  if (!inYoungGen(oldValue)) {
  ------------------
  |  Branch (2040:7): [True: 19, False: 0]
  ------------------
 2041|     19|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|     19|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 2042|      0|        dbgContains(oldValue) &&
 2043|      0|        "Non-heap pointer encountered in snapshotWriteBarrier");
 2044|      0|    oldGenMarker_->globalWorklist().enqueue(oldValue);
 2045|     19|  }
 2046|     19|}
_ZN6hermes2vm7HadesGC28snapshotWriteBarrierInternalENS0_17CompressedPointerE:
 2048|    172|void HadesGC::snapshotWriteBarrierInternal(CompressedPointer oldValue) {
 2049|    172|  assert(
 2050|    172|      (oldValue.get(getPointerBase())->isValid()) &&
 2051|    172|      "Invalid cell encountered in snapshotWriteBarrier");
 2052|    172|  if (!inYoungGen(oldValue)) {
  ------------------
  |  Branch (2052:7): [True: 81, False: 91]
  ------------------
 2053|     81|    GCCell *ptr = oldValue.get(getPointerBase());
 2054|     81|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|     81|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 2055|      0|        dbgContains(ptr) &&
 2056|      0|        "Non-heap pointer encountered in snapshotWriteBarrier");
 2057|      0|    oldGenMarker_->globalWorklist().enqueue(ptr);
 2058|     81|  }
 2059|    172|}
_ZN6hermes2vm7HadesGC28snapshotWriteBarrierInternalENS0_13HermesValue32E:
 2070|   149k|void HadesGC::snapshotWriteBarrierInternal(SmallHermesValue oldValue) {
 2071|   149k|  if (oldValue.isPointer()) {
  ------------------
  |  Branch (2071:7): [True: 0, False: 149k]
  ------------------
 2072|      0|    snapshotWriteBarrierInternal(oldValue.getPointer());
 2073|   149k|  } else if (oldValue.isSymbol()) {
  ------------------
  |  Branch (2073:14): [True: 0, False: 149k]
  ------------------
 2074|       |    // Symbols need snapshot write barriers.
 2075|      0|    snapshotWriteBarrierInternal(oldValue.getSymbol());
 2076|      0|  }
 2077|   149k|}
_ZN6hermes2vm7HadesGC22relocationWriteBarrierEPKvS3_:
 2086|   324k|void HadesGC::relocationWriteBarrier(const void *loc, const void *value) {
 2087|   324k|  assert(!inYoungGen(loc) && "Pre-condition from other callers");
 2088|       |  // Do not dirty cards for compactee->compactee, yg->yg, or yg->compactee
 2089|       |  // pointers. But do dirty cards for compactee->yg pointers, since compaction
 2090|       |  // may not happen in the next YG.
 2091|   324k|  if (AlignedStorage::containedInSame(loc, value)) {
  ------------------
  |  Branch (2091:7): [True: 56.9k, False: 267k]
  ------------------
 2092|  56.9k|    return;
 2093|  56.9k|  }
 2094|   267k|  if (inYoungGen(value) || compactee_.contains(value)) {
  ------------------
  |  Branch (2094:7): [True: 267k, False: 133]
  |  Branch (2094:28): [True: 0, False: 133]
  ------------------
 2095|       |    // Only dirty a card if it's an old-to-young or old-to-compactee pointer.
 2096|       |    // This is fine to do since the GC never modifies card tables outside of
 2097|       |    // allocation.
 2098|       |    // Note that this *only* applies since the boundaries are updated separately
 2099|       |    // from the card table being marked itself.
 2100|   267k|    HeapSegment::cardTableCovering(loc)->dirtyCardForAddress(loc);
 2101|   267k|  }
 2102|   267k|}
_ZN6hermes2vm7HadesGC18weakRefReadBarrierEPNS0_6GCCellE:
 2104|   119k|void HadesGC::weakRefReadBarrier(GCCell *value) {
 2105|   119k|  assert(
 2106|   119k|      !calledByBackgroundThread() &&
 2107|   119k|      "Read barrier invoked by background thread.");
 2108|       |  // If the GC is marking, conservatively mark the value as live.
 2109|   119k|  if (ogMarkingBarriers_)
  ------------------
  |  Branch (2109:7): [True: 19, False: 119k]
  ------------------
 2110|     19|    snapshotWriteBarrierInternal(value);
 2111|       |
 2112|       |  // Otherwise, if no GC is active at all, the weak ref must be alive.
 2113|       |  // During sweeping there's no special handling either.
 2114|   119k|}
_ZN6hermes2vm7HadesGC22canAllocExternalMemoryEj:
 2116|  1.83k|bool HadesGC::canAllocExternalMemory(uint32_t size) {
 2117|  1.83k|  return size <= maxHeapSize_;
 2118|  1.83k|}
_ZN6hermes2vm7HadesGC10forAllObjsERKNSt3__18functionIFvPNS0_6GCCellEEEE:
 2120|  1.34k|void HadesGC::forAllObjs(const std::function<void(GCCell *)> &callback) {
 2121|  1.34k|  std::lock_guard<Mutex> lk{gcMutex_};
 2122|  1.34k|  youngGen().forAllObjs(callback);
 2123|       |
 2124|  1.34k|  const auto skipGarbageCallback = [callback](GCCell *cell) {
 2125|       |    // If we're doing this check during sweeping, or between sweeping and
 2126|       |    // compaction, there might be some objects that are dead, and could
 2127|       |    // potentially have garbage in them. There's no need to check the
 2128|       |    // pointers of those objects.
 2129|  1.34k|    if (HeapSegment::getCellMarkBit(cell)) {
 2130|  1.34k|      callback(cell);
 2131|  1.34k|    }
 2132|  1.34k|  };
 2133|  1.42k|  for (HeapSegment &seg : oldGen_) {
  ------------------
  |  Branch (2133:25): [True: 1.42k, False: 1.34k]
  ------------------
 2134|  1.42k|    if (concurrentPhase_ != Phase::Sweep)
  ------------------
  |  Branch (2134:9): [True: 1.41k, False: 13]
  ------------------
 2135|  1.41k|      seg.forAllObjs(callback);
 2136|     13|    else
 2137|     13|      seg.forAllObjs(skipGarbageCallback);
 2138|  1.42k|  }
 2139|  1.34k|  if (compactee_.segment) {
  ------------------
  |  Branch (2139:7): [True: 5, False: 1.34k]
  ------------------
 2140|      5|    if (!compactee_.evacActive())
  ------------------
  |  Branch (2140:9): [True: 5, False: 0]
  ------------------
 2141|      5|      compactee_.segment->forAllObjs(callback);
 2142|      0|    else
 2143|      0|      compactee_.segment->forAllObjs(skipGarbageCallback);
 2144|      5|  }
 2145|  1.34k|}
_ZNK6hermes2vm7HadesGC24calledByBackgroundThreadEv:
 2154|  6.43M|bool HadesGC::calledByBackgroundThread() const {
 2155|       |  // If the background thread is active, check if this thread matches the
 2156|       |  // background thread.
 2157|  6.43M|  return kConcurrentGC &&
  ------------------
  |  Branch (2157:10): [Folded - Ignored]
  ------------------
 2158|  6.43M|      backgroundExecutor_->getThreadId() == std::this_thread::get_id();
  ------------------
  |  Branch (2158:7): [True: 0, False: 6.43M]
  ------------------
 2159|  6.43M|}
_ZNK6hermes2vm7HadesGC12validPointerEPKv:
 2161|  14.3M|bool HadesGC::validPointer(const void *p) const {
 2162|  14.3M|  return dbgContains(p) && static_cast<const GCCell *>(p)->isValid();
  ------------------
  |  Branch (2162:10): [True: 14.3M, False: 0]
  |  Branch (2162:28): [True: 14.3M, False: 0]
  ------------------
 2163|  14.3M|}
_ZNK6hermes2vm7HadesGC11dbgContainsEPKv:
 2165|  15.2M|bool HadesGC::dbgContains(const void *p) const {
 2166|  15.2M|  return inYoungGen(p) || inOldGen(p);
  ------------------
  |  Branch (2166:10): [True: 4.06M, False: 11.1M]
  |  Branch (2166:27): [True: 11.1M, False: 0]
  ------------------
 2167|  15.2M|}
_ZN6hermes2vm7HadesGC17needsWriteBarrierEPvPNS0_6GCCellE:
 2171|   981k|bool HadesGC::needsWriteBarrier(void *loc, GCCell *value) {
 2172|   981k|  return !inYoungGen(loc);
 2173|   981k|}
_ZN6hermes2vm7HadesGC9allocSlowEj:
 2176|     35|void *HadesGC::allocSlow(uint32_t sz) {
 2177|     35|  AllocResult res;
 2178|       |  // Failed to alloc in young gen, do a young gen collection.
 2179|     35|  youngGenCollection(
 2180|     35|      kNaturalCauseForAnalytics, /*forceOldGenCollection*/ false);
 2181|     35|  res = youngGen().alloc(sz);
 2182|     35|  if (res.success)
  ------------------
  |  Branch (2182:7): [True: 35, False: 0]
  ------------------
 2183|     35|    return res.ptr;
 2184|       |
 2185|       |  // Still fails after YG collection, perhaps it is a large alloc, try growing
 2186|       |  // the YG to full size.
 2187|      0|  youngGen().clearExternalMemoryCharge();
 2188|      0|  res = youngGen().alloc(sz);
 2189|      0|  if (res.success)
  ------------------
  |  Branch (2189:7): [True: 0, False: 0]
  ------------------
 2190|      0|    return res.ptr;
 2191|       |
 2192|       |  // A YG collection is guaranteed to fully evacuate, leaving all the space
 2193|       |  // available, so the only way this could fail is if sz is greater than
 2194|       |  // a segment size.
 2195|       |  // This would be an error in VM code to ever allow such a size to be
 2196|       |  // allocated, and thus there's an assert at the top of this function to
 2197|       |  // disallow that. This case is for production, if we miss a test case.
 2198|      0|  oom(make_error_code(OOMError::SuperSegmentAlloc));
 2199|      0|}
_ZN6hermes2vm7HadesGC14allocLongLivedEj:
 2201|   187k|void *HadesGC::allocLongLived(uint32_t sz) {
 2202|   187k|  assert(
 2203|   187k|      isSizeHeapAligned(sz) &&
 2204|   187k|      "Call to allocLongLived must use a size aligned to HeapAlign");
 2205|   187k|  if (kConcurrentGC) {
  ------------------
  |  Branch (2205:7): [Folded - Ignored]
  ------------------
 2206|   187k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|   187k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 2207|   187k|        !weakRefMutex() &&
 2208|   187k|        "WeakRef mutex should not be held when allocLongLived is called");
 2209|   187k|  }
 2210|      0|  assert(gcMutex_ && "GC mutex must be held when calling allocLongLived");
 2211|      0|  totalAllocatedBytes_ += sz;
 2212|       |  // Alloc directly into the old gen.
 2213|   187k|  return oldGen_.alloc(sz);
 2214|   187k|}
_ZN6hermes2vm7HadesGC6OldGen5allocEj:
 2216|   616k|GCCell *HadesGC::OldGen::alloc(uint32_t sz) {
 2217|   616k|  assert(
 2218|   616k|      isSizeHeapAligned(sz) &&
 2219|   616k|      "Should be aligned before entering this function");
 2220|      0|  assert(sz >= minAllocationSize() && "Allocating too small of an object");
 2221|      0|  assert(sz <= maxAllocationSize() && "Allocating too large of an object");
 2222|      0|  assert(gc_.gcMutex_ && "gcMutex_ must be held before calling oldGenAlloc");
 2223|   616k|  if (GCCell *cell = search(sz)) {
  ------------------
  |  Branch (2223:15): [True: 616k, False: 104]
  ------------------
 2224|   616k|    return cell;
 2225|   616k|  }
 2226|       |  // Before waiting for a collection to finish, check if we're below the max
 2227|       |  // heap size and can simply allocate another segment. This will prevent
 2228|       |  // blocking the YG unnecessarily.
 2229|    104|  llvh::ErrorOr<HeapSegment> seg = gc_.createSegment();
 2230|    104|  if (seg) {
  ------------------
  |  Branch (2230:7): [True: 104, False: 0]
  ------------------
 2231|       |    // Complete this allocation using a bump alloc.
 2232|    104|    AllocResult res = seg->alloc(sz);
 2233|    104|    assert(
 2234|    104|        res.success &&
 2235|    104|        "A newly created segment should always be able to allocate");
 2236|       |    // Set the cell head for any successful alloc, so that write barriers can
 2237|       |    // move from dirty cards to the head of the object.
 2238|      0|    seg->setCellHead(static_cast<GCCell *>(res.ptr), sz);
 2239|       |    // Add the segment to segments_ and add the remainder of the segment to the
 2240|       |    // free list.
 2241|    104|    addSegment(std::move(seg.get()));
 2242|    104|    GCCell *newObj = static_cast<GCCell *>(res.ptr);
 2243|    104|    HeapSegment::setCellMarkBit(newObj);
 2244|    104|    return newObj;
 2245|    104|  }
 2246|       |
 2247|       |  // TODO(T109282643): Block on any pending OG collections here in case they
 2248|       |  // free up space.
 2249|       |
 2250|       |  // Repeat the search in case the collection did free memory.
 2251|      0|  if (GCCell *cell = search(sz)) {
  ------------------
  |  Branch (2251:15): [True: 0, False: 0]
  ------------------
 2252|      0|    return cell;
 2253|      0|  }
 2254|       |
 2255|       |  // The GC didn't recover enough memory, OOM.
 2256|       |  // Re-use the error code from the earlier heap segment allocation, because
 2257|       |  // it's either that the max heap size was reached, or that segment failed to
 2258|       |  // allocate.
 2259|      0|  gc_.oom(seg.getError());
 2260|      0|}
_ZN6hermes2vm7HadesGC6OldGen17getFreelistBucketEj:
 2262|  2.46M|uint32_t HadesGC::OldGen::getFreelistBucket(uint32_t size) {
 2263|       |  // If the size corresponds to the "small" portion of the freelist, then the
 2264|       |  // bucket is just (size) / (heap alignment)
 2265|  2.46M|  if (size < kMinSizeForLargeBlock) {
  ------------------
  |  Branch (2265:7): [True: 1.23M, False: 1.23M]
  ------------------
 2266|  1.23M|    auto bucket = size >> LogHeapAlign;
 2267|  1.23M|    assert(
 2268|  1.23M|        bucket < kNumSmallFreelistBuckets &&
 2269|  1.23M|        "Small blocks must be within the small free list range");
 2270|      0|    return bucket;
 2271|  1.23M|  }
 2272|       |  // Otherwise, index into the large portion of the freelist, which is based on
 2273|       |  // powers of 2
 2274|       |
 2275|  1.23M|  auto bucket =
 2276|  1.23M|      kNumSmallFreelistBuckets + llvh::Log2_32(size) - kLogMinSizeForLargeBlock;
 2277|  1.23M|  assert(
 2278|  1.23M|      bucket < kNumFreelistBuckets &&
 2279|  1.23M|      "Block size must be within the freelist range!");
 2280|      0|  return bucket;
 2281|  2.46M|}
_ZN6hermes2vm7HadesGC6OldGen6searchEj:
 2283|   616k|GCCell *HadesGC::OldGen::search(uint32_t sz) {
 2284|   616k|  size_t bucket = getFreelistBucket(sz);
 2285|   616k|  if (bucket < kNumSmallFreelistBuckets) {
  ------------------
  |  Branch (2285:7): [True: 616k, False: 412]
  ------------------
 2286|       |    // Fast path: There already exists a size bucket for this alloc. Check if
 2287|       |    // there's a free cell to take and exit.
 2288|   616k|    if (auto *segBucket = buckets_[bucket].next) {
  ------------------
  |  Branch (2288:15): [True: 171, False: 615k]
  ------------------
 2289|    171|      assert(freelistBucketBitArray_.at(bucket));
 2290|      0|      FreelistCell *cell = removeCellFromFreelist(bucket, segBucket);
 2291|    171|      assert(
 2292|    171|          cell->getAllocatedSize() == sz &&
 2293|    171|          "Size bucket should be an exact match");
 2294|      0|      return finishAlloc(cell, sz);
 2295|    171|    }
 2296|       |    // Make sure we start searching at the smallest possible size that could fit
 2297|   615k|    bucket = getFreelistBucket(sz + minAllocationSize());
 2298|   615k|  }
 2299|       |  // Once we're examining the rest of the free list, it's a first-fit algorithm.
 2300|       |  // This approach approximates finding the smallest possible fit.
 2301|   616k|  bucket = freelistBucketBitArray_.findNextSetBitFrom(bucket);
 2302|   616k|  for (; bucket < kNumFreelistBuckets;
  ------------------
  |  Branch (2302:10): [True: 616k, False: 104]
  ------------------
 2303|   616k|       bucket = freelistBucketBitArray_.findNextSetBitFrom(bucket + 1)) {
 2304|   616k|    auto *segBucket = buckets_[bucket].next;
 2305|   616k|    do {
 2306|       |      // Need to track the previous entry in order to change the next pointer.
 2307|   616k|      AssignableCompressedPointer *prevLoc = &segBucket->head;
 2308|   616k|      AssignableCompressedPointer cellCP = segBucket->head;
 2309|       |
 2310|   616k|      do {
 2311|   616k|        auto *cell =
 2312|   616k|            vmcast<FreelistCell>(cellCP.getNonNull(gc_.getPointerBase()));
 2313|   616k|        assert(
 2314|   616k|            cellCP == *prevLoc &&
 2315|   616k|            "prevLoc should be updated in each iteration");
 2316|      0|        assert(
 2317|   616k|            (!cell->next_ ||
 2318|   616k|             cell->next_.getNonNull(gc_.getPointerBase())->isValid()) &&
 2319|   616k|            "Next pointer points to an invalid cell");
 2320|      0|        const auto cellSize = cell->getAllocatedSize();
 2321|   616k|        assert(
 2322|   616k|            getFreelistBucket(cellSize) == bucket &&
 2323|   616k|            "Found an incorrectly sized block in this bucket");
 2324|       |        // Check if the size is large enough that the cell could be split.
 2325|   616k|        if (cellSize >= sz + minAllocationSize()) {
  ------------------
  |  Branch (2325:13): [True: 616k, False: 0]
  ------------------
 2326|       |          // Split the free cell. In order to avoid initializing
 2327|       |          // soon-to-be-unused values like the size and the next pointer, copy
 2328|       |          // the return path here.
 2329|   616k|          auto newCell = cell->carve(sz);
 2330|       |          // Since the size of cell has changed, we may need to add it to a
 2331|       |          // different free list bucket.
 2332|   616k|          auto newBucket = getFreelistBucket(cell->getAllocatedSize());
 2333|   616k|          assert(newBucket <= bucket && "Split cell must be smaller.");
 2334|   616k|          if (newBucket != bucket) {
  ------------------
  |  Branch (2334:15): [True: 365, False: 615k]
  ------------------
 2335|    365|            removeCellFromFreelist(prevLoc, bucket, segBucket);
 2336|       |            // Since the buckets for each segment are stored contiguously in
 2337|       |            // memory, we can compute the address of the SegmentBucket for
 2338|       |            // newBucket in this segment relative to the current SegmentBucket.
 2339|    365|            auto diff = bucket - newBucket;
 2340|    365|            addCellToFreelist(cell, segBucket - diff);
 2341|    365|          }
 2342|       |          // Because we carved newCell out before removing cell from the
 2343|       |          // freelist, newCell is still poisoned (regardless of whether the
 2344|       |          // conditional above executed). Unpoison it.
 2345|   616k|          __asan_unpoison_memory_region(newCell, sz);
 2346|   616k|          return finishAlloc(newCell, sz);
 2347|   616k|        } else if (cellSize == sz) {
  ------------------
  |  Branch (2347:20): [True: 0, False: 0]
  ------------------
 2348|       |          // Exact match, take it.
 2349|      0|          removeCellFromFreelist(prevLoc, bucket, segBucket);
 2350|      0|          return finishAlloc(cell, sz);
 2351|      0|        }
 2352|       |        // Non-exact matches, or anything just barely too small to fit, will
 2353|       |        // need to find another block.
 2354|       |        // NOTE: This is due to restrictions on the minimum cell size to keep
 2355|       |        // the heap parseable, especially in debug mode. If this minimum size
 2356|       |        // becomes smaller (smaller header, size becomes part of it
 2357|       |        // automatically, debug magic field is handled differently), this
 2358|       |        // decisions can be re-examined. An example alternative is to make a
 2359|       |        // special fixed-size cell that is only as big as an empty GCCell. That
 2360|       |        // alternative only works if the empty is small enough to fit in any gap
 2361|       |        // in the heap. That's not true in debug modes currently.
 2362|      0|        prevLoc = &cell->next_;
 2363|      0|        cellCP = cell->next_;
 2364|      0|      } while (cellCP);
  ------------------
  |  Branch (2364:16): [True: 0, False: 0]
  ------------------
 2365|      0|      segBucket = segBucket->next;
 2366|      0|    } while (segBucket);
  ------------------
  |  Branch (2366:14): [True: 0, False: 0]
  ------------------
 2367|   616k|  }
 2368|    104|  return nullptr;
 2369|   616k|}
_ZN6hermes2vm7HadesGC18youngGenCollectionENSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEEb:
 2402|    301|    bool forceOldGenCollection) {
 2403|    301|  ygCollectionStats_ = std::make_unique<CollectionStats>(*this, cause, "young");
 2404|    301|  ygCollectionStats_->beginCPUTimeSection();
 2405|    301|  ygCollectionStats_->setBeginTime();
 2406|       |  // Acquire the GC lock for the duration of the YG collection.
 2407|    301|  auto lk = ensureBackgroundTaskPaused();
 2408|       |  // The YG is not parseable while a collection is occurring.
 2409|    301|  assert(!inGC() && "Cannot be in GC at the start of YG!");
 2410|      0|  GCCycle cycle{*this, "GC Young Gen"};
 2411|    301|#ifdef HERMES_SLOW_DEBUG
 2412|    301|  checkWellFormed();
 2413|       |  // Check that the card tables are well-formed before the collection.
 2414|    301|  verifyCardTable();
 2415|    301|#endif
 2416|    301|  assert(
 2417|    301|      youngGen().markBitArray().findNextUnmarkedBitFrom(0) ==
 2418|    301|          youngGen().markBitArray().size() &&
 2419|    301|      "Young gen segment must have all mark bits set");
 2420|      0|  struct {
 2421|    301|    uint64_t before{0};
 2422|    301|    uint64_t after{0};
 2423|    301|  } heapBytes, externalBytes;
 2424|    301|  heapBytes.before = youngGen().used();
 2425|    301|  externalBytes.before = getYoungGenExternalBytes();
 2426|       |  // YG is about to be emptied, add all of the allocations.
 2427|    301|  totalAllocatedBytes_ += youngGen().used();
 2428|    301|  const bool doCompaction = compactee_.evacActive();
 2429|       |  // Attempt to promote the YG segment to OG if the flag is set. If this call
 2430|       |  // fails for any reason, proceed with a GC.
 2431|    301|  if (promoteYoungGenToOldGen()) {
  ------------------
  |  Branch (2431:7): [True: 0, False: 301]
  ------------------
 2432|       |    // Leave sweptBytes and sweptExternalBytes as defaults (which are 0).
 2433|       |    // Don't update the average YG survival ratio since no liveness was
 2434|       |    // calculated for the promotion case.
 2435|      0|    ygCollectionStats_->setBeforeSizes(
 2436|      0|        heapBytes.before, externalBytes.before, segmentFootprint());
 2437|      0|    ygCollectionStats_->addCollectionType("promotion");
 2438|      0|    assert(!doCompaction && "Cannot do compactions during YG promotions.");
 2439|    301|  } else {
 2440|    301|    auto &yg = youngGen();
 2441|       |
 2442|    301|    if (compactee_.segment) {
  ------------------
  |  Branch (2442:9): [True: 1, False: 300]
  ------------------
 2443|      1|      EvacAcceptor<true> acceptor{*this};
 2444|      1|      youngGenEvacuateImpl(acceptor, doCompaction);
 2445|       |      // The remaining bytes after the collection is just the number of bytes
 2446|       |      // that were evacuated.
 2447|      1|      heapBytes.after = acceptor.evacuatedBytes();
 2448|    300|    } else {
 2449|    300|      EvacAcceptor<false> acceptor{*this};
 2450|    300|      youngGenEvacuateImpl(acceptor, false);
 2451|    300|      heapBytes.after = acceptor.evacuatedBytes();
 2452|    300|    }
 2453|       |    // Inform trackers about objects that died during this YG collection.
 2454|    301|    if (isTrackingIDs()) {
  ------------------
  |  Branch (2454:9): [True: 0, False: 301]
  ------------------
 2455|      0|      auto trackerCallback = [this](GCCell *cell) {
 2456|       |        // The compactee might have free list cells, which are not tracked.
 2457|       |        // untrackObject requires the object to have been tracked previously.
 2458|       |        // So skip free list cells here.
 2459|      0|        if (!vmisa<OldGen::FreelistCell>(cell)) {
 2460|      0|          untrackObject(cell, cell->getAllocatedSize());
 2461|      0|        }
 2462|      0|      };
 2463|      0|      yg.forCompactedObjs(trackerCallback, getPointerBase());
 2464|      0|      if (doCompaction) {
  ------------------
  |  Branch (2464:11): [True: 0, False: 0]
  ------------------
 2465|      0|        compactee_.segment->forCompactedObjs(trackerCallback, getPointerBase());
 2466|      0|      }
 2467|      0|    }
 2468|       |    // Run finalizers for young gen objects.
 2469|    301|    finalizeYoungGenObjects();
 2470|       |    // This was modified by debitExternalMemoryFromFinalizer, called by
 2471|       |    // finalizers. The difference in the value before to now was the swept bytes
 2472|    301|    externalBytes.after = getYoungGenExternalBytes();
 2473|       |
 2474|    301|    if (overwriteDeadYGObjects_)
  ------------------
  |  Branch (2474:9): [True: 0, False: 301]
  ------------------
 2475|      0|      memset(yg.start(), kInvalidHeapValue, yg.used());
 2476|       |
 2477|       |    // Now the copy list is drained, and all references point to the old
 2478|       |    // gen. Clear the level of the young gen.
 2479|    301|    yg.resetLevel();
 2480|    301|    assert(
 2481|    301|        yg.markBitArray().findNextUnmarkedBitFrom(0) ==
 2482|    301|            yg.markBitArray().size() &&
 2483|    301|        "Young gen segment must have all mark bits set");
 2484|       |
 2485|    301|    if (doCompaction) {
  ------------------
  |  Branch (2485:9): [True: 0, False: 301]
  ------------------
 2486|      0|      numCompactions_++;
 2487|      0|      ygCollectionStats_->addCollectionType("compact");
 2488|       |      // We can use the total amount of external memory in the OG before and
 2489|       |      // after running finalizers to measure how much external memory has been
 2490|       |      // released.
 2491|      0|      uint64_t ogExternalBefore = oldGen_.externalBytes();
 2492|       |      // Similarly, finalizeCompactee will update the allocated bytes counter to
 2493|       |      // remove bytes allocated in the compactee.
 2494|      0|      uint64_t ogAllocatedBefore = oldGen_.allocatedBytes();
 2495|      0|      finalizeCompactee();
 2496|      0|      heapBytes.before += ogAllocatedBefore - oldGen_.allocatedBytes();
 2497|      0|      const uint64_t externalCompactedBytes =
 2498|      0|          ogExternalBefore - oldGen_.externalBytes();
 2499|       |      // Since we can't track the actual number of external bytes that were in
 2500|       |      // this segment, just use the swept external byte count.
 2501|      0|      externalBytes.before += externalCompactedBytes;
 2502|      0|      externalBytes.after += externalCompactedBytes;
 2503|      0|    }
 2504|       |
 2505|       |    // Move external memory accounting from YG to OG as well.
 2506|    301|    transferExternalMemoryToOldGen();
 2507|       |
 2508|       |    // Potentially resize the YG if this collection did not meet our pause time
 2509|       |    // goals. Exclude compacting collections and the portion of YG time spent on
 2510|       |    // incremental OG collections, since they distort pause times and are
 2511|       |    // unaffected by YG size.
 2512|    301|    if (!doCompaction)
  ------------------
  |  Branch (2512:9): [True: 301, False: 0]
  ------------------
 2513|    301|      updateYoungGenSizeFactor();
 2514|       |
 2515|       |    // The effective end of our YG is no longer accurate for multiple reasons:
 2516|       |    // 1. transferExternalMemoryToOldGen resets the effectiveEnd to be the end.
 2517|       |    // 2. Creating a large alloc in the YG can increase the effectiveEnd.
 2518|       |    // 3. The duration of this collection may not have met our pause time goals.
 2519|    301|    youngGen().setEffectiveEnd(
 2520|    301|        youngGen().start() +
 2521|    301|        static_cast<size_t>(ygSizeFactor_ * HeapSegment::maxSize()));
 2522|       |
 2523|       |    // We have to set these after the collection, in case a compaction took
 2524|       |    // place and updated these metrics.
 2525|    301|    ygCollectionStats_->setBeforeSizes(
 2526|    301|        heapBytes.before, externalBytes.before, segmentFootprint());
 2527|       |
 2528|       |    // The swept bytes are just the bytes that were not evacuated.
 2529|    301|    ygCollectionStats_->setSweptBytes(heapBytes.before - heapBytes.after);
 2530|    301|    ygCollectionStats_->setSweptExternalBytes(
 2531|    301|        externalBytes.before - externalBytes.after);
 2532|    301|    ygCollectionStats_->setAfterSize(segmentFootprint());
 2533|       |    // If this is not a compacting YG, update the average survival bytes.
 2534|       |    // In a compacting YG, since the evacuatedBytes counter tracks both
 2535|       |    // segments, this value is not a useful predictor of future collections.
 2536|    301|    if (!doCompaction)
  ------------------
  |  Branch (2536:9): [True: 301, False: 0]
  ------------------
 2537|    301|      ygAverageSurvivalBytes_.update(
 2538|    301|          ygCollectionStats_->afterAllocatedBytes() +
 2539|    301|          ygCollectionStats_->afterExternalBytes());
 2540|    301|  }
 2541|      0|#ifdef HERMES_SLOW_DEBUG
 2542|       |  // Check that the card tables are well-formed after the collection.
 2543|      0|  verifyCardTable();
 2544|    301|#endif
 2545|       |  // Perform any pending work for an ongoing OG collection.
 2546|       |  // Do this before starting a new collection in case we need collections
 2547|       |  // back-to-back. Also, don't check this after starting a collection to avoid
 2548|       |  // waiting for something that is both unlikely, and will increase the pause
 2549|       |  // time if it does happen.
 2550|    301|  yieldToOldGen();
 2551|       |  // We can only consider starting a new OG collection if any previous OG
 2552|       |  // collection is fully completed and has not left a pending compaction. This
 2553|       |  // handles the rare case where an OG collection was completed during this YG
 2554|       |  // collection, and the compaction will therefore only be completed in the next
 2555|       |  // collection.
 2556|    301|  if (concurrentPhase_ == Phase::None && !compactee_.evacActive()) {
  ------------------
  |  Branch (2556:7): [True: 292, False: 9]
  |  Branch (2556:42): [True: 292, False: 0]
  ------------------
 2557|       |    // There is no OG collection running, check the tripwire in case this is the
 2558|       |    // first YG after an OG completed.
 2559|    292|    checkTripwireAndSubmitStats();
 2560|    292|    if (forceOldGenCollection) {
  ------------------
  |  Branch (2560:9): [True: 133, False: 159]
  ------------------
 2561|       |      // If an OG collection is being forced, it's because something called
 2562|       |      // collect directly, most likely from a memory warning. In order to
 2563|       |      // respond to memory pressure effectively, the OG should compact.
 2564|    133|      oldGenCollection(std::move(cause), /*forceCompaction*/ true);
 2565|    159|    } else {
 2566|       |      // If the OG is sufficiently full after the collection finishes, begin
 2567|       |      // an OG collection.
 2568|       |      // External bytes are part of the numerator and denominator, because they
 2569|       |      // should not be included as part of determining the heap's occupancy, but
 2570|       |      // instead just influence when collections begin.
 2571|    159|      const uint64_t totalAllocated =
 2572|    159|          oldGen_.allocatedBytes() + oldGen_.externalBytes();
 2573|    159|      const uint64_t totalBytes = oldGen_.targetSizeBytes();
 2574|    159|      double allocatedRatio = static_cast<double>(totalAllocated) / totalBytes;
 2575|    159|      if (allocatedRatio >= ogThreshold_) {
  ------------------
  |  Branch (2575:11): [True: 10, False: 149]
  ------------------
 2576|     10|        oldGenCollection(kNaturalCauseForAnalytics, /*forceCompaction*/ false);
 2577|     10|      }
 2578|    159|    }
 2579|    292|  }
 2580|    301|#ifdef HERMES_SLOW_DEBUG
 2581|       |  // Run a well-formed check before exiting.
 2582|    301|  checkWellFormed();
 2583|    301|#endif
 2584|    301|  ygCollectionStats_->setEndTime();
 2585|    301|  ygCollectionStats_->endCPUTimeSection();
 2586|    301|  auto statsEvent = std::move(*ygCollectionStats_).getEvent();
 2587|    301|  recordGCStats(statsEvent, true);
 2588|    301|  recordGCStats(statsEvent, &ygCumulativeStats_, true);
 2589|    301|  ygCollectionStats_.reset();
 2590|    301|}
_ZN6hermes2vm7HadesGC23promoteYoungGenToOldGenEv:
 2592|    301|bool HadesGC::promoteYoungGenToOldGen() {
 2593|    301|  if (!promoteYGToOG_) {
  ------------------
  |  Branch (2593:7): [True: 301, False: 0]
  ------------------
 2594|    301|    return false;
 2595|    301|  }
 2596|       |
 2597|       |  // Attempt to create a new segment, if that fails, turn off the flag to
 2598|       |  // disable GC and return false so we proceed with a GC.
 2599|       |  // TODO: Add more stringent criteria for turning off this flag, for instance,
 2600|       |  // once the heap reaches a certain size. That would avoid growing the heap to
 2601|       |  // the maximum possible size before stopping promotions.
 2602|      0|  llvh::ErrorOr<HeapSegment> newYoungGen = createSegment();
 2603|      0|  if (!newYoungGen) {
  ------------------
  |  Branch (2603:7): [True: 0, False: 0]
  ------------------
 2604|      0|    promoteYGToOG_ = false;
 2605|      0|    return false;
 2606|      0|  }
 2607|       |
 2608|       |  // Move the external memory costs to the OG. Needs to happen here so that the
 2609|       |  // YG segment moved to OG is not left with an effective end.
 2610|      0|  transferExternalMemoryToOldGen();
 2611|       |  // The flag is on to prevent GC until TTI. Promote the whole YG segment
 2612|       |  // directly into OG.
 2613|       |  // Before promoting it, set the cell heads correctly for the segment
 2614|       |  // going into OG. This could be done at allocation time, but at a cost
 2615|       |  // to YG alloc times for a case that might not come up.
 2616|      0|  youngGen_.forAllObjs([this](GCCell *cell) {
 2617|      0|    youngGen_.setCellHead(cell, cell->getAllocatedSize());
 2618|      0|  });
 2619|       |  // It is important that this operation is just a move of pointers to
 2620|       |  // segments. The addresses have to stay the same or else it would
 2621|       |  // require a marking pass through all objects.
 2622|       |  // This will also rename the segment in the crash data.
 2623|      0|  oldGen_.addSegment(setYoungGen(std::move(newYoungGen.get())));
 2624|       |
 2625|      0|  return true;
 2626|      0|}
_ZN6hermes2vm7HadesGC11setYoungGenENS1_11HeapSegmentE:
 2628|     99|HadesGC::HeapSegment HadesGC::setYoungGen(HeapSegment seg) {
 2629|     99|  addSegmentExtentToCrashManager(seg, "YG");
 2630|     99|  youngGenFinalizables_.clear();
 2631|     99|  std::swap(youngGen_, seg);
 2632|     99|  youngGenCP_ = CompressedPointer::encodeNonNull(
 2633|     99|      reinterpret_cast<GCCell *>(youngGen_.lowLim()), getPointerBase());
 2634|     99|  return seg;
 2635|     99|}
_ZN6hermes2vm7HadesGC27checkTripwireAndSubmitStatsEv:
 2637|    425|void HadesGC::checkTripwireAndSubmitStats() {
 2638|    425|  assert(
 2639|    425|      gcMutex_ &&
 2640|    425|      "gcMutex must be held before calling checkTripwireAndSubmitStats");
 2641|      0|  assert(
 2642|    425|      concurrentPhase_ == Phase::None &&
 2643|    425|      "Cannot check stats while OG collection is ongoing.");
 2644|    425|  if (!ogCollectionStats_) {
  ------------------
  |  Branch (2644:7): [True: 288, False: 137]
  ------------------
 2645|    288|    return;
 2646|    288|  }
 2647|    137|  const auto usedBytes = ogCollectionStats_->afterAllocatedBytes() +
 2648|    137|      ogCollectionStats_->afterExternalBytes();
 2649|       |  // We use the amount of live data from after a GC completed as the minimum
 2650|       |  // bound of what is live.
 2651|    137|  checkTripwire(usedBytes);
 2652|    137|  auto event = std::move(*ogCollectionStats_).getEvent();
 2653|    137|  recordGCStats(event, false);
 2654|    137|  recordGCStats(event, &ogCumulativeStats_, false);
 2655|    137|  ogCollectionStats_.reset();
 2656|    137|}
_ZN6hermes2vm7HadesGC30transferExternalMemoryToOldGenEv:
 2658|    400|void HadesGC::transferExternalMemoryToOldGen() {
 2659|    400|  oldGen_.creditExternalMemory(getYoungGenExternalBytes());
 2660|    400|  setYoungGenExternalBytes(0);
 2661|    400|  youngGen_.clearExternalMemoryCharge();
 2662|    400|}
_ZN6hermes2vm7HadesGC24updateYoungGenSizeFactorEv:
 2664|    301|void HadesGC::updateYoungGenSizeFactor() {
 2665|    301|  assert(
 2666|    301|      ygSizeFactor_ <= 1.0 && ygSizeFactor_ >= 0.25 && "YG size out of range.");
 2667|      0|  const auto ygDuration = ygCollectionStats_->getElapsedTime().count();
 2668|       |  // If the YG collection has taken less than 20% of our budgeted time, increase
 2669|       |  // the size of the YG by 10%.
 2670|    301|  if (ygDuration < kTargetMaxPauseMs * 0.2)
  ------------------
  |  Branch (2670:7): [True: 282, False: 19]
  ------------------
 2671|    282|    ygSizeFactor_ = std::min(ygSizeFactor_ * 1.1, 1.0);
 2672|       |  // If the YG collection has taken more than 40% of our budgeted time, decrease
 2673|       |  // the size of the YG by 10%. This is meant to leave some time for OG work.
 2674|       |  // However, don't let the YG size drop below 25% of the segment size.
 2675|     19|  else if (ygDuration > kTargetMaxPauseMs * 0.4)
  ------------------
  |  Branch (2675:12): [True: 13, False: 6]
  ------------------
 2676|     13|    ygSizeFactor_ = std::max(ygSizeFactor_ * 0.9, 0.25);
 2677|    301|}
_ZN6hermes2vm7HadesGC23finalizeYoungGenObjectsEv:
 2789|    400|void HadesGC::finalizeYoungGenObjects() {
 2790|    727|  for (GCCell *cell : youngGenFinalizables_) {
  ------------------
  |  Branch (2790:21): [True: 727, False: 400]
  ------------------
 2791|    727|    if (!cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (2791:9): [True: 606, False: 121]
  ------------------
 2792|    606|      cell->getVT()->finalize(cell, *this);
 2793|    606|    }
 2794|    727|  }
 2795|    400|  youngGenFinalizables_.clear();
 2796|    400|}
_ZN6hermes2vm7HadesGC29updateWeakReferencesForOldGenEv:
 2798|    141|void HadesGC::updateWeakReferencesForOldGen() {
 2799|  82.2k|  for (auto &slot : weakSlots_) {
  ------------------
  |  Branch (2799:19): [True: 82.2k, False: 141]
  ------------------
 2800|  82.2k|    switch (slot.state()) {
  ------------------
  |  Branch (2800:13): [True: 0, False: 82.2k]
  ------------------
 2801|  1.94k|      case WeakSlotState::Free:
  ------------------
  |  Branch (2801:7): [True: 1.94k, False: 80.2k]
  ------------------
 2802|       |        // Skip free weak slots.
 2803|  1.94k|        break;
 2804|  80.2k|      case WeakSlotState::Marked:
  ------------------
  |  Branch (2804:7): [True: 80.2k, False: 2.00k]
  ------------------
 2805|       |        // Set all allocated slots to unmarked.
 2806|  80.2k|        slot.unmark();
 2807|  80.2k|        break;
 2808|     60|      case WeakSlotState::Unmarked:
  ------------------
  |  Branch (2808:7): [True: 60, False: 82.1k]
  ------------------
 2809|     60|        freeWeakSlot(&slot);
 2810|     60|        break;
 2811|  82.2k|    }
 2812|  82.2k|  }
 2813|    141|}
_ZN6hermes2vm7HadesGC22completeWeakMapMarkingERNS1_12MarkAcceptorE:
 2815|    141|void HadesGC::completeWeakMapMarking(MarkAcceptor &acceptor) {
 2816|    141|  gcheapsize_t weakMapAllocBytes = GCBase::completeWeakMapMarking(
 2817|    141|      *this,
 2818|    141|      acceptor,
 2819|    141|      acceptor.reachableWeakMaps(),
 2820|       |      /*objIsMarked*/
 2821|    141|      HeapSegment::getCellMarkBit,
 2822|       |      /*markFromVal*/
 2823|    141|      [&acceptor](GCCell *valCell, GCHermesValue &valRef) {
 2824|    141|        if (HeapSegment::getCellMarkBit(valCell)) {
 2825|    141|          return false;
 2826|    141|        }
 2827|    141|        acceptor.accept(valRef);
 2828|       |        // The weak ref lock is held throughout this entire section, so no need
 2829|       |        // to re-lock it.
 2830|    141|        acceptor.drainAllWork();
 2831|    141|        return true;
 2832|    141|      },
 2833|       |      /*drainMarkStack*/
 2834|    141|      [](MarkAcceptor &acceptor) {
 2835|       |        // The weak ref lock is held throughout this entire section, so no need
 2836|       |        // to re-lock it.
 2837|    141|        acceptor.drainAllWork();
 2838|    141|      },
 2839|       |      /*checkMarkStackOverflow (HadesGC does not have mark stack overflow)*/
 2840|    141|      []() { return false; });
 2841|       |
 2842|    141|  acceptor.reachableWeakMaps().clear();
 2843|    141|  (void)weakMapAllocBytes;
 2844|    141|}
_ZNK6hermes2vm7HadesGC13externalBytesEv:
 2851|    203|uint64_t HadesGC::externalBytes() const {
 2852|    203|  return getYoungGenExternalBytes() + oldGen_.externalBytes();
 2853|    203|}
_ZNK6hermes2vm7HadesGC16segmentFootprintEv:
 2855|  1.08k|uint64_t HadesGC::segmentFootprint() const {
 2856|  1.08k|  size_t totalSegments = oldGen_.numSegments() + (youngGen_ ? 1 : 0) +
  ------------------
  |  Branch (2856:51): [True: 990, False: 99]
  ------------------
 2857|  1.08k|      (compactee_.segment ? 1 : 0);
  ------------------
  |  Branch (2857:8): [True: 2, False: 1.08k]
  ------------------
 2858|  1.08k|  return totalSegments * AlignedStorage::size();
 2859|  1.08k|}
_ZNK6hermes2vm7HadesGC13heapFootprintEv:
 2861|    203|uint64_t HadesGC::heapFootprint() const {
 2862|    203|  return segmentFootprint() + externalBytes();
 2863|    203|}
_ZNK6hermes2vm7HadesGC6OldGen14allocatedBytesEv:
 2865|  1.09k|uint64_t HadesGC::OldGen::allocatedBytes() const {
 2866|  1.09k|  return allocatedBytes_;
 2867|  1.09k|}
_ZN6hermes2vm7HadesGC6OldGen23incrementAllocatedBytesEi:
 2869|   616k|void HadesGC::OldGen::incrementAllocatedBytes(int32_t incr) {
 2870|   616k|  allocatedBytes_ += incr;
 2871|   616k|  assert(allocatedBytes_ <= size() && "Invalid increment");
 2872|   616k|}
_ZNK6hermes2vm7HadesGC6OldGen13externalBytesEv:
 2874|  1.59k|uint64_t HadesGC::OldGen::externalBytes() const {
 2875|  1.59k|  assert(gc_.gcMutex_ && "OG external bytes must be accessed under gcMutex_.");
 2876|      0|  return externalBytes_;
 2877|  1.59k|}
_ZNK6hermes2vm7HadesGC6OldGen4sizeEv:
 2879|   616k|uint64_t HadesGC::OldGen::size() const {
 2880|   616k|  size_t totalSegments = numSegments() + (gc_.compactee_.segment ? 1 : 0);
  ------------------
  |  Branch (2880:43): [True: 1, False: 616k]
  ------------------
 2881|   616k|  return totalSegments * HeapSegment::maxSize();
 2882|   616k|}
_ZNK6hermes2vm7HadesGC6OldGen15targetSizeBytesEv:
 2884|  1.09k|uint64_t HadesGC::OldGen::targetSizeBytes() const {
 2885|  1.09k|  assert(gc_.gcMutex_ && "Must hold gcMutex_ when accessing targetSizeBytes_.");
 2886|      0|  return targetSizeBytes_;
 2887|  1.09k|}
_ZNK6hermes2vm7HadesGC24getYoungGenExternalBytesEv:
 2889|  1.50k|size_t HadesGC::getYoungGenExternalBytes() const {
 2890|  1.50k|  assert(
 2891|  1.50k|      !calledByBackgroundThread() &&
 2892|  1.50k|      "ygExternalBytes_ is only accessible from the mutator.");
 2893|      0|  return ygExternalBytes_;
 2894|  1.50k|}
_ZN6hermes2vm7HadesGC24setYoungGenExternalBytesEm:
 2895|    704|void HadesGC::setYoungGenExternalBytes(size_t sz) {
 2896|    704|  assert(
 2897|    704|      !calledByBackgroundThread() &&
 2898|    704|      "ygExternalBytes_ is only accessible from the mutator.");
 2899|      0|  ygExternalBytes_ = sz;
 2900|    704|}
_ZN6hermes2vm7HadesGC6OldGen5beginEv:
 2922|  2.19k|std::deque<HadesGC::HeapSegment>::iterator HadesGC::OldGen::begin() {
 2923|  2.19k|  return segments_.begin();
 2924|  2.19k|}
_ZN6hermes2vm7HadesGC6OldGen3endEv:
 2926|  2.19k|std::deque<HadesGC::HeapSegment>::iterator HadesGC::OldGen::end() {
 2927|  2.19k|  return segments_.end();
 2928|  2.19k|}
_ZNK6hermes2vm7HadesGC6OldGen5beginEv:
 2931|  11.5M|    const {
 2932|  11.5M|  return segments_.begin();
 2933|  11.5M|}
_ZNK6hermes2vm7HadesGC6OldGen3endEv:
 2935|  11.5M|std::deque<HadesGC::HeapSegment>::const_iterator HadesGC::OldGen::end() const {
 2936|  11.5M|  return segments_.end();
 2937|  11.5M|}
_ZNK6hermes2vm7HadesGC6OldGen11numSegmentsEv:
 2939|   618k|size_t HadesGC::OldGen::numSegments() const {
 2940|   618k|  return segments_.size();
 2941|   618k|}
_ZN6hermes2vm7HadesGC6OldGenixEm:
 2943|    316|HadesGC::HeapSegment &HadesGC::OldGen::operator[](size_t i) {
 2944|    316|  return segments_[i];
 2945|    316|}
_ZN6hermes2vm7HadesGC13createSegmentEv:
 2947|    203|llvh::ErrorOr<HadesGC::HeapSegment> HadesGC::createSegment() {
 2948|       |  // No heap size limit when Handle-SAN is on, to allow the heap enough room to
 2949|       |  // keep moving things around.
 2950|    203|  if (!sanitizeRate_ && heapFootprint() >= maxHeapSize_)
  ------------------
  |  Branch (2950:7): [Folded - Ignored]
  |  Branch (2950:25): [True: 0, False: 203]
  ------------------
 2951|      0|    return make_error_code(OOMError::MaxHeapReached);
 2952|       |
 2953|    203|  auto res = AlignedStorage::create(provider_.get(), "hades-segment");
 2954|    203|  if (!res) {
  ------------------
  |  Branch (2954:7): [True: 0, False: 203]
  ------------------
 2955|      0|    return res.getError();
 2956|      0|  }
 2957|    203|  HeapSegment seg(std::move(res.get()));
 2958|       |  // Even if compressed pointers are off, we still use the segment index for
 2959|       |  // crash manager indices.
 2960|    203|  size_t segIdx;
 2961|    203|  if (segmentIndices_.size()) {
  ------------------
  |  Branch (2961:7): [True: 0, False: 203]
  ------------------
 2962|      0|    segIdx = segmentIndices_.back();
 2963|      0|    segmentIndices_.pop_back();
 2964|    203|  } else {
 2965|    203|    segIdx = ++numSegments_;
 2966|    203|  }
 2967|    203|  pointerBase_.setSegment(segIdx, seg.lowLim());
 2968|    203|  addSegmentExtentToCrashManager(seg, std::to_string(segIdx));
 2969|    203|  seg.markBitArray().markAll();
 2970|    203|  return llvh::ErrorOr<HadesGC::HeapSegment>(std::move(seg));
 2971|    203|}
_ZN6hermes2vm7HadesGC6OldGen10addSegmentENS1_11HeapSegmentE:
 2973|    104|void HadesGC::OldGen::addSegment(HeapSegment seg) {
 2974|    104|  segments_.emplace_back(std::move(seg));
 2975|    104|  HeapSegment &newSeg = segments_.back();
 2976|    104|  incrementAllocatedBytes(newSeg.used());
 2977|       |  // Add a set of freelist buckets for this segment.
 2978|    104|  segmentBuckets_.emplace_back();
 2979|       |
 2980|    104|  assert(
 2981|    104|      segmentBuckets_.size() == segments_.size() &&
 2982|    104|      "Must have as many freelists as segments.");
 2983|       |
 2984|       |  // Add the remainder of the segment to the freelist.
 2985|      0|  uint32_t sz = newSeg.available();
 2986|    104|  if (sz >= minAllocationSize()) {
  ------------------
  |  Branch (2986:7): [True: 104, False: 0]
  ------------------
 2987|    104|    auto res = newSeg.alloc(sz);
 2988|    104|    assert(res.success);
 2989|      0|    auto bucket = getFreelistBucket(sz);
 2990|    104|    addCellToFreelist(res.ptr, sz, &segmentBuckets_.back()[bucket]);
 2991|    104|  }
 2992|       |
 2993|      0|  gc_.addSegmentExtentToCrashManager(newSeg, std::to_string(numSegments()));
 2994|    104|}
_ZN6hermes2vm7HadesGC6OldGen10popSegmentEv:
 2996|      1|HadesGC::HeapSegment HadesGC::OldGen::popSegment() {
 2997|      1|  const auto &segBuckets = segmentBuckets_.back();
 2998|    268|  for (size_t bucket = 0; bucket < kNumFreelistBuckets; ++bucket) {
  ------------------
  |  Branch (2998:27): [True: 267, False: 1]
  ------------------
 2999|    267|    if (segBuckets[bucket].head) {
  ------------------
  |  Branch (2999:9): [True: 1, False: 266]
  ------------------
 3000|      1|      segBuckets[bucket].removeFromFreelist();
 3001|      1|      freelistBucketBitArray_.set(bucket, buckets_[bucket].next);
 3002|      1|    }
 3003|    267|  }
 3004|      1|  segmentBuckets_.pop_back();
 3005|       |
 3006|      1|  auto oldSeg = std::move(segments_.back());
 3007|      1|  segments_.pop_back();
 3008|      1|  return oldSeg;
 3009|      1|}
_ZN6hermes2vm7HadesGC6OldGen18setTargetSizeBytesEm:
 3011|     99|void HadesGC::OldGen::setTargetSizeBytes(size_t targetSizeBytes) {
 3012|     99|  assert(gc_.gcMutex_ && "Must hold gcMutex_ when accessing targetSizeBytes_.");
 3013|      0|  assert(!targetSizeBytes_ && "Should only initialise targetSizeBytes_ once.");
 3014|      0|  targetSizeBytes_ = ExponentialMovingAverage(0.5, targetSizeBytes);
 3015|     99|}
_ZNK6hermes2vm7HadesGC8inOldGenEPKv:
 3017|  11.5M|bool HadesGC::inOldGen(const void *p) const {
 3018|       |  // If it isn't in any OG segment or the compactee, then this pointer is not in
 3019|       |  // the OG.
 3020|  11.5M|  return compactee_.contains(p) ||
  ------------------
  |  Branch (3020:10): [True: 9.87k, False: 11.5M]
  ------------------
 3021|  11.5M|      std::any_of(oldGen_.begin(), oldGen_.end(), [p](const HeapSegment &seg) {
  ------------------
  |  Branch (3021:7): [True: 11.5M, False: 0]
  ------------------
 3022|  11.5M|           return seg.contains(p);
 3023|  11.5M|         });
 3024|  11.5M|}
_ZN6hermes2vm7HadesGC13yieldToOldGenEv:
 3026|    301|void HadesGC::yieldToOldGen() {
 3027|    301|  assert(inGC() && "Must be in GC when yielding to old gen");
 3028|    301|  if (!kConcurrentGC && concurrentPhase_ != Phase::None) {
  ------------------
  |  Branch (3028:7): [Folded - Ignored]
  |  Branch (3028:25): [True: 0, False: 0]
  ------------------
 3029|       |    // If there is an ongoing collection, update the drain rate before
 3030|       |    // collecting.
 3031|      0|    if (concurrentPhase_ == Phase::Mark)
  ------------------
  |  Branch (3031:9): [True: 0, False: 0]
  ------------------
 3032|      0|      oldGenMarker_->setDrainRate(getDrainRate());
 3033|       |
 3034|      0|    constexpr uint32_t kYGIncrementalCollectBudget = kTargetMaxPauseMs / 2;
 3035|      0|    const auto initialPhase = concurrentPhase_;
 3036|       |    // If the phase hasn't changed and we are still under 25ms after the first
 3037|       |    // iteration, then we can be reasonably sure that the next iteration will
 3038|       |    // also be <25ms, keeping us within 50ms even in the worst case.
 3039|      0|    do {
 3040|      0|      incrementalCollect(false);
 3041|      0|    } while (concurrentPhase_ == initialPhase &&
  ------------------
  |  Branch (3041:14): [True: 0, False: 0]
  |  Branch (3041:14): [True: 0, False: 0]
  ------------------
 3042|      0|             ygCollectionStats_->getElapsedTime().count() <
  ------------------
  |  Branch (3042:14): [True: 0, False: 0]
  ------------------
 3043|      0|                 kYGIncrementalCollectBudget);
 3044|       |
 3045|    301|  } else if (concurrentPhase_ == Phase::CompleteMarking) {
  ------------------
  |  Branch (3045:14): [True: 8, False: 293]
  ------------------
 3046|      8|    incrementalCollect(false);
 3047|      8|    collectOGInBackground();
 3048|      8|  }
 3049|    301|}
_ZN6hermes2vm7HadesGC30addSegmentExtentToCrashManagerERKNS1_11HeapSegmentERKNSt3__112basic_stringIcNS5_11char_traitsIcEENS5_9allocatorIcEEEE:
 3077|    407|    const std::string &extraName) {
 3078|    407|  assert(!extraName.empty() && "extraName can't be empty");
 3079|    407|  if (!crashMgr_) {
  ------------------
  |  Branch (3079:7): [True: 0, False: 407]
  ------------------
 3080|      0|    return;
 3081|      0|  }
 3082|    407|  const std::string segmentName = name_ + ":HeapSegment:" + extraName;
 3083|       |  // Pointers need at most 18 characters for 0x + 16 digits for a 64-bit
 3084|       |  // pointer.
 3085|    407|  constexpr unsigned kAddressMaxSize = 18;
 3086|    407|  char segmentAddressBuffer[kAddressMaxSize];
 3087|    407|  snprintf(segmentAddressBuffer, kAddressMaxSize, "%p", seg.lowLim());
 3088|    407|  crashMgr_->setContextualCustomData(segmentName.c_str(), segmentAddressBuffer);
 3089|       |
 3090|       |#ifdef HERMESVM_PLATFORM_LOGGING
 3091|       |  hermesLog(
 3092|       |      "HermesGC",
 3093|       |      "Added segment extent: %s = %s",
 3094|       |      segmentName.c_str(),
 3095|       |      segmentAddressBuffer);
 3096|       |#endif
 3097|    407|}
_ZN6hermes2vm7HadesGC15checkWellFormedEv:
 3111|    745|void HadesGC::checkWellFormed() {
 3112|    745|  WeakRefLock lk{weakRefMutex()};
 3113|    745|  CheckHeapWellFormedAcceptor acceptor(*this);
 3114|    745|  {
 3115|    745|    DroppingAcceptor<CheckHeapWellFormedAcceptor> nameAcceptor{acceptor};
 3116|    745|    markRoots(nameAcceptor, true);
 3117|    745|  }
 3118|    745|  markWeakRoots(acceptor, /*markLongLived*/ true);
 3119|    745|  forAllObjs([this, &acceptor](GCCell *cell) {
 3120|    745|    assert(cell->isValid() && "Invalid cell encountered in heap");
 3121|    745|    markCell(cell, acceptor);
 3122|    745|  });
 3123|    745|}
_ZN6hermes2vm7HadesGC15verifyCardTableEv:
 3125|    602|void HadesGC::verifyCardTable() {
 3126|    602|  assert(inGC() && "Must be in GC to call verifyCardTable");
 3127|      0|  struct VerifyCardDirtyAcceptor final : public SlotAcceptor {
 3128|    602|    HadesGC &gc;
 3129|       |
 3130|    602|    explicit VerifyCardDirtyAcceptor(HadesGC &gc) : gc(gc) {}
 3131|       |
 3132|    602|    void acceptHelper(void *valuePtr, void *locPtr) {
 3133|    602|      const bool crossRegionCompacteePtr =
 3134|    602|          !gc.compactee_.evacContains(locPtr) &&
 3135|    602|          gc.compactee_.evacContains(valuePtr);
 3136|    602|      if (!gc.inYoungGen(locPtr) &&
 3137|    602|          (gc.inYoungGen(valuePtr) || crossRegionCompacteePtr)) {
 3138|    602|        assert(HeapSegment::cardTableCovering(locPtr)->isCardForAddressDirty(
 3139|    602|            locPtr));
 3140|    602|      }
 3141|    602|    }
 3142|       |
 3143|    602|    void accept(GCPointerBase &ptr) override {
 3144|    602|      acceptHelper(ptr.get(gc.getPointerBase()), &ptr);
 3145|    602|    }
 3146|       |
 3147|    602|    void accept(GCHermesValue &hv) override {
 3148|    602|      if (hv.isPointer())
 3149|    602|        acceptHelper(hv.getPointer(), &hv);
 3150|    602|    }
 3151|    602|    void accept(GCSmallHermesValue &hv) override {
 3152|    602|      if (hv.isPointer())
 3153|    602|        acceptHelper(hv.getPointer(gc.getPointerBase()), &hv);
 3154|    602|    }
 3155|       |
 3156|    602|    void accept(const GCSymbolID &hv) override {}
 3157|    602|  };
 3158|       |
 3159|    602|  VerifyCardDirtyAcceptor acceptor{*this};
 3160|    602|  forAllObjs([this, &acceptor](GCCell *cell) { markCell(cell, acceptor); });
 3161|       |
 3162|    637|  for (const HeapSegment &seg : oldGen_) {
  ------------------
  |  Branch (3162:31): [True: 637, False: 602]
  ------------------
 3163|    637|    seg.cardTable().verifyBoundaries(seg.start(), seg.level());
 3164|    637|  }
 3165|    602|}
_ZNK6hermes2vm7HadesGC15CollectionStats20beforeAllocatedBytesEv:
  313|    282|  uint64_t beforeAllocatedBytes() const {
  314|    282|    return allocatedBefore_;
  315|    282|  }
_ZN6hermes2vm7HadesGC15CollectionStats13setSweptBytesEm:
  270|    442|  void setSweptBytes(uint64_t sweptBytes) {
  271|    442|    sweptBytes_ = sweptBytes;
  272|    442|  }
_ZN6hermes2vm7HadesGC15CollectionStats21setSweptExternalBytesEm:
  274|    442|  void setSweptExternalBytes(uint64_t externalBytes) {
  275|    442|    sweptExternalBytes_ = externalBytes;
  276|    442|  }
_ZNK6hermes2vm7HadesGC15CollectionStats19afterAllocatedBytesEv:
  320|  1.45k|  uint64_t afterAllocatedBytes() const {
  321|  1.45k|    assert(sweptBytes_ <= allocatedBefore_);
  322|      0|    return allocatedBefore_ - sweptBytes_;
  323|  1.45k|  }
_ZNK6hermes2vm7HadesGC15CollectionStats18afterExternalBytesEv:
  325|  1.15k|  uint64_t afterExternalBytes() const {
  326|  1.15k|    assert(sweptExternalBytes_ <= externalBefore_);
  327|      0|    return externalBefore_ - sweptExternalBytes_;
  328|  1.15k|  }
_ZN6hermes2vm7HadesGC15CollectionStatsC2ERS1_NSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEESA_:
  251|    577|        collectionType_{std::move(collectionType)} {}
_ZN6hermes2vm7HadesGC15CollectionStats19beginCPUTimeSectionEv:
  302|    577|  void beginCPUTimeSection() {
  303|    577|    assert(
  304|    577|        cpuTimeSectionStart_ == Duration{} &&
  305|    577|        "Must end cpu time section before starting another");
  306|      0|    cpuTimeSectionStart_ = oscompat::thread_cpu_time();
  307|    577|  }
_ZN6hermes2vm7HadesGC15CollectionStats12setBeginTimeEv:
  283|    577|  void setBeginTime() {
  284|    577|    assert(beginTime_ == Clock::time_point{} && "Begin time already set");
  285|      0|    beginTime_ = Clock::now();
  286|    577|  }
_ZN6hermes2vm7HadesGC15CollectionStats17endCPUTimeSectionEv:
  308|    577|  void endCPUTimeSection() {
  309|    577|    cpuDuration_ += oscompat::thread_cpu_time() - cpuTimeSectionStart_;
  310|    577|    cpuTimeSectionStart_ = {};
  311|    577|  }
_ZN6hermes2vm7HadesGC15CollectionStats10setEndTimeEv:
  289|    575|  void setEndTime() {
  290|    575|    assert(endTime_ == Clock::time_point{} && "End time already set");
  291|      0|    endTime_ = Clock::now();
  292|    575|  }
_ZNO6hermes2vm7HadesGC15CollectionStats8getEventEv:
  340|    571|  GCAnalyticsEvent getEvent() && {
  341|    571|    markUsed();
  342|    571|    return GCAnalyticsEvent{
  343|    571|        gc_.getName(),
  344|    571|        gc_.getKindAsStr(),
  345|    571|        collectionType_,
  346|    571|        std::move(cause_),
  347|    571|        std::chrono::duration_cast<std::chrono::milliseconds>(
  348|    571|            endTime_ - beginTime_),
  349|    571|        std::chrono::duration_cast<std::chrono::milliseconds>(cpuDuration_),
  350|    571|        /*allocated*/ BeforeAndAfter{allocatedBefore_, afterAllocatedBytes()},
  351|    571|        /*size*/ BeforeAndAfter{sizeBefore_, sizeAfter_},
  352|    571|        /*external*/ BeforeAndAfter{externalBefore_, afterExternalBytes()},
  353|    571|        /*survivalRatio*/ survivalRatio(),
  354|    571|        /*tags*/ std::move(tags_)};
  355|    571|  }
_ZNK6hermes2vm7HadesGC15CollectionStats13survivalRatioEv:
  330|    571|  double survivalRatio() const {
  331|    571|    return allocatedBefore_
  ------------------
  |  Branch (331:12): [True: 305, False: 266]
  ------------------
  332|    571|        ? static_cast<double>(afterAllocatedBytes()) / allocatedBefore_
  333|    571|        : 0;
  334|    571|  }
_ZN6hermes2vm7HadesGC15CollectionStatsD2Ev:
  252|    577|  ~CollectionStats() {
  253|    577|    assert(usedDbg_ && "Stats not submitted.");
  254|    577|  }
_ZN6hermes2vm7HadesGC15CollectionStats17addCollectionTypeENSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEE:
  256|    151|  void addCollectionType(std::string collectionType) {
  257|    151|    if (std::find(tags_.begin(), tags_.end(), collectionType) == tags_.end())
  ------------------
  |  Branch (257:9): [True: 151, False: 0]
  ------------------
  258|    151|      tags_.emplace_back(std::move(collectionType));
  259|    151|  }
_ZN6hermes2vm7HadesGC15CollectionStats14setBeforeSizesEmmm:
  263|    444|  void setBeforeSizes(uint64_t allocated, uint64_t external, uint64_t sz) {
  264|    444|    allocatedBefore_ = allocated;
  265|    444|    externalBefore_ = external;
  266|    444|    sizeBefore_ = sz;
  267|    444|  }
_ZN6hermes2vm7HadesGC12MarkAcceptorC2ERS1_:
  698|    143|        writeBarrierMarkedSymbols_{gc.gcCallbacks_.getSymbolsEnd()} {}
_ZN6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EEC2Ev:
  590|    143|    explicit FixedCapacityVector() : FixedCapacityVector(0) {}
_ZN6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EEC2Em:
  591|    143|    explicit FixedCapacityVector(size_t sz) : size_(sz) {}
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERPNS0_6GCCellE:
  724|  61.7k|  void accept(GCCell *&ptr) override {
  725|  61.7k|    if (ptr)
  ------------------
  |  Branch (725:9): [True: 61.7k, False: 0]
  ------------------
  726|  61.7k|      acceptRoot(ptr);
  727|  61.7k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor10acceptRootEPNS0_6GCCellE:
  718|   115k|  void acceptRoot(GCCell *cell) {
  719|   115k|    assert(cell->isValid() && "Encountered an invalid cell");
  720|   115k|    if (!HeapSegment::getCellMarkBit(cell))
  ------------------
  |  Branch (720:9): [True: 111k, False: 4.13k]
  ------------------
  721|   111k|      push(cell);
  722|   115k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor4pushEPNS0_6GCCellE:
  950|   802k|  void push(GCCell *cell) {
  951|   802k|    assert(
  952|   802k|        !HeapSegment::getCellMarkBit(cell) &&
  953|   802k|        "A marked object should never be pushed onto a worklist");
  954|      0|    assert(
  955|   802k|        !gc.inYoungGen(cell) &&
  956|   802k|        "Shouldn't ever push a YG object onto the worklist");
  957|      0|    HeapSegment::setCellMarkBit(cell);
  958|       |    // There could be a race here: however, the mutator will never change a
  959|       |    // cell's kind after initialization. The GC thread might to a free cell, but
  960|       |    // only during sweeping, not concurrently with this operation. Therefore
  961|       |    // there's no need for any synchronization here.
  962|   802k|    if (vmisa<JSWeakMap>(cell)) {
  ------------------
  |  Branch (962:9): [True: 0, False: 802k]
  ------------------
  963|      0|      reachableWeakMaps_.push_back(vmcast<JSWeakMap>(cell));
  964|   802k|    } else {
  965|   802k|      localWorklist_.push(cell);
  966|   802k|    }
  967|   802k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERNS0_17PinnedHermesValueE:
  743|  58.5k|  void accept(PinnedHermesValue &hv) override {
  744|       |    // PinnedHermesValue is a root type and cannot live in the heap. Therefore
  745|       |    // there's no risk of a concurrent access.
  746|  58.5k|    if (hv.isPointer()) {
  ------------------
  |  Branch (746:9): [True: 53.2k, False: 5.36k]
  ------------------
  747|  53.2k|      acceptRoot(static_cast<GCCell *>(hv.getPointer()));
  748|  53.2k|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (748:16): [True: 0, False: 5.36k]
  ------------------
  749|      0|      acceptSym(hv.getSymbol());
  750|      0|    }
  751|  58.5k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor9acceptSymENS0_8SymbolIDE:
  770|   199k|  void acceptSym(SymbolID sym) {
  771|   199k|    const uint32_t idx = sym.unsafeGetIndex();
  772|   199k|    if (sym.isInvalid() || idx >= markedSymbols_.size()) {
  ------------------
  |  Branch (772:9): [True: 142, False: 199k]
  |  Branch (772:28): [True: 0, False: 199k]
  ------------------
  773|       |      // Ignore symbols that aren't valid or are pointing outside of the range
  774|       |      // when the collection began.
  775|    142|      return;
  776|    142|    }
  777|   199k|    markedSymbols_[idx] = true;
  778|   199k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14acceptNullableERNS0_17PinnedHermesValueE:
  752|    553|  void acceptNullable(PinnedHermesValue &hv) override {
  753|    553|    if (hv.isPointer()) {
  ------------------
  |  Branch (753:9): [True: 393, False: 160]
  ------------------
  754|    393|      if (void *ptr = hv.getPointer())
  ------------------
  |  Branch (754:17): [True: 389, False: 4]
  ------------------
  755|    389|        acceptRoot(static_cast<GCCell *>(ptr));
  756|    393|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (756:16): [True: 11, False: 149]
  ------------------
  757|     11|      acceptSym(hv.getSymbol());
  758|     11|    }
  759|    553|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERKNS0_12RootSymbolIDE:
  780|  14.6k|  void accept(const RootSymbolID &sym) override {
  781|  14.6k|    acceptSym(sym);
  782|  14.6k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERNS0_13GCPointerBaseE:
  729|   588k|  void accept(GCPointerBase &ptr) override {
  730|   588k|    if (auto cp = concurrentRead<CompressedPointer>(ptr))
  ------------------
  |  Branch (730:14): [True: 346k, False: 241k]
  ------------------
  731|   346k|      acceptHeap(cp.getNonNull(pointerBase_), &ptr);
  732|   588k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14concurrentReadINS0_17CompressedPointerEEET_RKS5_:
 1013|   588k|  T concurrentRead(const T &ref) {
 1014|   588k|    return kConcurrentGC ? concurrentReadImpl<T>(ref) : ref;
  ------------------
  |  Branch (1014:12): [Folded - Ignored]
  ------------------
 1015|   588k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor18concurrentReadImplINS0_17CompressedPointerEEET_RKS5_:
  970|   588k|  T concurrentReadImpl(const T &valRef) {
  971|   588k|    using Storage =
  972|   588k|        typename std::conditional<sizeof(T) == 4, uint32_t, uint64_t>::type;
  973|   588k|    static_assert(sizeof(T) == sizeof(Storage), "Sizes must match");
  974|   588k|    union {
  975|   588k|      Storage storage;
  976|   588k|      T val;
  977|   588k|    } ret{};
  978|       |
  979|       |    // There is a benign data race here, as the GC can read a pointer while
  980|       |    // it's being modified by the mutator; however, the following rules we
  981|       |    // obey prevent it from being a problem:
  982|       |    // * The only things being modified that the GC reads are the GCPointers
  983|       |    //    and GCHermesValue in an object. All other fields are ignored.
  984|       |    // * Those fields are fewer than 64 bits.
  985|       |    // * Therefore, on 64-bit platforms, those fields are atomic
  986|       |    //    automatically.
  987|       |    // * On 32-bit platforms, we don't run this code concurrently, and
  988|       |    //    instead yield cooperatively with the mutator.
  989|       |    // * Thanks to the write barrier, if something is modified its old value
  990|       |    //    is placed in the globalWorklist, so we don't miss marking it.
  991|       |    // * Since the global worklist is pushed onto *before* the write
  992|       |    //    happens, we know that there's no way the loop will exit unless it
  993|       |    //    reads the old value.
  994|       |    // * If it observes the old value (pre-write-barrier value) here, the
  995|       |    //    new value will still be live, either by being pre-marked by the
  996|       |    //    allocator, or because something else's write barrier will catch
  997|       |    //    the modification.
  998|   588k|    TsanIgnoreReadsBegin();
  999|       |
 1000|       |    // The cast to a volatile variable forces a read from valRef, since
 1001|       |    // reads from volatile variables are considered observable behaviour. This
 1002|       |    // prevents the compiler from optimizing away the returned value,
 1003|       |    // guaranteeing that we will not observe changes to the underlying value
 1004|       |    // past this point. Not using volatile here could lead to a TOCTOU bug,
 1005|       |    // because the underlying value may change after a pointer check (in the
 1006|       |    // case of HermesValue) or a null check (for pointers).
 1007|   588k|    ret.storage = *reinterpret_cast<Storage const volatile *>(&valRef);
 1008|   588k|    TsanIgnoreReadsEnd();
 1009|   588k|    return ret.val;
 1010|   588k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor10acceptHeapEPNS0_6GCCellEPKv:
  700|   963k|  void acceptHeap(GCCell *cell, const void *heapLoc) {
  701|   963k|    assert(cell && "Cannot pass null pointer to acceptHeap");
  702|      0|    assert(!gc.inYoungGen(heapLoc) && "YG slot found in OG marking");
  703|   963k|    if (gc.compactee_.contains(cell) && !gc.compactee_.contains(heapLoc)) {
  ------------------
  |  Branch (703:9): [True: 0, False: 963k]
  |  Branch (703:41): [True: 0, False: 0]
  ------------------
  704|       |      // This is a pointer in the heap pointing into the compactee, dirty the
  705|       |      // corresponding card.
  706|      0|      HeapSegment::cardTableCovering(heapLoc)->dirtyCardForAddress(heapLoc);
  707|      0|    }
  708|   963k|    if (HeapSegment::getCellMarkBit(cell)) {
  ------------------
  |  Branch (708:9): [True: 273k, False: 690k]
  ------------------
  709|       |      // Points to an already marked object, do nothing.
  710|   273k|      return;
  711|   273k|    }
  712|       |    // This must be done after checking the cell mark bit, to avoid reading the
  713|       |    // metadata of cells in the YG, which we do not have the lock for.
  714|   690k|    assert(cell->isValid() && "Encountered an invalid cell");
  715|      0|    push(cell);
  716|   690k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
  734|  6.12k|  void accept(GCHermesValue &hvRef) override {
  735|  6.12k|    HermesValue hv = concurrentRead<HermesValue>(hvRef);
  736|  6.12k|    if (hv.isPointer()) {
  ------------------
  |  Branch (736:9): [True: 5.69k, False: 426]
  ------------------
  737|  5.69k|      acceptHeap(static_cast<GCCell *>(hv.getPointer()), &hvRef);
  738|  5.69k|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (738:16): [True: 0, False: 426]
  ------------------
  739|      0|      acceptSym(hv.getSymbol());
  740|      0|    }
  741|  6.12k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14concurrentReadINS0_11HermesValueEEET_RKS5_:
 1013|  6.12k|  T concurrentRead(const T &ref) {
 1014|  6.12k|    return kConcurrentGC ? concurrentReadImpl<T>(ref) : ref;
  ------------------
  |  Branch (1014:12): [Folded - Ignored]
  ------------------
 1015|  6.12k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor18concurrentReadImplINS0_11HermesValueEEET_RKS5_:
  970|  6.12k|  T concurrentReadImpl(const T &valRef) {
  971|  6.12k|    using Storage =
  972|  6.12k|        typename std::conditional<sizeof(T) == 4, uint32_t, uint64_t>::type;
  973|  6.12k|    static_assert(sizeof(T) == sizeof(Storage), "Sizes must match");
  974|  6.12k|    union {
  975|  6.12k|      Storage storage;
  976|  6.12k|      T val;
  977|  6.12k|    } ret{};
  978|       |
  979|       |    // There is a benign data race here, as the GC can read a pointer while
  980|       |    // it's being modified by the mutator; however, the following rules we
  981|       |    // obey prevent it from being a problem:
  982|       |    // * The only things being modified that the GC reads are the GCPointers
  983|       |    //    and GCHermesValue in an object. All other fields are ignored.
  984|       |    // * Those fields are fewer than 64 bits.
  985|       |    // * Therefore, on 64-bit platforms, those fields are atomic
  986|       |    //    automatically.
  987|       |    // * On 32-bit platforms, we don't run this code concurrently, and
  988|       |    //    instead yield cooperatively with the mutator.
  989|       |    // * Thanks to the write barrier, if something is modified its old value
  990|       |    //    is placed in the globalWorklist, so we don't miss marking it.
  991|       |    // * Since the global worklist is pushed onto *before* the write
  992|       |    //    happens, we know that there's no way the loop will exit unless it
  993|       |    //    reads the old value.
  994|       |    // * If it observes the old value (pre-write-barrier value) here, the
  995|       |    //    new value will still be live, either by being pre-marked by the
  996|       |    //    allocator, or because something else's write barrier will catch
  997|       |    //    the modification.
  998|  6.12k|    TsanIgnoreReadsBegin();
  999|       |
 1000|       |    // The cast to a volatile variable forces a read from valRef, since
 1001|       |    // reads from volatile variables are considered observable behaviour. This
 1002|       |    // prevents the compiler from optimizing away the returned value,
 1003|       |    // guaranteeing that we will not observe changes to the underlying value
 1004|       |    // past this point. Not using volatile here could lead to a TOCTOU bug,
 1005|       |    // because the underlying value may change after a pointer check (in the
 1006|       |    // case of HermesValue) or a null check (for pointers).
 1007|  6.12k|    ret.storage = *reinterpret_cast<Storage const volatile *>(&valRef);
 1008|  6.12k|    TsanIgnoreReadsEnd();
 1009|  6.12k|    return ret.val;
 1010|  6.12k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
  761|   707k|  void accept(GCSmallHermesValue &hvRef) override {
  762|   707k|    const SmallHermesValue hv = concurrentRead<SmallHermesValue>(hvRef);
  763|   707k|    if (hv.isPointer()) {
  ------------------
  |  Branch (763:9): [True: 611k, False: 96.1k]
  ------------------
  764|   611k|      acceptHeap(hv.getPointer(pointerBase_), &hvRef);
  765|   611k|    } else if (hv.isSymbol()) {
  ------------------
  |  Branch (765:16): [True: 1.42k, False: 94.6k]
  ------------------
  766|  1.42k|      acceptSym(hv.getSymbol());
  767|  1.42k|    }
  768|   707k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14concurrentReadINS0_13HermesValue32EEET_RKS5_:
 1013|   707k|  T concurrentRead(const T &ref) {
 1014|   707k|    return kConcurrentGC ? concurrentReadImpl<T>(ref) : ref;
  ------------------
  |  Branch (1014:12): [Folded - Ignored]
  ------------------
 1015|   707k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor18concurrentReadImplINS0_13HermesValue32EEET_RKS5_:
  970|   707k|  T concurrentReadImpl(const T &valRef) {
  971|   707k|    using Storage =
  972|   707k|        typename std::conditional<sizeof(T) == 4, uint32_t, uint64_t>::type;
  973|   707k|    static_assert(sizeof(T) == sizeof(Storage), "Sizes must match");
  974|   707k|    union {
  975|   707k|      Storage storage;
  976|   707k|      T val;
  977|   707k|    } ret{};
  978|       |
  979|       |    // There is a benign data race here, as the GC can read a pointer while
  980|       |    // it's being modified by the mutator; however, the following rules we
  981|       |    // obey prevent it from being a problem:
  982|       |    // * The only things being modified that the GC reads are the GCPointers
  983|       |    //    and GCHermesValue in an object. All other fields are ignored.
  984|       |    // * Those fields are fewer than 64 bits.
  985|       |    // * Therefore, on 64-bit platforms, those fields are atomic
  986|       |    //    automatically.
  987|       |    // * On 32-bit platforms, we don't run this code concurrently, and
  988|       |    //    instead yield cooperatively with the mutator.
  989|       |    // * Thanks to the write barrier, if something is modified its old value
  990|       |    //    is placed in the globalWorklist, so we don't miss marking it.
  991|       |    // * Since the global worklist is pushed onto *before* the write
  992|       |    //    happens, we know that there's no way the loop will exit unless it
  993|       |    //    reads the old value.
  994|       |    // * If it observes the old value (pre-write-barrier value) here, the
  995|       |    //    new value will still be live, either by being pre-marked by the
  996|       |    //    allocator, or because something else's write barrier will catch
  997|       |    //    the modification.
  998|   707k|    TsanIgnoreReadsBegin();
  999|       |
 1000|       |    // The cast to a volatile variable forces a read from valRef, since
 1001|       |    // reads from volatile variables are considered observable behaviour. This
 1002|       |    // prevents the compiler from optimizing away the returned value,
 1003|       |    // guaranteeing that we will not observe changes to the underlying value
 1004|       |    // past this point. Not using volatile here could lead to a TOCTOU bug,
 1005|       |    // because the underlying value may change after a pointer check (in the
 1006|       |    // case of HermesValue) or a null check (for pointers).
 1007|   707k|    ret.storage = *reinterpret_cast<Storage const volatile *>(&valRef);
 1008|   707k|    TsanIgnoreReadsEnd();
 1009|   707k|    return ret.val;
 1010|   707k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERKNS0_10GCSymbolIDE:
  783|   183k|  void accept(const GCSymbolID &sym) override {
  784|   183k|    acceptSym(concurrentRead<SymbolID>(sym));
  785|   183k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14concurrentReadINS0_8SymbolIDEEET_RKS5_:
 1013|   183k|  T concurrentRead(const T &ref) {
 1014|   183k|    return kConcurrentGC ? concurrentReadImpl<T>(ref) : ref;
  ------------------
  |  Branch (1014:12): [Folded - Ignored]
  ------------------
 1015|   183k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor18concurrentReadImplINS0_8SymbolIDEEET_RKS5_:
  970|   183k|  T concurrentReadImpl(const T &valRef) {
  971|   183k|    using Storage =
  972|   183k|        typename std::conditional<sizeof(T) == 4, uint32_t, uint64_t>::type;
  973|   183k|    static_assert(sizeof(T) == sizeof(Storage), "Sizes must match");
  974|   183k|    union {
  975|   183k|      Storage storage;
  976|   183k|      T val;
  977|   183k|    } ret{};
  978|       |
  979|       |    // There is a benign data race here, as the GC can read a pointer while
  980|       |    // it's being modified by the mutator; however, the following rules we
  981|       |    // obey prevent it from being a problem:
  982|       |    // * The only things being modified that the GC reads are the GCPointers
  983|       |    //    and GCHermesValue in an object. All other fields are ignored.
  984|       |    // * Those fields are fewer than 64 bits.
  985|       |    // * Therefore, on 64-bit platforms, those fields are atomic
  986|       |    //    automatically.
  987|       |    // * On 32-bit platforms, we don't run this code concurrently, and
  988|       |    //    instead yield cooperatively with the mutator.
  989|       |    // * Thanks to the write barrier, if something is modified its old value
  990|       |    //    is placed in the globalWorklist, so we don't miss marking it.
  991|       |    // * Since the global worklist is pushed onto *before* the write
  992|       |    //    happens, we know that there's no way the loop will exit unless it
  993|       |    //    reads the old value.
  994|       |    // * If it observes the old value (pre-write-barrier value) here, the
  995|       |    //    new value will still be live, either by being pre-marked by the
  996|       |    //    allocator, or because something else's write barrier will catch
  997|       |    //    the modification.
  998|   183k|    TsanIgnoreReadsBegin();
  999|       |
 1000|       |    // The cast to a volatile variable forces a read from valRef, since
 1001|       |    // reads from volatile variables are considered observable behaviour. This
 1002|       |    // prevents the compiler from optimizing away the returned value,
 1003|       |    // guaranteeing that we will not observe changes to the underlying value
 1004|       |    // past this point. Not using volatile here could lead to a TOCTOU bug,
 1005|       |    // because the underlying value may change after a pointer check (in the
 1006|       |    // case of HermesValue) or a null check (for pointers).
 1007|   183k|    ret.storage = *reinterpret_cast<Storage const volatile *>(&valRef);
 1008|   183k|    TsanIgnoreReadsEnd();
 1009|   183k|    return ret.val;
 1010|   183k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor6acceptERNS0_11WeakRefBaseE:
  801|  80.6k|  void accept(WeakRefBase &wr) override {
  802|  80.6k|    assert(
  803|  80.6k|        gc.weakRefMutex() &&
  804|  80.6k|        "Must hold weak ref mutex when marking a WeakRef.");
  805|      0|    WeakRefSlot *slot = wr.unsafeGetSlot();
  806|  80.6k|    assert(
  807|  80.6k|        slot->state() != WeakSlotState::Free &&
  808|  80.6k|        "marking a freed weak ref slot");
  809|      0|    slot->mark();
  810|  80.6k|  }
_ZN6hermes2vm7HadesGC8Executor3addENSt3__18functionIFvvEEE:
 1056|    151|  std::future<void> add(std::function<void()> fn) {
 1057|    151|    std::lock_guard<std::mutex> lk(mtx_);
 1058|       |    // Use a shared_ptr because we cannot std::move the promise into the
 1059|       |    // lambda in C++11.
 1060|    151|    auto promise = std::make_shared<std::promise<void>>();
 1061|    151|    auto ret = promise->get_future();
 1062|    151|    queue_.push_back([promise, fn] {
 1063|    151|      fn();
 1064|    151|      promise->set_value();
 1065|    151|    });
 1066|    151|    cv_.notify_one();
 1067|    151|    return ret;
 1068|    151|  }
_ZZN6hermes2vm7HadesGC8Executor3addENSt3__18functionIFvvEEEENKUlvE_clEv:
 1062|    151|    queue_.push_back([promise, fn] {
 1063|    151|      fn();
 1064|    151|      promise->set_value();
 1065|    151|    });
_ZN6hermes2vm7HadesGC12MarkAcceptor13drainSomeWorkEv:
  837|  6.23k|  bool drainSomeWork() {
  838|       |    // See the comment in setDrainRate for why the drain rate isn't used for
  839|       |    // concurrent collections.
  840|  6.23k|    constexpr size_t kConcurrentMarkLimit = 8192;
  841|  6.23k|    return drainSomeWork(kConcurrentGC ? kConcurrentMarkLimit : byteDrainRate_);
  ------------------
  |  Branch (841:26): [Folded - Ignored]
  ------------------
  842|  6.23k|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor13drainSomeWorkEm:
  852|  6.37k|  bool drainSomeWork(const size_t markLimit) {
  853|  6.37k|    assert(gc.gcMutex_ && "Must hold the GC lock while accessing mark bits.");
  854|       |    // Pull any new items off the global worklist.
  855|      0|    auto cells = globalWorklist_.drain();
  856|  6.37k|    for (GCCell *cell : cells) {
  ------------------
  |  Branch (856:23): [True: 76, False: 6.37k]
  ------------------
  857|     76|      assert(
  858|     76|          cell->isValid() && "Invalid cell received off the global worklist");
  859|      0|      assert(
  860|     76|          !gc.inYoungGen(cell) &&
  861|     76|          "Shouldn't ever traverse a YG object in this loop");
  862|     76|      HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|     76|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  863|      0|          gc.dbgContains(cell) && "Non-heap cell found in global worklist");
  864|     76|      if (!HeapSegment::getCellMarkBit(cell)) {
  ------------------
  |  Branch (864:11): [True: 2, False: 74]
  ------------------
  865|       |        // Cell has not yet been marked.
  866|      2|        push(cell);
  867|      2|      }
  868|     76|    }
  869|       |
  870|  6.37k|    size_t numMarkedBytes = 0;
  871|  6.37k|    assert(markLimit && "markLimit must be non-zero!");
  872|   807k|    while (!localWorklist_.empty() && numMarkedBytes < markLimit) {
  ------------------
  |  Branch (872:12): [True: 807k, False: 283]
  |  Branch (872:39): [True: 801k, False: 6.09k]
  ------------------
  873|   801k|      GCCell *const cell = localWorklist_.top();
  874|   801k|      localWorklist_.pop();
  875|   801k|      assert(cell->isValid() && "Invalid cell in marking");
  876|      0|      assert(HeapSegment::getCellMarkBit(cell) && "Discovered unmarked object");
  877|      0|      assert(
  878|   801k|          !gc.inYoungGen(cell) &&
  879|   801k|          "Shouldn't ever traverse a YG object in this loop");
  880|   801k|      HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|   801k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  881|      0|          gc.dbgContains(cell) && "Non-heap object discovered during marking");
  882|      0|      const auto sz = cell->getAllocatedSize();
  883|   801k|      numMarkedBytes += sz;
  884|   801k|      gc.markCell(cell, *this);
  885|   801k|    }
  886|  6.37k|    markedBytes_ += numMarkedBytes;
  887|  6.37k|    return !localWorklist_.empty();
  888|  6.37k|  }
_ZN6hermes2vm12MarkWorklist5drainEv:
  642|  6.37k|  llvh::SmallVector<GCCell *, 0> drain() {
  643|  6.37k|    llvh::SmallVector<GCCell *, 0> cells;
  644|       |    // Move the list (in O(1) time) to a local variable, and then release the
  645|       |    // lock. This unblocks the mutator faster.
  646|  6.37k|    std::lock_guard<Mutex> lk{mtx_};
  647|  6.37k|    std::swap(cells, worklist_);
  648|  6.37k|    assert(worklist_.empty() && "worklist isn't cleared out");
  649|       |    // Keep the previously allocated size to minimise allocations
  650|      0|    worklist_.reserve(cells.size());
  651|  6.37k|    return cells;
  652|  6.37k|  }
_ZN6hermes2vm7HadesGC15CollectionStats12setAfterSizeEm:
  278|    442|  void setAfterSize(uint64_t sz) {
  279|    442|    sizeAfter_ = sz;
  280|    442|  }
_ZNK6hermes2vm7HadesGC12MarkAcceptor11markedBytesEv:
  819|    141|  uint64_t markedBytes() const {
  820|    141|    return markedBytes_;
  821|    141|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor14globalWorklistEv:
  890|    523|  MarkWorklist &globalWorklist() {
  891|    523|    return globalWorklist_;
  892|    523|  }
_ZN6hermes2vm12MarkWorklist14flushPushChunkEv:
  657|    141|  void flushPushChunk() {
  658|    141|    std::lock_guard<Mutex> lk{mtx_};
  659|    141|    worklist_.insert(
  660|    141|        worklist_.end(),
  661|    141|        pushChunk_.data(),
  662|    141|        pushChunk_.data() + pushChunk_.size());
  663|       |    // Set the size back to 0 and refill the same buffer.
  664|    141|    pushChunk_.clear();
  665|    141|  }
_ZN6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE4dataEv:
  613|    282|    T *data() {
  614|    282|      return data_.data();
  615|    282|    }
_ZNK6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE4sizeEv:
  595|    241|    size_t size() const {
  596|    241|      return size_;
  597|    241|    }
_ZN6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE5clearEv:
  617|    141|    void clear() {
  618|    141|#ifndef NDEBUG
  619|       |      // Fill the push chunk with bad memory in debug modes to catch invalid
  620|       |      // reads.
  621|    141|      std::memset(data_.data(), kInvalidHeapValue, sizeof(GCCell *) * N);
  622|    141|#endif
  623|    141|      size_ = 0;
  624|    141|    }
_ZN6hermes2vm7HadesGC12MarkAcceptor12drainAllWorkEv:
  826|    141|  void drainAllWork() {
  827|       |    // This should only be called from the mutator. This means no write barriers
  828|       |    // should occur, and there's no need to check the global worklist more than
  829|       |    // once.
  830|    141|    drainSomeWork(std::numeric_limits<size_t>::max());
  831|    141|    assert(localWorklist_.empty() && "Some work left that wasn't completed");
  832|    141|  }
_ZN6hermes2vm12MarkWorklist5emptyEv:
  676|    282|  bool empty() {
  677|    282|    std::lock_guard<Mutex> lk{mtx_};
  678|    282|    return pushChunk_.empty() && worklist_.empty();
  ------------------
  |  Branch (678:12): [True: 282, False: 0]
  |  Branch (678:34): [True: 282, False: 0]
  ------------------
  679|    282|  }
_ZNK6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE5emptyEv:
  603|    282|    bool empty() const {
  604|    282|      return size_ == 0;
  605|    282|    }
_ZN6hermes2vm7HadesGC21MarkWeakRootsAcceptorC2ERS1_:
 1024|    141|  MarkWeakRootsAcceptor(HadesGC &gc) : gc_{gc} {}
_ZN6hermes2vm7HadesGC21MarkWeakRootsAcceptor10acceptWeakERNS0_12WeakRootBaseE:
 1026|  84.3k|  void acceptWeak(WeakRootBase &wr) override {
 1027|  84.3k|    if (!wr) {
  ------------------
  |  Branch (1027:9): [True: 274, False: 84.0k]
  ------------------
 1028|    274|      return;
 1029|    274|    }
 1030|  84.0k|    GCCell *const cell = wr.getNoBarrierUnsafe(gc_.getPointerBase());
 1031|  84.0k|    HERMES_SLOW_ASSERT(gc_.dbgContains(cell) && "ptr not in heap");
  ------------------
  |  |   17|  84.0k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
 1032|  84.0k|    if (HeapSegment::getCellMarkBit(cell)) {
  ------------------
  |  Branch (1032:9): [True: 84.0k, False: 21]
  ------------------
 1033|       |      // If the cell is marked, no need to do any writes.
 1034|  84.0k|      return;
 1035|  84.0k|    }
 1036|       |    // Reset weak root if target GCCell is dead.
 1037|     21|    wr = nullptr;
 1038|     21|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor13markedSymbolsEv:
  903|    141|  llvh::BitVector &markedSymbols() {
  904|    141|    assert(gc.gcMutex_ && "Cannot call markedSymbols without a lock");
  905|      0|    markedSymbols_ |= writeBarrierMarkedSymbols_;
  906|       |    // No need to clear writeBarrierMarkedSymbols_, or'ing it again won't change
  907|       |    // the bit vector.
  908|    141|    return markedSymbols_;
  909|    141|  }
_ZN6hermes2vm7HadesGC15CollectionStats8markUsedEv:
  336|    577|  void markUsed() {
  337|    577|    assert(!std::exchange(usedDbg_, true) && "markUsed called twice");
  338|    577|  }
_ZN6hermes2vm12MarkWorklist7enqueueEPNS0_6GCCellE:
  633|    100|  void enqueue(GCCell *cell) {
  634|    100|    pushChunk_.push_back(cell);
  635|    100|    if (pushChunk_.size() == pushChunk_.capacity()) {
  ------------------
  |  Branch (635:9): [True: 0, False: 100]
  ------------------
  636|       |      // Once the chunk has reached its max size, move it to the pull chunks.
  637|      0|      flushPushChunk();
  638|      0|    }
  639|    100|  }
_ZN6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE9push_backES4_:
  607|    100|    void push_back(T elem) {
  608|    100|      assert(
  609|    100|          size_ < N && "Trying to push off the end of a FixedCapacityVector");
  610|      0|      data_[size_++] = elem;
  611|    100|    }
_ZNK6hermes2vm12MarkWorklist19FixedCapacityVectorIPNS0_6GCCellELm128EE8capacityEv:
  599|    100|    constexpr size_t capacity() const {
  600|    100|      return N;
  601|    100|    }
_ZNK6hermes2vm7HadesGC8Executor11getThreadIdEv:
 1070|  6.43M|  std::thread::id getThreadId() const {
 1071|  6.43M|    return thread_.get_id();
 1072|  6.43M|  }
_ZN6hermes2vm7HadesGC15CollectionStats14getElapsedTimeEv:
  294|    301|  std::chrono::milliseconds getElapsedTime() {
  295|    301|    return std::chrono::duration_cast<std::chrono::milliseconds>(
  296|    301|        Clock::now() - beginTime_);
  297|    301|  }
_ZN6hermes2vm7HadesGC12MarkAcceptor17reachableWeakMapsEv:
  894|    282|  std::vector<JSWeakMap *> &reachableWeakMaps() {
  895|    282|    return reachableWeakMaps_;
  896|    282|  }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptorC2ERS1_:
 3130|    602|    explicit VerifyCardDirtyAcceptor(HadesGC &gc) : gc(gc) {}
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_13GCPointerBaseE:
 3143|  3.94M|    void accept(GCPointerBase &ptr) override {
 3144|  3.94M|      acceptHelper(ptr.get(gc.getPointerBase()), &ptr);
 3145|  3.94M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor12acceptHelperEPvS3_:
 3132|  8.08M|    void acceptHelper(void *valuePtr, void *locPtr) {
 3133|  8.08M|      const bool crossRegionCompacteePtr =
 3134|  8.08M|          !gc.compactee_.evacContains(locPtr) &&
  ------------------
  |  Branch (3134:11): [True: 8.08M, False: 0]
  ------------------
 3135|  8.08M|          gc.compactee_.evacContains(valuePtr);
  ------------------
  |  Branch (3135:11): [True: 0, False: 8.08M]
  ------------------
 3136|  8.08M|      if (!gc.inYoungGen(locPtr) &&
  ------------------
  |  Branch (3136:11): [True: 5.26M, False: 2.81M]
  ------------------
 3137|  8.08M|          (gc.inYoungGen(valuePtr) || crossRegionCompacteePtr)) {
  ------------------
  |  Branch (3137:12): [True: 8.82k, False: 5.25M]
  |  Branch (3137:39): [True: 0, False: 5.25M]
  ------------------
 3138|  8.82k|        assert(HeapSegment::cardTableCovering(locPtr)->isCardForAddressDirty(
 3139|  8.82k|            locPtr));
 3140|  8.82k|      }
 3141|  8.08M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
 3147|  26.6k|    void accept(GCHermesValue &hv) override {
 3148|  26.6k|      if (hv.isPointer())
  ------------------
  |  Branch (3148:11): [True: 24.8k, False: 1.80k]
  ------------------
 3149|  24.8k|        acceptHelper(hv.getPointer(), &hv);
 3150|  26.6k|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
 3151|  5.60M|    void accept(GCSmallHermesValue &hv) override {
 3152|  5.60M|      if (hv.isPointer())
  ------------------
  |  Branch (3152:11): [True: 4.11M, False: 1.49M]
  ------------------
 3153|  4.11M|        acceptHelper(hv.getPointer(gc.getPointerBase()), &hv);
 3154|  5.60M|    }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvEN23VerifyCardDirtyAcceptor6acceptERKNS0_10GCSymbolIDE:
 3156|   785k|    void accept(const GCSymbolID &hv) override {}
_ZN6hermes2vm7HadesGC8ExecutorC2Ev:
 1046|     99|  Executor() : thread_([this] { worker(); }) {}
_ZZN6hermes2vm7HadesGC8ExecutorC1EvENKUlvE_clEv:
 1046|     99|  Executor() : thread_([this] { worker(); }) {}
_ZN6hermes2vm7HadesGC8Executor6workerEv:
 1075|     99|  void worker() {
 1076|     99|    oscompat::set_thread_name("hades");
 1077|     99|    std::unique_lock<std::mutex> lk(mtx_);
 1078|    349|    while (!shutdown_) {
  ------------------
  |  Branch (1078:12): [True: 250, False: 99]
  ------------------
 1079|    250|      cv_.wait(lk, [this]() { return !queue_.empty() || shutdown_; });
 1080|    401|      while (!queue_.empty()) {
  ------------------
  |  Branch (1080:14): [True: 151, False: 250]
  ------------------
 1081|    151|        auto fn = std::move(queue_.front());
 1082|    151|        queue_.pop_front();
 1083|    151|        lk.unlock();
 1084|    151|        fn();
 1085|    151|        lk.lock();
 1086|    151|      }
 1087|    250|    }
 1088|     99|  }
_ZZN6hermes2vm7HadesGC8Executor6workerEvENKUlvE_clEv:
 1079|    500|      cv_.wait(lk, [this]() { return !queue_.empty() || shutdown_; });
  ------------------
  |  Branch (1079:38): [True: 151, False: 349]
  |  Branch (1079:57): [True: 99, False: 250]
  ------------------
_ZN6hermes2vm7HadesGC8ExecutorD2Ev:
 1047|     99|  ~Executor() {
 1048|     99|    {
 1049|     99|      std::lock_guard<std::mutex> lk(mtx_);
 1050|     99|      shutdown_ = true;
 1051|     99|      cv_.notify_one();
 1052|     99|    }
 1053|     99|    thread_.join();
 1054|     99|  }
HadesGC.cpp:_ZZN6hermes2vm7HadesGC21collectOGInBackgroundEvENK3$_1clEv:
 1638|    151|  ogThreadStatus_ = backgroundExecutor_->add([this]() {
 1639|    151|    std::unique_lock<Mutex> lk(gcMutex_);
 1640|  4.11k|    while (true) {
  ------------------
  |  Branch (1640:12): [Folded - Ignored]
  ------------------
 1641|       |      // If the mutator has requested the background task to stop and yield
 1642|       |      // gcMutex_, wait on ogPauseCondVar_ until the mutator acquires the mutex
 1643|       |      // and signals that we may resume.
 1644|  4.11k|      ogPauseCondVar_.wait(
 1645|  4.11k|          lk, [this] { return !ogPaused_.load(std::memory_order_relaxed); });
 1646|  4.11k|      assert(
 1647|  4.11k|          backgroundTaskActive_ &&
 1648|  4.11k|          "backgroundTaskActive_ must be true when the background task is in the loop.");
 1649|      0|      incrementalCollect(true);
 1650|  4.11k|      if (concurrentPhase_ == Phase::None ||
  ------------------
  |  Branch (1650:11): [True: 142, False: 3.97k]
  ------------------
 1651|  4.11k|          concurrentPhase_ == Phase::CompleteMarking) {
  ------------------
  |  Branch (1651:11): [True: 9, False: 3.96k]
  ------------------
 1652|    151|#ifndef NDEBUG
 1653|    151|        backgroundTaskActive_ = false;
 1654|    151|#endif
 1655|    151|        break;
 1656|    151|      }
 1657|  4.11k|    }
 1658|    151|  });
HadesGC.cpp:_ZZZN6hermes2vm7HadesGC21collectOGInBackgroundEvENK3$_1clEvENKUlvE_clEv:
 1645|  4.12k|          lk, [this] { return !ogPaused_.load(std::memory_order_relaxed); });
HadesGC.cpp:_ZN6hermes2vm7HadesGC11HeapSegment16forCompactedObjsIZNS1_11finalizeAllEvE3$_2EEvT_RNS0_11PointerBaseE:
  207|      1|    PointerBase &base) {
  208|      1|  void *const stop = level();
  209|      1|  GCCell *cell = reinterpret_cast<GCCell *>(start());
  210|  3.16k|  while (cell < stop) {
  ------------------
  |  Branch (210:10): [True: 3.16k, False: 1]
  ------------------
  211|  3.16k|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (211:9): [True: 0, False: 3.16k]
  ------------------
  212|       |      // This cell has been evacuated, do nothing.
  213|      0|      cell = reinterpret_cast<GCCell *>(
  214|      0|          reinterpret_cast<char *>(cell) +
  215|      0|          cell->getMarkedForwardingPointer()
  216|      0|              .getNonNull(base)
  217|      0|              ->getAllocatedSize());
  218|  3.16k|    } else {
  219|       |      // This cell is being compacted away, call the callback on it.
  220|       |      // NOTE: We do not check if it is a FreelistCell here in order to avoid
  221|       |      // the extra overhead of that check in YG. The callback should add that
  222|       |      // check if required.
  223|  3.16k|      callback(cell);
  224|  3.16k|      cell = cell->nextCell();
  225|  3.16k|    }
  226|  3.16k|  }
  227|      1|}
HadesGC.cpp:_ZZN6hermes2vm7HadesGC11finalizeAllEvENK3$_2clEPNS0_6GCCellE:
 1900|   616k|  const auto finalizeCallback = [this](GCCell *cell) {
 1901|   616k|    assert(cell->isValid() && "Invalid cell in finalizeAll");
 1902|      0|    cell->getVT()->finalizeIfExists(cell, *this);
 1903|   616k|  };
HadesGC.cpp:_ZN6hermes2vm7HadesGC11HeapSegment10forAllObjsIZNS1_11finalizeAllEvE3$_2EEvT_:
  195|    103|void HadesGC::HeapSegment::forAllObjs(CallbackFunction callback) {
  196|   613k|  for (GCCell *cell : cells()) {
  ------------------
  |  Branch (196:21): [True: 613k, False: 103]
  ------------------
  197|       |    // Skip free-list entries.
  198|   613k|    if (!vmisa<OldGen::FreelistCell>(cell)) {
  ------------------
  |  Branch (198:9): [True: 613k, False: 157]
  ------------------
  199|   613k|      callback(cell);
  200|   613k|    }
  201|   613k|  }
  202|    103|}
_ZN6hermes2vm7HadesGC11HeapSegment10forAllObjsINSt3__18functionIFvPNS0_6GCCellEEEEEEvT_:
  195|  2.76k|void HadesGC::HeapSegment::forAllObjs(CallbackFunction callback) {
  196|  9.99M|  for (GCCell *cell : cells()) {
  ------------------
  |  Branch (196:21): [True: 9.99M, False: 2.76k]
  ------------------
  197|       |    // Skip free-list entries.
  198|  9.99M|    if (!vmisa<OldGen::FreelistCell>(cell)) {
  ------------------
  |  Branch (198:9): [True: 9.98M, False: 10.9k]
  ------------------
  199|  9.98M|      callback(cell);
  200|  9.98M|    }
  201|  9.99M|  }
  202|  2.76k|}
HadesGC.cpp:_ZN6hermes2vm7HadesGC11HeapSegment10forAllObjsIZNS1_10forAllObjsERKNSt3__18functionIFvPNS0_6GCCellEEEEE3$_3EEvT_:
  195|     13|void HadesGC::HeapSegment::forAllObjs(CallbackFunction callback) {
  196|   497k|  for (GCCell *cell : cells()) {
  ------------------
  |  Branch (196:21): [True: 497k, False: 13]
  ------------------
  197|       |    // Skip free-list entries.
  198|   497k|    if (!vmisa<OldGen::FreelistCell>(cell)) {
  ------------------
  |  Branch (198:9): [True: 497k, False: 46]
  ------------------
  199|   497k|      callback(cell);
  200|   497k|    }
  201|   497k|  }
  202|     13|}
HadesGC.cpp:_ZZN6hermes2vm7HadesGC10forAllObjsERKNSt3__18functionIFvPNS0_6GCCellEEEEENK3$_3clES5_:
 2124|   497k|  const auto skipGarbageCallback = [callback](GCCell *cell) {
 2125|       |    // If we're doing this check during sweeping, or between sweeping and
 2126|       |    // compaction, there might be some objects that are dead, and could
 2127|       |    // potentially have garbage in them. There's no need to check the
 2128|       |    // pointers of those objects.
 2129|   497k|    if (HeapSegment::getCellMarkBit(cell)) {
  ------------------
  |  Branch (2129:9): [True: 497k, False: 46]
  ------------------
 2130|   497k|      callback(cell);
 2131|   497k|    }
 2132|   497k|  };
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EEC2ERS1_:
  403|      1|        isTrackingIDs_{gc.isTrackingIDs()} {}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE6acceptERPNS0_6GCCellE:
  494|     56|  void accept(GCCell *&ptr) override {
  495|     56|    ptr = acceptRoot(ptr);
  496|     56|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE10acceptRootEPNS0_6GCCellE:
  419|    165|  LLVM_NODISCARD GCCell *acceptRoot(GCCell *ptr) {
  420|    165|    if (shouldForward(ptr))
  ------------------
  |  Branch (420:9): [True: 1, False: 164]
  ------------------
  421|      1|      return forwardCell<GCCell *>(ptr);
  422|    164|    return ptr;
  423|    165|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb1EE13shouldForwardEPKv:
  410|    751|  inline bool shouldForward(const void *ptr) const {
  411|    751|    return gc.inYoungGen(ptr) ||
  ------------------
  |  Branch (411:12): [True: 1, False: 750]
  ------------------
  412|    751|        (CompactionEnabled && gc.compactee_.evacContains(ptr));
  ------------------
  |  Branch (412:10): [Folded - Ignored]
  |  Branch (412:31): [True: 0, False: 750]
  ------------------
  413|    751|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE11forwardCellIPNS0_6GCCellEEET_S6_:
  458|      1|  LLVM_NODISCARD T forwardCell(GCCell *const cell) {
  459|      1|    assert(
  460|      1|        HeapSegment::getCellMarkBit(cell) && "Cannot forward unmarked object");
  461|      1|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (461:9): [True: 0, False: 1]
  ------------------
  462|       |      // Get the forwarding pointer from the header of the object.
  463|      0|      CompressedPointer forwardedCell = cell->getMarkedForwardingPointer();
  464|      0|      assert(
  465|      0|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  466|      0|          "Cell was forwarded incorrectly");
  467|      0|      return convertPtr<T>(pointerBase_, forwardedCell);
  468|      0|    }
  469|      1|    assert(cell->isValid() && "Encountered an invalid cell");
  470|      0|    const auto cellSize = cell->getAllocatedSize();
  471|       |    // Newly discovered cell, first forward into the old gen.
  472|      1|    GCCell *const newCell = gc.oldGen_.alloc(cellSize);
  473|      1|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|      1|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  474|      0|        gc.inOldGen(newCell) && "Evacuated cell not in the old gen");
  475|      0|    assert(
  476|      1|        HeapSegment::getCellMarkBit(newCell) &&
  477|      1|        "Cell must be marked when it is allocated into the old gen");
  478|       |    // Copy the contents of the existing cell over before modifying it.
  479|      0|    std::memcpy(newCell, cell, cellSize);
  480|      1|    assert(newCell->isValid() && "Cell was copied incorrectly");
  481|      0|    evacuatedBytes_ += cellSize;
  482|      1|    CopyListCell *const copyCell = static_cast<CopyListCell *>(cell);
  483|       |    // Set the forwarding pointer in the old spot
  484|      1|    copyCell->setMarkedForwardingPointer(
  485|      1|        CompressedPointer::encodeNonNull(newCell, pointerBase_));
  486|      1|    if (isTrackingIDs_) {
  ------------------
  |  Branch (486:9): [True: 0, False: 1]
  ------------------
  487|      0|      gc.moveObject(cell, cellSize, newCell, cellSize);
  488|      0|    }
  489|       |    // Push onto the copied list.
  490|      1|    push(copyCell);
  491|      1|    return convertPtr<T>(pointerBase_, newCell);
  492|      1|  }
HadesGC.cpp:_ZN6hermes2vmL10convertPtrIPNS0_6GCCellEEET_RNS0_11PointerBaseENS0_17CompressedPointerE:
  383|    205|/* static */ GCCell *convertPtr(PointerBase &base, CompressedPointer cp) {
  384|    205|  return cp.get(base);
  385|    205|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE4pushEPNS1_12CopyListCellE:
  577|      1|  void push(CopyListCell *cell) {
  578|      1|    cell->next_ = copyListHead_;
  579|      1|    copyListHead_ = CompressedPointer::encodeNonNull(cell, pointerBase_);
  580|      1|  }
HadesGC.cpp:_ZN6hermes2vmL10convertPtrIPNS0_6GCCellEEET_RNS0_11PointerBaseES3_:
  387|  1.83k|static T convertPtr(PointerBase &, GCCell *p) {
  388|  1.83k|  return p;
  389|  1.83k|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE6acceptERNS0_17PinnedHermesValueE:
  502|    131|  void accept(PinnedHermesValue &hv) override {
  503|    131|    assert((!hv.isPointer() || hv.getPointer()) && "Value is not nullable.");
  504|      0|    acceptNullable(hv);
  505|    131|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE14acceptNullableERNS0_17PinnedHermesValueE:
  507|    140|  void acceptNullable(PinnedHermesValue &hv) override {
  508|    140|    if (hv.isPointer()) {
  ------------------
  |  Branch (508:9): [True: 109, False: 31]
  ------------------
  509|    109|      GCCell *forwardedPtr = acceptRoot(static_cast<GCCell *>(hv.getPointer()));
  510|    109|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  511|    109|    }
  512|    140|  }
HadesGC.cpp:_ZN6hermes2vmL10convertPtrINS0_17CompressedPointerEEET_RNS0_11PointerBaseES2_:
  379|  8.13k|static T convertPtr(PointerBase &, CompressedPointer cp) {
  380|  8.13k|  return cp;
  381|  8.13k|}
HadesGC.cpp:_ZN6hermes2vmL10convertPtrINS0_17CompressedPointerEEET_RNS0_11PointerBaseEPNS0_6GCCellE:
  391|   427k|/* static */ CompressedPointer convertPtr(PointerBase &base, GCCell *a) {
  392|   427k|  return CompressedPointer::encodeNonNull(a, base);
  393|   427k|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE10acceptWeakERNS0_12WeakRootBaseE:
  529|    586|  void acceptWeak(WeakRootBase &wr) override {
  530|       |    // It's safe to not do a read barrier here since this is happening in the GC
  531|       |    // and does not extend the lifetime of the referent.
  532|    586|    GCCell *const ptr = wr.getNoBarrierUnsafe(pointerBase_);
  533|       |
  534|    586|    if (!shouldForward(ptr))
  ------------------
  |  Branch (534:9): [True: 586, False: 0]
  ------------------
  535|    586|      return;
  536|       |
  537|      0|    if (ptr->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (537:9): [True: 0, False: 0]
  ------------------
  538|       |      // Get the forwarding pointer from the header of the object.
  539|      0|      CompressedPointer forwardedCell = ptr->getMarkedForwardingPointer();
  540|      0|      assert(
  541|      0|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  542|      0|          "Cell was forwarded incorrectly");
  543|       |      // Assign back to the input pointer location.
  544|      0|      wr = forwardedCell;
  545|      0|    } else {
  546|      0|      wr = nullptr;
  547|      0|    }
  548|      0|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EED2Ev:
  405|      1|  ~EvacAcceptor() override {}
_ZN6hermes2vm7HadesGC20youngGenEvacuateImplINS1_12EvacAcceptorILb1EEEEEvRT_b:
 2372|      1|void HadesGC::youngGenEvacuateImpl(Acceptor &acceptor, bool doCompaction) {
 2373|       |  // Marking each object puts it onto an embedded free list.
 2374|      1|  {
 2375|      1|    DroppingAcceptor<Acceptor> nameAcceptor{acceptor};
 2376|      1|    markRoots(nameAcceptor, /*markLongLived*/ doCompaction);
 2377|      1|  }
 2378|       |  // Find old-to-young pointers, as they are considered roots for YG
 2379|       |  // collection.
 2380|      1|  scanDirtyCards(acceptor);
 2381|       |  // Iterate through the copy list to find new pointers.
 2382|      2|  while (CopyListCell *const copyCell = acceptor.pop()) {
  ------------------
  |  Branch (2382:30): [True: 1, False: 1]
  ------------------
 2383|      1|    assert(
 2384|      1|        copyCell->hasMarkedForwardingPointer() && "Discovered unmarked object");
 2385|      0|    assert(
 2386|      1|        (inYoungGen(copyCell) || compactee_.evacContains(copyCell)) &&
 2387|      1|        "Unexpected object in YG collection");
 2388|       |    // Update the pointers inside the forwarded object, since the old
 2389|       |    // object is only there for the forwarding pointer.
 2390|      0|    GCCell *const cell =
 2391|      1|        copyCell->getMarkedForwardingPointer().getNonNull(getPointerBase());
 2392|      1|    markCell(cell, acceptor);
 2393|      1|  }
 2394|       |
 2395|       |  // Mark weak roots. We only need to update the long lived weak roots if we are
 2396|       |  // evacuating part of the OG.
 2397|      1|  markWeakRoots(acceptor, /*markLongLived*/ doCompaction);
 2398|      1|}
_ZN6hermes2vm7HadesGC14scanDirtyCardsILb1EEEvRNS1_12EvacAcceptorIXT_EEE:
 2760|      1|void HadesGC::scanDirtyCards(EvacAcceptor<CompactionEnabled> &acceptor) {
 2761|      1|  SlotVisitor<EvacAcceptor<CompactionEnabled>> visitor{acceptor};
 2762|      1|  const bool preparingCompaction =
 2763|      1|      CompactionEnabled && !compactee_.evacActive();
  ------------------
  |  Branch (2763:7): [Folded - Ignored]
  |  Branch (2763:28): [True: 1, False: 0]
  ------------------
 2764|       |  // The acceptors in this loop can grow the old gen by adding another
 2765|       |  // segment, if there's not enough room to evac the YG objects discovered.
 2766|       |  // Since segments are always placed at the end, we can use indices instead
 2767|       |  // of iterators, which aren't invalidated. It's ok to not scan newly added
 2768|       |  // segments, since they are going to be handled from the rest of YG
 2769|       |  // collection.
 2770|      1|  const auto segEnd = oldGen_.numSegments();
 2771|      4|  for (size_t i = 0; i < segEnd; ++i) {
  ------------------
  |  Branch (2771:22): [True: 3, False: 1]
  ------------------
 2772|       |    // It is safe to hold this reference across a push_back into
 2773|       |    // oldGen_.segments_ since references into a deque are not invalidated.
 2774|      3|    HeapSegment &seg = oldGen_[i];
 2775|      3|    scanDirtyCardsForSegment(visitor, seg);
 2776|       |    // Do not clear the card table if the OG thread is currently marking to
 2777|       |    // prepare for a compaction. Note that we should clear the card tables if
 2778|       |    // the compaction is currently ongoing.
 2779|      3|    if (!preparingCompaction)
  ------------------
  |  Branch (2779:9): [True: 0, False: 3]
  ------------------
 2780|      0|      seg.cardTable().clear();
 2781|      3|  }
 2782|       |
 2783|       |  // No need to search dirty cards in the compactee segment if it is
 2784|       |  // currently being evacuated, since it will be scanned fully.
 2785|      1|  if (preparingCompaction)
  ------------------
  |  Branch (2785:7): [True: 1, False: 0]
  ------------------
 2786|      1|    scanDirtyCardsForSegment(visitor, *compactee_.segment);
 2787|      1|}
_ZN6hermes2vm7HadesGC24scanDirtyCardsForSegmentILb1EEEvRNS0_11SlotVisitorINS1_12EvacAcceptorIXT_EEEEERNS1_11HeapSegmentE:
 2682|      4|    HeapSegment &seg) {
 2683|      4|  const auto &cardTable = seg.cardTable();
 2684|       |  // Use level instead of end in case the OG segment is still in bump alloc
 2685|       |  // mode.
 2686|      4|  const char *const origSegLevel = seg.level();
 2687|      4|  size_t from = cardTable.addressToIndex(seg.start());
 2688|      4|  const size_t to = cardTable.addressToIndex(origSegLevel - 1) + 1;
 2689|       |
 2690|       |  // If a compaction is taking place during sweeping, we may scan cards that
 2691|       |  // contain dead objects which in turn point to dead objects in the compactee.
 2692|       |  // In order to avoid promoting these dead objects, we should skip unmarked
 2693|       |  // objects altogether when compaction and sweeping happen at the same time.
 2694|      4|  const bool visitUnmarked =
 2695|      4|      !CompactionEnabled || concurrentPhase_ != Phase::Sweep;
  ------------------
  |  Branch (2695:7): [Folded - Ignored]
  |  Branch (2695:29): [True: 4, False: 0]
  ------------------
 2696|       |
 2697|      4|  while (const auto oiBegin = cardTable.findNextDirtyCard(from, to)) {
  ------------------
  |  Branch (2697:21): [True: 0, False: 4]
  ------------------
 2698|      0|    const auto iBegin = *oiBegin;
 2699|       |
 2700|      0|    const auto oiEnd = cardTable.findNextCleanCard(iBegin, to);
 2701|      0|    const auto iEnd = oiEnd ? *oiEnd : to;
  ------------------
  |  Branch (2701:23): [True: 0, False: 0]
  ------------------
 2702|       |
 2703|      0|    assert(
 2704|      0|        (iEnd == to || !cardTable.isCardForIndexDirty(iEnd)) &&
 2705|      0|        cardTable.isCardForIndexDirty(iEnd - 1) &&
 2706|      0|        "end should either be the end of the card table, or the first "
 2707|      0|        "non-dirty card after a sequence of dirty cards");
 2708|      0|    assert(iBegin < iEnd && "Indices must be apart by at least one");
 2709|       |
 2710|      0|    const char *const begin = cardTable.indexToAddress(iBegin);
 2711|      0|    const char *const end = cardTable.indexToAddress(iEnd);
 2712|       |    // Don't try to mark any cell past the original boundary of the segment.
 2713|      0|    const void *const boundary = std::min(end, origSegLevel);
 2714|       |
 2715|       |    // Use the object heads rather than the card table to discover the head
 2716|       |    // of the object.
 2717|      0|    GCCell *const firstObj = seg.getFirstCellHead(iBegin);
 2718|      0|    GCCell *obj = firstObj;
 2719|       |    // Throughout this loop, objects are being marked which could promote
 2720|       |    // other objects into the OG. Such objects might be promoted onto a dirty
 2721|       |    // card, and be visited a second time. This is only a problem if the
 2722|       |    // acceptor isn't idempotent. Luckily, EvacAcceptor happens to be
 2723|       |    // idempotent, and so there's no correctness issue with visiting an object
 2724|       |    // multiple times. If EvacAcceptor wasn't idempotent, we'd have to be able
 2725|       |    // to identify objects promoted from YG in this loop, which would be
 2726|       |    // expensive.
 2727|       |
 2728|       |    // Mark the first object with respect to the dirty card boundaries.
 2729|      0|    if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2729:9): [True: 0, False: 0]
  |  Branch (2729:26): [True: 0, False: 0]
  ------------------
 2730|      0|      markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2731|       |
 2732|      0|    obj = obj->nextCell();
 2733|       |    // If there are additional objects in this card, scan them.
 2734|      0|    if (LLVM_LIKELY(obj < boundary)) {
  ------------------
  |  |  188|      0|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 0, False: 0]
  |  |  ------------------
  ------------------
 2735|       |      // Mark the objects that are entirely contained within the dirty card
 2736|       |      // boundaries. In a given iteration, obj is the start of a given object,
 2737|       |      // and next is the start of the next object. Iterate until the last
 2738|       |      // object where next is within the card.
 2739|      0|      for (GCCell *next = obj->nextCell(); next < boundary;
  ------------------
  |  Branch (2739:44): [True: 0, False: 0]
  ------------------
 2740|      0|           next = next->nextCell()) {
 2741|      0|        if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2741:13): [True: 0, False: 0]
  |  Branch (2741:30): [True: 0, False: 0]
  ------------------
 2742|      0|          markCell(visitor, obj, obj->getKind());
 2743|      0|        obj = next;
 2744|      0|      }
 2745|       |
 2746|       |      // Mark the final object in the range with respect to the dirty card
 2747|       |      // boundaries.
 2748|      0|      assert(
 2749|      0|          obj < boundary && obj->nextCell() >= boundary &&
 2750|      0|          "Last object in card must touch or cross cross the card boundary");
 2751|      0|      if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2751:11): [True: 0, False: 0]
  |  Branch (2751:28): [True: 0, False: 0]
  ------------------
 2752|      0|        markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2753|      0|    }
 2754|       |
 2755|      0|    from = iEnd;
 2756|      0|  }
 2757|      4|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb1EE3popEv:
  557|      2|  CopyListCell *pop() {
  558|      2|    if (!copyListHead_) {
  ------------------
  |  Branch (558:9): [True: 1, False: 1]
  ------------------
  559|      1|      return nullptr;
  560|      1|    } else {
  561|      1|      CopyListCell *const cell =
  562|      1|          static_cast<CopyListCell *>(copyListHead_.getNonNull(pointerBase_));
  563|      1|      assert(HeapSegment::getCellMarkBit(cell) && "Discovered unmarked object");
  564|      0|      copyListHead_ = cell->next_;
  565|      1|      return cell;
  566|      1|    }
  567|      2|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb1EE14evacuatedBytesEv:
  553|      1|  uint64_t evacuatedBytes() const {
  554|      1|    return evacuatedBytes_;
  555|      1|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EEC2ERS1_:
  403|    300|        isTrackingIDs_{gc.isTrackingIDs()} {}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERPNS0_6GCCellE:
  494|  19.2k|  void accept(GCCell *&ptr) override {
  495|  19.2k|    ptr = acceptRoot(ptr);
  496|  19.2k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptRootEPNS0_6GCCellE:
  419|  54.7k|  LLVM_NODISCARD GCCell *acceptRoot(GCCell *ptr) {
  420|  54.7k|    if (shouldForward(ptr))
  ------------------
  |  Branch (420:9): [True: 1.66k, False: 53.1k]
  ------------------
  421|  1.66k|      return forwardCell<GCCell *>(ptr);
  422|  53.1k|    return ptr;
  423|  54.7k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE13shouldForwardEPKv:
  410|   231k|  inline bool shouldForward(const void *ptr) const {
  411|   231k|    return gc.inYoungGen(ptr) ||
  ------------------
  |  Branch (411:12): [True: 2.74k, False: 228k]
  ------------------
  412|   231k|        (CompactionEnabled && gc.compactee_.evacContains(ptr));
  ------------------
  |  Branch (412:10): [Folded - Ignored]
  |  Branch (412:31): [True: 0, False: 0]
  ------------------
  413|   231k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE11forwardCellIPNS0_6GCCellEEET_S6_:
  458|  2.04k|  LLVM_NODISCARD T forwardCell(GCCell *const cell) {
  459|  2.04k|    assert(
  460|  2.04k|        HeapSegment::getCellMarkBit(cell) && "Cannot forward unmarked object");
  461|  2.04k|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (461:9): [True: 205, False: 1.83k]
  ------------------
  462|       |      // Get the forwarding pointer from the header of the object.
  463|    205|      CompressedPointer forwardedCell = cell->getMarkedForwardingPointer();
  464|    205|      assert(
  465|    205|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  466|    205|          "Cell was forwarded incorrectly");
  467|      0|      return convertPtr<T>(pointerBase_, forwardedCell);
  468|    205|    }
  469|  1.83k|    assert(cell->isValid() && "Encountered an invalid cell");
  470|      0|    const auto cellSize = cell->getAllocatedSize();
  471|       |    // Newly discovered cell, first forward into the old gen.
  472|  1.83k|    GCCell *const newCell = gc.oldGen_.alloc(cellSize);
  473|  1.83k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|  1.83k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  474|      0|        gc.inOldGen(newCell) && "Evacuated cell not in the old gen");
  475|      0|    assert(
  476|  1.83k|        HeapSegment::getCellMarkBit(newCell) &&
  477|  1.83k|        "Cell must be marked when it is allocated into the old gen");
  478|       |    // Copy the contents of the existing cell over before modifying it.
  479|      0|    std::memcpy(newCell, cell, cellSize);
  480|  1.83k|    assert(newCell->isValid() && "Cell was copied incorrectly");
  481|      0|    evacuatedBytes_ += cellSize;
  482|  1.83k|    CopyListCell *const copyCell = static_cast<CopyListCell *>(cell);
  483|       |    // Set the forwarding pointer in the old spot
  484|  1.83k|    copyCell->setMarkedForwardingPointer(
  485|  1.83k|        CompressedPointer::encodeNonNull(newCell, pointerBase_));
  486|  1.83k|    if (isTrackingIDs_) {
  ------------------
  |  Branch (486:9): [True: 0, False: 1.83k]
  ------------------
  487|      0|      gc.moveObject(cell, cellSize, newCell, cellSize);
  488|      0|    }
  489|       |    // Push onto the copied list.
  490|  1.83k|    push(copyCell);
  491|  1.83k|    return convertPtr<T>(pointerBase_, newCell);
  492|  2.04k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE4pushEPNS1_12CopyListCellE:
  577|   428k|  void push(CopyListCell *cell) {
  578|   428k|    cell->next_ = copyListHead_;
  579|   428k|    copyListHead_ = CompressedPointer::encodeNonNull(cell, pointerBase_);
  580|   428k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17PinnedHermesValueE:
  502|  45.7k|  void accept(PinnedHermesValue &hv) override {
  503|  45.7k|    assert((!hv.isPointer() || hv.getPointer()) && "Value is not nullable.");
  504|      0|    acceptNullable(hv);
  505|  45.7k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE14acceptNullableERNS0_17PinnedHermesValueE:
  507|  46.9k|  void acceptNullable(PinnedHermesValue &hv) override {
  508|  46.9k|    if (hv.isPointer()) {
  ------------------
  |  Branch (508:9): [True: 35.5k, False: 11.4k]
  ------------------
  509|  35.5k|      GCCell *forwardedPtr = acceptRoot(static_cast<GCCell *>(hv.getPointer()));
  510|  35.5k|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  511|  35.5k|    }
  512|  46.9k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_13GCPointerBaseE:
  498|  39.8k|  void accept(GCPointerBase &ptr) override {
  499|  39.8k|    ptr.setInGC(acceptHeap(ptr, &ptr));
  500|  39.8k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptHeapENS0_17CompressedPointerEPv:
  441|   525k|  acceptHeap(CompressedPointer cptr, void *heapLoc) {
  442|   525k|    if (shouldForward(cptr)) {
  ------------------
  |  Branch (442:9): [True: 435k, False: 90.5k]
  ------------------
  443|   435k|      GCCell *ptr = cptr.getNonNull(pointerBase_);
  444|   435k|      assert(
  445|   435k|          HeapSegment::getCellMarkBit(ptr) &&
  446|   435k|          "Should only evacuate marked objects.");
  447|      0|      return forwardCell<CompressedPointer>(ptr);
  448|   435k|    }
  449|  90.5k|    if (CompactionEnabled && gc.compactee_.contains(cptr)) {
  ------------------
  |  Branch (449:9): [Folded - Ignored]
  |  Branch (449:30): [True: 0, False: 0]
  ------------------
  450|       |      // If a compaction is about to take place, dirty the card for any newly
  451|       |      // evacuated cells, since the marker may miss them.
  452|      0|      HeapSegment::cardTableCovering(heapLoc)->dirtyCardForAddress(heapLoc);
  453|      0|    }
  454|  90.5k|    return cptr;
  455|   525k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE13shouldForwardENS0_17CompressedPointerE:
  414|   525k|  inline bool shouldForward(CompressedPointer ptr) const {
  415|   525k|    return gc.inYoungGen(ptr) ||
  ------------------
  |  Branch (415:12): [True: 435k, False: 90.5k]
  ------------------
  416|   525k|        (CompactionEnabled && gc.compactee_.evacContains(ptr));
  ------------------
  |  Branch (416:10): [Folded - Ignored]
  |  Branch (416:31): [True: 0, False: 0]
  ------------------
  417|   525k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE11forwardCellINS0_17CompressedPointerEEET_PNS0_6GCCellE:
  458|   435k|  LLVM_NODISCARD T forwardCell(GCCell *const cell) {
  459|   435k|    assert(
  460|   435k|        HeapSegment::getCellMarkBit(cell) && "Cannot forward unmarked object");
  461|   435k|    if (cell->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (461:9): [True: 8.13k, False: 427k]
  ------------------
  462|       |      // Get the forwarding pointer from the header of the object.
  463|  8.13k|      CompressedPointer forwardedCell = cell->getMarkedForwardingPointer();
  464|  8.13k|      assert(
  465|  8.13k|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  466|  8.13k|          "Cell was forwarded incorrectly");
  467|      0|      return convertPtr<T>(pointerBase_, forwardedCell);
  468|  8.13k|    }
  469|   427k|    assert(cell->isValid() && "Encountered an invalid cell");
  470|      0|    const auto cellSize = cell->getAllocatedSize();
  471|       |    // Newly discovered cell, first forward into the old gen.
  472|   427k|    GCCell *const newCell = gc.oldGen_.alloc(cellSize);
  473|   427k|    HERMES_SLOW_ASSERT(
  ------------------
  |  |   17|   427k|#define HERMES_SLOW_ASSERT(x) assert(x)
  ------------------
  474|      0|        gc.inOldGen(newCell) && "Evacuated cell not in the old gen");
  475|      0|    assert(
  476|   427k|        HeapSegment::getCellMarkBit(newCell) &&
  477|   427k|        "Cell must be marked when it is allocated into the old gen");
  478|       |    // Copy the contents of the existing cell over before modifying it.
  479|      0|    std::memcpy(newCell, cell, cellSize);
  480|   427k|    assert(newCell->isValid() && "Cell was copied incorrectly");
  481|      0|    evacuatedBytes_ += cellSize;
  482|   427k|    CopyListCell *const copyCell = static_cast<CopyListCell *>(cell);
  483|       |    // Set the forwarding pointer in the old spot
  484|   427k|    copyCell->setMarkedForwardingPointer(
  485|   427k|        CompressedPointer::encodeNonNull(newCell, pointerBase_));
  486|   427k|    if (isTrackingIDs_) {
  ------------------
  |  Branch (486:9): [True: 0, False: 427k]
  ------------------
  487|      0|      gc.moveObject(cell, cellSize, newCell, cellSize);
  488|      0|    }
  489|       |    // Push onto the copied list.
  490|   427k|    push(copyCell);
  491|   427k|    return convertPtr<T>(pointerBase_, newCell);
  492|   435k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17GCHermesValueBaseINS0_11HermesValueEEE:
  514|    546|  void accept(GCHermesValue &hv) override {
  515|    546|    if (hv.isPointer()) {
  ------------------
  |  Branch (515:9): [True: 519, False: 27]
  ------------------
  516|    519|      GCCell *forwardedPtr =
  517|    519|          acceptHeap(static_cast<GCCell *>(hv.getPointer()), &hv);
  518|    519|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  519|    519|    }
  520|    546|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptHeapEPNS0_6GCCellEPv:
  425|    519|  LLVM_NODISCARD GCCell *acceptHeap(GCCell *ptr, void *heapLoc) {
  426|    519|    if (shouldForward(ptr)) {
  ------------------
  |  Branch (426:9): [True: 380, False: 139]
  ------------------
  427|    380|      assert(
  428|    380|          HeapSegment::getCellMarkBit(ptr) &&
  429|    380|          "Should only evacuate marked objects.");
  430|      0|      return forwardCell<GCCell *>(ptr);
  431|    380|    }
  432|    139|    if (CompactionEnabled && gc.compactee_.contains(ptr)) {
  ------------------
  |  Branch (432:9): [Folded - Ignored]
  |  Branch (432:30): [True: 0, False: 0]
  ------------------
  433|       |      // If a compaction is about to take place, dirty the card for any newly
  434|       |      // evacuated cells, since the marker may miss them.
  435|      0|      HeapSegment::cardTableCovering(heapLoc)->dirtyCardForAddress(heapLoc);
  436|      0|    }
  437|    139|    return ptr;
  438|    519|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERNS0_17GCHermesValueBaseINS0_13HermesValue32EEE:
  522|   492k|  void accept(GCSmallHermesValue &hv) override {
  523|   492k|    if (hv.isPointer()) {
  ------------------
  |  Branch (523:9): [True: 485k, False: 6.31k]
  ------------------
  524|   485k|      CompressedPointer forwardedPtr = acceptHeap(hv.getPointer(), &hv);
  525|   485k|      hv.setInGC(hv.updatePointer(forwardedPtr), gc);
  526|   485k|    }
  527|   492k|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE10acceptWeakERNS0_12WeakRootBaseE:
  529|   175k|  void acceptWeak(WeakRootBase &wr) override {
  530|       |    // It's safe to not do a read barrier here since this is happening in the GC
  531|       |    // and does not extend the lifetime of the referent.
  532|   175k|    GCCell *const ptr = wr.getNoBarrierUnsafe(pointerBase_);
  533|       |
  534|   175k|    if (!shouldForward(ptr))
  ------------------
  |  Branch (534:9): [True: 175k, False: 701]
  ------------------
  535|   175k|      return;
  536|       |
  537|    701|    if (ptr->hasMarkedForwardingPointer()) {
  ------------------
  |  Branch (537:9): [True: 701, False: 0]
  ------------------
  538|       |      // Get the forwarding pointer from the header of the object.
  539|    701|      CompressedPointer forwardedCell = ptr->getMarkedForwardingPointer();
  540|    701|      assert(
  541|    701|          forwardedCell.getNonNull(pointerBase_)->isValid() &&
  542|    701|          "Cell was forwarded incorrectly");
  543|       |      // Assign back to the input pointer location.
  544|      0|      wr = forwardedCell;
  545|    701|    } else {
  546|      0|      wr = nullptr;
  547|      0|    }
  548|    701|  }
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE6acceptERKNS0_10GCSymbolIDE:
  551|  12.3k|  void accept(const GCSymbolID &sym) override {}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EED2Ev:
  405|    300|  ~EvacAcceptor() override {}
_ZN6hermes2vm7HadesGC20youngGenEvacuateImplINS1_12EvacAcceptorILb0EEEEEvRT_b:
 2372|    300|void HadesGC::youngGenEvacuateImpl(Acceptor &acceptor, bool doCompaction) {
 2373|       |  // Marking each object puts it onto an embedded free list.
 2374|    300|  {
 2375|    300|    DroppingAcceptor<Acceptor> nameAcceptor{acceptor};
 2376|    300|    markRoots(nameAcceptor, /*markLongLived*/ doCompaction);
 2377|    300|  }
 2378|       |  // Find old-to-young pointers, as they are considered roots for YG
 2379|       |  // collection.
 2380|    300|  scanDirtyCards(acceptor);
 2381|       |  // Iterate through the copy list to find new pointers.
 2382|   429k|  while (CopyListCell *const copyCell = acceptor.pop()) {
  ------------------
  |  Branch (2382:30): [True: 428k, False: 300]
  ------------------
 2383|   428k|    assert(
 2384|   428k|        copyCell->hasMarkedForwardingPointer() && "Discovered unmarked object");
 2385|      0|    assert(
 2386|   428k|        (inYoungGen(copyCell) || compactee_.evacContains(copyCell)) &&
 2387|   428k|        "Unexpected object in YG collection");
 2388|       |    // Update the pointers inside the forwarded object, since the old
 2389|       |    // object is only there for the forwarding pointer.
 2390|      0|    GCCell *const cell =
 2391|   428k|        copyCell->getMarkedForwardingPointer().getNonNull(getPointerBase());
 2392|   428k|    markCell(cell, acceptor);
 2393|   428k|  }
 2394|       |
 2395|       |  // Mark weak roots. We only need to update the long lived weak roots if we are
 2396|       |  // evacuating part of the OG.
 2397|    300|  markWeakRoots(acceptor, /*markLongLived*/ doCompaction);
 2398|    300|}
_ZN6hermes2vm7HadesGC14scanDirtyCardsILb0EEEvRNS1_12EvacAcceptorIXT_EEE:
 2760|    300|void HadesGC::scanDirtyCards(EvacAcceptor<CompactionEnabled> &acceptor) {
 2761|    300|  SlotVisitor<EvacAcceptor<CompactionEnabled>> visitor{acceptor};
 2762|    300|  const bool preparingCompaction =
 2763|    300|      CompactionEnabled && !compactee_.evacActive();
  ------------------
  |  Branch (2763:7): [Folded - Ignored]
  |  Branch (2763:28): [True: 0, False: 0]
  ------------------
 2764|       |  // The acceptors in this loop can grow the old gen by adding another
 2765|       |  // segment, if there's not enough room to evac the YG objects discovered.
 2766|       |  // Since segments are always placed at the end, we can use indices instead
 2767|       |  // of iterators, which aren't invalidated. It's ok to not scan newly added
 2768|       |  // segments, since they are going to be handled from the rest of YG
 2769|       |  // collection.
 2770|    300|  const auto segEnd = oldGen_.numSegments();
 2771|    613|  for (size_t i = 0; i < segEnd; ++i) {
  ------------------
  |  Branch (2771:22): [True: 313, False: 300]
  ------------------
 2772|       |    // It is safe to hold this reference across a push_back into
 2773|       |    // oldGen_.segments_ since references into a deque are not invalidated.
 2774|    313|    HeapSegment &seg = oldGen_[i];
 2775|    313|    scanDirtyCardsForSegment(visitor, seg);
 2776|       |    // Do not clear the card table if the OG thread is currently marking to
 2777|       |    // prepare for a compaction. Note that we should clear the card tables if
 2778|       |    // the compaction is currently ongoing.
 2779|    313|    if (!preparingCompaction)
  ------------------
  |  Branch (2779:9): [Folded - Ignored]
  ------------------
 2780|    313|      seg.cardTable().clear();
 2781|    313|  }
 2782|       |
 2783|       |  // No need to search dirty cards in the compactee segment if it is
 2784|       |  // currently being evacuated, since it will be scanned fully.
 2785|    300|  if (preparingCompaction)
  ------------------
  |  Branch (2785:7): [Folded - Ignored]
  ------------------
 2786|      0|    scanDirtyCardsForSegment(visitor, *compactee_.segment);
 2787|    300|}
_ZN6hermes2vm7HadesGC24scanDirtyCardsForSegmentILb0EEEvRNS0_11SlotVisitorINS1_12EvacAcceptorIXT_EEEEERNS1_11HeapSegmentE:
 2682|    313|    HeapSegment &seg) {
 2683|    313|  const auto &cardTable = seg.cardTable();
 2684|       |  // Use level instead of end in case the OG segment is still in bump alloc
 2685|       |  // mode.
 2686|    313|  const char *const origSegLevel = seg.level();
 2687|    313|  size_t from = cardTable.addressToIndex(seg.start());
 2688|    313|  const size_t to = cardTable.addressToIndex(origSegLevel - 1) + 1;
 2689|       |
 2690|       |  // If a compaction is taking place during sweeping, we may scan cards that
 2691|       |  // contain dead objects which in turn point to dead objects in the compactee.
 2692|       |  // In order to avoid promoting these dead objects, we should skip unmarked
 2693|       |  // objects altogether when compaction and sweeping happen at the same time.
 2694|    313|  const bool visitUnmarked =
 2695|    313|      !CompactionEnabled || concurrentPhase_ != Phase::Sweep;
  ------------------
  |  Branch (2695:7): [Folded - Ignored]
  |  Branch (2695:29): [True: 0, False: 0]
  ------------------
 2696|       |
 2697|    483|  while (const auto oiBegin = cardTable.findNextDirtyCard(from, to)) {
  ------------------
  |  Branch (2697:21): [True: 170, False: 313]
  ------------------
 2698|    170|    const auto iBegin = *oiBegin;
 2699|       |
 2700|    170|    const auto oiEnd = cardTable.findNextCleanCard(iBegin, to);
 2701|    170|    const auto iEnd = oiEnd ? *oiEnd : to;
  ------------------
  |  Branch (2701:23): [True: 170, False: 0]
  ------------------
 2702|       |
 2703|    170|    assert(
 2704|    170|        (iEnd == to || !cardTable.isCardForIndexDirty(iEnd)) &&
 2705|    170|        cardTable.isCardForIndexDirty(iEnd - 1) &&
 2706|    170|        "end should either be the end of the card table, or the first "
 2707|    170|        "non-dirty card after a sequence of dirty cards");
 2708|      0|    assert(iBegin < iEnd && "Indices must be apart by at least one");
 2709|       |
 2710|      0|    const char *const begin = cardTable.indexToAddress(iBegin);
 2711|    170|    const char *const end = cardTable.indexToAddress(iEnd);
 2712|       |    // Don't try to mark any cell past the original boundary of the segment.
 2713|    170|    const void *const boundary = std::min(end, origSegLevel);
 2714|       |
 2715|       |    // Use the object heads rather than the card table to discover the head
 2716|       |    // of the object.
 2717|    170|    GCCell *const firstObj = seg.getFirstCellHead(iBegin);
 2718|    170|    GCCell *obj = firstObj;
 2719|       |    // Throughout this loop, objects are being marked which could promote
 2720|       |    // other objects into the OG. Such objects might be promoted onto a dirty
 2721|       |    // card, and be visited a second time. This is only a problem if the
 2722|       |    // acceptor isn't idempotent. Luckily, EvacAcceptor happens to be
 2723|       |    // idempotent, and so there's no correctness issue with visiting an object
 2724|       |    // multiple times. If EvacAcceptor wasn't idempotent, we'd have to be able
 2725|       |    // to identify objects promoted from YG in this loop, which would be
 2726|       |    // expensive.
 2727|       |
 2728|       |    // Mark the first object with respect to the dirty card boundaries.
 2729|    170|    if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2729:9): [Folded - Ignored]
  |  Branch (2729:26): [True: 0, False: 0]
  ------------------
 2730|    170|      markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2731|       |
 2732|    170|    obj = obj->nextCell();
 2733|       |    // If there are additional objects in this card, scan them.
 2734|    170|    if (LLVM_LIKELY(obj < boundary)) {
  ------------------
  |  |  188|    170|#define LLVM_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
  |  |  ------------------
  |  |  |  Branch (188:27): [True: 169, False: 1]
  |  |  ------------------
  ------------------
 2735|       |      // Mark the objects that are entirely contained within the dirty card
 2736|       |      // boundaries. In a given iteration, obj is the start of a given object,
 2737|       |      // and next is the start of the next object. Iterate until the last
 2738|       |      // object where next is within the card.
 2739|  10.1k|      for (GCCell *next = obj->nextCell(); next < boundary;
  ------------------
  |  Branch (2739:44): [True: 9.95k, False: 169]
  ------------------
 2740|  9.95k|           next = next->nextCell()) {
 2741|  9.95k|        if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2741:13): [Folded - Ignored]
  |  Branch (2741:30): [True: 0, False: 0]
  ------------------
 2742|  9.95k|          markCell(visitor, obj, obj->getKind());
 2743|  9.95k|        obj = next;
 2744|  9.95k|      }
 2745|       |
 2746|       |      // Mark the final object in the range with respect to the dirty card
 2747|       |      // boundaries.
 2748|    169|      assert(
 2749|    169|          obj < boundary && obj->nextCell() >= boundary &&
 2750|    169|          "Last object in card must touch or cross cross the card boundary");
 2751|    169|      if (visitUnmarked || HeapSegment::getCellMarkBit(obj))
  ------------------
  |  Branch (2751:11): [Folded - Ignored]
  |  Branch (2751:28): [True: 0, False: 0]
  ------------------
 2752|    169|        markCellWithinRange(visitor, obj, obj->getKind(), begin, end);
 2753|    169|    }
 2754|       |
 2755|      0|    from = iEnd;
 2756|    170|  }
 2757|    313|}
_ZN6hermes2vm7HadesGC12EvacAcceptorILb0EE3popEv:
  557|   429k|  CopyListCell *pop() {
  558|   429k|    if (!copyListHead_) {
  ------------------
  |  Branch (558:9): [True: 300, False: 428k]
  ------------------
  559|    300|      return nullptr;
  560|   428k|    } else {
  561|   428k|      CopyListCell *const cell =
  562|   428k|          static_cast<CopyListCell *>(copyListHead_.getNonNull(pointerBase_));
  563|   428k|      assert(HeapSegment::getCellMarkBit(cell) && "Discovered unmarked object");
  564|      0|      copyListHead_ = cell->next_;
  565|   428k|      return cell;
  566|   428k|    }
  567|   429k|  }
_ZNK6hermes2vm7HadesGC12EvacAcceptorILb0EE14evacuatedBytesEv:
  553|    300|  uint64_t evacuatedBytes() const {
  554|    300|    return evacuatedBytes_;
  555|    300|  }
HadesGC.cpp:_ZZNK6hermes2vm7HadesGC8inOldGenEPKvENK4$_10clERKNS1_11HeapSegmentE:
 3021|  11.9M|      std::any_of(oldGen_.begin(), oldGen_.end(), [p](const HeapSegment &seg) {
 3022|  11.9M|           return seg.contains(p);
 3023|  11.9M|         });
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15checkWellFormedEvENK4$_11clEPNS0_6GCCellE:
 3119|  5.65M|  forAllObjs([this, &acceptor](GCCell *cell) {
 3120|  5.65M|    assert(cell->isValid() && "Invalid cell encountered in heap");
 3121|      0|    markCell(cell, acceptor);
 3122|  5.65M|  });
HadesGC.cpp:_ZZN6hermes2vm7HadesGC15verifyCardTableEvENK4$_12clEPNS0_6GCCellE:
 3160|  4.82M|  forAllObjs([this, &acceptor](GCCell *cell) { markCell(cell, acceptor); });

_ZNK6hermes6Buffer4dataEv:
   27|    594|  const uint8_t *data() const {
   28|    594|    return data_;
   29|    594|  };
_ZNK6hermes6Buffer4sizeEv:
   31|  1.28k|  size_t size() const {
   32|  1.28k|    return size_;
   33|  1.28k|  }
_ZN6hermes6BufferC2Ev:
   21|    198|  Buffer() : data_(nullptr), size_(0) {}
_ZN6hermes6BufferC2EPKhm:
   23|     99|  Buffer(const uint8_t *data, size_t size) : data_(data), size_(size) {}

_ZN6hermes2vm15NopCrashManager14registerMemoryEPvm:
   90|    452|  void registerMemory(void *, size_t) override {}
_ZN6hermes2vm15NopCrashManager16unregisterMemoryEPv:
   91|  1.32k|  void unregisterMemory(void *) override {}
_ZN6hermes2vm15NopCrashManager13setCustomDataEPKcS3_:
   92|     99|  void setCustomData(const char *, const char *) override {}
_ZN6hermes2vm15NopCrashManager23setContextualCustomDataEPKcS3_:
   94|    407|  void setContextualCustomData(const char *, const char *) override {}
_ZN6hermes2vm15NopCrashManager16registerCallbackENSt3__18functionIFviEEE:
   96|     99|  CallbackKey registerCallback(CallbackFunc /*callback*/) override {
   97|     99|    return 0;
   98|     99|  }
_ZN6hermes2vm15NopCrashManager18unregisterCallbackEi:
   99|     99|  void unregisterCallback(CallbackKey /*key*/) override {}

_ZNK6hermes2vm16GCTripwireConfig8getLimitEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm16GCTripwireConfig11getCallbackEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig14getMinHeapSizeEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig15getInitHeapSizeEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig14getMaxHeapSizeEv:
  122|    198|  inline TYPE get##NAME() const {                      \
  123|    198|    return NAME##_;                                    \
  124|    198|  }                                                    \
_ZNK6hermes2vm8GCConfig18getOccupancyTargetEv:
  122|    297|  inline TYPE get##NAME() const {                      \
  123|    297|    return NAME##_;                                    \
  124|    297|  }                                                    \
_ZNK6hermes2vm8GCConfig20getShouldRecordStatsEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig7getNameEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig17getTripwireConfigEv:
  122|    198|  inline TYPE get##NAME() const {                      \
  123|    198|    return NAME##_;                                    \
  124|    198|  }                                                    \
_ZNK6hermes2vm8GCConfig15getAllocInYoungEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig25getOverwriteDeadYGObjectsEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig18getRevertToYGAtTTIEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig20getAnalyticsCallbackEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm8GCConfig11getCallbackEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig11getGCConfigEv:
  122|    495|  inline TYPE get##NAME() const {                      \
  123|    495|    return NAME##_;                                    \
  124|    495|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig16getRegisterStackEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig18getMaxNumRegistersEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig13getEnableEvalEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig15getVerifyEvalIREv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig16getOptimizedEvalEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig24getAsyncBreakCheckInEvalEv:
  122|    198|  inline TYPE get##NAME() const {                      \
  123|    198|    return NAME##_;                                    \
  124|    198|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig13getES6PromiseEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig11getES6ProxyEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig7getIntlEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig14getArrayBufferEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig17getMicrotaskQueueEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig15getTraceEnabledEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig24getEnableSampleProfilingEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig24getRandomizeMemoryLayoutEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig24getBytecodeWarmupPercentEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig10getTrackIOEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig23getEnableHermesInternalEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig34getEnableHermesInternalTestMethodsEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig18getCompilationModeEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig18getEnableGeneratorEv:
  122|     99|  inline TYPE get##NAME() const {                      \
  123|     99|    return NAME##_;                                    \
  124|     99|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig11getCrashMgrEv:
  122|    198|  inline TYPE get##NAME() const {                      \
  123|    198|    return NAME##_;                                    \
  124|    198|  }                                                    \
_ZNK6hermes2vm13RuntimeConfig20getVMExperimentFlagsEv:
  122|    297|  inline TYPE get##NAME() const {                      \
  123|    297|    return NAME##_;                                    \
  124|    297|  }                                                    \

_ZN8facebook6hermes8debugger10StackTraceC2Ev:
   86|    198|  StackTrace() {}

_ZN6hermes6BufferD2Ev:
   19|    297|Buffer::~Buffer() {}
_ZN6hermes2vm12CrashManagerD2Ev:
   22|     99|CrashManager::~CrashManager() {}

LLVMFuzzerTestOneInput:
   22|     99|extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
   23|     99|  if (!size) {
  ------------------
  |  Branch (23:7): [True: 0, False: 99]
  ------------------
   24|       |    // Hermes can't handle empty input, and it would have a performance cost
   25|       |    // to do so.
   26|      0|    return 0;
   27|      0|  }
   28|       |  // Hermes bytecode is assumed to be trusted, and there are often no checks
   29|       |  // for validity (for performance purposes).
   30|       |  // Discard inputs that would be interpreted as bytecode to avoid reporting
   31|       |  // those as errors.
   32|     99|  if (HermesRuntime::isHermesBytecode(data, size)) {
  ------------------
  |  Branch (32:7): [True: 0, False: 99]
  ------------------
   33|      0|    return 0;
   34|      0|  }
   35|       |
   36|     99|  std::string s(reinterpret_cast<const char *>(data), size);
   37|     99|  s.append("\0");
   38|     99|  auto runtime = makeHermesRuntime();
   39|       |
   40|       |  // create a simple HostObject
   41|     99|  class ProtoHostObject : public HostObject {
   42|     99|    Value get(Runtime &rt, const PropNameID &) override {
   43|     99|      return String::createFromAscii(rt, "phoprop");
   44|     99|    }
   45|       |
   46|     99|    void set(Runtime &, const PropNameID &name, const Value &value) override {
   47|     99|      (void)name;
   48|     99|      (void)value;
   49|     99|      return;
   50|     99|    }
   51|       |
   52|     99|    std::vector<PropNameID> getPropertyNames(Runtime &rt) override {
   53|     99|      return PropNameID::names(rt, "prop1", "1", "2", "prop2", "3");
   54|     99|    }
   55|     99|  };
   56|       |
   57|       |  // expose the HostObject to the js runtime
   58|       |  // many important apps expose this kind of objects
   59|     99|  runtime->global().setProperty(
   60|     99|      *runtime,
   61|     99|      "p",
   62|     99|      Object::createFromHostObject(
   63|     99|          *runtime, std::make_shared<ProtoHostObject>()));
   64|       |
   65|       |  // Cap the run-time of the code so that fuzzing can stay efficient.
   66|     99|  constexpr uint32_t kTimeoutForRunningInMs = 10000;
   67|     99|  runtime->watchTimeLimit(kTimeoutForRunningInMs);
   68|       |
   69|     99|  try {
   70|     99|    runtime->evaluateJavaScript(std::make_unique<StringBuffer>(s), "");
   71|     99|  } catch (const JSIException &e) {
   72|       |    // Swallow JS-based exceptions.
   73|       |    // The fuzzer will generate a lot of invalid JS, and if this causes an
   74|       |    // exception to be thrown evaluating it, that's alright.
   75|       |    // The fuzzer is more interested in inputs that cause the sort of crash that
   76|       |    // doesn't throw an exception.
   77|     67|  }
   78|       |  // Other types of exceptions are not ok to occur, and should be reported as
   79|       |  // bugs.
   80|       |  // Hermes throws no exceptions during normal operation, with the exception of
   81|       |  // any that escape JS.
   82|     99|  return 0;
   83|     99|}

